Skip to content

Commit

Permalink
Fix bug where black tries to split string on escaped space (psf#1799)
Browse files Browse the repository at this point in the history
Closes psf#1505.
  • Loading branch information
bbugyi200 committed Oct 31, 2020
1 parent 8c8af4f commit 6c3f818
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 2 deletions.
17 changes: 15 additions & 2 deletions src/black/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3590,7 +3590,8 @@ class StringSplitter(CustomSplitMapMixin, BaseStringSplitter):
MIN_SUBSTR_SIZE characters.
The string will ONLY be split on spaces (i.e. each new substring should
start with a space).
start with a space). Note that the string will NOT be split on a space
which is escaped with a backslash.
If the string is an f-string, it will NOT be split in the middle of an
f-expression (e.g. in f"FooBar: {foo() if x else bar()}", {foo() if x
Expand Down Expand Up @@ -3930,11 +3931,23 @@ def passes_all_checks(i: Index) -> bool:
section of this classes' docstring would be be met by returning @i.
"""
is_space = string[i] == " "

is_not_escaped = True
j = i - 1
while is_valid_index(j) and string[j] == "\\":
is_not_escaped = not is_not_escaped
j -= 1

is_big_enough = (
len(string[i:]) >= self.MIN_SUBSTR_SIZE
and len(string[:i]) >= self.MIN_SUBSTR_SIZE
)
return is_space and is_big_enough and not breaks_fstring_expression(i)
return (
is_space
and is_not_escaped
and is_big_enough
and not breaks_fstring_expression(i)
)

# First, we check all indices BELOW @max_break_idx.
break_idx = max_break_idx
Expand Down
37 changes: 37 additions & 0 deletions tests/data/long_strings__regression.py
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,24 @@ def xxxxxxx_xxxxxx(xxxx):
key
] = "test" # set some Thrift field to non-None in the struct aa bb cc dd ee

RE_ONE_BACKSLASH = {
"asdf_hjkl_jkl": re.compile(
r"(?<!([0-9]\ ))(?<=(^|\ ))([A-Z]+(\ )?|[0-9](\ )|[a-z](\ )){4,7}([A-Z]|[0-9]|[a-z])($|\b)(?!(\ ?([0-9]\ )|(\.)))"
),
}

RE_TWO_BACKSLASHES = {
"asdf_hjkl_jkl": re.compile(
r"(?<!([0-9]\ ))(?<=(^|\ ))([A-Z]+(\ )?|[0-9](\ )|[a-z](\\ )){4,7}([A-Z]|[0-9]|[a-z])($|\b)(?!(\ ?([0-9]\ )|(\.)))"
),
}

RE_THREE_BACKSLASHES = {
"asdf_hjkl_jkl": re.compile(
r"(?<!([0-9]\ ))(?<=(^|\ ))([A-Z]+(\ )?|[0-9](\ )|[a-z](\\\ )){4,7}([A-Z]|[0-9]|[a-z])($|\b)(?!(\ ?([0-9]\ )|(\.)))"
),
}

# output


Expand Down Expand Up @@ -793,3 +811,22 @@ def xxxxxxx_xxxxxx(xxxx):
value.__dict__[
key
] = "test" # set some Thrift field to non-None in the struct aa bb cc dd ee

RE_ONE_BACKSLASH = {
"asdf_hjkl_jkl": re.compile(
r"(?<!([0-9]\ ))(?<=(^|\ ))([A-Z]+(\ )?|[0-9](\ )|[a-z](\ )){4,7}([A-Z]|[0-9]|[a-z])($|\b)(?!(\ ?([0-9]\ )|(\.)))"
),
}

RE_TWO_BACKSLASHES = {
"asdf_hjkl_jkl": re.compile(
r"(?<!([0-9]\ ))(?<=(^|\ ))([A-Z]+(\ )?|[0-9](\ )|[a-z](\\"
r" )){4,7}([A-Z]|[0-9]|[a-z])($|\b)(?!(\ ?([0-9]\ )|(\.)))"
),
}

RE_THREE_BACKSLASHES = {
"asdf_hjkl_jkl": re.compile(
r"(?<!([0-9]\ ))(?<=(^|\ ))([A-Z]+(\ )?|[0-9](\ )|[a-z](\\\ )){4,7}([A-Z]|[0-9]|[a-z])($|\b)(?!(\ ?([0-9]\ )|(\.)))"
),
}

0 comments on commit 6c3f818

Please sign in to comment.