From 17141632cd7d2d3b27b6ffbea0b48b7e78273e60 Mon Sep 17 00:00:00 2001 From: Matej Aleksandrov Date: Mon, 14 Oct 2024 08:22:25 +0000 Subject: [PATCH 1/4] Fix formatting cells with magic methods and starting or trailing empty lines --- src/black/handle_ipynb_magics.py | 6 ++++-- tests/test_ipynb.py | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/black/handle_ipynb_magics.py b/src/black/handle_ipynb_magics.py index 792d22595aa..6b3367ca9db 100644 --- a/src/black/handle_ipynb_magics.py +++ b/src/black/handle_ipynb_magics.py @@ -178,12 +178,14 @@ def mask_cell(src: str) -> tuple[str, list[Replacement]]: from IPython.core.inputtransformer2 import TransformerManager transformer_manager = TransformerManager() + # A side effect of the following transformation is that it also removes any + # empty lines at the beginning of the cell. transformed = transformer_manager.transform_cell(src) transformed, cell_magic_replacements = replace_cell_magics(transformed) replacements += cell_magic_replacements transformed = transformer_manager.transform_cell(transformed) transformed, magic_replacements = replace_magics(transformed) - if len(transformed.splitlines()) != len(src.splitlines()): + if len(transformed.strip().splitlines()) != len(src.strip().splitlines()): # Multi-line magic, not supported. raise NothingChanged replacements += magic_replacements @@ -269,7 +271,7 @@ def replace_magics(src: str) -> tuple[str, list[Replacement]]: magic_finder = MagicFinder() magic_finder.visit(ast.parse(src)) new_srcs = [] - for i, line in enumerate(src.splitlines(), start=1): + for i, line in enumerate(src.split("\n"), start=1): if i in magic_finder.magics: offsets_and_magics = magic_finder.magics[i] if len(offsets_and_magics) != 1: # pragma: nocover diff --git a/tests/test_ipynb.py b/tests/test_ipynb.py index bdc2f27fcdb..3a3cc5fefdb 100644 --- a/tests/test_ipynb.py +++ b/tests/test_ipynb.py @@ -173,6 +173,22 @@ def test_cell_magic_with_magic() -> None: assert result == expected +@pytest.mark.parametrize( + "src, expected", + ( + ("\n\n\n%time \n\n", "%time"), + (" \n\t\n%%timeit -n4 \t \nx=2 \n\r\n", "%%timeit -n4\nx = 2"), + ( + " \t\n\n%%capture \nx=2 \n%config \n\n%env\n\t \n \n\n", + "%%capture\nx = 2\n%config\n\n%env", + ), + ), +) +def test_cell_magic_with_empty_lines(src: str, expected: str) -> None: + result = format_cell(src, fast=True, mode=JUPYTER_MODE) + assert result == expected + + @pytest.mark.parametrize( "mode, expected_output, expectation", [ From 35900df687c4bbd107d106767ee7d69a3fea7a41 Mon Sep 17 00:00:00 2001 From: Matej Aleksandrov Date: Mon, 14 Oct 2024 08:56:49 +0000 Subject: [PATCH 2/4] Add #4484 fix to CHANGES.md --- CHANGES.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index d50bcb49e00..276716f2fa2 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -10,6 +10,8 @@ +- Fix formatting cells with magic methods and starting or trailing empty lines (#4484) + ### Preview style From ebaecd5d17f1c1398c5fbad2f7f66eee787152b3 Mon Sep 17 00:00:00 2001 From: Matej Aleksandrov Date: Mon, 14 Oct 2024 15:42:23 +0200 Subject: [PATCH 3/4] Update CHANGES.md according to code review Co-authored-by: Jelle Zijlstra --- CHANGES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 276716f2fa2..8b4ca6c1ca1 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -10,7 +10,7 @@ -- Fix formatting cells with magic methods and starting or trailing empty lines (#4484) +- Fix formatting cells in IPython notebooks with magic methods and starting or trailing empty lines (#4484) ### Preview style From 694dcb73c1d9afea92bc96d69f38f88b09cc04bc Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 14 Oct 2024 13:43:10 +0000 Subject: [PATCH 4/4] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- CHANGES.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 8b4ca6c1ca1..e2cc70f1661 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -10,7 +10,8 @@ -- Fix formatting cells in IPython notebooks with magic methods and starting or trailing empty lines (#4484) +- Fix formatting cells in IPython notebooks with magic methods and starting or trailing + empty lines (#4484) ### Preview style