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 `match` statements with open sequence subjects, like `match a, b:` (#2639)
|
||||
- Fixed assignment to environment variables in Jupyter Notebooks (#2642)
|
||||
|
||||
## 21.11b1
|
||||
|
||||
|
@ -403,20 +403,28 @@ def visit_Assign(self, node: ast.Assign) -> None:
|
||||
For example,
|
||||
|
||||
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')
|
||||
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 (
|
||||
isinstance(node.value, ast.Call)
|
||||
and _is_ipython_magic(node.value.func)
|
||||
and node.value.func.attr == "getoutput"
|
||||
):
|
||||
(arg,) = _get_str_args(node.value.args)
|
||||
src = f"!{arg}"
|
||||
if isinstance(node.value, ast.Call) and _is_ipython_magic(node.value.func):
|
||||
args = _get_str_args(node.value.args)
|
||||
if node.value.func.attr == "getoutput":
|
||||
src = f"!{args[0]}"
|
||||
elif node.value.func.attr == "run_line_magic":
|
||||
src = f"%{args[0]}"
|
||||
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(
|
||||
OffsetAndMagic(node.value.col_offset, src)
|
||||
)
|
||||
@ -451,7 +459,6 @@ def visit_Expr(self, node: ast.Expr) -> None:
|
||||
else:
|
||||
src = f"%{args[0]}"
|
||||
if args[1]:
|
||||
assert src is not None
|
||||
src += f" {args[1]}"
|
||||
elif node.value.func.attr == "system":
|
||||
src = f"!{args[0]}"
|
||||
|
@ -90,6 +90,10 @@ def test_cell_magic_noop() -> None:
|
||||
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:
|
||||
|
Loading…
Reference in New Issue
Block a user