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