test_magic.py
1548 lines
| 43.3 KiB
| text/x-python
|
PythonLexer
MinRK
|
r6211 | # -*- coding: utf-8 -*- | ||
Nikita Kniazev
|
r27042 | """Tests for various magic functions.""" | ||
Fernando Perez
|
r1762 | |||
Nikita Kniazev
|
r27235 | import gc | ||
MinRK
|
r6211 | import io | ||
Fernando Perez
|
r1848 | import os | ||
Joshua Storck
|
r23624 | import re | ||
Matthias Bussonnier
|
r26854 | import shlex | ||
MinRK
|
r6108 | import sys | ||
Min RK
|
r19557 | import warnings | ||
Srinivas Reddy Thatiparthy
|
r23082 | from importlib import invalidate_caches | ||
from io import StringIO | ||||
Joyce Er
|
r26063 | from pathlib import Path | ||
Matthias Bussonnier
|
r26854 | from textwrap import dedent | ||
from unittest import TestCase, mock | ||||
Thomas Kluyver
|
r7019 | |||
Matthias Bussonnier
|
r26856 | import pytest | ||
Min RK
|
r19557 | from IPython import get_ipython | ||
Fernando Perez
|
r6942 | from IPython.core import magic | ||
mvr
|
r18924 | from IPython.core.error import UsageError | ||
Matthias Bussonnier
|
r26854 | from IPython.core.magic import ( | ||
Magics, | ||||
cell_magic, | ||||
line_magic, | ||||
magics_class, | ||||
register_cell_magic, | ||||
register_line_magic, | ||||
) | ||||
from IPython.core.magics import code, execution, logging, osm, script | ||||
Fernando Perez
|
r1762 | from IPython.testing import decorators as dec | ||
Fernando Perez
|
r1955 | from IPython.testing import tools as tt | ||
MinRK
|
r10996 | from IPython.utils.io import capture_output | ||
MinRK
|
r7407 | from IPython.utils.process import find_cmd | ||
Matthias Bussonnier
|
r26854 | from IPython.utils.tempdir import TemporaryDirectory, TemporaryWorkingDirectory | ||
Matthias Bussonnier
|
r27503 | from IPython.utils.syspathcontext import prepended_to_syspath | ||
Fernando Perez
|
r1955 | |||
Matthias Bussonnier
|
r26854 | from .test_debugger import PdbTestInput | ||
Matthias Bussonnier
|
r26297 | |||
Matthias Bussonnier
|
r27503 | from tempfile import NamedTemporaryFile | ||
Thomas Kluyver
|
r13366 | |||
Fernando Perez
|
r6973 | @magic.magics_class | ||
Fernando Perez
|
r6943 | class DummyMagics(magic.Magics): pass | ||
MinRK
|
r6211 | |||
MartÃn Gaitán
|
r12835 | def test_extract_code_ranges(): | ||
instr = "1 3 5-6 7-9 10:15 17: :10 10- -13 :" | ||||
Samuel Gaist
|
r26902 | expected = [ | ||
(0, 1), | ||||
(2, 3), | ||||
(4, 6), | ||||
(6, 9), | ||||
(9, 14), | ||||
(16, None), | ||||
(None, 9), | ||||
(9, None), | ||||
(None, 13), | ||||
(None, None), | ||||
] | ||||
MartÃn Gaitán
|
r12835 | actual = list(code.extract_code_ranges(instr)) | ||
Samuel Gaist
|
r26902 | assert actual == expected | ||
MartÃn Gaitán
|
r12835 | |||
MartÃn Gaitán
|
r12841 | def test_extract_symbols(): | ||
MartÃn Gaitán
|
r12848 | source = """import foo\na = 10\ndef b():\n return 42\n\n\nclass A: pass\n\n\n""" | ||
MartÃn Gaitán
|
r12841 | symbols_args = ["a", "b", "A", "A,b", "A,a", "z"] | ||
MartÃn Gaitán
|
r12920 | expected = [([], ['a']), | ||
(["def b():\n return 42\n"], []), | ||||
(["class A: pass\n"], []), | ||||
(["class A: pass\n", "def b():\n return 42\n"], []), | ||||
(["class A: pass\n"], ['a']), | ||||
([], ['z'])] | ||||
MartÃn Gaitán
|
r12841 | for symbols, exp in zip(symbols_args, expected): | ||
Samuel Gaist
|
r26902 | assert code.extract_symbols(source, symbols) == exp | ||
MartÃn Gaitán
|
r12841 | |||
MartÃn Gaitán
|
r12945 | def test_extract_symbols_raises_exception_with_non_python_code(): | ||
MartÃn Gaitán
|
r12841 | source = ("=begin A Ruby program :)=end\n" | ||
"def hello\n" | ||||
"puts 'Hello world'\n" | ||||
"end") | ||||
Samuel Gaist
|
r26902 | with pytest.raises(SyntaxError): | ||
MartÃn Gaitán
|
r12945 | code.extract_symbols(source, "hello") | ||
MartÃn Gaitán
|
r12841 | |||
Min RK
|
r23833 | |||
def test_magic_not_found(): | ||||
# magic not found raises UsageError | ||||
Samuel Gaist
|
r26902 | with pytest.raises(UsageError): | ||
Matthias Bussonnier
|
r27814 | _ip.run_line_magic("doesntexist", "") | ||
Min RK
|
r23833 | |||
# ensure result isn't success when a magic isn't found | ||||
result = _ip.run_cell('%doesntexist') | ||||
assert isinstance(result.error_in_exec, UsageError) | ||||
def test_cell_magic_not_found(): | ||||
# magic not found raises UsageError | ||||
Samuel Gaist
|
r26902 | with pytest.raises(UsageError): | ||
Min RK
|
r23833 | _ip.run_cell_magic('doesntexist', 'line', 'cell') | ||
# ensure result isn't success when a magic isn't found | ||||
result = _ip.run_cell('%%doesntexist') | ||||
assert isinstance(result.error_in_exec, UsageError) | ||||
def test_magic_error_status(): | ||||
def fail(shell): | ||||
1/0 | ||||
_ip.register_magic_function(fail) | ||||
result = _ip.run_cell('%fail') | ||||
assert isinstance(result.error_in_exec, ZeroDivisionError) | ||||
Matthias BUSSONNIER
|
r13237 | def test_config(): | ||
""" test that config magic does not raise | ||||
can happen if Configurable init is moved too early into | ||||
luzpaz
|
r24084 | Magics.__init__ as then a Config object will be registered as a | ||
Matthias BUSSONNIER
|
r13237 | magic. | ||
""" | ||||
## should not raise. | ||||
Matthias Bussonnier
|
r27814 | _ip.run_line_magic("config", "") | ||
MartÃn Gaitán
|
r12841 | |||
Sang Min Park
|
r23617 | def test_config_available_configs(): | ||
""" test that config magic prints available configs in unique and | ||||
sorted order. """ | ||||
with capture_output() as captured: | ||||
Matthias Bussonnier
|
r27814 | _ip.run_line_magic("config", "") | ||
Sang Min Park
|
r23617 | |||
stdout = captured.stdout | ||||
config_classes = stdout.strip().split('\n')[1:] | ||||
Samuel Gaist
|
r26902 | assert config_classes == sorted(set(config_classes)) | ||
Sang Min Park
|
r23617 | |||
def test_config_print_class(): | ||||
""" test that config with a classname prints the class's options. """ | ||||
with capture_output() as captured: | ||||
Matthias Bussonnier
|
r27814 | _ip.run_line_magic("config", "TerminalInteractiveShell") | ||
Sang Min Park
|
r23617 | |||
stdout = captured.stdout | ||||
Nikita Kniazev
|
r27087 | assert re.match( | ||
"TerminalInteractiveShell.* options", stdout.splitlines()[0] | ||||
), f"{stdout}\n\n1st line of stdout not like 'TerminalInteractiveShell.* options'" | ||||
Sang Min Park
|
r23617 | |||
Ville M. Vainio
|
r1735 | def test_rehashx(): | ||
# clear up everything | ||||
Thomas Kluyver
|
r12601 | _ip.alias_manager.clear_aliases() | ||
Ville M. Vainio
|
r1735 | del _ip.db['syscmdlist'] | ||
Samuel Gaist
|
r26902 | |||
Matthias Bussonnier
|
r27814 | _ip.run_line_magic("rehashx", "") | ||
Ville M. Vainio
|
r1735 | # Practically ALL ipython development systems will have more than 10 aliases | ||
Samuel Gaist
|
r26902 | assert len(_ip.alias_manager.aliases) > 10 | ||
Thomas Kluyver
|
r12601 | for name, cmd in _ip.alias_manager.aliases: | ||
Ville M. Vainio
|
r1735 | # we must strip dots from alias names | ||
Samuel Gaist
|
r26902 | assert "." not in name | ||
Ville M. Vainio
|
r1735 | |||
# rehashx must fill up syscmdlist | ||||
scoms = _ip.db['syscmdlist'] | ||||
Samuel Gaist
|
r26902 | assert len(scoms) > 10 | ||
Fernando Perez
|
r1762 | |||
Fernando Perez
|
r2450 | def test_magic_parse_options(): | ||
"""Test that we don't mangle paths when parsing magic options.""" | ||||
ip = get_ipython() | ||||
path = 'c:\\x' | ||||
Fernando Perez
|
r6943 | m = DummyMagics(ip) | ||
Fernando Perez
|
r6942 | opts = m.parse_options('-f %s' % path,'f:')[0] | ||
Fernando Perez
|
r2450 | # argv splitting is os-dependent | ||
if os.name == 'posix': | ||||
expected = 'c:x' | ||||
else: | ||||
expected = path | ||||
Samuel Gaist
|
r26902 | assert opts["f"] == expected | ||
Fernando Perez
|
r2450 | |||
MinRK
|
r7041 | def test_magic_parse_long_options(): | ||
"""Magic.parse_options can handle --foo=bar long options""" | ||||
ip = get_ipython() | ||||
m = DummyMagics(ip) | ||||
Samuel Gaist
|
r26902 | opts, _ = m.parse_options("--foo --bar=bubble", "a", "foo", "bar=") | ||
assert "foo" in opts | ||||
assert "bar" in opts | ||||
assert opts["bar"] == "bubble" | ||||
MinRK
|
r7041 | |||
MinRK
|
r5147 | |||
Fernando Perez
|
r1762 | def doctest_hist_f(): | ||
"""Test %hist -f with temporary filename. | ||||
In [9]: import tempfile | ||||
In [10]: tfile = tempfile.mktemp('.py','tmp-ipython-') | ||||
Thomas Kluyver
|
r3396 | In [11]: %hist -nl -f $tfile 3 | ||
Fernando Perez
|
r2450 | |||
In [13]: import os; os.unlink(tfile) | ||||
Fernando Perez
|
r1762 | """ | ||
Fernando Perez
|
r2441 | def doctest_hist_op(): | ||
"""Test %hist -op | ||||
Thomas Kluyver
|
r4895 | In [1]: class b(float): | ||
...: pass | ||||
Samuel Gaist
|
r26902 | ...: | ||
Fernando Perez
|
r2441 | |||
Thomas Kluyver
|
r4895 | In [2]: class s(object): | ||
...: def __str__(self): | ||||
...: return 's' | ||||
Samuel Gaist
|
r26902 | ...: | ||
Fernando Perez
|
r2441 | |||
Samuel Gaist
|
r26902 | In [3]: | ||
Fernando Perez
|
r2441 | |||
In [4]: class r(b): | ||||
Thomas Kluyver
|
r4895 | ...: def __repr__(self): | ||
...: return 'r' | ||||
Samuel Gaist
|
r26902 | ...: | ||
Fernando Perez
|
r2441 | |||
In [5]: class sr(s,r): pass | ||||
Samuel Gaist
|
r26902 | ...: | ||
Fernando Perez
|
r2441 | |||
Samuel Gaist
|
r26902 | In [6]: | ||
Fernando Perez
|
r2441 | |||
In [7]: bb=b() | ||||
In [8]: ss=s() | ||||
In [9]: rr=r() | ||||
In [10]: ssrr=sr() | ||||
Thomas Kluyver
|
r4895 | In [11]: 4.5 | ||
Out[11]: 4.5 | ||||
Fernando Perez
|
r2441 | |||
Thomas Kluyver
|
r4895 | In [12]: str(ss) | ||
Out[12]: 's' | ||||
Fernando Perez
|
r2441 | |||
Samuel Gaist
|
r26902 | In [13]: | ||
Fernando Perez
|
r2441 | |||
In [14]: %hist -op | ||||
>>> class b: | ||||
... pass | ||||
Samuel Gaist
|
r26902 | ... | ||
Fernando Perez
|
r2441 | >>> class s(b): | ||
... def __str__(self): | ||||
... return 's' | ||||
Samuel Gaist
|
r26902 | ... | ||
>>> | ||||
Fernando Perez
|
r2441 | >>> class r(b): | ||
... def __repr__(self): | ||||
... return 'r' | ||||
Samuel Gaist
|
r26902 | ... | ||
Fernando Perez
|
r2441 | >>> class sr(s,r): pass | ||
Samuel Gaist
|
r26902 | >>> | ||
Fernando Perez
|
r2441 | >>> bb=b() | ||
>>> ss=s() | ||||
>>> rr=r() | ||||
>>> ssrr=sr() | ||||
Thomas Kluyver
|
r4895 | >>> 4.5 | ||
4.5 | ||||
>>> str(ss) | ||||
's' | ||||
Samuel Gaist
|
r26902 | >>> | ||
Fernando Perez
|
r2441 | """ | ||
MinRK
|
r5147 | |||
Thomas Kluyver
|
r16712 | def test_hist_pof(): | ||
ip = get_ipython() | ||||
Samuel Gaist
|
r26902 | ip.run_cell("1+2", store_history=True) | ||
Thomas Kluyver
|
r16712 | #raise Exception(ip.history_manager.session_number) | ||
#raise Exception(list(ip.history_manager._get_range_session())) | ||||
with TemporaryDirectory() as td: | ||||
tf = os.path.join(td, 'hist.py') | ||||
ip.run_line_magic('history', '-pof %s' % tf) | ||||
assert os.path.isfile(tf) | ||||
MinRK
|
r5147 | |||
Thomas Kluyver
|
r3385 | def test_macro(): | ||
ip = get_ipython() | ||||
ip.history_manager.reset() # Clear any existing history. | ||||
cmds = ["a=1", "def b():\n return a**2", "print(a,b())"] | ||||
Thomas Kluyver
|
r3396 | for i, cmd in enumerate(cmds, start=1): | ||
ip.history_manager.store_inputs(i, cmd) | ||||
Matthias Bussonnier
|
r27814 | ip.run_line_magic("macro", "test 1-3") | ||
Samuel Gaist
|
r26902 | assert ip.user_ns["test"].value == "\n".join(cmds) + "\n" | ||
MinRK
|
r11061 | # List macros | ||
Matthias Bussonnier
|
r27814 | assert "test" in ip.run_line_magic("macro", "") | ||
Fernando Perez
|
r2392 | |||
MinRK
|
r5147 | |||
Thomas Kluyver
|
r3414 | def test_macro_run(): | ||
"""Test that we can run a multi-line macro successfully.""" | ||||
ip = get_ipython() | ||||
ip.history_manager.reset() | ||||
Matthias Bussonnier
|
r24265 | cmds = ["a=10", "a+=1", "print(a)", "%macro test 2-3"] | ||
Thomas Kluyver
|
r3414 | for cmd in cmds: | ||
Thomas Kluyver
|
r4995 | ip.run_cell(cmd, store_history=True) | ||
Samuel Gaist
|
r26902 | assert ip.user_ns["test"].value == "a+=1\nprint(a)\n" | ||
Thomas Kluyver
|
r4903 | with tt.AssertPrints("12"): | ||
Thomas Kluyver
|
r3414 | ip.run_cell("test") | ||
Thomas Kluyver
|
r4903 | with tt.AssertPrints("13"): | ||
Thomas Kluyver
|
r3414 | ip.run_cell("test") | ||
Fernando Perez
|
r2092 | |||
MinRK
|
r10996 | def test_magic_magic(): | ||
"""Test %magic""" | ||||
ip = get_ipython() | ||||
with capture_output() as captured: | ||||
Matthias Bussonnier
|
r27814 | ip.run_line_magic("magic", "") | ||
Samuel Gaist
|
r26902 | |||
MinRK
|
r10996 | stdout = captured.stdout | ||
Samuel Gaist
|
r26902 | assert "%magic" in stdout | ||
assert "IPython" in stdout | ||||
assert "Available" in stdout | ||||
MinRK
|
r10996 | |||
Paul Ivanov
|
r5939 | @dec.skipif_not_numpy | ||
Paul Ivanov
|
r5965 | def test_numpy_reset_array_undec(): | ||
"Test '%reset array' functionality" | ||||
Samuel Gaist
|
r26902 | _ip.ex("import numpy as np") | ||
_ip.ex("a = np.empty(2)") | ||||
assert "a" in _ip.user_ns | ||||
Matthias Bussonnier
|
r27814 | _ip.run_line_magic("reset", "-f array") | ||
Samuel Gaist
|
r26902 | assert "a" not in _ip.user_ns | ||
Paul Ivanov
|
r5939 | |||
Paul Ivanov
|
r5976 | def test_reset_out(): | ||
"Test '%reset out' magic" | ||||
Paul Ivanov
|
r5939 | _ip.run_cell("parrot = 'dead'", store_history=True) | ||
Paul Ivanov
|
r5965 | # test '%reset -f out', make an Out prompt | ||
Paul Ivanov
|
r5939 | _ip.run_cell("parrot", store_history=True) | ||
Samuel Gaist
|
r26902 | assert "dead" in [_ip.user_ns[x] for x in ("_", "__", "___")] | ||
Matthias Bussonnier
|
r27814 | _ip.run_line_magic("reset", "-f out") | ||
Samuel Gaist
|
r26902 | assert "dead" not in [_ip.user_ns[x] for x in ("_", "__", "___")] | ||
assert len(_ip.user_ns["Out"]) == 0 | ||||
Paul Ivanov
|
r5939 | |||
Paul Ivanov
|
r5976 | def test_reset_in(): | ||
"Test '%reset in' magic" | ||||
Paul Ivanov
|
r5965 | # test '%reset -f in' | ||
Paul Ivanov
|
r5939 | _ip.run_cell("parrot", store_history=True) | ||
Samuel Gaist
|
r26902 | assert "parrot" in [_ip.user_ns[x] for x in ("_i", "_ii", "_iii")] | ||
Matthias Bussonnier
|
r27814 | _ip.run_line_magic("reset", "-f in") | ||
Samuel Gaist
|
r26902 | assert "parrot" not in [_ip.user_ns[x] for x in ("_i", "_ii", "_iii")] | ||
assert len(set(_ip.user_ns["In"])) == 1 | ||||
Paul Ivanov
|
r5939 | |||
Paul Ivanov
|
r5976 | def test_reset_dhist(): | ||
"Test '%reset dhist' magic" | ||||
Samuel Gaist
|
r26902 | _ip.run_cell("tmp = [d for d in _dh]") # copy before clearing | ||
Matthias Bussonnier
|
r27814 | _ip.run_line_magic("cd", os.path.dirname(pytest.__file__)) | ||
_ip.run_line_magic("cd", "-") | ||||
Samuel Gaist
|
r26902 | assert len(_ip.user_ns["_dh"]) > 0 | ||
Matthias Bussonnier
|
r27814 | _ip.run_line_magic("reset", "-f dhist") | ||
Samuel Gaist
|
r26902 | assert len(_ip.user_ns["_dh"]) == 0 | ||
_ip.run_cell("_dh = [d for d in tmp]") # restore | ||||
Fernando Perez
|
r1762 | |||
Paul Ivanov
|
r5976 | def test_reset_in_length(): | ||
"Test that '%reset in' preserves In[] length" | ||||
Paul Ivanov
|
r5957 | _ip.run_cell("print 'foo'") | ||
Paul Ivanov
|
r5965 | _ip.run_cell("reset -f in") | ||
Samuel Gaist
|
r26902 | assert len(_ip.user_ns["In"]) == _ip.displayhook.prompt_count + 1 | ||
Fernando Perez
|
r1762 | |||
Matthias Bussonnier
|
r25151 | class TestResetErrors(TestCase): | ||
def test_reset_redefine(self): | ||||
@magics_class | ||||
class KernelMagics(Magics): | ||||
@line_magic | ||||
def less(self, shell): pass | ||||
_ip.register_magics(KernelMagics) | ||||
with self.assertLogs() as cm: | ||||
# hack, we want to just capture logs, but assertLogs fails if not | ||||
# logs get produce. | ||||
# so log one things we ignore. | ||||
import logging as log_mod | ||||
log = log_mod.getLogger() | ||||
log.info('Nothing') | ||||
# end hack. | ||||
_ip.run_cell("reset -f") | ||||
assert len(cm.output) == 1 | ||||
for out in cm.output: | ||||
assert "Invalid alias" not in out | ||||
MinRK
|
r6108 | def test_tb_syntaxerror(): | ||
"""test %tb after a SyntaxError""" | ||||
ip = get_ipython() | ||||
ip.run_cell("for") | ||||
Samuel Gaist
|
r26902 | |||
MinRK
|
r6108 | # trap and validate stdout | ||
save_stdout = sys.stdout | ||||
try: | ||||
sys.stdout = StringIO() | ||||
ip.run_cell("%tb") | ||||
out = sys.stdout.getvalue() | ||||
finally: | ||||
sys.stdout = save_stdout | ||||
# trim output, and only check the last line | ||||
last_line = out.rstrip().splitlines()[-1].strip() | ||||
Samuel Gaist
|
r26902 | assert last_line == "SyntaxError: invalid syntax" | ||
MinRK
|
r6108 | |||
Fernando Perez
|
r2411 | |||
Thomas Kluyver
|
r8216 | def test_time(): | ||
ip = get_ipython() | ||||
Samuel Gaist
|
r26902 | |||
Jan Schulz
|
r9728 | with tt.AssertPrints("Wall time: "): | ||
Thomas Kluyver
|
r8216 | ip.run_cell("%time None") | ||
Samuel Gaist
|
r26902 | |||
Thomas Kluyver
|
r8216 | ip.run_cell("def f(kmjy):\n" | ||
" %time print (2*kmjy)") | ||||
Samuel Gaist
|
r26902 | |||
Jan Schulz
|
r9728 | with tt.AssertPrints("Wall time: "): | ||
Thomas Kluyver
|
r8216 | with tt.AssertPrints("hihi", suppress=False): | ||
ip.run_cell("f('hi')") | ||||
Fernando Perez
|
r2650 | |||
nfgf
|
r27890 | |||
nfgf
|
r27889 | # ';' at the end of %time prevents instruction value to be printed. | ||
nfgf
|
r27891 | # This tests fix for #13837. | ||
nfgf
|
r27900 | def test_time_no_output_with_semicolon(): | ||
nfgf
|
r27889 | ip = get_ipython() | ||
nfgf
|
r27948 | # Test %time cases | ||
nfgf
|
r27889 | with tt.AssertPrints(" 123456"): | ||
with tt.AssertPrints("Wall time: ", suppress=False): | ||||
with tt.AssertPrints("CPU times: ", suppress=False): | ||||
ip.run_cell("%time 123000+456") | ||||
with tt.AssertNotPrints(" 123456"): | ||||
with tt.AssertPrints("Wall time: ", suppress=False): | ||||
with tt.AssertPrints("CPU times: ", suppress=False): | ||||
ip.run_cell("%time 123000+456;") | ||||
nfgf
|
r27900 | with tt.AssertPrints(" 123456"): | ||
with tt.AssertPrints("Wall time: ", suppress=False): | ||||
with tt.AssertPrints("CPU times: ", suppress=False): | ||||
ip.run_cell("%time 123000+456 # Comment") | ||||
with tt.AssertNotPrints(" 123456"): | ||||
with tt.AssertPrints("Wall time: ", suppress=False): | ||||
with tt.AssertPrints("CPU times: ", suppress=False): | ||||
ip.run_cell("%time 123000+456; # Comment") | ||||
with tt.AssertPrints(" 123456"): | ||||
with tt.AssertPrints("Wall time: ", suppress=False): | ||||
with tt.AssertPrints("CPU times: ", suppress=False): | ||||
ip.run_cell("%time 123000+456 # ;Comment") | ||||
nfgf
|
r27948 | # Test %%time cases | ||
with tt.AssertPrints("123456"): | ||||
with tt.AssertPrints("Wall time: ", suppress=False): | ||||
with tt.AssertPrints("CPU times: ", suppress=False): | ||||
ip.run_cell("%%time\n123000+456\n\n\n") | ||||
with tt.AssertNotPrints("123456"): | ||||
with tt.AssertPrints("Wall time: ", suppress=False): | ||||
with tt.AssertPrints("CPU times: ", suppress=False): | ||||
ip.run_cell("%%time\n123000+456;\n\n\n") | ||||
with tt.AssertPrints("123456"): | ||||
with tt.AssertPrints("Wall time: ", suppress=False): | ||||
with tt.AssertPrints("CPU times: ", suppress=False): | ||||
ip.run_cell("%%time\n123000+456 # Comment\n\n\n") | ||||
with tt.AssertNotPrints("123456"): | ||||
with tt.AssertPrints("Wall time: ", suppress=False): | ||||
with tt.AssertPrints("CPU times: ", suppress=False): | ||||
ip.run_cell("%%time\n123000+456; # Comment\n\n\n") | ||||
with tt.AssertPrints("123456"): | ||||
with tt.AssertPrints("Wall time: ", suppress=False): | ||||
with tt.AssertPrints("CPU times: ", suppress=False): | ||||
ip.run_cell("%%time\n123000+456 # ;Comment\n\n\n") | ||||
nfgf
|
r27890 | |||
Matthias Bussonnier
|
r25131 | def test_time_last_not_expression(): | ||
ip.run_cell("%%time\n" | ||||
"var_1 = 1\n" | ||||
"var_2 = 2\n") | ||||
assert ip.user_ns['var_1'] == 1 | ||||
del ip.user_ns['var_1'] | ||||
assert ip.user_ns['var_2'] == 2 | ||||
del ip.user_ns['var_2'] | ||||
Samuel Gaist
|
r26902 | |||
Jan Schulz
|
r9728 | |||
@dec.skip_win32 | ||||
def test_time2(): | ||||
ip = get_ipython() | ||||
Samuel Gaist
|
r26902 | |||
Jan Schulz
|
r9728 | with tt.AssertPrints("CPU times: user "): | ||
ip.run_cell("%time None") | ||||
Thomas Kluyver
|
r10671 | def test_time3(): | ||
"""Erroneous magic function calls, issue gh-3334""" | ||||
ip = get_ipython() | ||||
ip.user_ns.pop('run', None) | ||||
Samuel Gaist
|
r26902 | |||
Thomas Kluyver
|
r10671 | with tt.AssertNotPrints("not found", channel='stderr'): | ||
ip.run_cell("%%time\n" | ||||
"run = 0\n" | ||||
"run += 1") | ||||
Matthias Bussonnier
|
r25040 | def test_multiline_time(): | ||
"""Make sure last statement from time return a value.""" | ||||
ip = get_ipython() | ||||
ip.user_ns.pop('run', None) | ||||
Matthias Bussonnier
|
r27639 | ip.run_cell( | ||
dedent( | ||||
"""\ | ||||
Matthias Bussonnier
|
r25040 | %%time | ||
a = "ho" | ||||
b = "hey" | ||||
a+b | ||||
Samuel Gaist
|
r26902 | """ | ||
) | ||||
) | ||||
assert ip.user_ns_hidden["_"] == "hohey" | ||||
Matthias Bussonnier
|
r25040 | |||
Matthias Bussonnier
|
r25007 | def test_time_local_ns(): | ||
""" | ||||
Test that local_ns is actually global_ns when running a cell magic | ||||
""" | ||||
ip = get_ipython() | ||||
Samuel Gaist
|
r26902 | ip.run_cell("%%time\n" "myvar = 1") | ||
assert ip.user_ns["myvar"] == 1 | ||||
del ip.user_ns["myvar"] | ||||
Matthias Bussonnier
|
r25007 | |||
nfgf
|
r28110 | # Test %%capture magic. Added to test issue #13926 | ||
def test_capture(): | ||||
ip = get_ipython() | ||||
# Test %%capture nominal case | ||||
ip.run_cell("%%capture abc\n1+2") | ||||
with tt.AssertPrints("True", suppress=False): | ||||
ip.run_cell("'abc' in locals()") | ||||
with tt.AssertPrints("True", suppress=False): | ||||
ip.run_cell("'outputs' in dir(abc)") | ||||
with tt.AssertPrints("3", suppress=False): | ||||
ip.run_cell("abc.outputs[0]") | ||||
# Test %%capture with ';' at end of expression | ||||
ip.run_cell("%%capture abc\n7+8;") | ||||
with tt.AssertPrints("False", suppress=False): | ||||
ip.run_cell("'abc' in locals()") | ||||
Fernando Perez
|
r2426 | def test_doctest_mode(): | ||
"Toggle doctest_mode twice, it should be a no-op and run without error" | ||||
Matthias Bussonnier
|
r27814 | _ip.run_line_magic("doctest_mode", "") | ||
_ip.run_line_magic("doctest_mode", "") | ||||
Fernando Perez
|
r2650 | |||
def test_parse_options(): | ||||
"""Tests for basic options parsing in magics.""" | ||||
# These are only the most minimal of tests, more should be added later. At | ||||
# the very least we check that basic text/unicode calls work OK. | ||||
Fernando Perez
|
r6943 | m = DummyMagics(_ip) | ||
Samuel Gaist
|
r26902 | assert m.parse_options("foo", "")[1] == "foo" | ||
assert m.parse_options("foo", "")[1] == "foo" | ||||
Fernando Perez
|
r2650 | |||
Reuben Morais
|
r24831 | |||
Aditya Sathe
|
r26221 | def test_parse_options_preserve_non_option_string(): | ||
"""Test to assert preservation of non-option part of magic-block, while parsing magic options.""" | ||||
m = DummyMagics(_ip) | ||||
Aditya Sathe
|
r26222 | opts, stmt = m.parse_options( | ||
" -n1 -r 13 _ = 314 + foo", "n:r:", preserve_non_opts=True | ||||
) | ||||
Samuel Gaist
|
r26902 | assert opts == {"n": "1", "r": "13"} | ||
assert stmt == "_ = 314 + foo" | ||||
Aditya Sathe
|
r26221 | |||
def test_run_magic_preserve_code_block(): | ||||
"""Test to assert preservation of non-option part of magic-block, while running magic.""" | ||||
Aditya Sathe
|
r26222 | _ip.user_ns["spaces"] = [] | ||
Matthias Bussonnier
|
r27814 | _ip.run_line_magic( | ||
"timeit", "-n1 -r1 spaces.append([s.count(' ') for s in ['document']])" | ||||
) | ||||
Aditya Sathe
|
r26222 | assert _ip.user_ns["spaces"] == [[0]] | ||
Aditya Sathe
|
r26221 | |||
Fernando Perez
|
r2650 | def test_dirops(): | ||
"""Test various directory handling operations.""" | ||||
Srinivas Reddy Thatiparthy
|
r23045 | # curpath = lambda :os.path.splitdrive(os.getcwd())[1].replace('\\','/') | ||
curpath = os.getcwd | ||||
startdir = os.getcwd() | ||||
Gabriel
|
r5663 | ipdir = os.path.realpath(_ip.ipython_dir) | ||
Fernando Perez
|
r2650 | try: | ||
Matthias Bussonnier
|
r27814 | _ip.run_line_magic("cd", '"%s"' % ipdir) | ||
Samuel Gaist
|
r26902 | assert curpath() == ipdir | ||
Matthias Bussonnier
|
r27814 | _ip.run_line_magic("cd", "-") | ||
Samuel Gaist
|
r26902 | assert curpath() == startdir | ||
Matthias Bussonnier
|
r27814 | _ip.run_line_magic("pushd", '"%s"' % ipdir) | ||
Samuel Gaist
|
r26902 | assert curpath() == ipdir | ||
Matthias Bussonnier
|
r27814 | _ip.run_line_magic("popd", "") | ||
Samuel Gaist
|
r26902 | assert curpath() == startdir | ||
Fernando Perez
|
r2650 | finally: | ||
os.chdir(startdir) | ||||
Fernando Perez
|
r2655 | |||
Reuben Morais
|
r24831 | def test_cd_force_quiet(): | ||
"""Test OSMagics.cd_force_quiet option""" | ||||
_ip.config.OSMagics.cd_force_quiet = True | ||||
osmagics = osm.OSMagics(shell=_ip) | ||||
startdir = os.getcwd() | ||||
ipdir = os.path.realpath(_ip.ipython_dir) | ||||
try: | ||||
with tt.AssertNotPrints(ipdir): | ||||
osmagics.cd('"%s"' % ipdir) | ||||
with tt.AssertNotPrints(startdir): | ||||
osmagics.cd('-') | ||||
finally: | ||||
os.chdir(startdir) | ||||
Fernando Perez
|
r3146 | def test_xmode(): | ||
# Calling xmode three times should be a no-op | ||||
xmode = _ip.InteractiveTB.mode | ||||
Dan Allan
|
r24851 | for i in range(4): | ||
Matthias Bussonnier
|
r27814 | _ip.run_line_magic("xmode", "") | ||
Samuel Gaist
|
r26902 | assert _ip.InteractiveTB.mode == xmode | ||
Thomas Kluyver
|
r3522 | def test_reset_hard(): | ||
monitor = [] | ||||
class A(object): | ||||
def __del__(self): | ||||
monitor.append(1) | ||||
def __repr__(self): | ||||
return "<A instance>" | ||||
Samuel Gaist
|
r26902 | |||
Thomas Kluyver
|
r3522 | _ip.user_ns["a"] = A() | ||
_ip.run_cell("a") | ||||
Samuel Gaist
|
r26902 | |||
assert monitor == [] | ||||
Matthias Bussonnier
|
r27814 | _ip.run_line_magic("reset", "-f") | ||
Samuel Gaist
|
r26902 | assert monitor == [1] | ||
Thomas Kluyver
|
r3824 | class TestXdel(tt.TempFileMixin): | ||
def test_xdel(self): | ||||
"""Test that references from %run are cleared by xdel.""" | ||||
src = ("class A(object):\n" | ||||
" monitor = []\n" | ||||
" def __del__(self):\n" | ||||
" self.monitor.append(1)\n" | ||||
"a = A()\n") | ||||
self.mktmp(src) | ||||
Thomas Kluyver
|
r3832 | # %run creates some hidden references... | ||
Matthias Bussonnier
|
r27814 | _ip.run_line_magic("run", "%s" % self.fname) | ||
Thomas Kluyver
|
r3832 | # ... as does the displayhook. | ||
Thomas Kluyver
|
r3824 | _ip.run_cell("a") | ||
Samuel Gaist
|
r26902 | |||
Thomas Kluyver
|
r3824 | monitor = _ip.user_ns["A"].monitor | ||
Samuel Gaist
|
r26902 | assert monitor == [] | ||
Matthias Bussonnier
|
r27814 | _ip.run_line_magic("xdel", "a") | ||
Samuel Gaist
|
r26902 | |||
Thomas Kluyver
|
r3832 | # Check that a's __del__ method has been called. | ||
Nikita Kniazev
|
r27235 | gc.collect(0) | ||
Samuel Gaist
|
r26902 | assert monitor == [1] | ||
MinRK
|
r3332 | |||
def doctest_who(): | ||||
"""doctest for %who | ||||
Samuel Gaist
|
r26902 | |||
Nikita Kniazev
|
r26996 | In [1]: %reset -sf | ||
Samuel Gaist
|
r26902 | |||
MinRK
|
r3332 | In [2]: alpha = 123 | ||
Samuel Gaist
|
r26902 | |||
MinRK
|
r3332 | In [3]: beta = 'beta' | ||
Samuel Gaist
|
r26902 | |||
MinRK
|
r3332 | In [4]: %who int | ||
alpha | ||||
Samuel Gaist
|
r26902 | |||
MinRK
|
r3332 | In [5]: %who str | ||
beta | ||||
Samuel Gaist
|
r26902 | |||
MinRK
|
r3332 | In [6]: %whos | ||
Variable Type Data/Info | ||||
---------------------------- | ||||
alpha int 123 | ||||
beta str beta | ||||
Samuel Gaist
|
r26902 | |||
MinRK
|
r3332 | In [7]: %who_ls | ||
Out[7]: ['alpha', 'beta'] | ||||
MinRK
|
r3350 | """ | ||
Thomas Kluyver
|
r6779 | def test_whos(): | ||
"""Check that whos is protected against objects where repr() fails.""" | ||||
class A(object): | ||||
def __repr__(self): | ||||
raise Exception() | ||||
_ip.user_ns['a'] = A() | ||||
Matthias Bussonnier
|
r27814 | _ip.run_line_magic("whos", "") | ||
Thomas Kluyver
|
r6779 | |||
MinRK
|
r3350 | def doctest_precision(): | ||
"""doctest for %precision | ||||
Samuel Gaist
|
r26902 | |||
Fernando Perez
|
r6916 | In [1]: f = get_ipython().display_formatter.formatters['text/plain'] | ||
Samuel Gaist
|
r26902 | |||
MinRK
|
r3350 | In [2]: %precision 5 | ||
adityausathe
|
r23764 | Out[2]: '%.5f' | ||
Samuel Gaist
|
r26902 | |||
MinRK
|
r3350 | In [3]: f.float_format | ||
adityausathe
|
r23764 | Out[3]: '%.5f' | ||
Samuel Gaist
|
r26902 | |||
MinRK
|
r3350 | In [4]: %precision %e | ||
adityausathe
|
r23764 | Out[4]: '%e' | ||
Samuel Gaist
|
r26902 | |||
MinRK
|
r3350 | In [5]: f(3.1415927) | ||
adityausathe
|
r23764 | Out[5]: '3.141593e+00' | ||
MinRK
|
r3350 | """ | ||
Quentin Peter
|
r28153 | |||
Quentin Peter
|
r25910 | def test_debug_magic(): | ||
"""Test debugging a small code with %debug | ||||
Samuel Gaist
|
r26902 | |||
Quentin Peter
|
r25911 | In [1]: with PdbTestInput(['c']): | ||
Quentin Peter
|
r25914 | ...: %debug print("a b") #doctest: +ELLIPSIS | ||
Quentin Peter
|
r25911 | ...: | ||
Quentin Peter
|
r25913 | ... | ||
Quentin Peter
|
r25910 | ipdb> c | ||
a b | ||||
In [2]: | ||||
""" | ||||
Quentin Peter
|
r28153 | |||
Quentin Peter
|
r28152 | def test_debug_magic_locals(): | ||
"""Test debugging a small code with %debug with locals | ||||
In [1]: with PdbTestInput(['c']): | ||||
...: def fun(): | ||||
...: res = 1 | ||||
...: %debug print(res) | ||||
...: fun() | ||||
...: | ||||
... | ||||
ipdb> c | ||||
1 | ||||
In [2]: | ||||
""" | ||||
Thomas Kluyver
|
r5549 | def test_psearch(): | ||
with tt.AssertPrints("dict.fromkeys"): | ||||
_ip.run_cell("dict.fr*?") | ||||
Markus Wageringel
|
r25595 | with tt.AssertPrints("Ï€.is_integer"): | ||
_ip.run_cell("π = 3.14;\nπ.is_integ*?") | ||||
Thomas Kluyver
|
r5549 | |||
MinRK
|
r5672 | def test_timeit_shlex(): | ||
"""test shlex issues with timeit (#1109)""" | ||||
_ip.ex("def f(*a,**kw): pass") | ||||
Matthias Bussonnier
|
r27814 | _ip.run_line_magic("timeit", '-n1 "this is a bug".count(" ")') | ||
_ip.run_line_magic("timeit", '-r1 -n1 f(" ", 1)') | ||||
_ip.run_line_magic("timeit", '-r1 -n1 f(" ", 1, " ", 2, " ")') | ||||
_ip.run_line_magic("timeit", '-r1 -n1 ("a " + "b")') | ||||
_ip.run_line_magic("timeit", '-r1 -n1 f("a " + "b")') | ||||
_ip.run_line_magic("timeit", '-r1 -n1 f("a " + "b ")') | ||||
Paul Ivanov
|
r5901 | |||
Fernando Perez
|
r7493 | def test_timeit_special_syntax(): | ||
"Test %%timeit with IPython special syntax" | ||||
Fernando Perez
|
r7492 | @register_line_magic | ||
def lmagic(line): | ||||
ip = get_ipython() | ||||
ip.user_ns['lmagic_out'] = line | ||||
Fernando Perez
|
r7493 | # line mode test | ||
Samuel Gaist
|
r26902 | _ip.run_line_magic("timeit", "-n1 -r1 %lmagic my line") | ||
assert _ip.user_ns["lmagic_out"] == "my line" | ||||
Fernando Perez
|
r7493 | # cell mode test | ||
Samuel Gaist
|
r26902 | _ip.run_cell_magic("timeit", "-n1 -r1", "%lmagic my line2") | ||
assert _ip.user_ns["lmagic_out"] == "my line2" | ||||
Matthias BUSSONNIER
|
r12648 | |||
def test_timeit_return(): | ||||
""" | ||||
luzpaz
|
r24084 | test whether timeit -o return object | ||
Matthias BUSSONNIER
|
r12648 | """ | ||
res = _ip.run_line_magic('timeit','-n10 -r10 -o 1') | ||||
assert(res is not None) | ||||
def test_timeit_quiet(): | ||||
""" | ||||
test quiet option of timeit magic | ||||
""" | ||||
with tt.AssertNotPrints("loops"): | ||||
_ip.run_cell("%timeit -n1 -r1 -q 1") | ||||
Fernando Perez
|
r7492 | |||
Ivan Timokhin
|
r21698 | def test_timeit_return_quiet(): | ||
with tt.AssertNotPrints("loops"): | ||||
res = _ip.run_line_magic('timeit', '-n1 -r1 -q -o 1') | ||||
assert (res is not None) | ||||
Thomas Kluyver
|
r23747 | def test_timeit_invalid_return(): | ||
Samuel Gaist
|
r26902 | with pytest.raises(SyntaxError): | ||
Thomas Kluyver
|
r23747 | _ip.run_line_magic('timeit', 'return') | ||
Fernando Perez
|
r6970 | @dec.skipif(execution.profile is None) | ||
Jason Grout
|
r12157 | def test_prun_special_syntax(): | ||
"Test %%prun with IPython special syntax" | ||||
@register_line_magic | ||||
def lmagic(line): | ||||
ip = get_ipython() | ||||
ip.user_ns['lmagic_out'] = line | ||||
# line mode test | ||||
Samuel Gaist
|
r26902 | _ip.run_line_magic("prun", "-q %lmagic my line") | ||
assert _ip.user_ns["lmagic_out"] == "my line" | ||||
Jason Grout
|
r12157 | # cell mode test | ||
Samuel Gaist
|
r26902 | _ip.run_cell_magic("prun", "-q", "%lmagic my line2") | ||
assert _ip.user_ns["lmagic_out"] == "my line2" | ||||
Jason Grout
|
r12157 | |||
@dec.skipif(execution.profile is None) | ||||
Paul Ivanov
|
r5932 | def test_prun_quotes(): | ||
"Test that prun does not clobber string escapes (GH #1302)" | ||||
Jörgen Stenarson
|
r7458 | _ip.magic(r"prun -q x = '\t'") | ||
Samuel Gaist
|
r26902 | assert _ip.user_ns["x"] == "\t" | ||
Thomas Kluyver
|
r6183 | |||
def test_extension(): | ||||
Thomas Kluyver
|
r21872 | # Debugging information for failures of this test | ||
print('sys.path:') | ||||
for p in sys.path: | ||||
print(' ', p) | ||||
print('CWD', os.getcwd()) | ||||
Samuel Gaist
|
r26902 | pytest.raises(ImportError, _ip.magic, "load_ext daft_extension") | ||
Min RK
|
r21840 | daft_path = os.path.join(os.path.dirname(__file__), "daft_extension") | ||
sys.path.insert(0, daft_path) | ||||
Thomas Kluyver
|
r6183 | try: | ||
_ip.user_ns.pop('arq', None) | ||||
Thomas Kluyver
|
r7019 | invalidate_caches() # Clear import caches | ||
Matthias Bussonnier
|
r27814 | _ip.run_line_magic("load_ext", "daft_extension") | ||
Samuel Gaist
|
r26902 | assert _ip.user_ns["arq"] == 185 | ||
Matthias Bussonnier
|
r27814 | _ip.run_line_magic("unload_ext", "daft_extension") | ||
Thomas Kluyver
|
r6183 | assert 'arq' not in _ip.user_ns | ||
finally: | ||||
Min RK
|
r21840 | sys.path.remove(daft_path) | ||
MinRK
|
r6211 | |||
Min RK
|
r21251 | def test_notebook_export_json(): | ||
Nikita Kniazev
|
r27104 | pytest.importorskip("nbformat") | ||
Min RK
|
r21251 | _ip = get_ipython() | ||
_ip.history_manager.reset() # Clear any existing history. | ||||
Samuel Gaist
|
r26902 | cmds = ["a=1", "def b():\n return a**2", "print('noël, été', b())"] | ||
Min RK
|
r21251 | for i, cmd in enumerate(cmds, start=1): | ||
_ip.history_manager.store_inputs(i, cmd) | ||||
with TemporaryDirectory() as td: | ||||
outfile = os.path.join(td, "nb.ipynb") | ||||
Matthias Bussonnier
|
r27814 | _ip.run_line_magic("notebook", "%s" % outfile) | ||
Thomas Kluyver
|
r16982 | |||
MinRK
|
r6211 | |||
mvr
|
r18924 | class TestEnv(TestCase): | ||
def test_env(self): | ||||
Matthias Bussonnier
|
r27814 | env = _ip.run_line_magic("env", "") | ||
mvr
|
r18924 | self.assertTrue(isinstance(env, dict)) | ||
Min RK
|
r25191 | def test_env_secret(self): | ||
Matthias Bussonnier
|
r27814 | env = _ip.run_line_magic("env", "") | ||
Min RK
|
r25191 | hidden = "<hidden>" | ||
with mock.patch.dict( | ||||
os.environ, | ||||
{ | ||||
"API_KEY": "abc123", | ||||
"SECRET_THING": "ssshhh", | ||||
"JUPYTER_TOKEN": "", | ||||
"VAR": "abc" | ||||
} | ||||
): | ||||
Matthias Bussonnier
|
r27814 | env = _ip.run_line_magic("env", "") | ||
Min RK
|
r25191 | assert env["API_KEY"] == hidden | ||
assert env["SECRET_THING"] == hidden | ||||
assert env["JUPYTER_TOKEN"] == hidden | ||||
assert env["VAR"] == "abc" | ||||
mvr
|
r18924 | def test_env_get_set_simple(self): | ||
Matthias Bussonnier
|
r27814 | env = _ip.run_line_magic("env", "var val1") | ||
mvr
|
r18924 | self.assertEqual(env, None) | ||
Matthias Bussonnier
|
r27814 | self.assertEqual(os.environ["var"], "val1") | ||
self.assertEqual(_ip.run_line_magic("env", "var"), "val1") | ||||
env = _ip.run_line_magic("env", "var=val2") | ||||
mvr
|
r18924 | self.assertEqual(env, None) | ||
self.assertEqual(os.environ['var'], 'val2') | ||||
def test_env_get_set_complex(self): | ||||
Matthias Bussonnier
|
r27814 | env = _ip.run_line_magic("env", "var 'val1 '' 'val2") | ||
mvr
|
r18924 | self.assertEqual(env, None) | ||
self.assertEqual(os.environ['var'], "'val1 '' 'val2") | ||||
Matthias Bussonnier
|
r27814 | self.assertEqual(_ip.run_line_magic("env", "var"), "'val1 '' 'val2") | ||
env = _ip.run_line_magic("env", 'var=val2 val3="val4') | ||||
mvr
|
r18924 | self.assertEqual(env, None) | ||
self.assertEqual(os.environ['var'], 'val2 val3="val4') | ||||
def test_env_set_bad_input(self): | ||||
Matthias Bussonnier
|
r27814 | self.assertRaises(UsageError, lambda: _ip.run_line_magic("set_env", "var")) | ||
mvr
|
r18924 | |||
def test_env_set_whitespace(self): | ||||
Matthias Bussonnier
|
r27814 | self.assertRaises(UsageError, lambda: _ip.run_line_magic("env", "var A=B")) | ||
Fernando Perez
|
r6975 | |||
class CellMagicTestCase(TestCase): | ||||
def check_ident(self, magic): | ||||
Fernando Perez
|
r6976 | # Manually called, we get the result | ||
Samuel Gaist
|
r26902 | out = _ip.run_cell_magic(magic, "a", "b") | ||
assert out == ("a", "b") | ||||
Fernando Perez
|
r6976 | # Via run_cell, it goes into the user's namespace via displayhook | ||
Samuel Gaist
|
r26902 | _ip.run_cell("%%" + magic + " c\nd\n") | ||
assert _ip.user_ns["_"] == ("c", "d\n") | ||||
Fernando Perez
|
r6975 | |||
def test_cell_magic_func_deco(self): | ||||
"Cell magic using simple decorator" | ||||
@register_cell_magic | ||||
def cellm(line, cell): | ||||
return line, cell | ||||
self.check_ident('cellm') | ||||
def test_cell_magic_reg(self): | ||||
"Cell magic manually registered" | ||||
def cellm(line, cell): | ||||
return line, cell | ||||
_ip.register_magic_function(cellm, 'cell', 'cellm2') | ||||
self.check_ident('cellm2') | ||||
def test_cell_magic_class(self): | ||||
"Cell magics declared via a class" | ||||
@magics_class | ||||
class MyMagics(Magics): | ||||
@cell_magic | ||||
def cellm3(self, line, cell): | ||||
return line, cell | ||||
Fernando Perez
|
r6976 | _ip.register_magics(MyMagics) | ||
self.check_ident('cellm3') | ||||
def test_cell_magic_class2(self): | ||||
"Cell magics declared via a class, #2" | ||||
@magics_class | ||||
class MyMagics2(Magics): | ||||
Fernando Perez
|
r6975 | @cell_magic('cellm4') | ||
def cellm33(self, line, cell): | ||||
return line, cell | ||||
Samuel Gaist
|
r26902 | |||
Fernando Perez
|
r6976 | _ip.register_magics(MyMagics2) | ||
Fernando Perez
|
r6975 | self.check_ident('cellm4') | ||
# Check that nothing is registered as 'cellm33' | ||||
c33 = _ip.find_cell_magic('cellm33') | ||||
Samuel Gaist
|
r26902 | assert c33 == None | ||
MinRK
|
r7407 | |||
def test_file(): | ||||
Shao Yang
|
r24678 | """Basic %%writefile""" | ||
MinRK
|
r7407 | ip = get_ipython() | ||
with TemporaryDirectory() as td: | ||||
gousaiyang
|
r27495 | fname = os.path.join(td, "file1") | ||
ip.run_cell_magic( | ||||
"writefile", | ||||
fname, | ||||
"\n".join( | ||||
[ | ||||
"line1", | ||||
"line2", | ||||
] | ||||
), | ||||
) | ||||
s = Path(fname).read_text(encoding="utf-8") | ||||
Samuel Gaist
|
r26902 | assert "line1\n" in s | ||
assert "line2" in s | ||||
Partha P. Mukherjee
|
r24928 | |||
Partha P. Mukherjee
|
r24929 | @dec.skip_win32 | ||
Partha P. Mukherjee
|
r24928 | def test_file_single_quote(): | ||
"""Basic %%writefile with embedded single quotes""" | ||||
ip = get_ipython() | ||||
with TemporaryDirectory() as td: | ||||
gousaiyang
|
r27495 | fname = os.path.join(td, "'file1'") | ||
ip.run_cell_magic( | ||||
"writefile", | ||||
fname, | ||||
"\n".join( | ||||
[ | ||||
"line1", | ||||
"line2", | ||||
] | ||||
), | ||||
) | ||||
s = Path(fname).read_text(encoding="utf-8") | ||||
Samuel Gaist
|
r26902 | assert "line1\n" in s | ||
assert "line2" in s | ||||
Partha P. Mukherjee
|
r24928 | |||
Partha P. Mukherjee
|
r24929 | @dec.skip_win32 | ||
Partha P. Mukherjee
|
r24928 | def test_file_double_quote(): | ||
"""Basic %%writefile with embedded double quotes""" | ||||
ip = get_ipython() | ||||
with TemporaryDirectory() as td: | ||||
fname = os.path.join(td, '"file1"') | ||||
gousaiyang
|
r27495 | ip.run_cell_magic( | ||
"writefile", | ||||
fname, | ||||
"\n".join( | ||||
[ | ||||
"line1", | ||||
"line2", | ||||
] | ||||
), | ||||
) | ||||
s = Path(fname).read_text(encoding="utf-8") | ||||
Samuel Gaist
|
r26902 | assert "line1\n" in s | ||
assert "line2" in s | ||||
MinRK
|
r7407 | |||
MinRK
|
r7903 | def test_file_var_expand(): | ||
Shao Yang
|
r24678 | """%%writefile $filename""" | ||
MinRK
|
r7903 | ip = get_ipython() | ||
with TemporaryDirectory() as td: | ||||
gousaiyang
|
r27495 | fname = os.path.join(td, "file1") | ||
ip.user_ns["filename"] = fname | ||||
ip.run_cell_magic( | ||||
"writefile", | ||||
"$filename", | ||||
"\n".join( | ||||
[ | ||||
"line1", | ||||
"line2", | ||||
] | ||||
), | ||||
) | ||||
s = Path(fname).read_text(encoding="utf-8") | ||||
Samuel Gaist
|
r26902 | assert "line1\n" in s | ||
assert "line2" in s | ||||
MinRK
|
r7903 | |||
MinRK
|
r7407 | def test_file_unicode(): | ||
Shao Yang
|
r24678 | """%%writefile with unicode cell""" | ||
MinRK
|
r7407 | ip = get_ipython() | ||
with TemporaryDirectory() as td: | ||||
fname = os.path.join(td, 'file1') | ||||
Shao Yang
|
r24678 | ip.run_cell_magic("writefile", fname, u'\n'.join([ | ||
MinRK
|
r7407 | u'liné1', | ||
u'liné2', | ||||
])) | ||||
with io.open(fname, encoding='utf-8') as f: | ||||
s = f.read() | ||||
Samuel Gaist
|
r26902 | assert "liné1\n" in s | ||
assert "liné2" in s | ||||
MinRK
|
r7407 | |||
def test_file_amend(): | ||||
Shao Yang
|
r24678 | """%%writefile -a amends files""" | ||
MinRK
|
r7407 | ip = get_ipython() | ||
with TemporaryDirectory() as td: | ||||
gousaiyang
|
r27495 | fname = os.path.join(td, "file2") | ||
ip.run_cell_magic( | ||||
"writefile", | ||||
fname, | ||||
"\n".join( | ||||
[ | ||||
"line1", | ||||
"line2", | ||||
] | ||||
), | ||||
) | ||||
ip.run_cell_magic( | ||||
"writefile", | ||||
"-a %s" % fname, | ||||
"\n".join( | ||||
[ | ||||
"line3", | ||||
"line4", | ||||
] | ||||
), | ||||
) | ||||
s = Path(fname).read_text(encoding="utf-8") | ||||
Samuel Gaist
|
r26902 | assert "line1\n" in s | ||
assert "line3\n" in s | ||||
Shao Yang
|
r24676 | |||
def test_file_spaces(): | ||||
"""%%file with spaces in filename""" | ||||
ip = get_ipython() | ||||
with TemporaryWorkingDirectory() as td: | ||||
hongshaoyang
|
r24677 | fname = "file name" | ||
gousaiyang
|
r27495 | ip.run_cell_magic( | ||
"file", | ||||
'"%s"' % fname, | ||||
"\n".join( | ||||
[ | ||||
"line1", | ||||
"line2", | ||||
] | ||||
), | ||||
) | ||||
s = Path(fname).read_text(encoding="utf-8") | ||||
Samuel Gaist
|
r26902 | assert "line1\n" in s | ||
assert "line2" in s | ||||
MinRK
|
r7407 | def test_script_config(): | ||
ip = get_ipython() | ||||
ip.config.ScriptMagics.script_magics = ['whoda'] | ||||
sm = script.ScriptMagics(shell=ip) | ||||
Samuel Gaist
|
r26902 | assert "whoda" in sm.magics["cell"] | ||
MinRK
|
r7407 | |||
Min RK
|
r27388 | def test_script_out(): | ||
MinRK
|
r7407 | ip = get_ipython() | ||
Min RK
|
r27388 | ip.run_cell_magic("script", f"--out output {sys.executable}", "print('hi')") | ||
assert ip.user_ns["output"].strip() == "hi" | ||||
Samuel Gaist
|
r26902 | |||
MinRK
|
r7407 | |||
Min RK
|
r27388 | def test_script_err(): | ||
MinRK
|
r7407 | ip = get_ipython() | ||
Min RK
|
r27388 | ip.run_cell_magic( | ||
"script", | ||||
f"--err error {sys.executable}", | ||||
"import sys; print('hello', file=sys.stderr)", | ||||
) | ||||
assert ip.user_ns["error"].strip() == "hello" | ||||
MinRK
|
r7407 | |||
Matthias Bussonnier
|
r26854 | |||
MinRK
|
r7407 | def test_script_out_err(): | ||
ip = get_ipython() | ||||
Matthias Bussonnier
|
r26854 | ip.run_cell_magic( | ||
Min RK
|
r27388 | "script", | ||
f"--out output --err error {sys.executable}", | ||||
"\n".join( | ||||
[ | ||||
"import sys", | ||||
"print('hi')", | ||||
"print('hello', file=sys.stderr)", | ||||
] | ||||
), | ||||
Matthias Bussonnier
|
r26854 | ) | ||
Min RK
|
r27388 | assert ip.user_ns["output"].strip() == "hi" | ||
assert ip.user_ns["error"].strip() == "hello" | ||||
MinRK
|
r7407 | |||
Matthias Bussonnier
|
r26854 | |||
Min RK
|
r27387 | async def test_script_bg_out(): | ||
MinRK
|
r7407 | ip = get_ipython() | ||
Min RK
|
r27388 | ip.run_cell_magic("script", f"--bg --out output {sys.executable}", "print('hi')") | ||
assert (await ip.user_ns["output"].read()).strip() == b"hi" | ||||
Min RK
|
r27387 | assert ip.user_ns["output"].at_eof() | ||
Samuel Gaist
|
r26902 | |||
Min RK
|
r27388 | |||
Ethan Madden
|
r26199 | async def test_script_bg_err(): | ||
MinRK
|
r7407 | ip = get_ipython() | ||
Min RK
|
r27388 | ip.run_cell_magic( | ||
"script", | ||||
f"--bg --err error {sys.executable}", | ||||
"import sys; print('hello', file=sys.stderr)", | ||||
) | ||||
assert (await ip.user_ns["error"].read()).strip() == b"hello" | ||||
Min RK
|
r27387 | assert ip.user_ns["error"].at_eof() | ||
Ethan Madden
|
r26200 | |||
MinRK
|
r7407 | |||
Ethan Madden
|
r26199 | async def test_script_bg_out_err(): | ||
MinRK
|
r7407 | ip = get_ipython() | ||
Ethan Madden
|
r26200 | ip.run_cell_magic( | ||
Min RK
|
r27388 | "script", | ||
f"--bg --out output --err error {sys.executable}", | ||||
"\n".join( | ||||
[ | ||||
"import sys", | ||||
"print('hi')", | ||||
"print('hello', file=sys.stderr)", | ||||
] | ||||
), | ||||
Ethan Madden
|
r26200 | ) | ||
Min RK
|
r27388 | assert (await ip.user_ns["output"].read()).strip() == b"hi" | ||
assert (await ip.user_ns["error"].read()).strip() == b"hello" | ||||
Min RK
|
r27387 | assert ip.user_ns["output"].at_eof() | ||
assert ip.user_ns["error"].at_eof() | ||||
async def test_script_bg_proc(): | ||||
ip = get_ipython() | ||||
ip.run_cell_magic( | ||||
Min RK
|
r27388 | "script", | ||
f"--bg --out output --proc p {sys.executable}", | ||||
"\n".join( | ||||
[ | ||||
"import sys", | ||||
"print('hi')", | ||||
"print('hello', file=sys.stderr)", | ||||
] | ||||
), | ||||
Min RK
|
r27387 | ) | ||
p = ip.user_ns["p"] | ||||
await p.wait() | ||||
assert p.returncode == 0 | ||||
Min RK
|
r27388 | assert (await p.stdout.read()).strip() == b"hi" | ||
Min RK
|
r27387 | # not captured, so empty | ||
assert (await p.stderr.read()) == b"" | ||||
assert p.stdout.at_eof() | ||||
assert p.stderr.at_eof() | ||||
Ethan Madden
|
r26200 | |||
MinRK
|
r7407 | |||
def test_script_defaults(): | ||||
ip = get_ipython() | ||||
for cmd in ['sh', 'bash', 'perl', 'ruby']: | ||||
try: | ||||
find_cmd(cmd) | ||||
except Exception: | ||||
pass | ||||
else: | ||||
Samuel Gaist
|
r26902 | assert cmd in ip.magics_manager.magics["cell"] | ||
MinRK
|
r7436 | |||
@magics_class | ||||
class FooFoo(Magics): | ||||
"""class with both %foo and %%foo magics""" | ||||
@line_magic('foo') | ||||
def line_foo(self, line): | ||||
"I am line foo" | ||||
pass | ||||
Bradley M. Froehle
|
r7712 | |||
MinRK
|
r7436 | @cell_magic("foo") | ||
def cell_foo(self, line, cell): | ||||
"I am cell foo, not line foo" | ||||
pass | ||||
def test_line_cell_info(): | ||||
"""%%foo and %foo magics are distinguishable to inspect""" | ||||
ip = get_ipython() | ||||
ip.magics_manager.register(FooFoo) | ||||
Samuel Gaist
|
r26902 | oinfo = ip.object_inspect("foo") | ||
assert oinfo["found"] is True | ||||
assert oinfo["ismagic"] is True | ||||
oinfo = ip.object_inspect("%%foo") | ||||
assert oinfo["found"] is True | ||||
assert oinfo["ismagic"] is True | ||||
assert oinfo["docstring"] == FooFoo.cell_foo.__doc__ | ||||
oinfo = ip.object_inspect("%foo") | ||||
assert oinfo["found"] is True | ||||
assert oinfo["ismagic"] is True | ||||
assert oinfo["docstring"] == FooFoo.line_foo.__doc__ | ||||
MinRK
|
r7583 | |||
def test_multiple_magics(): | ||||
ip = get_ipython() | ||||
foo1 = FooFoo(ip) | ||||
foo2 = FooFoo(ip) | ||||
mm = ip.magics_manager | ||||
mm.register(foo1) | ||||
Samuel Gaist
|
r26902 | assert mm.magics["line"]["foo"].__self__ is foo1 | ||
MinRK
|
r7583 | mm.register(foo2) | ||
Samuel Gaist
|
r26902 | assert mm.magics["line"]["foo"].__self__ is foo2 | ||
Bradley M. Froehle
|
r7712 | |||
def test_alias_magic(): | ||||
"""Test %alias_magic.""" | ||||
ip = get_ipython() | ||||
mm = ip.magics_manager | ||||
# Basic operation: both cell and line magics are created, if possible. | ||||
Samuel Gaist
|
r26902 | ip.run_line_magic("alias_magic", "timeit_alias timeit") | ||
assert "timeit_alias" in mm.magics["line"] | ||||
assert "timeit_alias" in mm.magics["cell"] | ||||
Bradley M. Froehle
|
r7712 | |||
# --cell is specified, line magic not created. | ||||
Samuel Gaist
|
r26902 | ip.run_line_magic("alias_magic", "--cell timeit_cell_alias timeit") | ||
assert "timeit_cell_alias" not in mm.magics["line"] | ||||
assert "timeit_cell_alias" in mm.magics["cell"] | ||||
Bradley M. Froehle
|
r7712 | |||
# Test that line alias is created successfully. | ||||
Samuel Gaist
|
r26902 | ip.run_line_magic("alias_magic", "--line env_alias env") | ||
assert ip.run_line_magic("env", "") == ip.run_line_magic("env_alias", "") | ||||
Dominik Dabrowski
|
r7850 | |||
Nick Weseman
|
r23639 | # Test that line alias with parameters passed in is created successfully. | ||
Samuel Gaist
|
r26902 | ip.run_line_magic( | ||
"alias_magic", "--line history_alias history --params " + shlex.quote("3") | ||||
) | ||||
assert "history_alias" in mm.magics["line"] | ||||
Nick Weseman
|
r23639 | |||
Dominik Dabrowski
|
r7850 | def test_save(): | ||
"""Test %save.""" | ||||
ip = get_ipython() | ||||
ip.history_manager.reset() # Clear any existing history. | ||||
Samuel Gaist
|
r26902 | cmds = ["a=1", "def b():\n return a**2", "print(a, b())"] | ||
Dominik Dabrowski
|
r7850 | for i, cmd in enumerate(cmds, start=1): | ||
ip.history_manager.store_inputs(i, cmd) | ||||
with TemporaryDirectory() as tmpdir: | ||||
file = os.path.join(tmpdir, "testsave.py") | ||||
ip.run_line_magic("save", "%s 1-10" % file) | ||||
gousaiyang
|
r27495 | content = Path(file).read_text(encoding="utf-8") | ||
Samuel Gaist
|
r26902 | assert content.count(cmds[0]) == 1 | ||
assert "coding: utf-8" in content | ||||
Dominik Dabrowski
|
r7850 | ip.run_line_magic("save", "-a %s 1-10" % file) | ||
gousaiyang
|
r27495 | content = Path(file).read_text(encoding="utf-8") | ||
Samuel Gaist
|
r26902 | assert content.count(cmds[0]) == 2 | ||
assert "coding: utf-8" in content | ||||
Cavendish McKay
|
r8002 | |||
Blazej Michalik
|
r26638 | def test_save_with_no_args(): | ||
ip = get_ipython() | ||||
Blazej Michalik
|
r26641 | ip.history_manager.reset() # Clear any existing history. | ||
Samuel Gaist
|
r26902 | cmds = ["a=1", "def b():\n return a**2", "print(a, b())", "%save"] | ||
Blazej Michalik
|
r26638 | for i, cmd in enumerate(cmds, start=1): | ||
ip.history_manager.store_inputs(i, cmd) | ||||
with TemporaryDirectory() as tmpdir: | ||||
path = os.path.join(tmpdir, "testsave.py") | ||||
ip.run_line_magic("save", path) | ||||
gousaiyang
|
r27495 | content = Path(path).read_text(encoding="utf-8") | ||
Blazej Michalik
|
r26638 | expected_content = dedent( | ||
"""\ | ||||
# coding: utf-8 | ||||
a=1 | ||||
def b(): | ||||
return a**2 | ||||
print(a, b()) | ||||
""" | ||||
) | ||||
Samuel Gaist
|
r26902 | assert content == expected_content | ||
Blazej Michalik
|
r26638 | |||
Cavendish McKay
|
r8002 | def test_store(): | ||
"""Test %store.""" | ||||
ip = get_ipython() | ||||
ip.run_line_magic('load_ext', 'storemagic') | ||||
Samuel Gaist
|
r26902 | |||
Cavendish McKay
|
r8002 | # make sure the storage is empty | ||
Samuel Gaist
|
r26902 | ip.run_line_magic("store", "-z") | ||
ip.user_ns["var"] = 42 | ||||
ip.run_line_magic("store", "var") | ||||
ip.user_ns["var"] = 39 | ||||
ip.run_line_magic("store", "-r") | ||||
assert ip.user_ns["var"] == 42 | ||||
Cavendish McKay
|
r8002 | |||
Samuel Gaist
|
r26902 | ip.run_line_magic("store", "-d var") | ||
ip.user_ns["var"] = 39 | ||||
ip.run_line_magic("store", "-r") | ||||
assert ip.user_ns["var"] == 39 | ||||
MinRK
|
r8993 | |||
def _run_edit_test(arg_s, exp_filename=None, | ||||
exp_lineno=-1, | ||||
exp_contents=None, | ||||
exp_is_temp=None): | ||||
ip = get_ipython() | ||||
M = code.CodeMagics(ip) | ||||
last_call = ['',''] | ||||
opts,args = M.parse_options(arg_s,'prxn:') | ||||
filename, lineno, is_temp = M._find_edit_target(ip, args, opts, last_call) | ||||
Samuel Gaist
|
r26902 | |||
MinRK
|
r8993 | if exp_filename is not None: | ||
Samuel Gaist
|
r26902 | assert exp_filename == filename | ||
MinRK
|
r8993 | if exp_contents is not None: | ||
Thomas Kluyver
|
r13657 | with io.open(filename, 'r', encoding='utf-8') as f: | ||
MinRK
|
r8993 | contents = f.read() | ||
Samuel Gaist
|
r26902 | assert exp_contents == contents | ||
MinRK
|
r8993 | if exp_lineno != -1: | ||
Samuel Gaist
|
r26902 | assert exp_lineno == lineno | ||
MinRK
|
r8993 | if exp_is_temp is not None: | ||
Samuel Gaist
|
r26902 | assert exp_is_temp == is_temp | ||
MinRK
|
r8993 | |||
def test_edit_interactive(): | ||||
"""%edit on interactively defined objects""" | ||||
ip = get_ipython() | ||||
n = ip.execution_count | ||||
Samuel Gaist
|
r26902 | ip.run_cell("def foo(): return 1", store_history=True) | ||
Nikita Kniazev
|
r27087 | with pytest.raises(code.InteractivelyDefined) as e: | ||
MinRK
|
r8993 | _run_edit_test("foo") | ||
Nikita Kniazev
|
r27087 | assert e.value.index == n | ||
MinRK
|
r8993 | |||
def test_edit_cell(): | ||||
"""%edit [cell id]""" | ||||
ip = get_ipython() | ||||
Samuel Gaist
|
r26902 | |||
ip.run_cell("def foo(): return 1", store_history=True) | ||||
MinRK
|
r8993 | # test | ||
_run_edit_test("1", exp_contents=ip.user_ns['In'][1], exp_is_temp=True) | ||||
Thomas Kluyver
|
r16369 | |||
rchiodo
|
r26001 | def test_edit_fname(): | ||
"""%edit file""" | ||||
# test | ||||
_run_edit_test("test file.py", exp_filename="test file.py") | ||||
Thomas Kluyver
|
r16369 | def test_bookmark(): | ||
ip = get_ipython() | ||||
ip.run_line_magic('bookmark', 'bmname') | ||||
with tt.AssertPrints('bmname'): | ||||
ip.run_line_magic('bookmark', '-l') | ||||
ip.run_line_magic('bookmark', '-d bmname') | ||||
Min RK
|
r19557 | |||
def test_ls_magic(): | ||||
ip = get_ipython() | ||||
json_formatter = ip.display_formatter.formatters['application/json'] | ||||
json_formatter.enabled = True | ||||
Matthias Bussonnier
|
r27814 | lsmagic = ip.run_line_magic("lsmagic", "") | ||
Min RK
|
r19557 | with warnings.catch_warnings(record=True) as w: | ||
j = json_formatter(lsmagic) | ||||
Samuel Gaist
|
r26902 | assert sorted(j) == ["cell", "line"] | ||
assert w == [] # no warnings | ||||
Thomas Kluyver
|
r22702 | |||
def test_strip_initial_indent(): | ||||
def sii(s): | ||||
lines = s.splitlines() | ||||
return '\n'.join(code.strip_initial_indent(lines)) | ||||
Samuel Gaist
|
r26902 | assert sii(" a = 1\nb = 2") == "a = 1\nb = 2" | ||
assert sii(" a\n b\nc") == "a\n b\nc" | ||||
assert sii("a\n b") == "a\n b" | ||||
Joshua Storck
|
r23624 | |||
def test_logging_magic_quiet_from_arg(): | ||||
_ip.config.LoggingMagics.quiet = False | ||||
lm = logging.LoggingMagics(shell=_ip) | ||||
with TemporaryDirectory() as td: | ||||
try: | ||||
with tt.AssertNotPrints(re.compile("Activating.*")): | ||||
lm.logstart('-q {}'.format( | ||||
os.path.join(td, "quiet_from_arg.log"))) | ||||
finally: | ||||
_ip.logger.logstop() | ||||
def test_logging_magic_quiet_from_config(): | ||||
_ip.config.LoggingMagics.quiet = True | ||||
lm = logging.LoggingMagics(shell=_ip) | ||||
with TemporaryDirectory() as td: | ||||
try: | ||||
with tt.AssertNotPrints(re.compile("Activating.*")): | ||||
lm.logstart(os.path.join(td, "quiet_from_config.log")) | ||||
finally: | ||||
_ip.logger.logstop() | ||||
Min RK
|
r24859 | |||
Joshua Storck
|
r23624 | def test_logging_magic_not_quiet(): | ||
_ip.config.LoggingMagics.quiet = False | ||||
lm = logging.LoggingMagics(shell=_ip) | ||||
with TemporaryDirectory() as td: | ||||
try: | ||||
with tt.AssertPrints(re.compile("Activating.*")): | ||||
lm.logstart(os.path.join(td, "not_quiet.log")) | ||||
finally: | ||||
_ip.logger.logstop() | ||||
Matthias Bussonnier
|
r24375 | |||
Min RK
|
r24859 | |||
def test_time_no_var_expand(): | ||||
Matthias Bussonnier
|
r27814 | _ip.user_ns["a"] = 5 | ||
_ip.user_ns["b"] = [] | ||||
_ip.run_line_magic("time", 'b.append("{a}")') | ||||
assert _ip.user_ns["b"] == ["{a}"] | ||||
Min RK
|
r24859 | |||
Matthias Bussonnier
|
r24375 | # this is slow, put at the end for local testing. | ||
def test_timeit_arguments(): | ||||
"Test valid timeit arguments, should not cause SyntaxError (GH #1269)" | ||||
Matthias Bussonnier
|
r27814 | _ip.run_line_magic("timeit", "-n1 -r1 a=('#')") | ||
Nathan Goldbaum
|
r25582 | |||
Matthias Bussonnier
|
r27503 | MINIMAL_LAZY_MAGIC = """ | ||
from IPython.core.magic import ( | ||||
Magics, | ||||
magics_class, | ||||
line_magic, | ||||
cell_magic, | ||||
) | ||||
@magics_class | ||||
class LazyMagics(Magics): | ||||
@line_magic | ||||
def lazy_line(self, line): | ||||
print("Lazy Line") | ||||
@cell_magic | ||||
def lazy_cell(self, line, cell): | ||||
print("Lazy Cell") | ||||
def load_ipython_extension(ipython): | ||||
ipython.register_magics(LazyMagics) | ||||
""" | ||||
def test_lazy_magics(): | ||||
with pytest.raises(UsageError): | ||||
ip.run_line_magic("lazy_line", "") | ||||
startdir = os.getcwd() | ||||
with TemporaryDirectory() as tmpdir: | ||||
with prepended_to_syspath(tmpdir): | ||||
ptempdir = Path(tmpdir) | ||||
tf = ptempdir / "lazy_magic_module.py" | ||||
tf.write_text(MINIMAL_LAZY_MAGIC) | ||||
ip.magics_manager.register_lazy("lazy_line", Path(tf.name).name[:-3]) | ||||
with tt.AssertPrints("Lazy Line"): | ||||
ip.run_line_magic("lazy_line", "") | ||||
Nathan Goldbaum
|
r25582 | TEST_MODULE = """ | ||
print('Loaded my_tmp') | ||||
if __name__ == "__main__": | ||||
print('I just ran a script') | ||||
""" | ||||
def test_run_module_from_import_hook(): | ||||
"Test that a module can be loaded via an import hook" | ||||
with TemporaryDirectory() as tmpdir: | ||||
gousaiyang
|
r27495 | fullpath = os.path.join(tmpdir, "my_tmp.py") | ||
Path(fullpath).write_text(TEST_MODULE, encoding="utf-8") | ||||
Nathan Goldbaum
|
r25582 | |||
Nikita Kniazev
|
r27077 | import importlib.abc | ||
import importlib.util | ||||
class MyTempImporter(importlib.abc.MetaPathFinder, importlib.abc.SourceLoader): | ||||
def find_spec(self, fullname, path, target=None): | ||||
if fullname == "my_tmp": | ||||
return importlib.util.spec_from_loader(fullname, self) | ||||
def get_filename(self, fullname): | ||||
Matthias Bussonnier
|
r27279 | assert fullname == "my_tmp" | ||
Nikita Kniazev
|
r27077 | return fullpath | ||
def get_data(self, path): | ||||
Matthias Bussonnier
|
r27279 | assert Path(path).samefile(fullpath) | ||
gousaiyang
|
r27495 | return Path(fullpath).read_text(encoding="utf-8") | ||
Nathan Goldbaum
|
r25582 | |||
sys.meta_path.insert(0, MyTempImporter()) | ||||
with capture_output() as captured: | ||||
Matthias Bussonnier
|
r27814 | _ip.run_line_magic("run", "-m my_tmp") | ||
Nathan Goldbaum
|
r25582 | _ip.run_cell("import my_tmp") | ||
output = "Loaded my_tmp\nI just ran a script\nLoaded my_tmp\n" | ||||
Samuel Gaist
|
r26902 | assert output == captured.stdout | ||
Nathan Goldbaum
|
r25582 | |||
sys.meta_path.pop(0) | ||||