]>
git.madduck.net Git - etc/vim.git/blobdiff - black.py
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:
STRING_PRIORITY = 12
COMPARATOR_PRIORITY = 10
MATH_PRIORITIES = {
STRING_PRIORITY = 12
COMPARATOR_PRIORITY = 10
MATH_PRIORITIES = {
- token.VBAR: 8 ,
- token.CIRCUMFLEX: 7 ,
- token.AMPER: 6 ,
- token.LEFTSHIFT: 5 ,
- token.RIGHTSHIFT: 5 ,
- token.PLUS: 4 ,
- token.MINUS: 4 ,
- token.STAR: 3 ,
- token.SLASH: 3 ,
- token.DOUBLESLASH: 3 ,
- token.PERCENT: 3 ,
- token.AT: 3 ,
- token.TILDE: 2 ,
- token.DOUBLESTAR: 1 ,
+ token.VBAR: 9 ,
+ token.CIRCUMFLEX: 8 ,
+ token.AMPER: 7 ,
+ token.LEFTSHIFT: 6 ,
+ token.RIGHTSHIFT: 6 ,
+ token.PLUS: 5 ,
+ token.MINUS: 5 ,
+ token.STAR: 4 ,
+ token.SLASH: 4 ,
+ token.DOUBLESLASH: 4 ,
+ token.PERCENT: 4 ,
+ token.AT: 4 ,
+ token.TILDE: 3 ,
+ token.DOUBLESTAR: 2 ,
"""
return max(v for k, v in self.delimiters.items() if k not in exclude)
"""
return max(v for k, v in self.delimiters.items() if k not in exclude)
+ def delimiter_count_with_priority(self, priority: int = 0) -> int:
+ """Return the number of delimiters with the given `priority`.
+
+ If no `priority` is passed, defaults to max priority on the line.
+ """
+ if not self.delimiters:
+ return 0
+
+ priority = priority or self.max_delimiter_priority()
+ return sum(1 for p in self.delimiters.values() if p == priority)
+
def maybe_increment_for_loop_variable(self, leaf: Leaf) -> bool:
"""In a for loop, or comprehension, the variables are often unpacks.
def maybe_increment_for_loop_variable(self, leaf: Leaf) -> bool:
"""In a for loop, or comprehension, the variables are often unpacks.
@property
def is_stub_class(self) -> bool:
"""Is this line a class definition with a body consisting only of "..."?"""
@property
def is_stub_class(self) -> bool:
"""Is this line a class definition with a body consisting only of "..."?"""
- return (
- self.is_class
- and self.leaves[-3:] == [Leaf(token.DOT, ".") for _ in range(3)]
- )
+ return self.is_class and self.leaves[-3:] == [
+ Leaf(token.DOT, ".") for _ in range(3)
+ ]
@property
def is_def(self) -> bool:
@property
def is_def(self) -> bool:
return DOUBLESPACE
assert p is not None, f"INTERNAL ERROR: hand-made leaf without parent: {leaf!r}"
return DOUBLESPACE
assert p is not None, f"INTERNAL ERROR: hand-made leaf without parent: {leaf!r}"
- if (
- t == token.COLON
- and p.type not in {syms.subscript, syms.subscriptlist, syms.sliceop}
- ):
+ if t == token.COLON and p.type not in {
+ syms.subscript, syms.subscriptlist, syms.sliceop
+ }:
return NO
prev = leaf.prev_sibling
return NO
prev = leaf.prev_sibling
prevp_parent = prevp.parent
assert prevp_parent is not None
prevp_parent = prevp.parent
assert prevp_parent is not None
- if (
- prevp.type == token.COLON
- and prevp_parent.type in {syms.subscript, syms.sliceop}
- ):
+ if prevp.type == token.COLON and prevp_parent.type in {
+ syms.subscript, syms.sliceop
+ }:
return NO
elif prevp.type == token.EQUAL and prevp_parent.type == syms.argument:
return NO
elif prevp.type == token.EQUAL and prevp_parent.type == syms.argument:
# Don't treat them as a delimiter.
return 0
# Don't treat them as a delimiter.
return 0
+ if (
+ leaf.type == token.DOT
+ and leaf.parent
+ and leaf.parent.type not in {syms.import_from, syms.dotted_name}
+ and (previous is None or previous.type != token.NAME)
+ ):
+ return DOT_PRIORITY
+
if (
leaf.type in MATH_OPERATORS
and leaf.parent
if (
leaf.type in MATH_OPERATORS
and leaf.parent
):
return STRING_PRIORITY
):
return STRING_PRIORITY
+ if leaf.type != token.NAME:
+ return 0
+
- leaf.type == token.NAME
- and leaf.value == "for"
and leaf.parent
and leaf.parent.type in {syms.comp_for, syms.old_comp_for}
):
return COMPREHENSION_PRIORITY
if (
and leaf.parent
and leaf.parent.type in {syms.comp_for, syms.old_comp_for}
):
return COMPREHENSION_PRIORITY
if (
- leaf.type == token.NAME
- and leaf.value == "if"
and leaf.parent
and leaf.parent.type in {syms.comp_if, syms.old_comp_if}
):
return COMPREHENSION_PRIORITY
and leaf.parent
and leaf.parent.type in {syms.comp_if, syms.old_comp_if}
):
return COMPREHENSION_PRIORITY
+ if leaf.value in {"if", "else"} and leaf.parent and leaf.parent.type == syms.test:
+ return TERNARY_PRIORITY
+
+ if leaf.value == "is":
+ return COMPARATOR_PRIORITY
+
- leaf.type == token.NAME
- and leaf.value in {"if", "else"}
- and leaf.parent.type == syms.test
+ and leaf.parent.type in {syms.comp_op, syms.comparison}
+ and not (
+ previous is not None
+ and previous.type == token.NAME
+ and previous.value == "not"
+ )
- return TERNARY_PRIORITY
+ return COMPARATOR_PRIORITY
+
+ if (
+ leaf.value == "not"
+ and leaf.parent
+ and leaf.parent.type == syms.comp_op
+ and not (
+ previous is not None
+ and previous.type == token.NAME
+ and previous.value == "is"
+ )
+ ):
+ return COMPARATOR_PRIORITY
- if leaf.type == token.NAME and leaf. value in LOGIC_OPERATORS and leaf.parent:
+ if leaf.value in LOGIC_OPERATORS and leaf.parent:
return LOGIC_PRIORITY
return 0
return LOGIC_PRIORITY
return 0
and not line.is_import
):
omit = {id(closing_bracket), *omit}
and not line.is_import
):
omit = {id(closing_bracket), *omit}
- delimiter_count = len(body.bracket_tracker.delimiters )
+ delimiter_count = body.bracket_tracker.delimiter_count_with_priority( )
if (
delimiter_count == 0
or delimiter_count == 1
if (
delimiter_count == 0
or delimiter_count == 1
except IndexError:
raise CannotSplit("Line empty")
except IndexError:
raise CannotSplit("Line empty")
- delimiters = line.bracket_tracker.delimiters
+ bt = line.bracket_tracker
- delimiter_priority = line.bracket_tracker.max_delimiter_priority(
- exclude={id(last_leaf)}
- )
+ delimiter_priority = bt.max_delimiter_priority(exclude={id(last_leaf)})
except ValueError:
raise CannotSplit("No delimiters found")
except ValueError:
raise CannotSplit("No delimiters found")
+ if delimiter_priority == DOT_PRIORITY:
+ if bt.delimiter_count_with_priority(delimiter_priority) == 1:
+ raise CannotSplit("Splitting a single attribute from its owner looks wrong")
+
current_line = Line(depth=line.depth, inside_brackets=line.inside_brackets)
lowest_depth = sys.maxsize
trailing_comma_safe = True
current_line = Line(depth=line.depth, inside_brackets=line.inside_brackets)
lowest_depth = sys.maxsize
trailing_comma_safe = True
yield from append_to_line(comment_after)
lowest_depth = min(lowest_depth, leaf.bracket_depth)
yield from append_to_line(comment_after)
lowest_depth = min(lowest_depth, leaf.bracket_depth)
- if (
- leaf.bracket_depth == lowest_depth
- and is_vararg(leaf, within=VARARGS_PARENTS)
+ if leaf.bracket_depth == lowest_depth and is_vararg(
+ leaf, within=VARARGS_PARENTS
):
trailing_comma_safe = trailing_comma_safe and py36
):
trailing_comma_safe = trailing_comma_safe and py36
- leaf_priority = delimiters.get(id(leaf))
+ leaf_priority = bt. delimiters.get(id(leaf))
if leaf_priority == delimiter_priority:
yield current_line
if leaf_priority == delimiter_priority:
yield current_line