Skip to content

Commit

Permalink
Fix incorrect custom breakpoint indices when string group contains fa…
Browse files Browse the repository at this point in the history
…ke f-strings (#2311)

Fixes #2293
  • Loading branch information
bbugyi200 committed Jun 7, 2021
1 parent 6380b9f commit 99b68e5
Show file tree
Hide file tree
Showing 3 changed files with 102 additions and 11 deletions.
2 changes: 2 additions & 0 deletions CHANGES.md
Expand Up @@ -9,6 +9,8 @@
- Fixed option usage when using the `--code` flag (#2259)
- Do not call `uvloop.install()` when _Black_ is used as a library (#2303)
- Added `--required-version` option to require a specific version to be running (#2300)
- Fix incorrect custom breakpoint indices when string group contains fake f-strings
(#2311)

## 21.5b2

Expand Down
33 changes: 22 additions & 11 deletions src/black/trans.py
Expand Up @@ -1151,21 +1151,32 @@ def more_splits_should_be_made() -> bool:

# --- Construct `next_value`
next_value = rest_value[:break_idx] + QUOTE

# HACK: The following 'if' statement is a hack to fix the custom
# breakpoint index in the case of either: (a) substrings that were
# f-strings but will have the 'f' prefix removed OR (b) substrings
# that were not f-strings but will now become f-strings because of
# redundant use of the 'f' prefix (i.e. none of the substrings
# contain f-expressions but one or more of them had the 'f' prefix
# anyway; in which case, we will prepend 'f' to _all_ substrings).
#
# There is probably a better way to accomplish what is being done
# here...
#
# If this substring is an f-string, we _could_ remove the 'f'
# prefix, and the current custom split did NOT originally use a
# prefix...
if (
# Are we allowed to try to drop a pointless 'f' prefix?
drop_pointless_f_prefix
# If we are, will we be successful?
and next_value != self._normalize_f_string(next_value, prefix)
next_value != self._normalize_f_string(next_value, prefix)
and use_custom_breakpoints
and not csplit.has_prefix
):
# If the current custom split did NOT originally use a prefix,
# then `csplit.break_idx` will be off by one after removing
# Then `csplit.break_idx` will be off by one after removing
# the 'f' prefix.
break_idx = (
break_idx + 1
if use_custom_breakpoints and not csplit.has_prefix
else break_idx
)
break_idx += 1
next_value = rest_value[:break_idx] + QUOTE

if drop_pointless_f_prefix:
next_value = self._normalize_f_string(next_value, prefix)

# --- Construct `next_leaf`
Expand Down
78 changes: 78 additions & 0 deletions tests/data/long_strings__regression.py
Expand Up @@ -455,6 +455,45 @@ async def foo(self):
)
assert str(suffix_arr) in "['$', 'angaroo$', 'angrykangaroo$', 'aroo$', 'garoo$', 'grykangaroo$', 'kangaroo$', 'ngaroo$', 'ngrykangaroo$', 'o$', 'oo$', 'roo$', 'rykangaroo$', 'ykangaroo$']"
assert str(suffix_arr) not in "['$', 'angaroo$', 'angrykangaroo$', 'aroo$', 'garoo$', 'grykangaroo$', 'kangaroo$', 'ngaroo$', 'ngrykangaroo$', 'o$', 'oo$', 'roo$', 'rykangaroo$', 'ykangaroo$']"
message = (
f"1. Go to Google Developers Console and log in with your Google account."
"(https://console.developers.google.com/)"
"2. You should be prompted to create a new project (name does not matter)."
"3. Click on Enable APIs and Services at the top."
"4. In the list of APIs choose or search for YouTube Data API v3 and "
"click on it. Choose Enable."
"5. Click on Credentials on the left navigation bar."
"6. Click on Create Credential at the top."
'7. At the top click the link for "API key".'
"8. No application restrictions are needed. Click Create at the bottom."
"9. You now have a key to add to `{prefix}set api youtube api_key`"
)
message = (
f"1. Go to Google Developers Console and log in with your Google account."
"(https://console.developers.google.com/)"
"2. You should be prompted to create a new project (name does not matter)."
f"3. Click on Enable APIs and Services at the top."
"4. In the list of APIs choose or search for YouTube Data API v3 and "
"click on it. Choose Enable."
f"5. Click on Credentials on the left navigation bar."
"6. Click on Create Credential at the top."
'7. At the top click the link for "API key".'
"8. No application restrictions are needed. Click Create at the bottom."
"9. You now have a key to add to `{prefix}set api youtube api_key`"
)
message = (
f"1. Go to Google Developers Console and log in with your Google account."
"(https://console.developers.google.com/)"
"2. You should be prompted to create a new project (name does not matter)."
f"3. Click on Enable APIs and Services at the top."
"4. In the list of APIs choose or search for YouTube Data API v3 and "
"click on it. Choose Enable."
f"5. Click on Credentials on the left navigation bar."
"6. Click on Create Credential at the top."
'7. At the top click the link for "API key".'
"8. No application restrictions are needed. Click Create at the bottom."
f"9. You now have a key to add to `{prefix}set api youtube api_key`"
)

# output

Expand Down Expand Up @@ -1022,3 +1061,42 @@ async def foo(self):
" 'kangaroo$', 'ngaroo$', 'ngrykangaroo$', 'o$', 'oo$', 'roo$',"
" 'rykangaroo$', 'ykangaroo$']"
)
message = (
f"1. Go to Google Developers Console and log in with your Google account."
f"(https://console.developers.google.com/)"
f"2. You should be prompted to create a new project (name does not matter)."
f"3. Click on Enable APIs and Services at the top."
f"4. In the list of APIs choose or search for YouTube Data API v3 and "
f"click on it. Choose Enable."
f"5. Click on Credentials on the left navigation bar."
f"6. Click on Create Credential at the top."
f'7. At the top click the link for "API key".'
f"8. No application restrictions are needed. Click Create at the bottom."
f"9. You now have a key to add to `{{prefix}}set api youtube api_key`"
)
message = (
f"1. Go to Google Developers Console and log in with your Google account."
f"(https://console.developers.google.com/)"
f"2. You should be prompted to create a new project (name does not matter)."
f"3. Click on Enable APIs and Services at the top."
f"4. In the list of APIs choose or search for YouTube Data API v3 and "
f"click on it. Choose Enable."
f"5. Click on Credentials on the left navigation bar."
f"6. Click on Create Credential at the top."
f'7. At the top click the link for "API key".'
f"8. No application restrictions are needed. Click Create at the bottom."
f"9. You now have a key to add to `{{prefix}}set api youtube api_key`"
)
message = (
"1. Go to Google Developers Console and log in with your Google account."
"(https://console.developers.google.com/)"
"2. You should be prompted to create a new project (name does not matter)."
"3. Click on Enable APIs and Services at the top."
"4. In the list of APIs choose or search for YouTube Data API v3 and "
"click on it. Choose Enable."
"5. Click on Credentials on the left navigation bar."
"6. Click on Create Credential at the top."
'7. At the top click the link for "API key".'
"8. No application restrictions are needed. Click Create at the bottom."
f"9. You now have a key to add to `{prefix}set api youtube api_key`"
)

0 comments on commit 99b68e5

Please sign in to comment.