Assignment to env var in Jupyter Notebook doesn't round-trip (#2642)
closes #2641
This commit is contained in:
parent
17e42cb94b
commit
e0253080b0
@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
- Fixed Python 3.10 support on platforms without ProcessPoolExecutor (#2631)
|
- Fixed Python 3.10 support on platforms without ProcessPoolExecutor (#2631)
|
||||||
- Fixed `match` statements with open sequence subjects, like `match a, b:` (#2639)
|
- Fixed `match` statements with open sequence subjects, like `match a, b:` (#2639)
|
||||||
|
- Fixed assignment to environment variables in Jupyter Notebooks (#2642)
|
||||||
|
|
||||||
## 21.11b1
|
## 21.11b1
|
||||||
|
|
||||||
|
@ -403,20 +403,28 @@ def visit_Assign(self, node: ast.Assign) -> None:
|
|||||||
For example,
|
For example,
|
||||||
|
|
||||||
black_version = !black --version
|
black_version = !black --version
|
||||||
|
env = %env var
|
||||||
|
|
||||||
would have been transformed to
|
would have been (respectively) transformed to
|
||||||
|
|
||||||
black_version = get_ipython().getoutput('black --version')
|
black_version = get_ipython().getoutput('black --version')
|
||||||
|
env = get_ipython().run_line_magic('env', 'var')
|
||||||
|
|
||||||
and we look for instances of the latter.
|
and we look for instances of any of the latter.
|
||||||
"""
|
"""
|
||||||
if (
|
if isinstance(node.value, ast.Call) and _is_ipython_magic(node.value.func):
|
||||||
isinstance(node.value, ast.Call)
|
args = _get_str_args(node.value.args)
|
||||||
and _is_ipython_magic(node.value.func)
|
if node.value.func.attr == "getoutput":
|
||||||
and node.value.func.attr == "getoutput"
|
src = f"!{args[0]}"
|
||||||
):
|
elif node.value.func.attr == "run_line_magic":
|
||||||
(arg,) = _get_str_args(node.value.args)
|
src = f"%{args[0]}"
|
||||||
src = f"!{arg}"
|
if args[1]:
|
||||||
|
src += f" {args[1]}"
|
||||||
|
else:
|
||||||
|
raise AssertionError(
|
||||||
|
"Unexpected IPython magic {node.value.func.attr!r} found. "
|
||||||
|
"Please report a bug on https://github.com/psf/black/issues."
|
||||||
|
) from None
|
||||||
self.magics[node.value.lineno].append(
|
self.magics[node.value.lineno].append(
|
||||||
OffsetAndMagic(node.value.col_offset, src)
|
OffsetAndMagic(node.value.col_offset, src)
|
||||||
)
|
)
|
||||||
@ -451,7 +459,6 @@ def visit_Expr(self, node: ast.Expr) -> None:
|
|||||||
else:
|
else:
|
||||||
src = f"%{args[0]}"
|
src = f"%{args[0]}"
|
||||||
if args[1]:
|
if args[1]:
|
||||||
assert src is not None
|
|
||||||
src += f" {args[1]}"
|
src += f" {args[1]}"
|
||||||
elif node.value.func.attr == "system":
|
elif node.value.func.attr == "system":
|
||||||
src = f"!{args[0]}"
|
src = f"!{args[0]}"
|
||||||
|
@ -90,6 +90,10 @@ def test_cell_magic_noop() -> None:
|
|||||||
id="Line magic with argument",
|
id="Line magic with argument",
|
||||||
),
|
),
|
||||||
pytest.param("%time\n'foo'", '%time\n"foo"', id="Line magic without 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:
|
def test_magic(src: str, expected: str) -> None:
|
||||||
|
Loading…
Reference in New Issue
Block a user