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