183
217
with tt.AssertPrints("13"):
184
218
ip.run_cell("test")
187
# XXX failing for now, until we get clearcmd out of quarantine. But we should
188
# fix this and revert the skip to happen only if numpy is not around.
189
#@dec.skipif_not_numpy
190
@dec.skip_known_failure
191
def test_numpy_clear_array_undec():
192
from IPython.extensions import clearcmd
221
@dec.skipif_not_numpy
222
def test_numpy_reset_array_undec():
223
"Test '%reset array' functionality"
194
224
_ip.ex('import numpy as np')
195
225
_ip.ex('a = np.empty(2)')
196
226
yield (nt.assert_true, 'a' in _ip.user_ns)
197
_ip.magic('clear array')
227
_ip.magic('reset -f array')
198
228
yield (nt.assert_false, 'a' in _ip.user_ns)
230
def test_reset_out():
231
"Test '%reset out' magic"
232
_ip.run_cell("parrot = 'dead'", store_history=True)
233
# test '%reset -f out', make an Out prompt
234
_ip.run_cell("parrot", store_history=True)
235
nt.assert_true('dead' in [_ip.user_ns[x] for x in '_','__','___'])
236
_ip.magic('reset -f out')
237
nt.assert_false('dead' in [_ip.user_ns[x] for x in '_','__','___'])
238
nt.assert_true(len(_ip.user_ns['Out']) == 0)
241
"Test '%reset in' magic"
242
# test '%reset -f in'
243
_ip.run_cell("parrot", store_history=True)
244
nt.assert_true('parrot' in [_ip.user_ns[x] for x in '_i','_ii','_iii'])
245
_ip.magic('%reset -f in')
246
nt.assert_false('parrot' in [_ip.user_ns[x] for x in '_i','_ii','_iii'])
247
nt.assert_true(len(set(_ip.user_ns['In'])) == 1)
249
def test_reset_dhist():
250
"Test '%reset dhist' magic"
251
_ip.run_cell("tmp = [d for d in _dh]") # copy before clearing
252
_ip.magic('cd ' + os.path.dirname(nt.__file__))
254
nt.assert_true(len(_ip.user_ns['_dh']) > 0)
255
_ip.magic('reset -f dhist')
256
nt.assert_true(len(_ip.user_ns['_dh']) == 0)
257
_ip.run_cell("_dh = [d for d in tmp]") #restore
259
def test_reset_in_length():
260
"Test that '%reset in' preserves In[] length"
261
_ip.run_cell("print 'foo'")
262
_ip.run_cell("reset -f in")
263
nt.assert_true(len(_ip.user_ns['In']) == _ip.displayhook.prompt_count+1)
202
266
_ip.magic('time None')
268
def test_tb_syntaxerror():
269
"""test %tb after a SyntaxError"""
273
# trap and validate stdout
274
save_stdout = sys.stdout
276
sys.stdout = StringIO()
278
out = sys.stdout.getvalue()
280
sys.stdout = save_stdout
281
# trim output, and only check the last line
282
last_line = out.rstrip().splitlines()[-1].strip()
283
nt.assert_equals(last_line, "SyntaxError: invalid syntax")
205
286
@py3compat.doctest_refactor_print
206
287
def doctest_time():
359
449
"Test valid timeit arguments, should not cause SyntaxError (GH #1269)"
360
450
_ip.magic("timeit ('#')")
362
@dec.skipif(_ip.magic_prun == _ip.profile_missing_notice)
453
def test_timeit_special_syntax():
454
"Test %%timeit with IPython special syntax"
455
from IPython.core.magic import register_line_magic
460
ip.user_ns['lmagic_out'] = line
463
_ip.run_line_magic('timeit', '-n1 -r1 %lmagic my line')
464
nt.assert_equal(_ip.user_ns['lmagic_out'], 'my line')
466
_ip.run_cell_magic('timeit', '-n1 -r1', '%lmagic my line2')
467
nt.assert_equal(_ip.user_ns['lmagic_out'], 'my line2')
470
@dec.skipif(execution.profile is None)
363
471
def test_prun_quotes():
364
472
"Test that prun does not clobber string escapes (GH #1302)"
365
473
_ip.magic(r"prun -q x = '\t'")
366
474
nt.assert_equal(_ip.user_ns['x'], '\t')
476
def test_extension():
477
tmpdir = TemporaryDirectory()
478
orig_ipython_dir = _ip.ipython_dir
480
_ip.ipython_dir = tmpdir.name
481
nt.assert_raises(ImportError, _ip.magic, "load_ext daft_extension")
482
url = os.path.join(os.path.dirname(__file__), "daft_extension.py")
483
_ip.magic("install_ext %s" % url)
484
_ip.user_ns.pop('arq', None)
485
invalidate_caches() # Clear import caches
486
_ip.magic("load_ext daft_extension")
487
tt.assert_equal(_ip.user_ns['arq'], 185)
488
_ip.magic("unload_ext daft_extension")
489
assert 'arq' not in _ip.user_ns
491
_ip.ipython_dir = orig_ipython_dir
493
def test_notebook_export_json():
494
with TemporaryDirectory() as td:
495
outfile = os.path.join(td, "nb.ipynb")
496
_ip.ex(py3compat.u_format(u"u = {u}'héllo'"))
497
_ip.magic("notebook -e %s" % outfile)
499
def test_notebook_export_py():
500
with TemporaryDirectory() as td:
501
outfile = os.path.join(td, "nb.py")
502
_ip.ex(py3compat.u_format(u"u = {u}'héllo'"))
503
_ip.magic("notebook -e %s" % outfile)
505
def test_notebook_reformat_py():
506
with TemporaryDirectory() as td:
507
infile = os.path.join(td, "nb.ipynb")
508
with io.open(infile, 'w', encoding='utf-8') as f:
509
current.write(nb0, f, 'json')
511
_ip.ex(py3compat.u_format(u"u = {u}'héllo'"))
512
_ip.magic("notebook -f py %s" % infile)
514
def test_notebook_reformat_json():
515
with TemporaryDirectory() as td:
516
infile = os.path.join(td, "nb.py")
517
with io.open(infile, 'w', encoding='utf-8') as f:
518
current.write(nb0, f, 'py')
520
_ip.ex(py3compat.u_format(u"u = {u}'héllo'"))
521
_ip.magic("notebook -f ipynb %s" % infile)
522
_ip.magic("notebook -f json %s" % infile)
525
env = _ip.magic("env")
526
assert isinstance(env, dict), type(env)
529
class CellMagicTestCase(TestCase):
531
def check_ident(self, magic):
532
# Manually called, we get the result
533
out = _ip.run_cell_magic(magic, 'a', 'b')
534
nt.assert_equals(out, ('a','b'))
535
# Via run_cell, it goes into the user's namespace via displayhook
536
_ip.run_cell('%%' + magic +' c\nd')
537
nt.assert_equals(_ip.user_ns['_'], ('c','d'))
539
def test_cell_magic_func_deco(self):
540
"Cell magic using simple decorator"
542
def cellm(line, cell):
545
self.check_ident('cellm')
547
def test_cell_magic_reg(self):
548
"Cell magic manually registered"
549
def cellm(line, cell):
552
_ip.register_magic_function(cellm, 'cell', 'cellm2')
553
self.check_ident('cellm2')
555
def test_cell_magic_class(self):
556
"Cell magics declared via a class"
558
class MyMagics(Magics):
561
def cellm3(self, line, cell):
564
_ip.register_magics(MyMagics)
565
self.check_ident('cellm3')
567
def test_cell_magic_class2(self):
568
"Cell magics declared via a class, #2"
570
class MyMagics2(Magics):
572
@cell_magic('cellm4')
573
def cellm33(self, line, cell):
576
_ip.register_magics(MyMagics2)
577
self.check_ident('cellm4')
578
# Check that nothing is registered as 'cellm33'
579
c33 = _ip.find_cell_magic('cellm33')
580
nt.assert_equals(c33, None)
585
with TemporaryDirectory() as td:
586
fname = os.path.join(td, 'file1')
587
ip.run_cell_magic("file", fname, u'\n'.join([
591
with open(fname) as f:
593
nt.assert_in('line1\n', s)
594
nt.assert_in('line2', s)
596
def test_file_unicode():
597
"""%%file with unicode cell"""
599
with TemporaryDirectory() as td:
600
fname = os.path.join(td, 'file1')
601
ip.run_cell_magic("file", fname, u'\n'.join([
605
with io.open(fname, encoding='utf-8') as f:
607
nt.assert_in(u'liné1\n', s)
608
nt.assert_in(u'liné2', s)
610
def test_file_amend():
611
"""%%file -a amends files"""
613
with TemporaryDirectory() as td:
614
fname = os.path.join(td, 'file2')
615
ip.run_cell_magic("file", fname, u'\n'.join([
619
ip.run_cell_magic("file", "-a %s" % fname, u'\n'.join([
623
with open(fname) as f:
625
nt.assert_in('line1\n', s)
626
nt.assert_in('line3\n', s)
629
def test_script_config():
631
ip.config.ScriptMagics.script_magics = ['whoda']
632
sm = script.ScriptMagics(shell=ip)
633
nt.assert_in('whoda', sm.magics['cell'])
636
def test_script_out():
638
ip.run_cell_magic("script", "--out output sh", "echo 'hi'")
639
nt.assert_equals(ip.user_ns['output'], 'hi\n')
642
def test_script_err():
644
ip.run_cell_magic("script", "--err error sh", "echo 'hello' >&2")
645
nt.assert_equals(ip.user_ns['error'], 'hello\n')
648
def test_script_out_err():
650
ip.run_cell_magic("script", "--out output --err error sh", "echo 'hi'\necho 'hello' >&2")
651
nt.assert_equals(ip.user_ns['output'], 'hi\n')
652
nt.assert_equals(ip.user_ns['error'], 'hello\n')
655
def test_script_bg_out():
657
ip.run_cell_magic("script", "--bg --out output sh", "echo 'hi'")
658
nt.assert_equals(ip.user_ns['output'].read(), b'hi\n')
661
def test_script_bg_err():
663
ip.run_cell_magic("script", "--bg --err error sh", "echo 'hello' >&2")
664
nt.assert_equals(ip.user_ns['error'].read(), b'hello\n')
667
def test_script_bg_out_err():
669
ip.run_cell_magic("script", "--bg --out output --err error sh", "echo 'hi'\necho 'hello' >&2")
670
nt.assert_equals(ip.user_ns['output'].read(), b'hi\n')
671
nt.assert_equals(ip.user_ns['error'].read(), b'hello\n')
673
def test_script_defaults():
675
for cmd in ['sh', 'bash', 'perl', 'ruby']:
681
nt.assert_in(cmd, ip.magics_manager.magics['cell'])
685
class FooFoo(Magics):
686
"""class with both %foo and %%foo magics"""
688
def line_foo(self, line):
693
def cell_foo(self, line, cell):
694
"I am cell foo, not line foo"
697
def test_line_cell_info():
698
"""%%foo and %foo magics are distinguishable to inspect"""
700
ip.magics_manager.register(FooFoo)
701
oinfo = ip.object_inspect('foo')
702
nt.assert_true(oinfo['found'])
703
nt.assert_true(oinfo['ismagic'])
705
oinfo = ip.object_inspect('%%foo')
706
nt.assert_true(oinfo['found'])
707
nt.assert_true(oinfo['ismagic'])
708
nt.assert_equals(oinfo['docstring'], FooFoo.cell_foo.__doc__)
710
oinfo = ip.object_inspect('%foo')
711
nt.assert_true(oinfo['found'])
712
nt.assert_true(oinfo['ismagic'])
713
nt.assert_equals(oinfo['docstring'], FooFoo.line_foo.__doc__)
715
def test_multiple_magics():
719
mm = ip.magics_manager
721
nt.assert_true(mm.magics['line']['foo'].im_self is foo1)
723
nt.assert_true(mm.magics['line']['foo'].im_self is foo2)
725
def test_alias_magic():
726
"""Test %alias_magic."""
728
mm = ip.magics_manager
730
# Basic operation: both cell and line magics are created, if possible.
731
ip.run_line_magic('alias_magic', 'timeit_alias timeit')
732
nt.assert_true('timeit_alias' in mm.magics['line'])
733
nt.assert_true('timeit_alias' in mm.magics['cell'])
735
# --cell is specified, line magic not created.
736
ip.run_line_magic('alias_magic', '--cell timeit_cell_alias timeit')
737
nt.assert_false('timeit_cell_alias' in mm.magics['line'])
738
nt.assert_true('timeit_cell_alias' in mm.magics['cell'])
740
# Test that line alias is created successfully.
741
ip.run_line_magic('alias_magic', '--line env_alias env')
742
nt.assert_equal(ip.run_line_magic('env', ''),
743
ip.run_line_magic('env_alias', ''))