]> git.madduck.net Git - etc/vim.git/commitdiff

madduck's git repository

Every one of the projects in this repository is available at the canonical URL git://git.madduck.net/madduck/pub/<projectpath> — see each project's metadata for the exact URL.

All patches and comments are welcome. Please squash your changes to logical commits before using git-format-patch and git-send-email to patches@git.madduck.net. If you'd read over the Git project's submission guidelines and adhered to them, I'd be especially grateful.

SSH access, as well as push access can be individually arranged.

If you use my repositories frequently, consider adding the following snippet to ~/.gitconfig and using the third clone URL listed for each project:

[url "git://git.madduck.net/madduck/"]
  insteadOf = madduck:

Add --skip-string-normalization
authorŁukasz Langa <lukasz@langa.pl>
Wed, 30 May 2018 19:54:52 +0000 (12:54 -0700)
committerŁukasz Langa <lukasz@langa.pl>
Wed, 30 May 2018 19:56:16 +0000 (12:56 -0700)
Fixes #118

README.md
black.py
tests/test_black.py

index 3d6f9d51edba6edbc32dce192a9c15421b28b451..f0a6babe2fbb7d13349b329c0bb8abe5efe20251 100644 (file)
--- a/README.md
+++ b/README.md
@@ -87,6 +87,8 @@ Options:
                               files.  This will put trailing commas in function
                               signatures and calls also after *args and
                               **kwargs.  [default: per-file auto-detection]
                               files.  This will put trailing commas in function
                               signatures and calls also after *args and
                               **kwargs.  [default: per-file auto-detection]
+  -S, --skip-string-normalization
+                              Don't normalize string quotes or prefixes.
   --version                   Show the version and exit.
   --help                      Show this message and exit.
 ```
   --version                   Show the version and exit.
   --help                      Show this message and exit.
 ```
@@ -346,6 +348,12 @@ a bit easier than double quotes.  The latter requires use of the Shift
 key.  My recommendation here is to keep using whatever is faster to type
 and let *Black* handle the transformation.
 
 key.  My recommendation here is to keep using whatever is faster to type
 and let *Black* handle the transformation.
 
+If you are adopting *Black* in a large project with pre-existing string
+conventions (like the popular ["single quotes for data, double quotes for
+human-readable strings"](https://stackoverflow.com/a/56190)), you can
+pass `--skip-string-normalization` on the command line.  This is meant as
+an adoption helper, avoid using this for new projects.
+
 
 ### Line breaks & binary operators
 
 
 ### Line breaks & binary operators
 
@@ -688,6 +696,11 @@ More details can be found in [CONTRIBUTING](CONTRIBUTING.md).
 
 ## Change Log
 
 
 ## Change Log
 
+### 18.6b0
+
+* added `--skip-string-normalization` (#118)
+
+
 ### 18.5b1
 
 * added `--pyi` (#249)
 ### 18.5b1
 
 * added `--pyi` (#249)
index 488f5811f04230f682638e32f3483ab030a81c23..4599bdd98a9ae536bb25c27d4b3d1511e0523f17 100644 (file)
--- a/black.py
+++ b/black.py
@@ -126,6 +126,7 @@ class FileMode(Flag):
     AUTO_DETECT = 0
     PYTHON36 = 1
     PYI = 2
     AUTO_DETECT = 0
     PYTHON36 = 1
     PYI = 2
+    NO_STRING_NORMALIZATION = 4
 
 
 @click.command()
 
 
 @click.command()
@@ -182,6 +183,12 @@ class FileMode(Flag):
         "**kwargs.  [default: per-file auto-detection]"
     ),
 )
         "**kwargs.  [default: per-file auto-detection]"
     ),
 )
+@click.option(
+    "-S",
+    "--skip-string-normalization",
+    is_flag=True,
+    help="Don't normalize string quotes or prefixes.",
+)
 @click.version_option(version=__version__)
 @click.argument(
     "src",
 @click.version_option(version=__version__)
 @click.argument(
     "src",
@@ -199,6 +206,7 @@ def main(
     fast: bool,
     pyi: bool,
     py36: bool,
     fast: bool,
     pyi: bool,
     py36: bool,
+    skip_string_normalization: bool,
     quiet: bool,
     src: List[str],
 ) -> None:
     quiet: bool,
     src: List[str],
 ) -> None:
@@ -227,6 +235,8 @@ def main(
         mode |= FileMode.PYTHON36
     if pyi:
         mode |= FileMode.PYI
         mode |= FileMode.PYTHON36
     if pyi:
         mode |= FileMode.PYI
+    if skip_string_normalization:
+        mode |= FileMode.NO_STRING_NORMALIZATION
     report = Report(check=check, quiet=quiet)
     if len(sources) == 0:
         out("No paths given. Nothing to do 😴")
     report = Report(check=check, quiet=quiet)
     if len(sources) == 0:
         out("No paths given. Nothing to do 😴")
@@ -487,8 +497,11 @@ def format_str(
     future_imports = get_future_imports(src_node)
     is_pyi = bool(mode & FileMode.PYI)
     py36 = bool(mode & FileMode.PYTHON36) or is_python36(src_node)
     future_imports = get_future_imports(src_node)
     is_pyi = bool(mode & FileMode.PYI)
     py36 = bool(mode & FileMode.PYTHON36) or is_python36(src_node)
+    normalize_strings = not bool(mode & FileMode.NO_STRING_NORMALIZATION)
     lines = LineGenerator(
     lines = LineGenerator(
-        remove_u_prefix=py36 or "unicode_literals" in future_imports, is_pyi=is_pyi
+        remove_u_prefix=py36 or "unicode_literals" in future_imports,
+        is_pyi=is_pyi,
+        normalize_strings=normalize_strings,
     )
     elt = EmptyLineTracker(is_pyi=is_pyi)
     empty_line = Line()
     )
     elt = EmptyLineTracker(is_pyi=is_pyi)
     empty_line = Line()
@@ -1286,6 +1299,7 @@ class LineGenerator(Visitor[Line]):
     """
 
     is_pyi: bool = False
     """
 
     is_pyi: bool = False
+    normalize_strings: bool = True
     current_line: Line = Factory(Line)
     remove_u_prefix: bool = False
 
     current_line: Line = Factory(Line)
     remove_u_prefix: bool = False
 
@@ -1354,7 +1368,7 @@ class LineGenerator(Visitor[Line]):
 
             else:
                 normalize_prefix(node, inside_brackets=any_open_brackets)
 
             else:
                 normalize_prefix(node, inside_brackets=any_open_brackets)
-                if node.type == token.STRING:
+                if self.normalize_strings and node.type == token.STRING:
                     normalize_string_prefix(node, remove_u_prefix=self.remove_u_prefix)
                     normalize_string_quotes(node)
                 if node.type not in WHITESPACE:
                     normalize_string_prefix(node, remove_u_prefix=self.remove_u_prefix)
                     normalize_string_quotes(node)
                 if node.type not in WHITESPACE:
index 595d6cd35c4bd2df0eba2f25fc984f3b7080df63..e654d0d532f91dcacd7a4fcfcd278e8aea61eb65 100644 (file)
@@ -236,6 +236,11 @@ class BlackTestCase(unittest.TestCase):
         self.assertFormatEqual(expected, actual)
         black.assert_equivalent(source, actual)
         black.assert_stable(source, actual, line_length=ll)
         self.assertFormatEqual(expected, actual)
         black.assert_equivalent(source, actual)
         black.assert_stable(source, actual, line_length=ll)
+        mode = black.FileMode.NO_STRING_NORMALIZATION
+        not_normalized = fs(source, mode=mode)
+        self.assertFormatEqual(source, not_normalized)
+        black.assert_equivalent(source, not_normalized)
+        black.assert_stable(source, not_normalized, line_length=ll, mode=mode)
 
     @patch("black.dump_to_file", dump_to_stderr)
     def test_slices(self) -> None:
 
     @patch("black.dump_to_file", dump_to_stderr)
     def test_slices(self) -> None: