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