From 2cd7db878e6505c96674f4464105d6cb26742f6c Mon Sep 17 00:00:00 2001 From: GiGaGon <107241144+MeGaGiGaGon@users.noreply.github.com> Date: Tue, 3 Jun 2025 13:51:18 -0700 Subject: [PATCH 1/5] Update trans.py --- src/black/trans.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/black/trans.py b/src/black/trans.py index fabc7051108..557641202db 100644 --- a/src/black/trans.py +++ b/src/black/trans.py @@ -1307,7 +1307,6 @@ def _prefer_paren_wrap_match(LL: list[Leaf]) -> Optional[int]: def iter_fexpr_spans(s: str) -> Iterator[tuple[int, int]]: """ Yields spans corresponding to expressions in a given f-string. - Spans are half-open ranges (left inclusive, right exclusive). Assumes the input string is a valid f-string, but will not crash if the input string is invalid. """ @@ -1755,7 +1754,7 @@ def _get_illegal_split_indices(self, string: str) -> set[Index]: ] for it in iterators: for begin, end in it: - illegal_indices.update(range(begin, end + 1)) + illegal_indices.update(range(begin, end)) return illegal_indices def _get_break_idx(self, string: str, max_break_idx: int) -> Optional[int]: From 39d3ae1a0b78fc1f18ef9ce192c7d27a49d9bd5c Mon Sep 17 00:00:00 2001 From: GiGaGon <107241144+MeGaGiGaGon@users.noreply.github.com> Date: Tue, 3 Jun 2025 13:59:53 -0700 Subject: [PATCH 2/5] Update preview_long_strings.py --- tests/data/cases/preview_long_strings.py | 32 ++++++++++++------------ 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/tests/data/cases/preview_long_strings.py b/tests/data/cases/preview_long_strings.py index cf1d12b6e3e..a267a509057 100644 --- a/tests/data/cases/preview_long_strings.py +++ b/tests/data/cases/preview_long_strings.py @@ -883,43 +883,43 @@ def foo(): call(body="%s %s" % (",".join(items), suffix)) log.info( - "Skipping:" - f' {desc["db_id"]=} {desc["ms_name"]} {money=} {dte=} {pos_share=} {desc["status"]=} {desc["exposure_max"]=}' + f'Skipping: {desc["db_id"]=} {desc["ms_name"]} {money=} {dte=} {pos_share=}' + f' {desc["status"]=} {desc["exposure_max"]=}' ) log.info( - "Skipping:" - f" {desc['db_id']=} {desc['ms_name']} {money=} {dte=} {pos_share=} {desc['status']=} {desc['exposure_max']=}" + f"Skipping: {desc['db_id']=} {desc['ms_name']} {money=} {dte=} {pos_share=}" + f" {desc['status']=} {desc['exposure_max']=}" ) log.info( - "Skipping:" - f' {desc["db_id"]} {foo("bar",x=123)} {"foo" != "bar"} {(x := "abc=")} {pos_share=} {desc["status"]} {desc["exposure_max"]}' + f'Skipping: {desc["db_id"]} {foo("bar",x=123)} {"foo" != "bar"} {(x := "abc=")}' + f' {pos_share=} {desc["status"]} {desc["exposure_max"]}' ) log.info( - "Skipping:" - f' {desc["db_id"]} {desc["ms_name"]} {money=} {(x := "abc=")=} {pos_share=} {desc["status"]} {desc["exposure_max"]}' + f'Skipping: {desc["db_id"]} {desc["ms_name"]} {money=} {(x := "abc=")=}' + f' {pos_share=} {desc["status"]} {desc["exposure_max"]}' ) log.info( - "Skipping:" - f' {desc["db_id"]} {foo("bar",x=123)=} {money=} {dte=} {pos_share=} {desc["status"]} {desc["exposure_max"]}' + f'Skipping: {desc["db_id"]} {foo("bar",x=123)=} {money=} {dte=} {pos_share=}' + f' {desc["status"]} {desc["exposure_max"]}' ) log.info( - "Skipping:" - f' {foo("asdf")=} {desc["ms_name"]} {money=} {dte=} {pos_share=} {desc["status"]} {desc["exposure_max"]}' + f'Skipping: {foo("asdf")=} {desc["ms_name"]} {money=} {dte=} {pos_share=}' + f' {desc["status"]} {desc["exposure_max"]}' ) log.info( - "Skipping:" - f' {"a" == "b" == "c" == "d"} {desc["ms_name"]} {money=} {dte=} {pos_share=} {desc["status"]} {desc["exposure_max"]}' + f'Skipping: {"a" == "b" == "c" == "d"} {desc["ms_name"]} {money=} {dte=}' + f' {pos_share=} {desc["status"]} {desc["exposure_max"]}' ) log.info( - "Skipping:" - f' {"a" == "b" == "c" == "d"=} {desc["ms_name"]} {money=} {dte=} {pos_share=} {desc["status"]} {desc["exposure_max"]}' + f'Skipping: {"a" == "b" == "c" == "d"=} {desc["ms_name"]} {money=} {dte=}' + f' {pos_share=} {desc["status"]} {desc["exposure_max"]}' ) log.info( From 9735ae88d7f7ef02c08bd338b36cc6dfb01268f3 Mon Sep 17 00:00:00 2001 From: GiGaGon <107241144+MeGaGiGaGon@users.noreply.github.com> Date: Tue, 3 Jun 2025 14:03:56 -0700 Subject: [PATCH 3/5] Update trans.py --- src/black/trans.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/black/trans.py b/src/black/trans.py index 557641202db..f929900bd72 100644 --- a/src/black/trans.py +++ b/src/black/trans.py @@ -1307,6 +1307,7 @@ def _prefer_paren_wrap_match(LL: list[Leaf]) -> Optional[int]: def iter_fexpr_spans(s: str) -> Iterator[tuple[int, int]]: """ Yields spans corresponding to expressions in a given f-string. + Spans are closed ranges (left and right inclusive). Assumes the input string is a valid f-string, but will not crash if the input string is invalid. """ From 4e5d815fc5fabecb3a4ce35f4edb87d4a6be065b Mon Sep 17 00:00:00 2001 From: GiGaGon <107241144+MeGaGiGaGon@users.noreply.github.com> Date: Tue, 3 Jun 2025 14:11:28 -0700 Subject: [PATCH 4/5] Update CHANGES.md --- CHANGES.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index cf415f15fc3..5a65e27e603 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -23,6 +23,8 @@ - Fix a bug where one-liner functions/conditionals marked with `# fmt: skip` would still be formatted (#4552) +- Fix a bug where `string_processing` would not split f-strings directly after + expressions (#4680) ### Configuration From 1e57468cf74a59c8269d8d54eee1b5d8d895e0c1 Mon Sep 17 00:00:00 2001 From: GiGaGon <107241144+MeGaGiGaGon@users.noreply.github.com> Date: Sun, 29 Jun 2025 09:35:37 -0700 Subject: [PATCH 5/5] Update trans.py --- src/black/trans.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/black/trans.py b/src/black/trans.py index f929900bd72..97dd1ce366a 100644 --- a/src/black/trans.py +++ b/src/black/trans.py @@ -1307,7 +1307,7 @@ def _prefer_paren_wrap_match(LL: list[Leaf]) -> Optional[int]: def iter_fexpr_spans(s: str) -> Iterator[tuple[int, int]]: """ Yields spans corresponding to expressions in a given f-string. - Spans are closed ranges (left and right inclusive). + Spans are half-open ranges (left inclusive, right exclusive). Assumes the input string is a valid f-string, but will not crash if the input string is invalid. """