From: Ɓukasz Langa Date: Tue, 24 Apr 2018 20:44:28 +0000 (-0700) Subject: Split imports like isort X-Git-Url: https://git.madduck.net/etc/vim.git/commitdiff_plain/09f5ee3a19f4274bb848324867bd8e68724cf851?ds=inline;pf=etc Split imports like isort Fixes #127 Partially addresses #152 --- diff --git a/README.md b/README.md index a589d0d..489bda5 100644 --- a/README.md +++ b/README.md @@ -176,6 +176,13 @@ between two distinct sections of the code that otherwise share the same indentation level (like the arguments list and the docstring in the example above). +If a line of "from" imports cannot fit in the allotted length, it's always split +into one per line. Imports tend to change often and this minimizes diffs, as well +as enables readers of code to easily find which commit introduced a particular +import. This exception also makes *Black* compatible with +[isort](https://pypi.org/p/isort/). Use `multi_line_output=3` and +`include_trailing_comma=True` in your isort config. + ### Line length @@ -528,6 +535,8 @@ More details can be found in [CONTRIBUTING](CONTRIBUTING.md). * Black no longer enforces putting empty lines behind control flow statements (#90) +* Black now splits imports like "Mode 3 + trailing comma" of isort (#127) + * fixed comment indentation when a standalone comment closes a block (#16, #32) * fixed standalone comments receiving extra empty lines if immediately preceding diff --git a/black.py b/black.py index 95489f3..21e3743 100644 --- a/black.py +++ b/black.py @@ -1712,6 +1712,8 @@ def split_line( split_funcs: List[SplitFunc] if line.is_def: split_funcs = [left_hand_split] + elif line.is_import: + split_funcs = [explode_split] elif line.inside_brackets: split_funcs = [delimiter_split, standalone_comment_split, right_hand_split] else: @@ -1978,6 +1980,24 @@ def standalone_comment_split(line: Line, py36: bool = False) -> Iterator[Line]: yield current_line +def explode_split( + line: Line, py36: bool = False, omit: Collection[LeafID] = () +) -> Iterator[Line]: + """Split by RHS and immediately split contents by a delimiter.""" + new_lines = list(right_hand_split(line, py36, omit)) + if len(new_lines) != 3: + yield from new_lines + return + + yield new_lines[0] + try: + yield from delimiter_split(new_lines[1], py36) + except CannotSplit: + yield new_lines[1] + + yield new_lines[2] + + def is_import(leaf: Leaf) -> bool: """Return True if the given leaf starts an import statement.""" p = leaf.parent diff --git a/tests/import_spacing.py b/tests/import_spacing.py index 4091148..f095ba1 100644 --- a/tests/import_spacing.py +++ b/tests/import_spacing.py @@ -17,6 +17,10 @@ from ..runners import * # comment here from ..queues import * from ..streams import * +from some_library import ( + Just, Enough, Libraries, To, Fit, In, This, Nice, Split, Which, We, No, Longer, Use +) + from .a.b.c.subprocess import * from . import (tasks) from . import (A, B, C) @@ -59,6 +63,23 @@ from ..runners import * # comment here from ..queues import * from ..streams import * +from some_library import ( + Just, + Enough, + Libraries, + To, + Fit, + In, + This, + Nice, + Split, + Which, + We, + No, + Longer, + Use, +) + from .a.b.c.subprocess import * from . import tasks from . import A, B, C