Fix formatting cells with magic methods and starting or trailing empty lines (#4484)
This commit is contained in:
parent
9995bffbe4
commit
fff747d61b
@ -10,6 +10,9 @@
|
|||||||
|
|
||||||
<!-- Changes that affect Black's stable style -->
|
<!-- Changes that affect Black's stable style -->
|
||||||
|
|
||||||
|
- Fix formatting cells in IPython notebooks with magic methods and starting or trailing
|
||||||
|
empty lines (#4484)
|
||||||
|
|
||||||
### Preview style
|
### Preview style
|
||||||
|
|
||||||
<!-- Changes that affect Black's preview style -->
|
<!-- Changes that affect Black's preview style -->
|
||||||
|
@ -178,12 +178,14 @@ def mask_cell(src: str) -> tuple[str, list[Replacement]]:
|
|||||||
from IPython.core.inputtransformer2 import TransformerManager
|
from IPython.core.inputtransformer2 import TransformerManager
|
||||||
|
|
||||||
transformer_manager = 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 = transformer_manager.transform_cell(src)
|
||||||
transformed, cell_magic_replacements = replace_cell_magics(transformed)
|
transformed, cell_magic_replacements = replace_cell_magics(transformed)
|
||||||
replacements += cell_magic_replacements
|
replacements += cell_magic_replacements
|
||||||
transformed = transformer_manager.transform_cell(transformed)
|
transformed = transformer_manager.transform_cell(transformed)
|
||||||
transformed, magic_replacements = replace_magics(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.
|
# Multi-line magic, not supported.
|
||||||
raise NothingChanged
|
raise NothingChanged
|
||||||
replacements += magic_replacements
|
replacements += magic_replacements
|
||||||
@ -269,7 +271,7 @@ def replace_magics(src: str) -> tuple[str, list[Replacement]]:
|
|||||||
magic_finder = MagicFinder()
|
magic_finder = MagicFinder()
|
||||||
magic_finder.visit(ast.parse(src))
|
magic_finder.visit(ast.parse(src))
|
||||||
new_srcs = []
|
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:
|
if i in magic_finder.magics:
|
||||||
offsets_and_magics = magic_finder.magics[i]
|
offsets_and_magics = magic_finder.magics[i]
|
||||||
if len(offsets_and_magics) != 1: # pragma: nocover
|
if len(offsets_and_magics) != 1: # pragma: nocover
|
||||||
|
@ -173,6 +173,22 @@ def test_cell_magic_with_magic() -> None:
|
|||||||
assert result == expected
|
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(
|
@pytest.mark.parametrize(
|
||||||
"mode, expected_output, expectation",
|
"mode, expected_output, expectation",
|
||||||
[
|
[
|
||||||
|
Loading…
Reference in New Issue
Block a user