From: shaoran <shaoran@sakuranohana.org>
Date: Wed, 29 Sep 2021 00:31:29 +0000 (+0200)
Subject: Allow to pass the FileMode options in the vim plugin (#1319)
X-Git-Url: https://git.madduck.net/etc/vim.git/commitdiff_plain/09915f4bd2d13652c089b9a96408b39116d82eb0?ds=sidebyside;hp=-c

Allow to pass the FileMode options in the vim plugin (#1319)
---

09915f4bd2d13652c089b9a96408b39116d82eb0
diff --git a/CHANGES.md b/CHANGES.md
index 1ff2cea..61d3178 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -7,6 +7,10 @@
 - Remove dependency on aiohttp-cors (#2500)
 - Bump required aiohttp version to 3.7.4 (#2509)
 
+### Integrations
+
+- Allow to pass `target_version` in the vim plugin (#1319)
+
 ## 21.9b0
 
 ### Packaging
diff --git a/autoload/black.vim b/autoload/black.vim
index 29d8f2b..9ff5c23 100644
--- a/autoload/black.vim
+++ b/autoload/black.vim
@@ -98,13 +98,47 @@ if _initialize_black_env():
   import black
   import time
 
-def Black():
+def get_target_version(tv):
+  if isinstance(tv, black.TargetVersion):
+    return tv
+  ret = None
+  try:
+    ret = black.TargetVersion[tv.upper()]
+  except KeyError:
+    print(f"WARNING: Target version {tv!r} not recognized by Black, using default target")
+  return ret
+
+def Black(**kwargs):
+  """
+  kwargs allows you to override ``target_versions`` argument of
+  ``black.FileMode``.
+
+  ``target_version`` needs to be cleaned because ``black.FileMode``
+  expects the ``target_versions`` argument to be a set of TargetVersion enums.
+
+  Allow kwargs["target_version"] to be a string to allow
+  to type it more quickly.
+
+  Using also target_version instead of target_versions to remain
+  consistent to Black's documentation of the structure of pyproject.toml.
+  """
   start = time.time()
   configs = get_configs()
+
+  black_kwargs = {}
+  if "target_version" in kwargs:
+    target_version = kwargs["target_version"]
+
+    if not isinstance(target_version, (list, set)):
+      target_version = [target_version]
+    target_version = set(filter(lambda x: x, map(lambda tv: get_target_version(tv), target_version)))
+    black_kwargs["target_versions"] = target_version
+
   mode = black.FileMode(
     line_length=configs["line_length"],
     string_normalization=not configs["skip_string_normalization"],
     is_pyi=vim.current.buffer.name.endswith('.pyi'),
+    **black_kwargs,
   )
   quiet = configs["quiet"]
 
@@ -160,8 +194,17 @@ def BlackVersion():
 
 EndPython3
 
-function black#Black()
-  :py3 Black()
+function black#Black(...)
+    let kwargs = {}
+    for arg in a:000
+        let arg_list = split(arg, '=')
+        let kwargs[arg_list[0]] = arg_list[1]
+    endfor
+python3 << EOF
+import vim
+kwargs = vim.eval("kwargs")
+EOF
+  :py3 Black(**kwargs)
 endfunction
 
 function black#BlackUpgrade()
diff --git a/docs/integrations/editors.md b/docs/integrations/editors.md
index 6098631..d3be7c0 100644
--- a/docs/integrations/editors.md
+++ b/docs/integrations/editors.md
@@ -116,6 +116,8 @@ Wing supports black via the OS Commands tool, as explained in the Wing documenta
 Commands and shortcuts:
 
 - `:Black` to format the entire file (ranges not supported);
+  - you can optionally pass `target_version=<version>` with the same values as in the
+    command line.
 - `:BlackUpgrade` to upgrade _Black_ inside the virtualenv;
 - `:BlackVersion` to get the current version of _Black_ inside the virtualenv.
 
diff --git a/plugin/black.vim b/plugin/black.vim
index 3bdca62..90d2047 100644
--- a/plugin/black.vim
+++ b/plugin/black.vim
@@ -53,8 +53,20 @@ endif
 if !exists("g:black_quiet")
   let g:black_quiet = 0
 endif
+if !exists("g:black_target_version")
+  let g:black_target_version = ""
+endif
 
+function BlackComplete(ArgLead, CmdLine, CursorPos)
+  return [
+\    'target_version=py27',
+\    'target_version=py36',
+\    'target_version=py37',
+\    'target_version=py38',
+\    'target_version=py39',
+\  ]
+endfunction
 
-command! Black :call black#Black()
+command! -nargs=* -complete=customlist,BlackComplete Black :call black#Black(<f-args>)
 command! BlackUpgrade :call black#BlackUpgrade()
 command! BlackVersion :call black#BlackVersion()