##// END OF EJS Templates
test timeit quiet and return
Matthias BUSSONNIER -
Show More
@@ -1,881 +1,895 b''
1 1 # -*- coding: utf-8 -*-
2 2 """Tests for various magic functions.
3 3
4 4 Needs to be run by nose (to make ipython session available).
5 5 """
6 6 from __future__ import absolute_import
7 7
8 8 #-----------------------------------------------------------------------------
9 9 # Imports
10 10 #-----------------------------------------------------------------------------
11 11
12 12 import io
13 13 import os
14 14 import sys
15 15 from StringIO import StringIO
16 16 from unittest import TestCase
17 17
18 18 try:
19 19 from importlib import invalidate_caches # Required from Python 3.3
20 20 except ImportError:
21 21 def invalidate_caches():
22 22 pass
23 23
24 24 import nose.tools as nt
25 25
26 26 from IPython.core import magic
27 27 from IPython.core.magic import (Magics, magics_class, line_magic,
28 28 cell_magic, line_cell_magic,
29 29 register_line_magic, register_cell_magic,
30 30 register_line_cell_magic)
31 31 from IPython.core.magics import execution, script, code
32 32 from IPython.nbformat.v3.tests.nbexamples import nb0
33 33 from IPython.nbformat import current
34 34 from IPython.testing import decorators as dec
35 35 from IPython.testing import tools as tt
36 36 from IPython.utils import py3compat
37 37 from IPython.utils.io import capture_output
38 38 from IPython.utils.tempdir import TemporaryDirectory
39 39 from IPython.utils.process import find_cmd
40 40
41 41 #-----------------------------------------------------------------------------
42 42 # Test functions begin
43 43 #-----------------------------------------------------------------------------
44 44
45 45 @magic.magics_class
46 46 class DummyMagics(magic.Magics): pass
47 47
48 48 def test_rehashx():
49 49 # clear up everything
50 50 _ip = get_ipython()
51 51 _ip.alias_manager.alias_table.clear()
52 52 del _ip.db['syscmdlist']
53 53
54 54 _ip.magic('rehashx')
55 55 # Practically ALL ipython development systems will have more than 10 aliases
56 56
57 57 nt.assert_true(len(_ip.alias_manager.alias_table) > 10)
58 58 for key, val in _ip.alias_manager.alias_table.iteritems():
59 59 # we must strip dots from alias names
60 60 nt.assert_not_in('.', key)
61 61
62 62 # rehashx must fill up syscmdlist
63 63 scoms = _ip.db['syscmdlist']
64 64 nt.assert_true(len(scoms) > 10)
65 65
66 66
67 67 def test_magic_parse_options():
68 68 """Test that we don't mangle paths when parsing magic options."""
69 69 ip = get_ipython()
70 70 path = 'c:\\x'
71 71 m = DummyMagics(ip)
72 72 opts = m.parse_options('-f %s' % path,'f:')[0]
73 73 # argv splitting is os-dependent
74 74 if os.name == 'posix':
75 75 expected = 'c:x'
76 76 else:
77 77 expected = path
78 78 nt.assert_equal(opts['f'], expected)
79 79
80 80 def test_magic_parse_long_options():
81 81 """Magic.parse_options can handle --foo=bar long options"""
82 82 ip = get_ipython()
83 83 m = DummyMagics(ip)
84 84 opts, _ = m.parse_options('--foo --bar=bubble', 'a', 'foo', 'bar=')
85 85 nt.assert_in('foo', opts)
86 86 nt.assert_in('bar', opts)
87 87 nt.assert_equal(opts['bar'], "bubble")
88 88
89 89
90 90 @dec.skip_without('sqlite3')
91 91 def doctest_hist_f():
92 92 """Test %hist -f with temporary filename.
93 93
94 94 In [9]: import tempfile
95 95
96 96 In [10]: tfile = tempfile.mktemp('.py','tmp-ipython-')
97 97
98 98 In [11]: %hist -nl -f $tfile 3
99 99
100 100 In [13]: import os; os.unlink(tfile)
101 101 """
102 102
103 103
104 104 @dec.skip_without('sqlite3')
105 105 def doctest_hist_r():
106 106 """Test %hist -r
107 107
108 108 XXX - This test is not recording the output correctly. For some reason, in
109 109 testing mode the raw history isn't getting populated. No idea why.
110 110 Disabling the output checking for now, though at least we do run it.
111 111
112 112 In [1]: 'hist' in _ip.lsmagic()
113 113 Out[1]: True
114 114
115 115 In [2]: x=1
116 116
117 117 In [3]: %hist -rl 2
118 118 x=1 # random
119 119 %hist -r 2
120 120 """
121 121
122 122
123 123 @dec.skip_without('sqlite3')
124 124 def doctest_hist_op():
125 125 """Test %hist -op
126 126
127 127 In [1]: class b(float):
128 128 ...: pass
129 129 ...:
130 130
131 131 In [2]: class s(object):
132 132 ...: def __str__(self):
133 133 ...: return 's'
134 134 ...:
135 135
136 136 In [3]:
137 137
138 138 In [4]: class r(b):
139 139 ...: def __repr__(self):
140 140 ...: return 'r'
141 141 ...:
142 142
143 143 In [5]: class sr(s,r): pass
144 144 ...:
145 145
146 146 In [6]:
147 147
148 148 In [7]: bb=b()
149 149
150 150 In [8]: ss=s()
151 151
152 152 In [9]: rr=r()
153 153
154 154 In [10]: ssrr=sr()
155 155
156 156 In [11]: 4.5
157 157 Out[11]: 4.5
158 158
159 159 In [12]: str(ss)
160 160 Out[12]: 's'
161 161
162 162 In [13]:
163 163
164 164 In [14]: %hist -op
165 165 >>> class b:
166 166 ... pass
167 167 ...
168 168 >>> class s(b):
169 169 ... def __str__(self):
170 170 ... return 's'
171 171 ...
172 172 >>>
173 173 >>> class r(b):
174 174 ... def __repr__(self):
175 175 ... return 'r'
176 176 ...
177 177 >>> class sr(s,r): pass
178 178 >>>
179 179 >>> bb=b()
180 180 >>> ss=s()
181 181 >>> rr=r()
182 182 >>> ssrr=sr()
183 183 >>> 4.5
184 184 4.5
185 185 >>> str(ss)
186 186 's'
187 187 >>>
188 188 """
189 189
190 190
191 191 @dec.skip_without('sqlite3')
192 192 def test_macro():
193 193 ip = get_ipython()
194 194 ip.history_manager.reset() # Clear any existing history.
195 195 cmds = ["a=1", "def b():\n return a**2", "print(a,b())"]
196 196 for i, cmd in enumerate(cmds, start=1):
197 197 ip.history_manager.store_inputs(i, cmd)
198 198 ip.magic("macro test 1-3")
199 199 nt.assert_equal(ip.user_ns["test"].value, "\n".join(cmds)+"\n")
200 200
201 201 # List macros
202 202 nt.assert_in("test", ip.magic("macro"))
203 203
204 204
205 205 @dec.skip_without('sqlite3')
206 206 def test_macro_run():
207 207 """Test that we can run a multi-line macro successfully."""
208 208 ip = get_ipython()
209 209 ip.history_manager.reset()
210 210 cmds = ["a=10", "a+=1", py3compat.doctest_refactor_print("print a"),
211 211 "%macro test 2-3"]
212 212 for cmd in cmds:
213 213 ip.run_cell(cmd, store_history=True)
214 214 nt.assert_equal(ip.user_ns["test"].value,
215 215 py3compat.doctest_refactor_print("a+=1\nprint a\n"))
216 216 with tt.AssertPrints("12"):
217 217 ip.run_cell("test")
218 218 with tt.AssertPrints("13"):
219 219 ip.run_cell("test")
220 220
221 221
222 222 def test_magic_magic():
223 223 """Test %magic"""
224 224 ip = get_ipython()
225 225 with capture_output() as captured:
226 226 ip.magic("magic")
227 227
228 228 stdout = captured.stdout
229 229 nt.assert_in('%magic', stdout)
230 230 nt.assert_in('IPython', stdout)
231 231 nt.assert_in('Available', stdout)
232 232
233 233
234 234 @dec.skipif_not_numpy
235 235 def test_numpy_reset_array_undec():
236 236 "Test '%reset array' functionality"
237 237 _ip.ex('import numpy as np')
238 238 _ip.ex('a = np.empty(2)')
239 239 nt.assert_in('a', _ip.user_ns)
240 240 _ip.magic('reset -f array')
241 241 nt.assert_not_in('a', _ip.user_ns)
242 242
243 243 def test_reset_out():
244 244 "Test '%reset out' magic"
245 245 _ip.run_cell("parrot = 'dead'", store_history=True)
246 246 # test '%reset -f out', make an Out prompt
247 247 _ip.run_cell("parrot", store_history=True)
248 248 nt.assert_true('dead' in [_ip.user_ns[x] for x in '_','__','___'])
249 249 _ip.magic('reset -f out')
250 250 nt.assert_false('dead' in [_ip.user_ns[x] for x in '_','__','___'])
251 251 nt.assert_equal(len(_ip.user_ns['Out']), 0)
252 252
253 253 def test_reset_in():
254 254 "Test '%reset in' magic"
255 255 # test '%reset -f in'
256 256 _ip.run_cell("parrot", store_history=True)
257 257 nt.assert_true('parrot' in [_ip.user_ns[x] for x in '_i','_ii','_iii'])
258 258 _ip.magic('%reset -f in')
259 259 nt.assert_false('parrot' in [_ip.user_ns[x] for x in '_i','_ii','_iii'])
260 260 nt.assert_equal(len(set(_ip.user_ns['In'])), 1)
261 261
262 262 def test_reset_dhist():
263 263 "Test '%reset dhist' magic"
264 264 _ip.run_cell("tmp = [d for d in _dh]") # copy before clearing
265 265 _ip.magic('cd ' + os.path.dirname(nt.__file__))
266 266 _ip.magic('cd -')
267 267 nt.assert_true(len(_ip.user_ns['_dh']) > 0)
268 268 _ip.magic('reset -f dhist')
269 269 nt.assert_equal(len(_ip.user_ns['_dh']), 0)
270 270 _ip.run_cell("_dh = [d for d in tmp]") #restore
271 271
272 272 def test_reset_in_length():
273 273 "Test that '%reset in' preserves In[] length"
274 274 _ip.run_cell("print 'foo'")
275 275 _ip.run_cell("reset -f in")
276 276 nt.assert_equal(len(_ip.user_ns['In']), _ip.displayhook.prompt_count+1)
277 277
278 278 def test_tb_syntaxerror():
279 279 """test %tb after a SyntaxError"""
280 280 ip = get_ipython()
281 281 ip.run_cell("for")
282 282
283 283 # trap and validate stdout
284 284 save_stdout = sys.stdout
285 285 try:
286 286 sys.stdout = StringIO()
287 287 ip.run_cell("%tb")
288 288 out = sys.stdout.getvalue()
289 289 finally:
290 290 sys.stdout = save_stdout
291 291 # trim output, and only check the last line
292 292 last_line = out.rstrip().splitlines()[-1].strip()
293 293 nt.assert_equal(last_line, "SyntaxError: invalid syntax")
294 294
295 295
296 296 def test_time():
297 297 ip = get_ipython()
298 298
299 299 with tt.AssertPrints("Wall time: "):
300 300 ip.run_cell("%time None")
301 301
302 302 ip.run_cell("def f(kmjy):\n"
303 303 " %time print (2*kmjy)")
304 304
305 305 with tt.AssertPrints("Wall time: "):
306 306 with tt.AssertPrints("hihi", suppress=False):
307 307 ip.run_cell("f('hi')")
308 308
309 309
310 310 @dec.skip_win32
311 311 def test_time2():
312 312 ip = get_ipython()
313 313
314 314 with tt.AssertPrints("CPU times: user "):
315 315 ip.run_cell("%time None")
316 316
317 317 def test_time3():
318 318 """Erroneous magic function calls, issue gh-3334"""
319 319 ip = get_ipython()
320 320 ip.user_ns.pop('run', None)
321 321
322 322 with tt.AssertNotPrints("not found", channel='stderr'):
323 323 ip.run_cell("%%time\n"
324 324 "run = 0\n"
325 325 "run += 1")
326 326
327 327 def test_doctest_mode():
328 328 "Toggle doctest_mode twice, it should be a no-op and run without error"
329 329 _ip.magic('doctest_mode')
330 330 _ip.magic('doctest_mode')
331 331
332 332
333 333 def test_parse_options():
334 334 """Tests for basic options parsing in magics."""
335 335 # These are only the most minimal of tests, more should be added later. At
336 336 # the very least we check that basic text/unicode calls work OK.
337 337 m = DummyMagics(_ip)
338 338 nt.assert_equal(m.parse_options('foo', '')[1], 'foo')
339 339 nt.assert_equal(m.parse_options(u'foo', '')[1], u'foo')
340 340
341 341
342 342 def test_dirops():
343 343 """Test various directory handling operations."""
344 344 # curpath = lambda :os.path.splitdrive(os.getcwdu())[1].replace('\\','/')
345 345 curpath = os.getcwdu
346 346 startdir = os.getcwdu()
347 347 ipdir = os.path.realpath(_ip.ipython_dir)
348 348 try:
349 349 _ip.magic('cd "%s"' % ipdir)
350 350 nt.assert_equal(curpath(), ipdir)
351 351 _ip.magic('cd -')
352 352 nt.assert_equal(curpath(), startdir)
353 353 _ip.magic('pushd "%s"' % ipdir)
354 354 nt.assert_equal(curpath(), ipdir)
355 355 _ip.magic('popd')
356 356 nt.assert_equal(curpath(), startdir)
357 357 finally:
358 358 os.chdir(startdir)
359 359
360 360
361 361 def test_xmode():
362 362 # Calling xmode three times should be a no-op
363 363 xmode = _ip.InteractiveTB.mode
364 364 for i in range(3):
365 365 _ip.magic("xmode")
366 366 nt.assert_equal(_ip.InteractiveTB.mode, xmode)
367 367
368 368 def test_reset_hard():
369 369 monitor = []
370 370 class A(object):
371 371 def __del__(self):
372 372 monitor.append(1)
373 373 def __repr__(self):
374 374 return "<A instance>"
375 375
376 376 _ip.user_ns["a"] = A()
377 377 _ip.run_cell("a")
378 378
379 379 nt.assert_equal(monitor, [])
380 380 _ip.magic("reset -f")
381 381 nt.assert_equal(monitor, [1])
382 382
383 383 class TestXdel(tt.TempFileMixin):
384 384 def test_xdel(self):
385 385 """Test that references from %run are cleared by xdel."""
386 386 src = ("class A(object):\n"
387 387 " monitor = []\n"
388 388 " def __del__(self):\n"
389 389 " self.monitor.append(1)\n"
390 390 "a = A()\n")
391 391 self.mktmp(src)
392 392 # %run creates some hidden references...
393 393 _ip.magic("run %s" % self.fname)
394 394 # ... as does the displayhook.
395 395 _ip.run_cell("a")
396 396
397 397 monitor = _ip.user_ns["A"].monitor
398 398 nt.assert_equal(monitor, [])
399 399
400 400 _ip.magic("xdel a")
401 401
402 402 # Check that a's __del__ method has been called.
403 403 nt.assert_equal(monitor, [1])
404 404
405 405 def doctest_who():
406 406 """doctest for %who
407 407
408 408 In [1]: %reset -f
409 409
410 410 In [2]: alpha = 123
411 411
412 412 In [3]: beta = 'beta'
413 413
414 414 In [4]: %who int
415 415 alpha
416 416
417 417 In [5]: %who str
418 418 beta
419 419
420 420 In [6]: %whos
421 421 Variable Type Data/Info
422 422 ----------------------------
423 423 alpha int 123
424 424 beta str beta
425 425
426 426 In [7]: %who_ls
427 427 Out[7]: ['alpha', 'beta']
428 428 """
429 429
430 430 def test_whos():
431 431 """Check that whos is protected against objects where repr() fails."""
432 432 class A(object):
433 433 def __repr__(self):
434 434 raise Exception()
435 435 _ip.user_ns['a'] = A()
436 436 _ip.magic("whos")
437 437
438 438 @py3compat.u_format
439 439 def doctest_precision():
440 440 """doctest for %precision
441 441
442 442 In [1]: f = get_ipython().display_formatter.formatters['text/plain']
443 443
444 444 In [2]: %precision 5
445 445 Out[2]: {u}'%.5f'
446 446
447 447 In [3]: f.float_format
448 448 Out[3]: {u}'%.5f'
449 449
450 450 In [4]: %precision %e
451 451 Out[4]: {u}'%e'
452 452
453 453 In [5]: f(3.1415927)
454 454 Out[5]: {u}'3.141593e+00'
455 455 """
456 456
457 457 def test_psearch():
458 458 with tt.AssertPrints("dict.fromkeys"):
459 459 _ip.run_cell("dict.fr*?")
460 460
461 461 def test_timeit_shlex():
462 462 """test shlex issues with timeit (#1109)"""
463 463 _ip.ex("def f(*a,**kw): pass")
464 464 _ip.magic('timeit -n1 "this is a bug".count(" ")')
465 465 _ip.magic('timeit -r1 -n1 f(" ", 1)')
466 466 _ip.magic('timeit -r1 -n1 f(" ", 1, " ", 2, " ")')
467 467 _ip.magic('timeit -r1 -n1 ("a " + "b")')
468 468 _ip.magic('timeit -r1 -n1 f("a " + "b")')
469 469 _ip.magic('timeit -r1 -n1 f("a " + "b ")')
470 470
471 471
472 472 def test_timeit_arguments():
473 473 "Test valid timeit arguments, should not cause SyntaxError (GH #1269)"
474 474 _ip.magic("timeit ('#')")
475 475
476 476
477 477 def test_timeit_special_syntax():
478 478 "Test %%timeit with IPython special syntax"
479 479 @register_line_magic
480 480 def lmagic(line):
481 481 ip = get_ipython()
482 482 ip.user_ns['lmagic_out'] = line
483 483
484 484 # line mode test
485 485 _ip.run_line_magic('timeit', '-n1 -r1 %lmagic my line')
486 486 nt.assert_equal(_ip.user_ns['lmagic_out'], 'my line')
487 487 # cell mode test
488 488 _ip.run_cell_magic('timeit', '-n1 -r1', '%lmagic my line2')
489 489 nt.assert_equal(_ip.user_ns['lmagic_out'], 'my line2')
490
490
491 def test_timeit_return():
492 """
493 test wether timeit -o return object
494 """
495
496 res = _ip.run_line_magic('timeit','-n10 -r10 -o 1')
497 assert(res is not None)
498
499 def test_timeit_quiet():
500 """
501 test quiet option of timeit magic
502 """
503 with tt.AssertNotPrints("loops"):
504 _ip.run_cell("%timeit -n1 -r1 -q 1")
491 505
492 506 @dec.skipif(execution.profile is None)
493 507 def test_prun_special_syntax():
494 508 "Test %%prun with IPython special syntax"
495 509 @register_line_magic
496 510 def lmagic(line):
497 511 ip = get_ipython()
498 512 ip.user_ns['lmagic_out'] = line
499 513
500 514 # line mode test
501 515 _ip.run_line_magic('prun', '-q %lmagic my line')
502 516 nt.assert_equal(_ip.user_ns['lmagic_out'], 'my line')
503 517 # cell mode test
504 518 _ip.run_cell_magic('prun', '-q', '%lmagic my line2')
505 519 nt.assert_equal(_ip.user_ns['lmagic_out'], 'my line2')
506 520
507 521 @dec.skipif(execution.profile is None)
508 522 def test_prun_quotes():
509 523 "Test that prun does not clobber string escapes (GH #1302)"
510 524 _ip.magic(r"prun -q x = '\t'")
511 525 nt.assert_equal(_ip.user_ns['x'], '\t')
512 526
513 527 def test_extension():
514 528 tmpdir = TemporaryDirectory()
515 529 orig_ipython_dir = _ip.ipython_dir
516 530 try:
517 531 _ip.ipython_dir = tmpdir.name
518 532 nt.assert_raises(ImportError, _ip.magic, "load_ext daft_extension")
519 533 url = os.path.join(os.path.dirname(__file__), "daft_extension.py")
520 534 _ip.magic("install_ext %s" % url)
521 535 _ip.user_ns.pop('arq', None)
522 536 invalidate_caches() # Clear import caches
523 537 _ip.magic("load_ext daft_extension")
524 538 nt.assert_equal(_ip.user_ns['arq'], 185)
525 539 _ip.magic("unload_ext daft_extension")
526 540 assert 'arq' not in _ip.user_ns
527 541 finally:
528 542 _ip.ipython_dir = orig_ipython_dir
529 543 tmpdir.cleanup()
530 544
531 545 def test_notebook_export_json():
532 546 with TemporaryDirectory() as td:
533 547 outfile = os.path.join(td, "nb.ipynb")
534 548 _ip.ex(py3compat.u_format(u"u = {u}'hΓ©llo'"))
535 549 _ip.magic("notebook -e %s" % outfile)
536 550
537 551 def test_notebook_export_py():
538 552 with TemporaryDirectory() as td:
539 553 outfile = os.path.join(td, "nb.py")
540 554 _ip.ex(py3compat.u_format(u"u = {u}'hΓ©llo'"))
541 555 _ip.magic("notebook -e %s" % outfile)
542 556
543 557 def test_notebook_reformat_py():
544 558 with TemporaryDirectory() as td:
545 559 infile = os.path.join(td, "nb.ipynb")
546 560 with io.open(infile, 'w', encoding='utf-8') as f:
547 561 current.write(nb0, f, 'json')
548 562
549 563 _ip.ex(py3compat.u_format(u"u = {u}'hΓ©llo'"))
550 564 _ip.magic("notebook -f py %s" % infile)
551 565
552 566 def test_notebook_reformat_json():
553 567 with TemporaryDirectory() as td:
554 568 infile = os.path.join(td, "nb.py")
555 569 with io.open(infile, 'w', encoding='utf-8') as f:
556 570 current.write(nb0, f, 'py')
557 571
558 572 _ip.ex(py3compat.u_format(u"u = {u}'hΓ©llo'"))
559 573 _ip.magic("notebook -f ipynb %s" % infile)
560 574 _ip.magic("notebook -f json %s" % infile)
561 575
562 576 def test_env():
563 577 env = _ip.magic("env")
564 578 assert isinstance(env, dict), type(env)
565 579
566 580
567 581 class CellMagicTestCase(TestCase):
568 582
569 583 def check_ident(self, magic):
570 584 # Manually called, we get the result
571 585 out = _ip.run_cell_magic(magic, 'a', 'b')
572 586 nt.assert_equal(out, ('a','b'))
573 587 # Via run_cell, it goes into the user's namespace via displayhook
574 588 _ip.run_cell('%%' + magic +' c\nd')
575 589 nt.assert_equal(_ip.user_ns['_'], ('c','d'))
576 590
577 591 def test_cell_magic_func_deco(self):
578 592 "Cell magic using simple decorator"
579 593 @register_cell_magic
580 594 def cellm(line, cell):
581 595 return line, cell
582 596
583 597 self.check_ident('cellm')
584 598
585 599 def test_cell_magic_reg(self):
586 600 "Cell magic manually registered"
587 601 def cellm(line, cell):
588 602 return line, cell
589 603
590 604 _ip.register_magic_function(cellm, 'cell', 'cellm2')
591 605 self.check_ident('cellm2')
592 606
593 607 def test_cell_magic_class(self):
594 608 "Cell magics declared via a class"
595 609 @magics_class
596 610 class MyMagics(Magics):
597 611
598 612 @cell_magic
599 613 def cellm3(self, line, cell):
600 614 return line, cell
601 615
602 616 _ip.register_magics(MyMagics)
603 617 self.check_ident('cellm3')
604 618
605 619 def test_cell_magic_class2(self):
606 620 "Cell magics declared via a class, #2"
607 621 @magics_class
608 622 class MyMagics2(Magics):
609 623
610 624 @cell_magic('cellm4')
611 625 def cellm33(self, line, cell):
612 626 return line, cell
613 627
614 628 _ip.register_magics(MyMagics2)
615 629 self.check_ident('cellm4')
616 630 # Check that nothing is registered as 'cellm33'
617 631 c33 = _ip.find_cell_magic('cellm33')
618 632 nt.assert_equal(c33, None)
619 633
620 634 def test_file():
621 635 """Basic %%file"""
622 636 ip = get_ipython()
623 637 with TemporaryDirectory() as td:
624 638 fname = os.path.join(td, 'file1')
625 639 ip.run_cell_magic("file", fname, u'\n'.join([
626 640 'line1',
627 641 'line2',
628 642 ]))
629 643 with open(fname) as f:
630 644 s = f.read()
631 645 nt.assert_in('line1\n', s)
632 646 nt.assert_in('line2', s)
633 647
634 648 def test_file_var_expand():
635 649 """%%file $filename"""
636 650 ip = get_ipython()
637 651 with TemporaryDirectory() as td:
638 652 fname = os.path.join(td, 'file1')
639 653 ip.user_ns['filename'] = fname
640 654 ip.run_cell_magic("file", '$filename', u'\n'.join([
641 655 'line1',
642 656 'line2',
643 657 ]))
644 658 with open(fname) as f:
645 659 s = f.read()
646 660 nt.assert_in('line1\n', s)
647 661 nt.assert_in('line2', s)
648 662
649 663 def test_file_unicode():
650 664 """%%file with unicode cell"""
651 665 ip = get_ipython()
652 666 with TemporaryDirectory() as td:
653 667 fname = os.path.join(td, 'file1')
654 668 ip.run_cell_magic("file", fname, u'\n'.join([
655 669 u'linΓ©1',
656 670 u'linΓ©2',
657 671 ]))
658 672 with io.open(fname, encoding='utf-8') as f:
659 673 s = f.read()
660 674 nt.assert_in(u'linΓ©1\n', s)
661 675 nt.assert_in(u'linΓ©2', s)
662 676
663 677 def test_file_amend():
664 678 """%%file -a amends files"""
665 679 ip = get_ipython()
666 680 with TemporaryDirectory() as td:
667 681 fname = os.path.join(td, 'file2')
668 682 ip.run_cell_magic("file", fname, u'\n'.join([
669 683 'line1',
670 684 'line2',
671 685 ]))
672 686 ip.run_cell_magic("file", "-a %s" % fname, u'\n'.join([
673 687 'line3',
674 688 'line4',
675 689 ]))
676 690 with open(fname) as f:
677 691 s = f.read()
678 692 nt.assert_in('line1\n', s)
679 693 nt.assert_in('line3\n', s)
680 694
681 695
682 696 def test_script_config():
683 697 ip = get_ipython()
684 698 ip.config.ScriptMagics.script_magics = ['whoda']
685 699 sm = script.ScriptMagics(shell=ip)
686 700 nt.assert_in('whoda', sm.magics['cell'])
687 701
688 702 @dec.skip_win32
689 703 def test_script_out():
690 704 ip = get_ipython()
691 705 ip.run_cell_magic("script", "--out output sh", "echo 'hi'")
692 706 nt.assert_equal(ip.user_ns['output'], 'hi\n')
693 707
694 708 @dec.skip_win32
695 709 def test_script_err():
696 710 ip = get_ipython()
697 711 ip.run_cell_magic("script", "--err error sh", "echo 'hello' >&2")
698 712 nt.assert_equal(ip.user_ns['error'], 'hello\n')
699 713
700 714 @dec.skip_win32
701 715 def test_script_out_err():
702 716 ip = get_ipython()
703 717 ip.run_cell_magic("script", "--out output --err error sh", "echo 'hi'\necho 'hello' >&2")
704 718 nt.assert_equal(ip.user_ns['output'], 'hi\n')
705 719 nt.assert_equal(ip.user_ns['error'], 'hello\n')
706 720
707 721 @dec.skip_win32
708 722 def test_script_bg_out():
709 723 ip = get_ipython()
710 724 ip.run_cell_magic("script", "--bg --out output sh", "echo 'hi'")
711 725 nt.assert_equal(ip.user_ns['output'].read(), b'hi\n')
712 726
713 727 @dec.skip_win32
714 728 def test_script_bg_err():
715 729 ip = get_ipython()
716 730 ip.run_cell_magic("script", "--bg --err error sh", "echo 'hello' >&2")
717 731 nt.assert_equal(ip.user_ns['error'].read(), b'hello\n')
718 732
719 733 @dec.skip_win32
720 734 def test_script_bg_out_err():
721 735 ip = get_ipython()
722 736 ip.run_cell_magic("script", "--bg --out output --err error sh", "echo 'hi'\necho 'hello' >&2")
723 737 nt.assert_equal(ip.user_ns['output'].read(), b'hi\n')
724 738 nt.assert_equal(ip.user_ns['error'].read(), b'hello\n')
725 739
726 740 def test_script_defaults():
727 741 ip = get_ipython()
728 742 for cmd in ['sh', 'bash', 'perl', 'ruby']:
729 743 try:
730 744 find_cmd(cmd)
731 745 except Exception:
732 746 pass
733 747 else:
734 748 nt.assert_in(cmd, ip.magics_manager.magics['cell'])
735 749
736 750
737 751 @magics_class
738 752 class FooFoo(Magics):
739 753 """class with both %foo and %%foo magics"""
740 754 @line_magic('foo')
741 755 def line_foo(self, line):
742 756 "I am line foo"
743 757 pass
744 758
745 759 @cell_magic("foo")
746 760 def cell_foo(self, line, cell):
747 761 "I am cell foo, not line foo"
748 762 pass
749 763
750 764 def test_line_cell_info():
751 765 """%%foo and %foo magics are distinguishable to inspect"""
752 766 ip = get_ipython()
753 767 ip.magics_manager.register(FooFoo)
754 768 oinfo = ip.object_inspect('foo')
755 769 nt.assert_true(oinfo['found'])
756 770 nt.assert_true(oinfo['ismagic'])
757 771
758 772 oinfo = ip.object_inspect('%%foo')
759 773 nt.assert_true(oinfo['found'])
760 774 nt.assert_true(oinfo['ismagic'])
761 775 nt.assert_equal(oinfo['docstring'], FooFoo.cell_foo.__doc__)
762 776
763 777 oinfo = ip.object_inspect('%foo')
764 778 nt.assert_true(oinfo['found'])
765 779 nt.assert_true(oinfo['ismagic'])
766 780 nt.assert_equal(oinfo['docstring'], FooFoo.line_foo.__doc__)
767 781
768 782 def test_multiple_magics():
769 783 ip = get_ipython()
770 784 foo1 = FooFoo(ip)
771 785 foo2 = FooFoo(ip)
772 786 mm = ip.magics_manager
773 787 mm.register(foo1)
774 788 nt.assert_true(mm.magics['line']['foo'].im_self is foo1)
775 789 mm.register(foo2)
776 790 nt.assert_true(mm.magics['line']['foo'].im_self is foo2)
777 791
778 792 def test_alias_magic():
779 793 """Test %alias_magic."""
780 794 ip = get_ipython()
781 795 mm = ip.magics_manager
782 796
783 797 # Basic operation: both cell and line magics are created, if possible.
784 798 ip.run_line_magic('alias_magic', 'timeit_alias timeit')
785 799 nt.assert_in('timeit_alias', mm.magics['line'])
786 800 nt.assert_in('timeit_alias', mm.magics['cell'])
787 801
788 802 # --cell is specified, line magic not created.
789 803 ip.run_line_magic('alias_magic', '--cell timeit_cell_alias timeit')
790 804 nt.assert_not_in('timeit_cell_alias', mm.magics['line'])
791 805 nt.assert_in('timeit_cell_alias', mm.magics['cell'])
792 806
793 807 # Test that line alias is created successfully.
794 808 ip.run_line_magic('alias_magic', '--line env_alias env')
795 809 nt.assert_equal(ip.run_line_magic('env', ''),
796 810 ip.run_line_magic('env_alias', ''))
797 811
798 812 def test_save():
799 813 """Test %save."""
800 814 ip = get_ipython()
801 815 ip.history_manager.reset() # Clear any existing history.
802 816 cmds = [u"a=1", u"def b():\n return a**2", u"print(a, b())"]
803 817 for i, cmd in enumerate(cmds, start=1):
804 818 ip.history_manager.store_inputs(i, cmd)
805 819 with TemporaryDirectory() as tmpdir:
806 820 file = os.path.join(tmpdir, "testsave.py")
807 821 ip.run_line_magic("save", "%s 1-10" % file)
808 822 with open(file) as f:
809 823 content = f.read()
810 824 nt.assert_equal(content.count(cmds[0]), 1)
811 825 nt.assert_in('coding: utf-8', content)
812 826 ip.run_line_magic("save", "-a %s 1-10" % file)
813 827 with open(file) as f:
814 828 content = f.read()
815 829 nt.assert_equal(content.count(cmds[0]), 2)
816 830 nt.assert_in('coding: utf-8', content)
817 831
818 832
819 833 def test_store():
820 834 """Test %store."""
821 835 ip = get_ipython()
822 836 ip.run_line_magic('load_ext', 'storemagic')
823 837
824 838 # make sure the storage is empty
825 839 ip.run_line_magic('store', '-z')
826 840 ip.user_ns['var'] = 42
827 841 ip.run_line_magic('store', 'var')
828 842 ip.user_ns['var'] = 39
829 843 ip.run_line_magic('store', '-r')
830 844 nt.assert_equal(ip.user_ns['var'], 42)
831 845
832 846 ip.run_line_magic('store', '-d var')
833 847 ip.user_ns['var'] = 39
834 848 ip.run_line_magic('store' , '-r')
835 849 nt.assert_equal(ip.user_ns['var'], 39)
836 850
837 851
838 852 def _run_edit_test(arg_s, exp_filename=None,
839 853 exp_lineno=-1,
840 854 exp_contents=None,
841 855 exp_is_temp=None):
842 856 ip = get_ipython()
843 857 M = code.CodeMagics(ip)
844 858 last_call = ['','']
845 859 opts,args = M.parse_options(arg_s,'prxn:')
846 860 filename, lineno, is_temp = M._find_edit_target(ip, args, opts, last_call)
847 861
848 862 if exp_filename is not None:
849 863 nt.assert_equal(exp_filename, filename)
850 864 if exp_contents is not None:
851 865 with io.open(filename, 'r') as f:
852 866 contents = f.read()
853 867 nt.assert_equal(exp_contents, contents)
854 868 if exp_lineno != -1:
855 869 nt.assert_equal(exp_lineno, lineno)
856 870 if exp_is_temp is not None:
857 871 nt.assert_equal(exp_is_temp, is_temp)
858 872
859 873
860 874 def test_edit_interactive():
861 875 """%edit on interactively defined objects"""
862 876 ip = get_ipython()
863 877 n = ip.execution_count
864 878 ip.run_cell(u"def foo(): return 1", store_history=True)
865 879
866 880 try:
867 881 _run_edit_test("foo")
868 882 except code.InteractivelyDefined as e:
869 883 nt.assert_equal(e.index, n)
870 884 else:
871 885 raise AssertionError("Should have raised InteractivelyDefined")
872 886
873 887
874 888 def test_edit_cell():
875 889 """%edit [cell id]"""
876 890 ip = get_ipython()
877 891
878 892 ip.run_cell(u"def foo(): return 1", store_history=True)
879 893
880 894 # test
881 895 _run_edit_test("1", exp_contents=ip.user_ns['In'][1], exp_is_temp=True)
General Comments 0
You need to be logged in to leave comments. Login now