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