From: Łukasz Langa Date: Wed, 30 May 2018 19:54:52 +0000 (-0700) Subject: Add --skip-string-normalization X-Git-Url: https://git.madduck.net/etc/vim.git/commitdiff_plain/8ebbd268880f15834b70910a6dc61e1ee7596b7c?hp=608019dffb1f933299f5682498548d375faf152e Add --skip-string-normalization Fixes #118 --- diff --git a/README.md b/README.md index 3d6f9d5..f0a6bab 100644 --- 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] + -S, --skip-string-normalization + Don't normalize string quotes or prefixes. --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. +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 @@ -688,6 +696,11 @@ More details can be found in [CONTRIBUTING](CONTRIBUTING.md). ## Change Log +### 18.6b0 + +* added `--skip-string-normalization` (#118) + + ### 18.5b1 * added `--pyi` (#249) diff --git a/black.py b/black.py index 488f581..4599bdd 100644 --- a/black.py +++ b/black.py @@ -126,6 +126,7 @@ class FileMode(Flag): AUTO_DETECT = 0 PYTHON36 = 1 PYI = 2 + NO_STRING_NORMALIZATION = 4 @click.command() @@ -182,6 +183,12 @@ class FileMode(Flag): "**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", @@ -199,6 +206,7 @@ def main( fast: bool, pyi: bool, py36: bool, + skip_string_normalization: bool, quiet: bool, src: List[str], ) -> None: @@ -227,6 +235,8 @@ def main( 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 😴") @@ -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) + normalize_strings = not bool(mode & FileMode.NO_STRING_NORMALIZATION) 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() @@ -1286,6 +1299,7 @@ class LineGenerator(Visitor[Line]): """ is_pyi: bool = False + normalize_strings: bool = True 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) - 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: diff --git a/tests/test_black.py b/tests/test_black.py index 595d6cd..e654d0d 100644 --- a/tests/test_black.py +++ b/tests/test_black.py @@ -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) + 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: