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