##// END OF EJS Templates
Add prun transform test
Jason Grout -
Show More
@@ -1,866 +1,881 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 491
492 492 @dec.skipif(execution.profile is None)
493 def test_prun_special_syntax():
494 "Test %%prun with IPython special syntax"
495 @register_line_magic
496 def lmagic(line):
497 ip = get_ipython()
498 ip.user_ns['lmagic_out'] = line
499
500 # line mode test
501 _ip.run_line_magic('prun', '-q %lmagic my line')
502 nt.assert_equal(_ip.user_ns['lmagic_out'], 'my line')
503 # cell mode test
504 _ip.run_cell_magic('prun', '-q', '%lmagic my line2')
505 nt.assert_equal(_ip.user_ns['lmagic_out'], 'my line2')
506
507 @dec.skipif(execution.profile is None)
493 508 def test_prun_quotes():
494 509 "Test that prun does not clobber string escapes (GH #1302)"
495 510 _ip.magic(r"prun -q x = '\t'")
496 511 nt.assert_equal(_ip.user_ns['x'], '\t')
497 512
498 513 def test_extension():
499 514 tmpdir = TemporaryDirectory()
500 515 orig_ipython_dir = _ip.ipython_dir
501 516 try:
502 517 _ip.ipython_dir = tmpdir.name
503 518 nt.assert_raises(ImportError, _ip.magic, "load_ext daft_extension")
504 519 url = os.path.join(os.path.dirname(__file__), "daft_extension.py")
505 520 _ip.magic("install_ext %s" % url)
506 521 _ip.user_ns.pop('arq', None)
507 522 invalidate_caches() # Clear import caches
508 523 _ip.magic("load_ext daft_extension")
509 524 nt.assert_equal(_ip.user_ns['arq'], 185)
510 525 _ip.magic("unload_ext daft_extension")
511 526 assert 'arq' not in _ip.user_ns
512 527 finally:
513 528 _ip.ipython_dir = orig_ipython_dir
514 529 tmpdir.cleanup()
515 530
516 531 def test_notebook_export_json():
517 532 with TemporaryDirectory() as td:
518 533 outfile = os.path.join(td, "nb.ipynb")
519 534 _ip.ex(py3compat.u_format(u"u = {u}'hΓ©llo'"))
520 535 _ip.magic("notebook -e %s" % outfile)
521 536
522 537 def test_notebook_export_py():
523 538 with TemporaryDirectory() as td:
524 539 outfile = os.path.join(td, "nb.py")
525 540 _ip.ex(py3compat.u_format(u"u = {u}'hΓ©llo'"))
526 541 _ip.magic("notebook -e %s" % outfile)
527 542
528 543 def test_notebook_reformat_py():
529 544 with TemporaryDirectory() as td:
530 545 infile = os.path.join(td, "nb.ipynb")
531 546 with io.open(infile, 'w', encoding='utf-8') as f:
532 547 current.write(nb0, f, 'json')
533 548
534 549 _ip.ex(py3compat.u_format(u"u = {u}'hΓ©llo'"))
535 550 _ip.magic("notebook -f py %s" % infile)
536 551
537 552 def test_notebook_reformat_json():
538 553 with TemporaryDirectory() as td:
539 554 infile = os.path.join(td, "nb.py")
540 555 with io.open(infile, 'w', encoding='utf-8') as f:
541 556 current.write(nb0, f, 'py')
542 557
543 558 _ip.ex(py3compat.u_format(u"u = {u}'hΓ©llo'"))
544 559 _ip.magic("notebook -f ipynb %s" % infile)
545 560 _ip.magic("notebook -f json %s" % infile)
546 561
547 562 def test_env():
548 563 env = _ip.magic("env")
549 564 assert isinstance(env, dict), type(env)
550 565
551 566
552 567 class CellMagicTestCase(TestCase):
553 568
554 569 def check_ident(self, magic):
555 570 # Manually called, we get the result
556 571 out = _ip.run_cell_magic(magic, 'a', 'b')
557 572 nt.assert_equal(out, ('a','b'))
558 573 # Via run_cell, it goes into the user's namespace via displayhook
559 574 _ip.run_cell('%%' + magic +' c\nd')
560 575 nt.assert_equal(_ip.user_ns['_'], ('c','d'))
561 576
562 577 def test_cell_magic_func_deco(self):
563 578 "Cell magic using simple decorator"
564 579 @register_cell_magic
565 580 def cellm(line, cell):
566 581 return line, cell
567 582
568 583 self.check_ident('cellm')
569 584
570 585 def test_cell_magic_reg(self):
571 586 "Cell magic manually registered"
572 587 def cellm(line, cell):
573 588 return line, cell
574 589
575 590 _ip.register_magic_function(cellm, 'cell', 'cellm2')
576 591 self.check_ident('cellm2')
577 592
578 593 def test_cell_magic_class(self):
579 594 "Cell magics declared via a class"
580 595 @magics_class
581 596 class MyMagics(Magics):
582 597
583 598 @cell_magic
584 599 def cellm3(self, line, cell):
585 600 return line, cell
586 601
587 602 _ip.register_magics(MyMagics)
588 603 self.check_ident('cellm3')
589 604
590 605 def test_cell_magic_class2(self):
591 606 "Cell magics declared via a class, #2"
592 607 @magics_class
593 608 class MyMagics2(Magics):
594 609
595 610 @cell_magic('cellm4')
596 611 def cellm33(self, line, cell):
597 612 return line, cell
598 613
599 614 _ip.register_magics(MyMagics2)
600 615 self.check_ident('cellm4')
601 616 # Check that nothing is registered as 'cellm33'
602 617 c33 = _ip.find_cell_magic('cellm33')
603 618 nt.assert_equal(c33, None)
604 619
605 620 def test_file():
606 621 """Basic %%file"""
607 622 ip = get_ipython()
608 623 with TemporaryDirectory() as td:
609 624 fname = os.path.join(td, 'file1')
610 625 ip.run_cell_magic("file", fname, u'\n'.join([
611 626 'line1',
612 627 'line2',
613 628 ]))
614 629 with open(fname) as f:
615 630 s = f.read()
616 631 nt.assert_in('line1\n', s)
617 632 nt.assert_in('line2', s)
618 633
619 634 def test_file_var_expand():
620 635 """%%file $filename"""
621 636 ip = get_ipython()
622 637 with TemporaryDirectory() as td:
623 638 fname = os.path.join(td, 'file1')
624 639 ip.user_ns['filename'] = fname
625 640 ip.run_cell_magic("file", '$filename', u'\n'.join([
626 641 'line1',
627 642 'line2',
628 643 ]))
629 644 with open(fname) as f:
630 645 s = f.read()
631 646 nt.assert_in('line1\n', s)
632 647 nt.assert_in('line2', s)
633 648
634 649 def test_file_unicode():
635 650 """%%file with unicode cell"""
636 651 ip = get_ipython()
637 652 with TemporaryDirectory() as td:
638 653 fname = os.path.join(td, 'file1')
639 654 ip.run_cell_magic("file", fname, u'\n'.join([
640 655 u'linΓ©1',
641 656 u'linΓ©2',
642 657 ]))
643 658 with io.open(fname, encoding='utf-8') as f:
644 659 s = f.read()
645 660 nt.assert_in(u'linΓ©1\n', s)
646 661 nt.assert_in(u'linΓ©2', s)
647 662
648 663 def test_file_amend():
649 664 """%%file -a amends files"""
650 665 ip = get_ipython()
651 666 with TemporaryDirectory() as td:
652 667 fname = os.path.join(td, 'file2')
653 668 ip.run_cell_magic("file", fname, u'\n'.join([
654 669 'line1',
655 670 'line2',
656 671 ]))
657 672 ip.run_cell_magic("file", "-a %s" % fname, u'\n'.join([
658 673 'line3',
659 674 'line4',
660 675 ]))
661 676 with open(fname) as f:
662 677 s = f.read()
663 678 nt.assert_in('line1\n', s)
664 679 nt.assert_in('line3\n', s)
665 680
666 681
667 682 def test_script_config():
668 683 ip = get_ipython()
669 684 ip.config.ScriptMagics.script_magics = ['whoda']
670 685 sm = script.ScriptMagics(shell=ip)
671 686 nt.assert_in('whoda', sm.magics['cell'])
672 687
673 688 @dec.skip_win32
674 689 def test_script_out():
675 690 ip = get_ipython()
676 691 ip.run_cell_magic("script", "--out output sh", "echo 'hi'")
677 692 nt.assert_equal(ip.user_ns['output'], 'hi\n')
678 693
679 694 @dec.skip_win32
680 695 def test_script_err():
681 696 ip = get_ipython()
682 697 ip.run_cell_magic("script", "--err error sh", "echo 'hello' >&2")
683 698 nt.assert_equal(ip.user_ns['error'], 'hello\n')
684 699
685 700 @dec.skip_win32
686 701 def test_script_out_err():
687 702 ip = get_ipython()
688 703 ip.run_cell_magic("script", "--out output --err error sh", "echo 'hi'\necho 'hello' >&2")
689 704 nt.assert_equal(ip.user_ns['output'], 'hi\n')
690 705 nt.assert_equal(ip.user_ns['error'], 'hello\n')
691 706
692 707 @dec.skip_win32
693 708 def test_script_bg_out():
694 709 ip = get_ipython()
695 710 ip.run_cell_magic("script", "--bg --out output sh", "echo 'hi'")
696 711 nt.assert_equal(ip.user_ns['output'].read(), b'hi\n')
697 712
698 713 @dec.skip_win32
699 714 def test_script_bg_err():
700 715 ip = get_ipython()
701 716 ip.run_cell_magic("script", "--bg --err error sh", "echo 'hello' >&2")
702 717 nt.assert_equal(ip.user_ns['error'].read(), b'hello\n')
703 718
704 719 @dec.skip_win32
705 720 def test_script_bg_out_err():
706 721 ip = get_ipython()
707 722 ip.run_cell_magic("script", "--bg --out output --err error sh", "echo 'hi'\necho 'hello' >&2")
708 723 nt.assert_equal(ip.user_ns['output'].read(), b'hi\n')
709 724 nt.assert_equal(ip.user_ns['error'].read(), b'hello\n')
710 725
711 726 def test_script_defaults():
712 727 ip = get_ipython()
713 728 for cmd in ['sh', 'bash', 'perl', 'ruby']:
714 729 try:
715 730 find_cmd(cmd)
716 731 except Exception:
717 732 pass
718 733 else:
719 734 nt.assert_in(cmd, ip.magics_manager.magics['cell'])
720 735
721 736
722 737 @magics_class
723 738 class FooFoo(Magics):
724 739 """class with both %foo and %%foo magics"""
725 740 @line_magic('foo')
726 741 def line_foo(self, line):
727 742 "I am line foo"
728 743 pass
729 744
730 745 @cell_magic("foo")
731 746 def cell_foo(self, line, cell):
732 747 "I am cell foo, not line foo"
733 748 pass
734 749
735 750 def test_line_cell_info():
736 751 """%%foo and %foo magics are distinguishable to inspect"""
737 752 ip = get_ipython()
738 753 ip.magics_manager.register(FooFoo)
739 754 oinfo = ip.object_inspect('foo')
740 755 nt.assert_true(oinfo['found'])
741 756 nt.assert_true(oinfo['ismagic'])
742 757
743 758 oinfo = ip.object_inspect('%%foo')
744 759 nt.assert_true(oinfo['found'])
745 760 nt.assert_true(oinfo['ismagic'])
746 761 nt.assert_equal(oinfo['docstring'], FooFoo.cell_foo.__doc__)
747 762
748 763 oinfo = ip.object_inspect('%foo')
749 764 nt.assert_true(oinfo['found'])
750 765 nt.assert_true(oinfo['ismagic'])
751 766 nt.assert_equal(oinfo['docstring'], FooFoo.line_foo.__doc__)
752 767
753 768 def test_multiple_magics():
754 769 ip = get_ipython()
755 770 foo1 = FooFoo(ip)
756 771 foo2 = FooFoo(ip)
757 772 mm = ip.magics_manager
758 773 mm.register(foo1)
759 774 nt.assert_true(mm.magics['line']['foo'].im_self is foo1)
760 775 mm.register(foo2)
761 776 nt.assert_true(mm.magics['line']['foo'].im_self is foo2)
762 777
763 778 def test_alias_magic():
764 779 """Test %alias_magic."""
765 780 ip = get_ipython()
766 781 mm = ip.magics_manager
767 782
768 783 # Basic operation: both cell and line magics are created, if possible.
769 784 ip.run_line_magic('alias_magic', 'timeit_alias timeit')
770 785 nt.assert_in('timeit_alias', mm.magics['line'])
771 786 nt.assert_in('timeit_alias', mm.magics['cell'])
772 787
773 788 # --cell is specified, line magic not created.
774 789 ip.run_line_magic('alias_magic', '--cell timeit_cell_alias timeit')
775 790 nt.assert_not_in('timeit_cell_alias', mm.magics['line'])
776 791 nt.assert_in('timeit_cell_alias', mm.magics['cell'])
777 792
778 793 # Test that line alias is created successfully.
779 794 ip.run_line_magic('alias_magic', '--line env_alias env')
780 795 nt.assert_equal(ip.run_line_magic('env', ''),
781 796 ip.run_line_magic('env_alias', ''))
782 797
783 798 def test_save():
784 799 """Test %save."""
785 800 ip = get_ipython()
786 801 ip.history_manager.reset() # Clear any existing history.
787 802 cmds = [u"a=1", u"def b():\n return a**2", u"print(a, b())"]
788 803 for i, cmd in enumerate(cmds, start=1):
789 804 ip.history_manager.store_inputs(i, cmd)
790 805 with TemporaryDirectory() as tmpdir:
791 806 file = os.path.join(tmpdir, "testsave.py")
792 807 ip.run_line_magic("save", "%s 1-10" % file)
793 808 with open(file) as f:
794 809 content = f.read()
795 810 nt.assert_equal(content.count(cmds[0]), 1)
796 811 nt.assert_in('coding: utf-8', content)
797 812 ip.run_line_magic("save", "-a %s 1-10" % file)
798 813 with open(file) as f:
799 814 content = f.read()
800 815 nt.assert_equal(content.count(cmds[0]), 2)
801 816 nt.assert_in('coding: utf-8', content)
802 817
803 818
804 819 def test_store():
805 820 """Test %store."""
806 821 ip = get_ipython()
807 822 ip.run_line_magic('load_ext', 'storemagic')
808 823
809 824 # make sure the storage is empty
810 825 ip.run_line_magic('store', '-z')
811 826 ip.user_ns['var'] = 42
812 827 ip.run_line_magic('store', 'var')
813 828 ip.user_ns['var'] = 39
814 829 ip.run_line_magic('store', '-r')
815 830 nt.assert_equal(ip.user_ns['var'], 42)
816 831
817 832 ip.run_line_magic('store', '-d var')
818 833 ip.user_ns['var'] = 39
819 834 ip.run_line_magic('store' , '-r')
820 835 nt.assert_equal(ip.user_ns['var'], 39)
821 836
822 837
823 838 def _run_edit_test(arg_s, exp_filename=None,
824 839 exp_lineno=-1,
825 840 exp_contents=None,
826 841 exp_is_temp=None):
827 842 ip = get_ipython()
828 843 M = code.CodeMagics(ip)
829 844 last_call = ['','']
830 845 opts,args = M.parse_options(arg_s,'prxn:')
831 846 filename, lineno, is_temp = M._find_edit_target(ip, args, opts, last_call)
832 847
833 848 if exp_filename is not None:
834 849 nt.assert_equal(exp_filename, filename)
835 850 if exp_contents is not None:
836 851 with io.open(filename, 'r') as f:
837 852 contents = f.read()
838 853 nt.assert_equal(exp_contents, contents)
839 854 if exp_lineno != -1:
840 855 nt.assert_equal(exp_lineno, lineno)
841 856 if exp_is_temp is not None:
842 857 nt.assert_equal(exp_is_temp, is_temp)
843 858
844 859
845 860 def test_edit_interactive():
846 861 """%edit on interactively defined objects"""
847 862 ip = get_ipython()
848 863 n = ip.execution_count
849 864 ip.run_cell(u"def foo(): return 1", store_history=True)
850 865
851 866 try:
852 867 _run_edit_test("foo")
853 868 except code.InteractivelyDefined as e:
854 869 nt.assert_equal(e.index, n)
855 870 else:
856 871 raise AssertionError("Should have raised InteractivelyDefined")
857 872
858 873
859 874 def test_edit_cell():
860 875 """%edit [cell id]"""
861 876 ip = get_ipython()
862 877
863 878 ip.run_cell(u"def foo(): return 1", store_history=True)
864 879
865 880 # test
866 881 _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