-import pathlib
+import re
+
from click.testing import CliRunner
from black.handle_ipynb_magics import jupyter_dependencies_are_installed
from black import (
format_file_contents,
format_file_in_place,
)
-import os
import pytest
from black import Mode
from _pytest.monkeypatch import MonkeyPatch
from py.path import local
+from tests.util import DATA_DIR
pytestmark = pytest.mark.jupyter
pytest.importorskip("IPython", reason="IPython is an optional dependency")
id="Line magic with argument",
),
pytest.param("%time\n'foo'", '%time\n"foo"', id="Line magic without argument"),
+ pytest.param(
+ "env = %env var", "env = %env var", id="Assignment to environment variable"
+ ),
+ pytest.param("env = %env", "env = %env", id="Assignment to magic"),
),
)
def test_magic(src: str, expected: str) -> None:
(
"%%bash\n2+2",
"%%html --isolated\n2+2",
+ "%%writefile e.txt\n meh\n meh",
),
)
def test_non_python_magics(src: str) -> None:
def test_cell_magic_with_magic() -> None:
- src = "%%t -n1\nls =!ls"
+ src = "%%timeit -n1\nls =!ls"
result = format_cell(src, fast=True, mode=JUPYTER_MODE)
- expected = "%%t -n1\nls = !ls"
+ expected = "%%timeit -n1\nls = !ls"
assert result == expected
def test_entire_notebook_empty_metadata() -> None:
- with open(
- os.path.join("tests", "data", "notebook_empty_metadata.ipynb"), "rb"
- ) as fd:
+ with open(DATA_DIR / "notebook_empty_metadata.ipynb", "rb") as fd:
content_bytes = fd.read()
content = content_bytes.decode()
result = format_file_contents(content, fast=True, mode=JUPYTER_MODE)
def test_entire_notebook_trailing_newline() -> None:
- with open(
- os.path.join("tests", "data", "notebook_trailing_newline.ipynb"), "rb"
- ) as fd:
+ with open(DATA_DIR / "notebook_trailing_newline.ipynb", "rb") as fd:
content_bytes = fd.read()
content = content_bytes.decode()
result = format_file_contents(content, fast=True, mode=JUPYTER_MODE)
def test_entire_notebook_no_trailing_newline() -> None:
- with open(
- os.path.join("tests", "data", "notebook_no_trailing_newline.ipynb"), "rb"
- ) as fd:
+ with open(DATA_DIR / "notebook_no_trailing_newline.ipynb", "rb") as fd:
content_bytes = fd.read()
content = content_bytes.decode()
result = format_file_contents(content, fast=True, mode=JUPYTER_MODE)
def test_entire_notebook_without_changes() -> None:
- with open(
- os.path.join("tests", "data", "notebook_without_changes.ipynb"), "rb"
- ) as fd:
+ with open(DATA_DIR / "notebook_without_changes.ipynb", "rb") as fd:
content_bytes = fd.read()
content = content_bytes.decode()
with pytest.raises(NothingChanged):
def test_non_python_notebook() -> None:
- with open(os.path.join("tests", "data", "non_python_notebook.ipynb"), "rb") as fd:
+ with open(DATA_DIR / "non_python_notebook.ipynb", "rb") as fd:
content_bytes = fd.read()
content = content_bytes.decode()
with pytest.raises(NothingChanged):
def test_unparseable_notebook() -> None:
- msg = (
- r"File 'tests[/\\]data[/\\]notebook_which_cant_be_parsed\.ipynb' "
- r"cannot be parsed as valid Jupyter notebook\."
- )
+ path = DATA_DIR / "notebook_which_cant_be_parsed.ipynb"
+ msg = rf"File '{re.escape(str(path))}' cannot be parsed as valid Jupyter notebook\."
with pytest.raises(ValueError, match=msg):
- format_file_in_place(
- pathlib.Path("tests") / "data/notebook_which_cant_be_parsed.ipynb",
- fast=True,
- mode=JUPYTER_MODE,
- )
+ format_file_in_place(path, fast=True, mode=JUPYTER_MODE)
def test_ipynb_diff_with_change() -> None:
result = runner.invoke(
main,
[
- os.path.join("tests", "data", "notebook_trailing_newline.ipynb"),
+ str(DATA_DIR / "notebook_trailing_newline.ipynb"),
"--diff",
],
)
result = runner.invoke(
main,
[
- os.path.join("tests", "data", "notebook_without_changes.ipynb"),
+ str(DATA_DIR / "notebook_without_changes.ipynb"),
"--diff",
],
)
) -> None:
# Check that the cache isn't written to if Jupyter dependencies aren't installed.
jupyter_dependencies_are_installed.cache_clear()
- nb = os.path.join("tests", "data", "notebook_trailing_newline.ipynb")
+ nb = DATA_DIR / "notebook_trailing_newline.ipynb"
tmp_nb = tmpdir / "notebook.ipynb"
with open(nb) as src, open(tmp_nb, "w") as dst:
dst.write(src.read())
) -> None:
# Check that the cache isn't written to if Jupyter dependencies aren't installed.
jupyter_dependencies_are_installed.cache_clear()
- nb = os.path.join("tests", "data", "notebook_trailing_newline.ipynb")
+ nb = DATA_DIR / "notebook_trailing_newline.ipynb"
tmp_nb = tmpdir / "notebook.ipynb"
with open(nb) as src, open(tmp_nb, "w") as dst:
dst.write(src.read())
def test_ipynb_flag(tmpdir: local) -> None:
- nb = os.path.join("tests", "data", "notebook_trailing_newline.ipynb")
+ nb = DATA_DIR / "notebook_trailing_newline.ipynb"
tmp_nb = tmpdir / "notebook.a_file_extension_which_is_definitely_not_ipynb"
with open(nb) as src, open(tmp_nb, "w") as dst:
dst.write(src.read())
def test_ipynb_and_pyi_flags() -> None:
- nb = os.path.join("tests", "data", "notebook_trailing_newline.ipynb")
+ nb = DATA_DIR / "notebook_trailing_newline.ipynb"
result = runner.invoke(
main,
[
- nb,
+ str(nb),
"--pyi",
"--ipynb",
"--diff",
assert isinstance(result.exception, SystemExit)
expected = "Cannot pass both `pyi` and `ipynb` flags!\n"
assert result.output == expected
+
+
+def test_unable_to_replace_magics(monkeypatch: MonkeyPatch) -> None:
+ src = "%%time\na = 'foo'"
+ monkeypatch.setattr("black.handle_ipynb_magics.TOKEN_HEX", lambda _: "foo")
+ with pytest.raises(
+ AssertionError, match="Black was not able to replace IPython magic"
+ ):
+ format_cell(src, fast=True, mode=JUPYTER_MODE)