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