##// END OF EJS Templates
Fix test
Quentin Peter -
Show More
@@ -1,1261 +1,1262 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
6
7 import io
7 import io
8 import os
8 import os
9 import re
9 import re
10 import sys
10 import sys
11 import warnings
11 import warnings
12 from textwrap import dedent
12 from textwrap import dedent
13 from unittest import TestCase
13 from unittest import TestCase
14 from unittest import mock
14 from unittest import mock
15 from importlib import invalidate_caches
15 from importlib import invalidate_caches
16 from io import StringIO
16 from io import StringIO
17
17
18 import nose.tools as nt
18 import nose.tools as nt
19
19
20 import shlex
20 import shlex
21
21
22 from IPython import get_ipython
22 from IPython import get_ipython
23 from IPython.core import magic
23 from IPython.core import magic
24 from IPython.core.error import UsageError
24 from IPython.core.error import UsageError
25 from IPython.core.magic import (Magics, magics_class, line_magic,
25 from IPython.core.magic import (Magics, magics_class, line_magic,
26 cell_magic,
26 cell_magic,
27 register_line_magic, register_cell_magic)
27 register_line_magic, register_cell_magic)
28 from IPython.core.magics import execution, script, code, logging, osm
28 from IPython.core.magics import execution, script, code, logging, osm
29 from IPython.testing import decorators as dec
29 from IPython.testing import decorators as dec
30 from IPython.testing import tools as tt
30 from IPython.testing import tools as tt
31 from IPython.utils.io import capture_output
31 from IPython.utils.io import capture_output
32 from IPython.utils.tempdir import (TemporaryDirectory,
32 from IPython.utils.tempdir import (TemporaryDirectory,
33 TemporaryWorkingDirectory)
33 TemporaryWorkingDirectory)
34 from IPython.utils.process import find_cmd
34 from IPython.utils.process import find_cmd
35 from .test_debugger import PdbTestInput
35
36
36
37
37 @magic.magics_class
38 @magic.magics_class
38 class DummyMagics(magic.Magics): pass
39 class DummyMagics(magic.Magics): pass
39
40
40 def test_extract_code_ranges():
41 def test_extract_code_ranges():
41 instr = "1 3 5-6 7-9 10:15 17: :10 10- -13 :"
42 instr = "1 3 5-6 7-9 10:15 17: :10 10- -13 :"
42 expected = [(0, 1),
43 expected = [(0, 1),
43 (2, 3),
44 (2, 3),
44 (4, 6),
45 (4, 6),
45 (6, 9),
46 (6, 9),
46 (9, 14),
47 (9, 14),
47 (16, None),
48 (16, None),
48 (None, 9),
49 (None, 9),
49 (9, None),
50 (9, None),
50 (None, 13),
51 (None, 13),
51 (None, None)]
52 (None, None)]
52 actual = list(code.extract_code_ranges(instr))
53 actual = list(code.extract_code_ranges(instr))
53 nt.assert_equal(actual, expected)
54 nt.assert_equal(actual, expected)
54
55
55 def test_extract_symbols():
56 def test_extract_symbols():
56 source = """import foo\na = 10\ndef b():\n return 42\n\n\nclass A: pass\n\n\n"""
57 source = """import foo\na = 10\ndef b():\n return 42\n\n\nclass A: pass\n\n\n"""
57 symbols_args = ["a", "b", "A", "A,b", "A,a", "z"]
58 symbols_args = ["a", "b", "A", "A,b", "A,a", "z"]
58 expected = [([], ['a']),
59 expected = [([], ['a']),
59 (["def b():\n return 42\n"], []),
60 (["def b():\n return 42\n"], []),
60 (["class A: pass\n"], []),
61 (["class A: pass\n"], []),
61 (["class A: pass\n", "def b():\n return 42\n"], []),
62 (["class A: pass\n", "def b():\n return 42\n"], []),
62 (["class A: pass\n"], ['a']),
63 (["class A: pass\n"], ['a']),
63 ([], ['z'])]
64 ([], ['z'])]
64 for symbols, exp in zip(symbols_args, expected):
65 for symbols, exp in zip(symbols_args, expected):
65 nt.assert_equal(code.extract_symbols(source, symbols), exp)
66 nt.assert_equal(code.extract_symbols(source, symbols), exp)
66
67
67
68
68 def test_extract_symbols_raises_exception_with_non_python_code():
69 def test_extract_symbols_raises_exception_with_non_python_code():
69 source = ("=begin A Ruby program :)=end\n"
70 source = ("=begin A Ruby program :)=end\n"
70 "def hello\n"
71 "def hello\n"
71 "puts 'Hello world'\n"
72 "puts 'Hello world'\n"
72 "end")
73 "end")
73 with nt.assert_raises(SyntaxError):
74 with nt.assert_raises(SyntaxError):
74 code.extract_symbols(source, "hello")
75 code.extract_symbols(source, "hello")
75
76
76
77
77 def test_magic_not_found():
78 def test_magic_not_found():
78 # magic not found raises UsageError
79 # magic not found raises UsageError
79 with nt.assert_raises(UsageError):
80 with nt.assert_raises(UsageError):
80 _ip.magic('doesntexist')
81 _ip.magic('doesntexist')
81
82
82 # ensure result isn't success when a magic isn't found
83 # ensure result isn't success when a magic isn't found
83 result = _ip.run_cell('%doesntexist')
84 result = _ip.run_cell('%doesntexist')
84 assert isinstance(result.error_in_exec, UsageError)
85 assert isinstance(result.error_in_exec, UsageError)
85
86
86
87
87 def test_cell_magic_not_found():
88 def test_cell_magic_not_found():
88 # magic not found raises UsageError
89 # magic not found raises UsageError
89 with nt.assert_raises(UsageError):
90 with nt.assert_raises(UsageError):
90 _ip.run_cell_magic('doesntexist', 'line', 'cell')
91 _ip.run_cell_magic('doesntexist', 'line', 'cell')
91
92
92 # ensure result isn't success when a magic isn't found
93 # ensure result isn't success when a magic isn't found
93 result = _ip.run_cell('%%doesntexist')
94 result = _ip.run_cell('%%doesntexist')
94 assert isinstance(result.error_in_exec, UsageError)
95 assert isinstance(result.error_in_exec, UsageError)
95
96
96
97
97 def test_magic_error_status():
98 def test_magic_error_status():
98 def fail(shell):
99 def fail(shell):
99 1/0
100 1/0
100 _ip.register_magic_function(fail)
101 _ip.register_magic_function(fail)
101 result = _ip.run_cell('%fail')
102 result = _ip.run_cell('%fail')
102 assert isinstance(result.error_in_exec, ZeroDivisionError)
103 assert isinstance(result.error_in_exec, ZeroDivisionError)
103
104
104
105
105 def test_config():
106 def test_config():
106 """ test that config magic does not raise
107 """ test that config magic does not raise
107 can happen if Configurable init is moved too early into
108 can happen if Configurable init is moved too early into
108 Magics.__init__ as then a Config object will be registered as a
109 Magics.__init__ as then a Config object will be registered as a
109 magic.
110 magic.
110 """
111 """
111 ## should not raise.
112 ## should not raise.
112 _ip.magic('config')
113 _ip.magic('config')
113
114
114 def test_config_available_configs():
115 def test_config_available_configs():
115 """ test that config magic prints available configs in unique and
116 """ test that config magic prints available configs in unique and
116 sorted order. """
117 sorted order. """
117 with capture_output() as captured:
118 with capture_output() as captured:
118 _ip.magic('config')
119 _ip.magic('config')
119
120
120 stdout = captured.stdout
121 stdout = captured.stdout
121 config_classes = stdout.strip().split('\n')[1:]
122 config_classes = stdout.strip().split('\n')[1:]
122 nt.assert_list_equal(config_classes, sorted(set(config_classes)))
123 nt.assert_list_equal(config_classes, sorted(set(config_classes)))
123
124
124 def test_config_print_class():
125 def test_config_print_class():
125 """ test that config with a classname prints the class's options. """
126 """ test that config with a classname prints the class's options. """
126 with capture_output() as captured:
127 with capture_output() as captured:
127 _ip.magic('config TerminalInteractiveShell')
128 _ip.magic('config TerminalInteractiveShell')
128
129
129 stdout = captured.stdout
130 stdout = captured.stdout
130 if not re.match("TerminalInteractiveShell.* options", stdout.splitlines()[0]):
131 if not re.match("TerminalInteractiveShell.* options", stdout.splitlines()[0]):
131 print(stdout)
132 print(stdout)
132 raise AssertionError("1st line of stdout not like "
133 raise AssertionError("1st line of stdout not like "
133 "'TerminalInteractiveShell.* options'")
134 "'TerminalInteractiveShell.* options'")
134
135
135 def test_rehashx():
136 def test_rehashx():
136 # clear up everything
137 # clear up everything
137 _ip.alias_manager.clear_aliases()
138 _ip.alias_manager.clear_aliases()
138 del _ip.db['syscmdlist']
139 del _ip.db['syscmdlist']
139
140
140 _ip.magic('rehashx')
141 _ip.magic('rehashx')
141 # Practically ALL ipython development systems will have more than 10 aliases
142 # Practically ALL ipython development systems will have more than 10 aliases
142
143
143 nt.assert_true(len(_ip.alias_manager.aliases) > 10)
144 nt.assert_true(len(_ip.alias_manager.aliases) > 10)
144 for name, cmd in _ip.alias_manager.aliases:
145 for name, cmd in _ip.alias_manager.aliases:
145 # we must strip dots from alias names
146 # we must strip dots from alias names
146 nt.assert_not_in('.', name)
147 nt.assert_not_in('.', name)
147
148
148 # rehashx must fill up syscmdlist
149 # rehashx must fill up syscmdlist
149 scoms = _ip.db['syscmdlist']
150 scoms = _ip.db['syscmdlist']
150 nt.assert_true(len(scoms) > 10)
151 nt.assert_true(len(scoms) > 10)
151
152
152
153
153
154
154 def test_magic_parse_options():
155 def test_magic_parse_options():
155 """Test that we don't mangle paths when parsing magic options."""
156 """Test that we don't mangle paths when parsing magic options."""
156 ip = get_ipython()
157 ip = get_ipython()
157 path = 'c:\\x'
158 path = 'c:\\x'
158 m = DummyMagics(ip)
159 m = DummyMagics(ip)
159 opts = m.parse_options('-f %s' % path,'f:')[0]
160 opts = m.parse_options('-f %s' % path,'f:')[0]
160 # argv splitting is os-dependent
161 # argv splitting is os-dependent
161 if os.name == 'posix':
162 if os.name == 'posix':
162 expected = 'c:x'
163 expected = 'c:x'
163 else:
164 else:
164 expected = path
165 expected = path
165 nt.assert_equal(opts['f'], expected)
166 nt.assert_equal(opts['f'], expected)
166
167
167 def test_magic_parse_long_options():
168 def test_magic_parse_long_options():
168 """Magic.parse_options can handle --foo=bar long options"""
169 """Magic.parse_options can handle --foo=bar long options"""
169 ip = get_ipython()
170 ip = get_ipython()
170 m = DummyMagics(ip)
171 m = DummyMagics(ip)
171 opts, _ = m.parse_options('--foo --bar=bubble', 'a', 'foo', 'bar=')
172 opts, _ = m.parse_options('--foo --bar=bubble', 'a', 'foo', 'bar=')
172 nt.assert_in('foo', opts)
173 nt.assert_in('foo', opts)
173 nt.assert_in('bar', opts)
174 nt.assert_in('bar', opts)
174 nt.assert_equal(opts['bar'], "bubble")
175 nt.assert_equal(opts['bar'], "bubble")
175
176
176
177
177 def doctest_hist_f():
178 def doctest_hist_f():
178 """Test %hist -f with temporary filename.
179 """Test %hist -f with temporary filename.
179
180
180 In [9]: import tempfile
181 In [9]: import tempfile
181
182
182 In [10]: tfile = tempfile.mktemp('.py','tmp-ipython-')
183 In [10]: tfile = tempfile.mktemp('.py','tmp-ipython-')
183
184
184 In [11]: %hist -nl -f $tfile 3
185 In [11]: %hist -nl -f $tfile 3
185
186
186 In [13]: import os; os.unlink(tfile)
187 In [13]: import os; os.unlink(tfile)
187 """
188 """
188
189
189
190
190 def doctest_hist_op():
191 def doctest_hist_op():
191 """Test %hist -op
192 """Test %hist -op
192
193
193 In [1]: class b(float):
194 In [1]: class b(float):
194 ...: pass
195 ...: pass
195 ...:
196 ...:
196
197
197 In [2]: class s(object):
198 In [2]: class s(object):
198 ...: def __str__(self):
199 ...: def __str__(self):
199 ...: return 's'
200 ...: return 's'
200 ...:
201 ...:
201
202
202 In [3]:
203 In [3]:
203
204
204 In [4]: class r(b):
205 In [4]: class r(b):
205 ...: def __repr__(self):
206 ...: def __repr__(self):
206 ...: return 'r'
207 ...: return 'r'
207 ...:
208 ...:
208
209
209 In [5]: class sr(s,r): pass
210 In [5]: class sr(s,r): pass
210 ...:
211 ...:
211
212
212 In [6]:
213 In [6]:
213
214
214 In [7]: bb=b()
215 In [7]: bb=b()
215
216
216 In [8]: ss=s()
217 In [8]: ss=s()
217
218
218 In [9]: rr=r()
219 In [9]: rr=r()
219
220
220 In [10]: ssrr=sr()
221 In [10]: ssrr=sr()
221
222
222 In [11]: 4.5
223 In [11]: 4.5
223 Out[11]: 4.5
224 Out[11]: 4.5
224
225
225 In [12]: str(ss)
226 In [12]: str(ss)
226 Out[12]: 's'
227 Out[12]: 's'
227
228
228 In [13]:
229 In [13]:
229
230
230 In [14]: %hist -op
231 In [14]: %hist -op
231 >>> class b:
232 >>> class b:
232 ... pass
233 ... pass
233 ...
234 ...
234 >>> class s(b):
235 >>> class s(b):
235 ... def __str__(self):
236 ... def __str__(self):
236 ... return 's'
237 ... return 's'
237 ...
238 ...
238 >>>
239 >>>
239 >>> class r(b):
240 >>> class r(b):
240 ... def __repr__(self):
241 ... def __repr__(self):
241 ... return 'r'
242 ... return 'r'
242 ...
243 ...
243 >>> class sr(s,r): pass
244 >>> class sr(s,r): pass
244 >>>
245 >>>
245 >>> bb=b()
246 >>> bb=b()
246 >>> ss=s()
247 >>> ss=s()
247 >>> rr=r()
248 >>> rr=r()
248 >>> ssrr=sr()
249 >>> ssrr=sr()
249 >>> 4.5
250 >>> 4.5
250 4.5
251 4.5
251 >>> str(ss)
252 >>> str(ss)
252 's'
253 's'
253 >>>
254 >>>
254 """
255 """
255
256
256 def test_hist_pof():
257 def test_hist_pof():
257 ip = get_ipython()
258 ip = get_ipython()
258 ip.run_cell(u"1+2", store_history=True)
259 ip.run_cell(u"1+2", store_history=True)
259 #raise Exception(ip.history_manager.session_number)
260 #raise Exception(ip.history_manager.session_number)
260 #raise Exception(list(ip.history_manager._get_range_session()))
261 #raise Exception(list(ip.history_manager._get_range_session()))
261 with TemporaryDirectory() as td:
262 with TemporaryDirectory() as td:
262 tf = os.path.join(td, 'hist.py')
263 tf = os.path.join(td, 'hist.py')
263 ip.run_line_magic('history', '-pof %s' % tf)
264 ip.run_line_magic('history', '-pof %s' % tf)
264 assert os.path.isfile(tf)
265 assert os.path.isfile(tf)
265
266
266
267
267 def test_macro():
268 def test_macro():
268 ip = get_ipython()
269 ip = get_ipython()
269 ip.history_manager.reset() # Clear any existing history.
270 ip.history_manager.reset() # Clear any existing history.
270 cmds = ["a=1", "def b():\n return a**2", "print(a,b())"]
271 cmds = ["a=1", "def b():\n return a**2", "print(a,b())"]
271 for i, cmd in enumerate(cmds, start=1):
272 for i, cmd in enumerate(cmds, start=1):
272 ip.history_manager.store_inputs(i, cmd)
273 ip.history_manager.store_inputs(i, cmd)
273 ip.magic("macro test 1-3")
274 ip.magic("macro test 1-3")
274 nt.assert_equal(ip.user_ns["test"].value, "\n".join(cmds)+"\n")
275 nt.assert_equal(ip.user_ns["test"].value, "\n".join(cmds)+"\n")
275
276
276 # List macros
277 # List macros
277 nt.assert_in("test", ip.magic("macro"))
278 nt.assert_in("test", ip.magic("macro"))
278
279
279
280
280 def test_macro_run():
281 def test_macro_run():
281 """Test that we can run a multi-line macro successfully."""
282 """Test that we can run a multi-line macro successfully."""
282 ip = get_ipython()
283 ip = get_ipython()
283 ip.history_manager.reset()
284 ip.history_manager.reset()
284 cmds = ["a=10", "a+=1", "print(a)", "%macro test 2-3"]
285 cmds = ["a=10", "a+=1", "print(a)", "%macro test 2-3"]
285 for cmd in cmds:
286 for cmd in cmds:
286 ip.run_cell(cmd, store_history=True)
287 ip.run_cell(cmd, store_history=True)
287 nt.assert_equal(ip.user_ns["test"].value, "a+=1\nprint(a)\n")
288 nt.assert_equal(ip.user_ns["test"].value, "a+=1\nprint(a)\n")
288 with tt.AssertPrints("12"):
289 with tt.AssertPrints("12"):
289 ip.run_cell("test")
290 ip.run_cell("test")
290 with tt.AssertPrints("13"):
291 with tt.AssertPrints("13"):
291 ip.run_cell("test")
292 ip.run_cell("test")
292
293
293
294
294 def test_magic_magic():
295 def test_magic_magic():
295 """Test %magic"""
296 """Test %magic"""
296 ip = get_ipython()
297 ip = get_ipython()
297 with capture_output() as captured:
298 with capture_output() as captured:
298 ip.magic("magic")
299 ip.magic("magic")
299
300
300 stdout = captured.stdout
301 stdout = captured.stdout
301 nt.assert_in('%magic', stdout)
302 nt.assert_in('%magic', stdout)
302 nt.assert_in('IPython', stdout)
303 nt.assert_in('IPython', stdout)
303 nt.assert_in('Available', stdout)
304 nt.assert_in('Available', stdout)
304
305
305
306
306 @dec.skipif_not_numpy
307 @dec.skipif_not_numpy
307 def test_numpy_reset_array_undec():
308 def test_numpy_reset_array_undec():
308 "Test '%reset array' functionality"
309 "Test '%reset array' functionality"
309 _ip.ex('import numpy as np')
310 _ip.ex('import numpy as np')
310 _ip.ex('a = np.empty(2)')
311 _ip.ex('a = np.empty(2)')
311 nt.assert_in('a', _ip.user_ns)
312 nt.assert_in('a', _ip.user_ns)
312 _ip.magic('reset -f array')
313 _ip.magic('reset -f array')
313 nt.assert_not_in('a', _ip.user_ns)
314 nt.assert_not_in('a', _ip.user_ns)
314
315
315 def test_reset_out():
316 def test_reset_out():
316 "Test '%reset out' magic"
317 "Test '%reset out' magic"
317 _ip.run_cell("parrot = 'dead'", store_history=True)
318 _ip.run_cell("parrot = 'dead'", store_history=True)
318 # test '%reset -f out', make an Out prompt
319 # test '%reset -f out', make an Out prompt
319 _ip.run_cell("parrot", store_history=True)
320 _ip.run_cell("parrot", store_history=True)
320 nt.assert_true('dead' in [_ip.user_ns[x] for x in ('_','__','___')])
321 nt.assert_true('dead' in [_ip.user_ns[x] for x in ('_','__','___')])
321 _ip.magic('reset -f out')
322 _ip.magic('reset -f out')
322 nt.assert_false('dead' in [_ip.user_ns[x] for x in ('_','__','___')])
323 nt.assert_false('dead' in [_ip.user_ns[x] for x in ('_','__','___')])
323 nt.assert_equal(len(_ip.user_ns['Out']), 0)
324 nt.assert_equal(len(_ip.user_ns['Out']), 0)
324
325
325 def test_reset_in():
326 def test_reset_in():
326 "Test '%reset in' magic"
327 "Test '%reset in' magic"
327 # test '%reset -f in'
328 # test '%reset -f in'
328 _ip.run_cell("parrot", store_history=True)
329 _ip.run_cell("parrot", store_history=True)
329 nt.assert_true('parrot' in [_ip.user_ns[x] for x in ('_i','_ii','_iii')])
330 nt.assert_true('parrot' in [_ip.user_ns[x] for x in ('_i','_ii','_iii')])
330 _ip.magic('%reset -f in')
331 _ip.magic('%reset -f in')
331 nt.assert_false('parrot' in [_ip.user_ns[x] for x in ('_i','_ii','_iii')])
332 nt.assert_false('parrot' in [_ip.user_ns[x] for x in ('_i','_ii','_iii')])
332 nt.assert_equal(len(set(_ip.user_ns['In'])), 1)
333 nt.assert_equal(len(set(_ip.user_ns['In'])), 1)
333
334
334 def test_reset_dhist():
335 def test_reset_dhist():
335 "Test '%reset dhist' magic"
336 "Test '%reset dhist' magic"
336 _ip.run_cell("tmp = [d for d in _dh]") # copy before clearing
337 _ip.run_cell("tmp = [d for d in _dh]") # copy before clearing
337 _ip.magic('cd ' + os.path.dirname(nt.__file__))
338 _ip.magic('cd ' + os.path.dirname(nt.__file__))
338 _ip.magic('cd -')
339 _ip.magic('cd -')
339 nt.assert_true(len(_ip.user_ns['_dh']) > 0)
340 nt.assert_true(len(_ip.user_ns['_dh']) > 0)
340 _ip.magic('reset -f dhist')
341 _ip.magic('reset -f dhist')
341 nt.assert_equal(len(_ip.user_ns['_dh']), 0)
342 nt.assert_equal(len(_ip.user_ns['_dh']), 0)
342 _ip.run_cell("_dh = [d for d in tmp]") #restore
343 _ip.run_cell("_dh = [d for d in tmp]") #restore
343
344
344 def test_reset_in_length():
345 def test_reset_in_length():
345 "Test that '%reset in' preserves In[] length"
346 "Test that '%reset in' preserves In[] length"
346 _ip.run_cell("print 'foo'")
347 _ip.run_cell("print 'foo'")
347 _ip.run_cell("reset -f in")
348 _ip.run_cell("reset -f in")
348 nt.assert_equal(len(_ip.user_ns['In']), _ip.displayhook.prompt_count+1)
349 nt.assert_equal(len(_ip.user_ns['In']), _ip.displayhook.prompt_count+1)
349
350
350 class TestResetErrors(TestCase):
351 class TestResetErrors(TestCase):
351
352
352 def test_reset_redefine(self):
353 def test_reset_redefine(self):
353
354
354 @magics_class
355 @magics_class
355 class KernelMagics(Magics):
356 class KernelMagics(Magics):
356 @line_magic
357 @line_magic
357 def less(self, shell): pass
358 def less(self, shell): pass
358
359
359 _ip.register_magics(KernelMagics)
360 _ip.register_magics(KernelMagics)
360
361
361 with self.assertLogs() as cm:
362 with self.assertLogs() as cm:
362 # hack, we want to just capture logs, but assertLogs fails if not
363 # hack, we want to just capture logs, but assertLogs fails if not
363 # logs get produce.
364 # logs get produce.
364 # so log one things we ignore.
365 # so log one things we ignore.
365 import logging as log_mod
366 import logging as log_mod
366 log = log_mod.getLogger()
367 log = log_mod.getLogger()
367 log.info('Nothing')
368 log.info('Nothing')
368 # end hack.
369 # end hack.
369 _ip.run_cell("reset -f")
370 _ip.run_cell("reset -f")
370
371
371 assert len(cm.output) == 1
372 assert len(cm.output) == 1
372 for out in cm.output:
373 for out in cm.output:
373 assert "Invalid alias" not in out
374 assert "Invalid alias" not in out
374
375
375 def test_tb_syntaxerror():
376 def test_tb_syntaxerror():
376 """test %tb after a SyntaxError"""
377 """test %tb after a SyntaxError"""
377 ip = get_ipython()
378 ip = get_ipython()
378 ip.run_cell("for")
379 ip.run_cell("for")
379
380
380 # trap and validate stdout
381 # trap and validate stdout
381 save_stdout = sys.stdout
382 save_stdout = sys.stdout
382 try:
383 try:
383 sys.stdout = StringIO()
384 sys.stdout = StringIO()
384 ip.run_cell("%tb")
385 ip.run_cell("%tb")
385 out = sys.stdout.getvalue()
386 out = sys.stdout.getvalue()
386 finally:
387 finally:
387 sys.stdout = save_stdout
388 sys.stdout = save_stdout
388 # trim output, and only check the last line
389 # trim output, and only check the last line
389 last_line = out.rstrip().splitlines()[-1].strip()
390 last_line = out.rstrip().splitlines()[-1].strip()
390 nt.assert_equal(last_line, "SyntaxError: invalid syntax")
391 nt.assert_equal(last_line, "SyntaxError: invalid syntax")
391
392
392
393
393 def test_time():
394 def test_time():
394 ip = get_ipython()
395 ip = get_ipython()
395
396
396 with tt.AssertPrints("Wall time: "):
397 with tt.AssertPrints("Wall time: "):
397 ip.run_cell("%time None")
398 ip.run_cell("%time None")
398
399
399 ip.run_cell("def f(kmjy):\n"
400 ip.run_cell("def f(kmjy):\n"
400 " %time print (2*kmjy)")
401 " %time print (2*kmjy)")
401
402
402 with tt.AssertPrints("Wall time: "):
403 with tt.AssertPrints("Wall time: "):
403 with tt.AssertPrints("hihi", suppress=False):
404 with tt.AssertPrints("hihi", suppress=False):
404 ip.run_cell("f('hi')")
405 ip.run_cell("f('hi')")
405
406
406 def test_time_last_not_expression():
407 def test_time_last_not_expression():
407 ip.run_cell("%%time\n"
408 ip.run_cell("%%time\n"
408 "var_1 = 1\n"
409 "var_1 = 1\n"
409 "var_2 = 2\n")
410 "var_2 = 2\n")
410 assert ip.user_ns['var_1'] == 1
411 assert ip.user_ns['var_1'] == 1
411 del ip.user_ns['var_1']
412 del ip.user_ns['var_1']
412 assert ip.user_ns['var_2'] == 2
413 assert ip.user_ns['var_2'] == 2
413 del ip.user_ns['var_2']
414 del ip.user_ns['var_2']
414
415
415
416
416 @dec.skip_win32
417 @dec.skip_win32
417 def test_time2():
418 def test_time2():
418 ip = get_ipython()
419 ip = get_ipython()
419
420
420 with tt.AssertPrints("CPU times: user "):
421 with tt.AssertPrints("CPU times: user "):
421 ip.run_cell("%time None")
422 ip.run_cell("%time None")
422
423
423 def test_time3():
424 def test_time3():
424 """Erroneous magic function calls, issue gh-3334"""
425 """Erroneous magic function calls, issue gh-3334"""
425 ip = get_ipython()
426 ip = get_ipython()
426 ip.user_ns.pop('run', None)
427 ip.user_ns.pop('run', None)
427
428
428 with tt.AssertNotPrints("not found", channel='stderr'):
429 with tt.AssertNotPrints("not found", channel='stderr'):
429 ip.run_cell("%%time\n"
430 ip.run_cell("%%time\n"
430 "run = 0\n"
431 "run = 0\n"
431 "run += 1")
432 "run += 1")
432
433
433 def test_multiline_time():
434 def test_multiline_time():
434 """Make sure last statement from time return a value."""
435 """Make sure last statement from time return a value."""
435 ip = get_ipython()
436 ip = get_ipython()
436 ip.user_ns.pop('run', None)
437 ip.user_ns.pop('run', None)
437
438
438 ip.run_cell(dedent("""\
439 ip.run_cell(dedent("""\
439 %%time
440 %%time
440 a = "ho"
441 a = "ho"
441 b = "hey"
442 b = "hey"
442 a+b
443 a+b
443 """))
444 """))
444 nt.assert_equal(ip.user_ns_hidden['_'], 'hohey')
445 nt.assert_equal(ip.user_ns_hidden['_'], 'hohey')
445
446
446 def test_time_local_ns():
447 def test_time_local_ns():
447 """
448 """
448 Test that local_ns is actually global_ns when running a cell magic
449 Test that local_ns is actually global_ns when running a cell magic
449 """
450 """
450 ip = get_ipython()
451 ip = get_ipython()
451 ip.run_cell("%%time\n"
452 ip.run_cell("%%time\n"
452 "myvar = 1")
453 "myvar = 1")
453 nt.assert_equal(ip.user_ns['myvar'], 1)
454 nt.assert_equal(ip.user_ns['myvar'], 1)
454 del ip.user_ns['myvar']
455 del ip.user_ns['myvar']
455
456
456 def test_doctest_mode():
457 def test_doctest_mode():
457 "Toggle doctest_mode twice, it should be a no-op and run without error"
458 "Toggle doctest_mode twice, it should be a no-op and run without error"
458 _ip.magic('doctest_mode')
459 _ip.magic('doctest_mode')
459 _ip.magic('doctest_mode')
460 _ip.magic('doctest_mode')
460
461
461
462
462 def test_parse_options():
463 def test_parse_options():
463 """Tests for basic options parsing in magics."""
464 """Tests for basic options parsing in magics."""
464 # These are only the most minimal of tests, more should be added later. At
465 # These are only the most minimal of tests, more should be added later. At
465 # the very least we check that basic text/unicode calls work OK.
466 # the very least we check that basic text/unicode calls work OK.
466 m = DummyMagics(_ip)
467 m = DummyMagics(_ip)
467 nt.assert_equal(m.parse_options('foo', '')[1], 'foo')
468 nt.assert_equal(m.parse_options('foo', '')[1], 'foo')
468 nt.assert_equal(m.parse_options(u'foo', '')[1], u'foo')
469 nt.assert_equal(m.parse_options(u'foo', '')[1], u'foo')
469
470
470
471
471 def test_dirops():
472 def test_dirops():
472 """Test various directory handling operations."""
473 """Test various directory handling operations."""
473 # curpath = lambda :os.path.splitdrive(os.getcwd())[1].replace('\\','/')
474 # curpath = lambda :os.path.splitdrive(os.getcwd())[1].replace('\\','/')
474 curpath = os.getcwd
475 curpath = os.getcwd
475 startdir = os.getcwd()
476 startdir = os.getcwd()
476 ipdir = os.path.realpath(_ip.ipython_dir)
477 ipdir = os.path.realpath(_ip.ipython_dir)
477 try:
478 try:
478 _ip.magic('cd "%s"' % ipdir)
479 _ip.magic('cd "%s"' % ipdir)
479 nt.assert_equal(curpath(), ipdir)
480 nt.assert_equal(curpath(), ipdir)
480 _ip.magic('cd -')
481 _ip.magic('cd -')
481 nt.assert_equal(curpath(), startdir)
482 nt.assert_equal(curpath(), startdir)
482 _ip.magic('pushd "%s"' % ipdir)
483 _ip.magic('pushd "%s"' % ipdir)
483 nt.assert_equal(curpath(), ipdir)
484 nt.assert_equal(curpath(), ipdir)
484 _ip.magic('popd')
485 _ip.magic('popd')
485 nt.assert_equal(curpath(), startdir)
486 nt.assert_equal(curpath(), startdir)
486 finally:
487 finally:
487 os.chdir(startdir)
488 os.chdir(startdir)
488
489
489
490
490 def test_cd_force_quiet():
491 def test_cd_force_quiet():
491 """Test OSMagics.cd_force_quiet option"""
492 """Test OSMagics.cd_force_quiet option"""
492 _ip.config.OSMagics.cd_force_quiet = True
493 _ip.config.OSMagics.cd_force_quiet = True
493 osmagics = osm.OSMagics(shell=_ip)
494 osmagics = osm.OSMagics(shell=_ip)
494
495
495 startdir = os.getcwd()
496 startdir = os.getcwd()
496 ipdir = os.path.realpath(_ip.ipython_dir)
497 ipdir = os.path.realpath(_ip.ipython_dir)
497
498
498 try:
499 try:
499 with tt.AssertNotPrints(ipdir):
500 with tt.AssertNotPrints(ipdir):
500 osmagics.cd('"%s"' % ipdir)
501 osmagics.cd('"%s"' % ipdir)
501 with tt.AssertNotPrints(startdir):
502 with tt.AssertNotPrints(startdir):
502 osmagics.cd('-')
503 osmagics.cd('-')
503 finally:
504 finally:
504 os.chdir(startdir)
505 os.chdir(startdir)
505
506
506
507
507 def test_xmode():
508 def test_xmode():
508 # Calling xmode three times should be a no-op
509 # Calling xmode three times should be a no-op
509 xmode = _ip.InteractiveTB.mode
510 xmode = _ip.InteractiveTB.mode
510 for i in range(4):
511 for i in range(4):
511 _ip.magic("xmode")
512 _ip.magic("xmode")
512 nt.assert_equal(_ip.InteractiveTB.mode, xmode)
513 nt.assert_equal(_ip.InteractiveTB.mode, xmode)
513
514
514 def test_reset_hard():
515 def test_reset_hard():
515 monitor = []
516 monitor = []
516 class A(object):
517 class A(object):
517 def __del__(self):
518 def __del__(self):
518 monitor.append(1)
519 monitor.append(1)
519 def __repr__(self):
520 def __repr__(self):
520 return "<A instance>"
521 return "<A instance>"
521
522
522 _ip.user_ns["a"] = A()
523 _ip.user_ns["a"] = A()
523 _ip.run_cell("a")
524 _ip.run_cell("a")
524
525
525 nt.assert_equal(monitor, [])
526 nt.assert_equal(monitor, [])
526 _ip.magic("reset -f")
527 _ip.magic("reset -f")
527 nt.assert_equal(monitor, [1])
528 nt.assert_equal(monitor, [1])
528
529
529 class TestXdel(tt.TempFileMixin):
530 class TestXdel(tt.TempFileMixin):
530 def test_xdel(self):
531 def test_xdel(self):
531 """Test that references from %run are cleared by xdel."""
532 """Test that references from %run are cleared by xdel."""
532 src = ("class A(object):\n"
533 src = ("class A(object):\n"
533 " monitor = []\n"
534 " monitor = []\n"
534 " def __del__(self):\n"
535 " def __del__(self):\n"
535 " self.monitor.append(1)\n"
536 " self.monitor.append(1)\n"
536 "a = A()\n")
537 "a = A()\n")
537 self.mktmp(src)
538 self.mktmp(src)
538 # %run creates some hidden references...
539 # %run creates some hidden references...
539 _ip.magic("run %s" % self.fname)
540 _ip.magic("run %s" % self.fname)
540 # ... as does the displayhook.
541 # ... as does the displayhook.
541 _ip.run_cell("a")
542 _ip.run_cell("a")
542
543
543 monitor = _ip.user_ns["A"].monitor
544 monitor = _ip.user_ns["A"].monitor
544 nt.assert_equal(monitor, [])
545 nt.assert_equal(monitor, [])
545
546
546 _ip.magic("xdel a")
547 _ip.magic("xdel a")
547
548
548 # Check that a's __del__ method has been called.
549 # Check that a's __del__ method has been called.
549 nt.assert_equal(monitor, [1])
550 nt.assert_equal(monitor, [1])
550
551
551 def doctest_who():
552 def doctest_who():
552 """doctest for %who
553 """doctest for %who
553
554
554 In [1]: %reset -f
555 In [1]: %reset -f
555
556
556 In [2]: alpha = 123
557 In [2]: alpha = 123
557
558
558 In [3]: beta = 'beta'
559 In [3]: beta = 'beta'
559
560
560 In [4]: %who int
561 In [4]: %who int
561 alpha
562 alpha
562
563
563 In [5]: %who str
564 In [5]: %who str
564 beta
565 beta
565
566
566 In [6]: %whos
567 In [6]: %whos
567 Variable Type Data/Info
568 Variable Type Data/Info
568 ----------------------------
569 ----------------------------
569 alpha int 123
570 alpha int 123
570 beta str beta
571 beta str beta
571
572
572 In [7]: %who_ls
573 In [7]: %who_ls
573 Out[7]: ['alpha', 'beta']
574 Out[7]: ['alpha', 'beta']
574 """
575 """
575
576
576 def test_whos():
577 def test_whos():
577 """Check that whos is protected against objects where repr() fails."""
578 """Check that whos is protected against objects where repr() fails."""
578 class A(object):
579 class A(object):
579 def __repr__(self):
580 def __repr__(self):
580 raise Exception()
581 raise Exception()
581 _ip.user_ns['a'] = A()
582 _ip.user_ns['a'] = A()
582 _ip.magic("whos")
583 _ip.magic("whos")
583
584
584 def doctest_precision():
585 def doctest_precision():
585 """doctest for %precision
586 """doctest for %precision
586
587
587 In [1]: f = get_ipython().display_formatter.formatters['text/plain']
588 In [1]: f = get_ipython().display_formatter.formatters['text/plain']
588
589
589 In [2]: %precision 5
590 In [2]: %precision 5
590 Out[2]: '%.5f'
591 Out[2]: '%.5f'
591
592
592 In [3]: f.float_format
593 In [3]: f.float_format
593 Out[3]: '%.5f'
594 Out[3]: '%.5f'
594
595
595 In [4]: %precision %e
596 In [4]: %precision %e
596 Out[4]: '%e'
597 Out[4]: '%e'
597
598
598 In [5]: f(3.1415927)
599 In [5]: f(3.1415927)
599 Out[5]: '3.141593e+00'
600 Out[5]: '3.141593e+00'
600 """
601 """
601
602
602 def test_debug_magic():
603 def test_debug_magic():
603 """Test debugging a small code with %debug
604 """Test debugging a small code with %debug
604
605
605 In [1]: %debug print("a b")
606 In [1]: with PdbTestInput(['c']):
607 ...: %debug print("a b")
608 ...:
606 NOTE: Enter 'c' at the ipdb> prompt to continue execution.
609 NOTE: Enter 'c' at the ipdb> prompt to continue execution.
607 > <string>(1)<module>()
610 > <string>(1)<module>()
608
609 ipdb> c
611 ipdb> c
610 a b
612 a b
611
612 In [2]:
613 In [2]:
613 """
614 """
614
615
615 def test_psearch():
616 def test_psearch():
616 with tt.AssertPrints("dict.fromkeys"):
617 with tt.AssertPrints("dict.fromkeys"):
617 _ip.run_cell("dict.fr*?")
618 _ip.run_cell("dict.fr*?")
618 with tt.AssertPrints("Ο€.is_integer"):
619 with tt.AssertPrints("Ο€.is_integer"):
619 _ip.run_cell("Ο€ = 3.14;\nΟ€.is_integ*?")
620 _ip.run_cell("Ο€ = 3.14;\nΟ€.is_integ*?")
620
621
621 def test_timeit_shlex():
622 def test_timeit_shlex():
622 """test shlex issues with timeit (#1109)"""
623 """test shlex issues with timeit (#1109)"""
623 _ip.ex("def f(*a,**kw): pass")
624 _ip.ex("def f(*a,**kw): pass")
624 _ip.magic('timeit -n1 "this is a bug".count(" ")')
625 _ip.magic('timeit -n1 "this is a bug".count(" ")')
625 _ip.magic('timeit -r1 -n1 f(" ", 1)')
626 _ip.magic('timeit -r1 -n1 f(" ", 1)')
626 _ip.magic('timeit -r1 -n1 f(" ", 1, " ", 2, " ")')
627 _ip.magic('timeit -r1 -n1 f(" ", 1, " ", 2, " ")')
627 _ip.magic('timeit -r1 -n1 ("a " + "b")')
628 _ip.magic('timeit -r1 -n1 ("a " + "b")')
628 _ip.magic('timeit -r1 -n1 f("a " + "b")')
629 _ip.magic('timeit -r1 -n1 f("a " + "b")')
629 _ip.magic('timeit -r1 -n1 f("a " + "b ")')
630 _ip.magic('timeit -r1 -n1 f("a " + "b ")')
630
631
631
632
632 def test_timeit_special_syntax():
633 def test_timeit_special_syntax():
633 "Test %%timeit with IPython special syntax"
634 "Test %%timeit with IPython special syntax"
634 @register_line_magic
635 @register_line_magic
635 def lmagic(line):
636 def lmagic(line):
636 ip = get_ipython()
637 ip = get_ipython()
637 ip.user_ns['lmagic_out'] = line
638 ip.user_ns['lmagic_out'] = line
638
639
639 # line mode test
640 # line mode test
640 _ip.run_line_magic('timeit', '-n1 -r1 %lmagic my line')
641 _ip.run_line_magic('timeit', '-n1 -r1 %lmagic my line')
641 nt.assert_equal(_ip.user_ns['lmagic_out'], 'my line')
642 nt.assert_equal(_ip.user_ns['lmagic_out'], 'my line')
642 # cell mode test
643 # cell mode test
643 _ip.run_cell_magic('timeit', '-n1 -r1', '%lmagic my line2')
644 _ip.run_cell_magic('timeit', '-n1 -r1', '%lmagic my line2')
644 nt.assert_equal(_ip.user_ns['lmagic_out'], 'my line2')
645 nt.assert_equal(_ip.user_ns['lmagic_out'], 'my line2')
645
646
646 def test_timeit_return():
647 def test_timeit_return():
647 """
648 """
648 test whether timeit -o return object
649 test whether timeit -o return object
649 """
650 """
650
651
651 res = _ip.run_line_magic('timeit','-n10 -r10 -o 1')
652 res = _ip.run_line_magic('timeit','-n10 -r10 -o 1')
652 assert(res is not None)
653 assert(res is not None)
653
654
654 def test_timeit_quiet():
655 def test_timeit_quiet():
655 """
656 """
656 test quiet option of timeit magic
657 test quiet option of timeit magic
657 """
658 """
658 with tt.AssertNotPrints("loops"):
659 with tt.AssertNotPrints("loops"):
659 _ip.run_cell("%timeit -n1 -r1 -q 1")
660 _ip.run_cell("%timeit -n1 -r1 -q 1")
660
661
661 def test_timeit_return_quiet():
662 def test_timeit_return_quiet():
662 with tt.AssertNotPrints("loops"):
663 with tt.AssertNotPrints("loops"):
663 res = _ip.run_line_magic('timeit', '-n1 -r1 -q -o 1')
664 res = _ip.run_line_magic('timeit', '-n1 -r1 -q -o 1')
664 assert (res is not None)
665 assert (res is not None)
665
666
666 def test_timeit_invalid_return():
667 def test_timeit_invalid_return():
667 with nt.assert_raises_regex(SyntaxError, "outside function"):
668 with nt.assert_raises_regex(SyntaxError, "outside function"):
668 _ip.run_line_magic('timeit', 'return')
669 _ip.run_line_magic('timeit', 'return')
669
670
670 @dec.skipif(execution.profile is None)
671 @dec.skipif(execution.profile is None)
671 def test_prun_special_syntax():
672 def test_prun_special_syntax():
672 "Test %%prun with IPython special syntax"
673 "Test %%prun with IPython special syntax"
673 @register_line_magic
674 @register_line_magic
674 def lmagic(line):
675 def lmagic(line):
675 ip = get_ipython()
676 ip = get_ipython()
676 ip.user_ns['lmagic_out'] = line
677 ip.user_ns['lmagic_out'] = line
677
678
678 # line mode test
679 # line mode test
679 _ip.run_line_magic('prun', '-q %lmagic my line')
680 _ip.run_line_magic('prun', '-q %lmagic my line')
680 nt.assert_equal(_ip.user_ns['lmagic_out'], 'my line')
681 nt.assert_equal(_ip.user_ns['lmagic_out'], 'my line')
681 # cell mode test
682 # cell mode test
682 _ip.run_cell_magic('prun', '-q', '%lmagic my line2')
683 _ip.run_cell_magic('prun', '-q', '%lmagic my line2')
683 nt.assert_equal(_ip.user_ns['lmagic_out'], 'my line2')
684 nt.assert_equal(_ip.user_ns['lmagic_out'], 'my line2')
684
685
685 @dec.skipif(execution.profile is None)
686 @dec.skipif(execution.profile is None)
686 def test_prun_quotes():
687 def test_prun_quotes():
687 "Test that prun does not clobber string escapes (GH #1302)"
688 "Test that prun does not clobber string escapes (GH #1302)"
688 _ip.magic(r"prun -q x = '\t'")
689 _ip.magic(r"prun -q x = '\t'")
689 nt.assert_equal(_ip.user_ns['x'], '\t')
690 nt.assert_equal(_ip.user_ns['x'], '\t')
690
691
691 def test_extension():
692 def test_extension():
692 # Debugging information for failures of this test
693 # Debugging information for failures of this test
693 print('sys.path:')
694 print('sys.path:')
694 for p in sys.path:
695 for p in sys.path:
695 print(' ', p)
696 print(' ', p)
696 print('CWD', os.getcwd())
697 print('CWD', os.getcwd())
697
698
698 nt.assert_raises(ImportError, _ip.magic, "load_ext daft_extension")
699 nt.assert_raises(ImportError, _ip.magic, "load_ext daft_extension")
699 daft_path = os.path.join(os.path.dirname(__file__), "daft_extension")
700 daft_path = os.path.join(os.path.dirname(__file__), "daft_extension")
700 sys.path.insert(0, daft_path)
701 sys.path.insert(0, daft_path)
701 try:
702 try:
702 _ip.user_ns.pop('arq', None)
703 _ip.user_ns.pop('arq', None)
703 invalidate_caches() # Clear import caches
704 invalidate_caches() # Clear import caches
704 _ip.magic("load_ext daft_extension")
705 _ip.magic("load_ext daft_extension")
705 nt.assert_equal(_ip.user_ns['arq'], 185)
706 nt.assert_equal(_ip.user_ns['arq'], 185)
706 _ip.magic("unload_ext daft_extension")
707 _ip.magic("unload_ext daft_extension")
707 assert 'arq' not in _ip.user_ns
708 assert 'arq' not in _ip.user_ns
708 finally:
709 finally:
709 sys.path.remove(daft_path)
710 sys.path.remove(daft_path)
710
711
711
712
712 def test_notebook_export_json():
713 def test_notebook_export_json():
713 _ip = get_ipython()
714 _ip = get_ipython()
714 _ip.history_manager.reset() # Clear any existing history.
715 _ip.history_manager.reset() # Clear any existing history.
715 cmds = [u"a=1", u"def b():\n return a**2", u"print('noΓ«l, Γ©tΓ©', b())"]
716 cmds = [u"a=1", u"def b():\n return a**2", u"print('noΓ«l, Γ©tΓ©', b())"]
716 for i, cmd in enumerate(cmds, start=1):
717 for i, cmd in enumerate(cmds, start=1):
717 _ip.history_manager.store_inputs(i, cmd)
718 _ip.history_manager.store_inputs(i, cmd)
718 with TemporaryDirectory() as td:
719 with TemporaryDirectory() as td:
719 outfile = os.path.join(td, "nb.ipynb")
720 outfile = os.path.join(td, "nb.ipynb")
720 _ip.magic("notebook -e %s" % outfile)
721 _ip.magic("notebook -e %s" % outfile)
721
722
722
723
723 class TestEnv(TestCase):
724 class TestEnv(TestCase):
724
725
725 def test_env(self):
726 def test_env(self):
726 env = _ip.magic("env")
727 env = _ip.magic("env")
727 self.assertTrue(isinstance(env, dict))
728 self.assertTrue(isinstance(env, dict))
728
729
729 def test_env_secret(self):
730 def test_env_secret(self):
730 env = _ip.magic("env")
731 env = _ip.magic("env")
731 hidden = "<hidden>"
732 hidden = "<hidden>"
732 with mock.patch.dict(
733 with mock.patch.dict(
733 os.environ,
734 os.environ,
734 {
735 {
735 "API_KEY": "abc123",
736 "API_KEY": "abc123",
736 "SECRET_THING": "ssshhh",
737 "SECRET_THING": "ssshhh",
737 "JUPYTER_TOKEN": "",
738 "JUPYTER_TOKEN": "",
738 "VAR": "abc"
739 "VAR": "abc"
739 }
740 }
740 ):
741 ):
741 env = _ip.magic("env")
742 env = _ip.magic("env")
742 assert env["API_KEY"] == hidden
743 assert env["API_KEY"] == hidden
743 assert env["SECRET_THING"] == hidden
744 assert env["SECRET_THING"] == hidden
744 assert env["JUPYTER_TOKEN"] == hidden
745 assert env["JUPYTER_TOKEN"] == hidden
745 assert env["VAR"] == "abc"
746 assert env["VAR"] == "abc"
746
747
747 def test_env_get_set_simple(self):
748 def test_env_get_set_simple(self):
748 env = _ip.magic("env var val1")
749 env = _ip.magic("env var val1")
749 self.assertEqual(env, None)
750 self.assertEqual(env, None)
750 self.assertEqual(os.environ['var'], 'val1')
751 self.assertEqual(os.environ['var'], 'val1')
751 self.assertEqual(_ip.magic("env var"), 'val1')
752 self.assertEqual(_ip.magic("env var"), 'val1')
752 env = _ip.magic("env var=val2")
753 env = _ip.magic("env var=val2")
753 self.assertEqual(env, None)
754 self.assertEqual(env, None)
754 self.assertEqual(os.environ['var'], 'val2')
755 self.assertEqual(os.environ['var'], 'val2')
755
756
756 def test_env_get_set_complex(self):
757 def test_env_get_set_complex(self):
757 env = _ip.magic("env var 'val1 '' 'val2")
758 env = _ip.magic("env var 'val1 '' 'val2")
758 self.assertEqual(env, None)
759 self.assertEqual(env, None)
759 self.assertEqual(os.environ['var'], "'val1 '' 'val2")
760 self.assertEqual(os.environ['var'], "'val1 '' 'val2")
760 self.assertEqual(_ip.magic("env var"), "'val1 '' 'val2")
761 self.assertEqual(_ip.magic("env var"), "'val1 '' 'val2")
761 env = _ip.magic('env var=val2 val3="val4')
762 env = _ip.magic('env var=val2 val3="val4')
762 self.assertEqual(env, None)
763 self.assertEqual(env, None)
763 self.assertEqual(os.environ['var'], 'val2 val3="val4')
764 self.assertEqual(os.environ['var'], 'val2 val3="val4')
764
765
765 def test_env_set_bad_input(self):
766 def test_env_set_bad_input(self):
766 self.assertRaises(UsageError, lambda: _ip.magic("set_env var"))
767 self.assertRaises(UsageError, lambda: _ip.magic("set_env var"))
767
768
768 def test_env_set_whitespace(self):
769 def test_env_set_whitespace(self):
769 self.assertRaises(UsageError, lambda: _ip.magic("env var A=B"))
770 self.assertRaises(UsageError, lambda: _ip.magic("env var A=B"))
770
771
771
772
772 class CellMagicTestCase(TestCase):
773 class CellMagicTestCase(TestCase):
773
774
774 def check_ident(self, magic):
775 def check_ident(self, magic):
775 # Manually called, we get the result
776 # Manually called, we get the result
776 out = _ip.run_cell_magic(magic, 'a', 'b')
777 out = _ip.run_cell_magic(magic, 'a', 'b')
777 nt.assert_equal(out, ('a','b'))
778 nt.assert_equal(out, ('a','b'))
778 # Via run_cell, it goes into the user's namespace via displayhook
779 # Via run_cell, it goes into the user's namespace via displayhook
779 _ip.run_cell('%%' + magic +' c\nd\n')
780 _ip.run_cell('%%' + magic +' c\nd\n')
780 nt.assert_equal(_ip.user_ns['_'], ('c','d\n'))
781 nt.assert_equal(_ip.user_ns['_'], ('c','d\n'))
781
782
782 def test_cell_magic_func_deco(self):
783 def test_cell_magic_func_deco(self):
783 "Cell magic using simple decorator"
784 "Cell magic using simple decorator"
784 @register_cell_magic
785 @register_cell_magic
785 def cellm(line, cell):
786 def cellm(line, cell):
786 return line, cell
787 return line, cell
787
788
788 self.check_ident('cellm')
789 self.check_ident('cellm')
789
790
790 def test_cell_magic_reg(self):
791 def test_cell_magic_reg(self):
791 "Cell magic manually registered"
792 "Cell magic manually registered"
792 def cellm(line, cell):
793 def cellm(line, cell):
793 return line, cell
794 return line, cell
794
795
795 _ip.register_magic_function(cellm, 'cell', 'cellm2')
796 _ip.register_magic_function(cellm, 'cell', 'cellm2')
796 self.check_ident('cellm2')
797 self.check_ident('cellm2')
797
798
798 def test_cell_magic_class(self):
799 def test_cell_magic_class(self):
799 "Cell magics declared via a class"
800 "Cell magics declared via a class"
800 @magics_class
801 @magics_class
801 class MyMagics(Magics):
802 class MyMagics(Magics):
802
803
803 @cell_magic
804 @cell_magic
804 def cellm3(self, line, cell):
805 def cellm3(self, line, cell):
805 return line, cell
806 return line, cell
806
807
807 _ip.register_magics(MyMagics)
808 _ip.register_magics(MyMagics)
808 self.check_ident('cellm3')
809 self.check_ident('cellm3')
809
810
810 def test_cell_magic_class2(self):
811 def test_cell_magic_class2(self):
811 "Cell magics declared via a class, #2"
812 "Cell magics declared via a class, #2"
812 @magics_class
813 @magics_class
813 class MyMagics2(Magics):
814 class MyMagics2(Magics):
814
815
815 @cell_magic('cellm4')
816 @cell_magic('cellm4')
816 def cellm33(self, line, cell):
817 def cellm33(self, line, cell):
817 return line, cell
818 return line, cell
818
819
819 _ip.register_magics(MyMagics2)
820 _ip.register_magics(MyMagics2)
820 self.check_ident('cellm4')
821 self.check_ident('cellm4')
821 # Check that nothing is registered as 'cellm33'
822 # Check that nothing is registered as 'cellm33'
822 c33 = _ip.find_cell_magic('cellm33')
823 c33 = _ip.find_cell_magic('cellm33')
823 nt.assert_equal(c33, None)
824 nt.assert_equal(c33, None)
824
825
825 def test_file():
826 def test_file():
826 """Basic %%writefile"""
827 """Basic %%writefile"""
827 ip = get_ipython()
828 ip = get_ipython()
828 with TemporaryDirectory() as td:
829 with TemporaryDirectory() as td:
829 fname = os.path.join(td, 'file1')
830 fname = os.path.join(td, 'file1')
830 ip.run_cell_magic("writefile", fname, u'\n'.join([
831 ip.run_cell_magic("writefile", fname, u'\n'.join([
831 'line1',
832 'line1',
832 'line2',
833 'line2',
833 ]))
834 ]))
834 with open(fname) as f:
835 with open(fname) as f:
835 s = f.read()
836 s = f.read()
836 nt.assert_in('line1\n', s)
837 nt.assert_in('line1\n', s)
837 nt.assert_in('line2', s)
838 nt.assert_in('line2', s)
838
839
839 @dec.skip_win32
840 @dec.skip_win32
840 def test_file_single_quote():
841 def test_file_single_quote():
841 """Basic %%writefile with embedded single quotes"""
842 """Basic %%writefile with embedded single quotes"""
842 ip = get_ipython()
843 ip = get_ipython()
843 with TemporaryDirectory() as td:
844 with TemporaryDirectory() as td:
844 fname = os.path.join(td, '\'file1\'')
845 fname = os.path.join(td, '\'file1\'')
845 ip.run_cell_magic("writefile", fname, u'\n'.join([
846 ip.run_cell_magic("writefile", fname, u'\n'.join([
846 'line1',
847 'line1',
847 'line2',
848 'line2',
848 ]))
849 ]))
849 with open(fname) as f:
850 with open(fname) as f:
850 s = f.read()
851 s = f.read()
851 nt.assert_in('line1\n', s)
852 nt.assert_in('line1\n', s)
852 nt.assert_in('line2', s)
853 nt.assert_in('line2', s)
853
854
854 @dec.skip_win32
855 @dec.skip_win32
855 def test_file_double_quote():
856 def test_file_double_quote():
856 """Basic %%writefile with embedded double quotes"""
857 """Basic %%writefile with embedded double quotes"""
857 ip = get_ipython()
858 ip = get_ipython()
858 with TemporaryDirectory() as td:
859 with TemporaryDirectory() as td:
859 fname = os.path.join(td, '"file1"')
860 fname = os.path.join(td, '"file1"')
860 ip.run_cell_magic("writefile", fname, u'\n'.join([
861 ip.run_cell_magic("writefile", fname, u'\n'.join([
861 'line1',
862 'line1',
862 'line2',
863 'line2',
863 ]))
864 ]))
864 with open(fname) as f:
865 with open(fname) as f:
865 s = f.read()
866 s = f.read()
866 nt.assert_in('line1\n', s)
867 nt.assert_in('line1\n', s)
867 nt.assert_in('line2', s)
868 nt.assert_in('line2', s)
868
869
869 def test_file_var_expand():
870 def test_file_var_expand():
870 """%%writefile $filename"""
871 """%%writefile $filename"""
871 ip = get_ipython()
872 ip = get_ipython()
872 with TemporaryDirectory() as td:
873 with TemporaryDirectory() as td:
873 fname = os.path.join(td, 'file1')
874 fname = os.path.join(td, 'file1')
874 ip.user_ns['filename'] = fname
875 ip.user_ns['filename'] = fname
875 ip.run_cell_magic("writefile", '$filename', u'\n'.join([
876 ip.run_cell_magic("writefile", '$filename', u'\n'.join([
876 'line1',
877 'line1',
877 'line2',
878 'line2',
878 ]))
879 ]))
879 with open(fname) as f:
880 with open(fname) as f:
880 s = f.read()
881 s = f.read()
881 nt.assert_in('line1\n', s)
882 nt.assert_in('line1\n', s)
882 nt.assert_in('line2', s)
883 nt.assert_in('line2', s)
883
884
884 def test_file_unicode():
885 def test_file_unicode():
885 """%%writefile with unicode cell"""
886 """%%writefile with unicode cell"""
886 ip = get_ipython()
887 ip = get_ipython()
887 with TemporaryDirectory() as td:
888 with TemporaryDirectory() as td:
888 fname = os.path.join(td, 'file1')
889 fname = os.path.join(td, 'file1')
889 ip.run_cell_magic("writefile", fname, u'\n'.join([
890 ip.run_cell_magic("writefile", fname, u'\n'.join([
890 u'linΓ©1',
891 u'linΓ©1',
891 u'linΓ©2',
892 u'linΓ©2',
892 ]))
893 ]))
893 with io.open(fname, encoding='utf-8') as f:
894 with io.open(fname, encoding='utf-8') as f:
894 s = f.read()
895 s = f.read()
895 nt.assert_in(u'linΓ©1\n', s)
896 nt.assert_in(u'linΓ©1\n', s)
896 nt.assert_in(u'linΓ©2', s)
897 nt.assert_in(u'linΓ©2', s)
897
898
898 def test_file_amend():
899 def test_file_amend():
899 """%%writefile -a amends files"""
900 """%%writefile -a amends files"""
900 ip = get_ipython()
901 ip = get_ipython()
901 with TemporaryDirectory() as td:
902 with TemporaryDirectory() as td:
902 fname = os.path.join(td, 'file2')
903 fname = os.path.join(td, 'file2')
903 ip.run_cell_magic("writefile", fname, u'\n'.join([
904 ip.run_cell_magic("writefile", fname, u'\n'.join([
904 'line1',
905 'line1',
905 'line2',
906 'line2',
906 ]))
907 ]))
907 ip.run_cell_magic("writefile", "-a %s" % fname, u'\n'.join([
908 ip.run_cell_magic("writefile", "-a %s" % fname, u'\n'.join([
908 'line3',
909 'line3',
909 'line4',
910 'line4',
910 ]))
911 ]))
911 with open(fname) as f:
912 with open(fname) as f:
912 s = f.read()
913 s = f.read()
913 nt.assert_in('line1\n', s)
914 nt.assert_in('line1\n', s)
914 nt.assert_in('line3\n', s)
915 nt.assert_in('line3\n', s)
915
916
916 def test_file_spaces():
917 def test_file_spaces():
917 """%%file with spaces in filename"""
918 """%%file with spaces in filename"""
918 ip = get_ipython()
919 ip = get_ipython()
919 with TemporaryWorkingDirectory() as td:
920 with TemporaryWorkingDirectory() as td:
920 fname = "file name"
921 fname = "file name"
921 ip.run_cell_magic("file", '"%s"'%fname, u'\n'.join([
922 ip.run_cell_magic("file", '"%s"'%fname, u'\n'.join([
922 'line1',
923 'line1',
923 'line2',
924 'line2',
924 ]))
925 ]))
925 with open(fname) as f:
926 with open(fname) as f:
926 s = f.read()
927 s = f.read()
927 nt.assert_in('line1\n', s)
928 nt.assert_in('line1\n', s)
928 nt.assert_in('line2', s)
929 nt.assert_in('line2', s)
929
930
930 def test_script_config():
931 def test_script_config():
931 ip = get_ipython()
932 ip = get_ipython()
932 ip.config.ScriptMagics.script_magics = ['whoda']
933 ip.config.ScriptMagics.script_magics = ['whoda']
933 sm = script.ScriptMagics(shell=ip)
934 sm = script.ScriptMagics(shell=ip)
934 nt.assert_in('whoda', sm.magics['cell'])
935 nt.assert_in('whoda', sm.magics['cell'])
935
936
936 @dec.skip_win32
937 @dec.skip_win32
937 def test_script_out():
938 def test_script_out():
938 ip = get_ipython()
939 ip = get_ipython()
939 ip.run_cell_magic("script", "--out output sh", "echo 'hi'")
940 ip.run_cell_magic("script", "--out output sh", "echo 'hi'")
940 nt.assert_equal(ip.user_ns['output'], 'hi\n')
941 nt.assert_equal(ip.user_ns['output'], 'hi\n')
941
942
942 @dec.skip_win32
943 @dec.skip_win32
943 def test_script_err():
944 def test_script_err():
944 ip = get_ipython()
945 ip = get_ipython()
945 ip.run_cell_magic("script", "--err error sh", "echo 'hello' >&2")
946 ip.run_cell_magic("script", "--err error sh", "echo 'hello' >&2")
946 nt.assert_equal(ip.user_ns['error'], 'hello\n')
947 nt.assert_equal(ip.user_ns['error'], 'hello\n')
947
948
948 @dec.skip_win32
949 @dec.skip_win32
949 def test_script_out_err():
950 def test_script_out_err():
950 ip = get_ipython()
951 ip = get_ipython()
951 ip.run_cell_magic("script", "--out output --err error sh", "echo 'hi'\necho 'hello' >&2")
952 ip.run_cell_magic("script", "--out output --err error sh", "echo 'hi'\necho 'hello' >&2")
952 nt.assert_equal(ip.user_ns['output'], 'hi\n')
953 nt.assert_equal(ip.user_ns['output'], 'hi\n')
953 nt.assert_equal(ip.user_ns['error'], 'hello\n')
954 nt.assert_equal(ip.user_ns['error'], 'hello\n')
954
955
955 @dec.skip_win32
956 @dec.skip_win32
956 def test_script_bg_out():
957 def test_script_bg_out():
957 ip = get_ipython()
958 ip = get_ipython()
958 ip.run_cell_magic("script", "--bg --out output sh", "echo 'hi'")
959 ip.run_cell_magic("script", "--bg --out output sh", "echo 'hi'")
959
960
960 nt.assert_equal(ip.user_ns['output'].read(), b'hi\n')
961 nt.assert_equal(ip.user_ns['output'].read(), b'hi\n')
961 ip.user_ns['output'].close()
962 ip.user_ns['output'].close()
962
963
963 @dec.skip_win32
964 @dec.skip_win32
964 def test_script_bg_err():
965 def test_script_bg_err():
965 ip = get_ipython()
966 ip = get_ipython()
966 ip.run_cell_magic("script", "--bg --err error sh", "echo 'hello' >&2")
967 ip.run_cell_magic("script", "--bg --err error sh", "echo 'hello' >&2")
967 nt.assert_equal(ip.user_ns['error'].read(), b'hello\n')
968 nt.assert_equal(ip.user_ns['error'].read(), b'hello\n')
968 ip.user_ns['error'].close()
969 ip.user_ns['error'].close()
969
970
970 @dec.skip_win32
971 @dec.skip_win32
971 def test_script_bg_out_err():
972 def test_script_bg_out_err():
972 ip = get_ipython()
973 ip = get_ipython()
973 ip.run_cell_magic("script", "--bg --out output --err error sh", "echo 'hi'\necho 'hello' >&2")
974 ip.run_cell_magic("script", "--bg --out output --err error sh", "echo 'hi'\necho 'hello' >&2")
974 nt.assert_equal(ip.user_ns['output'].read(), b'hi\n')
975 nt.assert_equal(ip.user_ns['output'].read(), b'hi\n')
975 nt.assert_equal(ip.user_ns['error'].read(), b'hello\n')
976 nt.assert_equal(ip.user_ns['error'].read(), b'hello\n')
976 ip.user_ns['output'].close()
977 ip.user_ns['output'].close()
977 ip.user_ns['error'].close()
978 ip.user_ns['error'].close()
978
979
979 def test_script_defaults():
980 def test_script_defaults():
980 ip = get_ipython()
981 ip = get_ipython()
981 for cmd in ['sh', 'bash', 'perl', 'ruby']:
982 for cmd in ['sh', 'bash', 'perl', 'ruby']:
982 try:
983 try:
983 find_cmd(cmd)
984 find_cmd(cmd)
984 except Exception:
985 except Exception:
985 pass
986 pass
986 else:
987 else:
987 nt.assert_in(cmd, ip.magics_manager.magics['cell'])
988 nt.assert_in(cmd, ip.magics_manager.magics['cell'])
988
989
989
990
990 @magics_class
991 @magics_class
991 class FooFoo(Magics):
992 class FooFoo(Magics):
992 """class with both %foo and %%foo magics"""
993 """class with both %foo and %%foo magics"""
993 @line_magic('foo')
994 @line_magic('foo')
994 def line_foo(self, line):
995 def line_foo(self, line):
995 "I am line foo"
996 "I am line foo"
996 pass
997 pass
997
998
998 @cell_magic("foo")
999 @cell_magic("foo")
999 def cell_foo(self, line, cell):
1000 def cell_foo(self, line, cell):
1000 "I am cell foo, not line foo"
1001 "I am cell foo, not line foo"
1001 pass
1002 pass
1002
1003
1003 def test_line_cell_info():
1004 def test_line_cell_info():
1004 """%%foo and %foo magics are distinguishable to inspect"""
1005 """%%foo and %foo magics are distinguishable to inspect"""
1005 ip = get_ipython()
1006 ip = get_ipython()
1006 ip.magics_manager.register(FooFoo)
1007 ip.magics_manager.register(FooFoo)
1007 oinfo = ip.object_inspect('foo')
1008 oinfo = ip.object_inspect('foo')
1008 nt.assert_true(oinfo['found'])
1009 nt.assert_true(oinfo['found'])
1009 nt.assert_true(oinfo['ismagic'])
1010 nt.assert_true(oinfo['ismagic'])
1010
1011
1011 oinfo = ip.object_inspect('%%foo')
1012 oinfo = ip.object_inspect('%%foo')
1012 nt.assert_true(oinfo['found'])
1013 nt.assert_true(oinfo['found'])
1013 nt.assert_true(oinfo['ismagic'])
1014 nt.assert_true(oinfo['ismagic'])
1014 nt.assert_equal(oinfo['docstring'], FooFoo.cell_foo.__doc__)
1015 nt.assert_equal(oinfo['docstring'], FooFoo.cell_foo.__doc__)
1015
1016
1016 oinfo = ip.object_inspect('%foo')
1017 oinfo = ip.object_inspect('%foo')
1017 nt.assert_true(oinfo['found'])
1018 nt.assert_true(oinfo['found'])
1018 nt.assert_true(oinfo['ismagic'])
1019 nt.assert_true(oinfo['ismagic'])
1019 nt.assert_equal(oinfo['docstring'], FooFoo.line_foo.__doc__)
1020 nt.assert_equal(oinfo['docstring'], FooFoo.line_foo.__doc__)
1020
1021
1021 def test_multiple_magics():
1022 def test_multiple_magics():
1022 ip = get_ipython()
1023 ip = get_ipython()
1023 foo1 = FooFoo(ip)
1024 foo1 = FooFoo(ip)
1024 foo2 = FooFoo(ip)
1025 foo2 = FooFoo(ip)
1025 mm = ip.magics_manager
1026 mm = ip.magics_manager
1026 mm.register(foo1)
1027 mm.register(foo1)
1027 nt.assert_true(mm.magics['line']['foo'].__self__ is foo1)
1028 nt.assert_true(mm.magics['line']['foo'].__self__ is foo1)
1028 mm.register(foo2)
1029 mm.register(foo2)
1029 nt.assert_true(mm.magics['line']['foo'].__self__ is foo2)
1030 nt.assert_true(mm.magics['line']['foo'].__self__ is foo2)
1030
1031
1031 def test_alias_magic():
1032 def test_alias_magic():
1032 """Test %alias_magic."""
1033 """Test %alias_magic."""
1033 ip = get_ipython()
1034 ip = get_ipython()
1034 mm = ip.magics_manager
1035 mm = ip.magics_manager
1035
1036
1036 # Basic operation: both cell and line magics are created, if possible.
1037 # Basic operation: both cell and line magics are created, if possible.
1037 ip.run_line_magic('alias_magic', 'timeit_alias timeit')
1038 ip.run_line_magic('alias_magic', 'timeit_alias timeit')
1038 nt.assert_in('timeit_alias', mm.magics['line'])
1039 nt.assert_in('timeit_alias', mm.magics['line'])
1039 nt.assert_in('timeit_alias', mm.magics['cell'])
1040 nt.assert_in('timeit_alias', mm.magics['cell'])
1040
1041
1041 # --cell is specified, line magic not created.
1042 # --cell is specified, line magic not created.
1042 ip.run_line_magic('alias_magic', '--cell timeit_cell_alias timeit')
1043 ip.run_line_magic('alias_magic', '--cell timeit_cell_alias timeit')
1043 nt.assert_not_in('timeit_cell_alias', mm.magics['line'])
1044 nt.assert_not_in('timeit_cell_alias', mm.magics['line'])
1044 nt.assert_in('timeit_cell_alias', mm.magics['cell'])
1045 nt.assert_in('timeit_cell_alias', mm.magics['cell'])
1045
1046
1046 # Test that line alias is created successfully.
1047 # Test that line alias is created successfully.
1047 ip.run_line_magic('alias_magic', '--line env_alias env')
1048 ip.run_line_magic('alias_magic', '--line env_alias env')
1048 nt.assert_equal(ip.run_line_magic('env', ''),
1049 nt.assert_equal(ip.run_line_magic('env', ''),
1049 ip.run_line_magic('env_alias', ''))
1050 ip.run_line_magic('env_alias', ''))
1050
1051
1051 # Test that line alias with parameters passed in is created successfully.
1052 # Test that line alias with parameters passed in is created successfully.
1052 ip.run_line_magic('alias_magic', '--line history_alias history --params ' + shlex.quote('3'))
1053 ip.run_line_magic('alias_magic', '--line history_alias history --params ' + shlex.quote('3'))
1053 nt.assert_in('history_alias', mm.magics['line'])
1054 nt.assert_in('history_alias', mm.magics['line'])
1054
1055
1055
1056
1056 def test_save():
1057 def test_save():
1057 """Test %save."""
1058 """Test %save."""
1058 ip = get_ipython()
1059 ip = get_ipython()
1059 ip.history_manager.reset() # Clear any existing history.
1060 ip.history_manager.reset() # Clear any existing history.
1060 cmds = [u"a=1", u"def b():\n return a**2", u"print(a, b())"]
1061 cmds = [u"a=1", u"def b():\n return a**2", u"print(a, b())"]
1061 for i, cmd in enumerate(cmds, start=1):
1062 for i, cmd in enumerate(cmds, start=1):
1062 ip.history_manager.store_inputs(i, cmd)
1063 ip.history_manager.store_inputs(i, cmd)
1063 with TemporaryDirectory() as tmpdir:
1064 with TemporaryDirectory() as tmpdir:
1064 file = os.path.join(tmpdir, "testsave.py")
1065 file = os.path.join(tmpdir, "testsave.py")
1065 ip.run_line_magic("save", "%s 1-10" % file)
1066 ip.run_line_magic("save", "%s 1-10" % file)
1066 with open(file) as f:
1067 with open(file) as f:
1067 content = f.read()
1068 content = f.read()
1068 nt.assert_equal(content.count(cmds[0]), 1)
1069 nt.assert_equal(content.count(cmds[0]), 1)
1069 nt.assert_in('coding: utf-8', content)
1070 nt.assert_in('coding: utf-8', content)
1070 ip.run_line_magic("save", "-a %s 1-10" % file)
1071 ip.run_line_magic("save", "-a %s 1-10" % file)
1071 with open(file) as f:
1072 with open(file) as f:
1072 content = f.read()
1073 content = f.read()
1073 nt.assert_equal(content.count(cmds[0]), 2)
1074 nt.assert_equal(content.count(cmds[0]), 2)
1074 nt.assert_in('coding: utf-8', content)
1075 nt.assert_in('coding: utf-8', content)
1075
1076
1076
1077
1077 def test_store():
1078 def test_store():
1078 """Test %store."""
1079 """Test %store."""
1079 ip = get_ipython()
1080 ip = get_ipython()
1080 ip.run_line_magic('load_ext', 'storemagic')
1081 ip.run_line_magic('load_ext', 'storemagic')
1081
1082
1082 # make sure the storage is empty
1083 # make sure the storage is empty
1083 ip.run_line_magic('store', '-z')
1084 ip.run_line_magic('store', '-z')
1084 ip.user_ns['var'] = 42
1085 ip.user_ns['var'] = 42
1085 ip.run_line_magic('store', 'var')
1086 ip.run_line_magic('store', 'var')
1086 ip.user_ns['var'] = 39
1087 ip.user_ns['var'] = 39
1087 ip.run_line_magic('store', '-r')
1088 ip.run_line_magic('store', '-r')
1088 nt.assert_equal(ip.user_ns['var'], 42)
1089 nt.assert_equal(ip.user_ns['var'], 42)
1089
1090
1090 ip.run_line_magic('store', '-d var')
1091 ip.run_line_magic('store', '-d var')
1091 ip.user_ns['var'] = 39
1092 ip.user_ns['var'] = 39
1092 ip.run_line_magic('store' , '-r')
1093 ip.run_line_magic('store' , '-r')
1093 nt.assert_equal(ip.user_ns['var'], 39)
1094 nt.assert_equal(ip.user_ns['var'], 39)
1094
1095
1095
1096
1096 def _run_edit_test(arg_s, exp_filename=None,
1097 def _run_edit_test(arg_s, exp_filename=None,
1097 exp_lineno=-1,
1098 exp_lineno=-1,
1098 exp_contents=None,
1099 exp_contents=None,
1099 exp_is_temp=None):
1100 exp_is_temp=None):
1100 ip = get_ipython()
1101 ip = get_ipython()
1101 M = code.CodeMagics(ip)
1102 M = code.CodeMagics(ip)
1102 last_call = ['','']
1103 last_call = ['','']
1103 opts,args = M.parse_options(arg_s,'prxn:')
1104 opts,args = M.parse_options(arg_s,'prxn:')
1104 filename, lineno, is_temp = M._find_edit_target(ip, args, opts, last_call)
1105 filename, lineno, is_temp = M._find_edit_target(ip, args, opts, last_call)
1105
1106
1106 if exp_filename is not None:
1107 if exp_filename is not None:
1107 nt.assert_equal(exp_filename, filename)
1108 nt.assert_equal(exp_filename, filename)
1108 if exp_contents is not None:
1109 if exp_contents is not None:
1109 with io.open(filename, 'r', encoding='utf-8') as f:
1110 with io.open(filename, 'r', encoding='utf-8') as f:
1110 contents = f.read()
1111 contents = f.read()
1111 nt.assert_equal(exp_contents, contents)
1112 nt.assert_equal(exp_contents, contents)
1112 if exp_lineno != -1:
1113 if exp_lineno != -1:
1113 nt.assert_equal(exp_lineno, lineno)
1114 nt.assert_equal(exp_lineno, lineno)
1114 if exp_is_temp is not None:
1115 if exp_is_temp is not None:
1115 nt.assert_equal(exp_is_temp, is_temp)
1116 nt.assert_equal(exp_is_temp, is_temp)
1116
1117
1117
1118
1118 def test_edit_interactive():
1119 def test_edit_interactive():
1119 """%edit on interactively defined objects"""
1120 """%edit on interactively defined objects"""
1120 ip = get_ipython()
1121 ip = get_ipython()
1121 n = ip.execution_count
1122 n = ip.execution_count
1122 ip.run_cell(u"def foo(): return 1", store_history=True)
1123 ip.run_cell(u"def foo(): return 1", store_history=True)
1123
1124
1124 try:
1125 try:
1125 _run_edit_test("foo")
1126 _run_edit_test("foo")
1126 except code.InteractivelyDefined as e:
1127 except code.InteractivelyDefined as e:
1127 nt.assert_equal(e.index, n)
1128 nt.assert_equal(e.index, n)
1128 else:
1129 else:
1129 raise AssertionError("Should have raised InteractivelyDefined")
1130 raise AssertionError("Should have raised InteractivelyDefined")
1130
1131
1131
1132
1132 def test_edit_cell():
1133 def test_edit_cell():
1133 """%edit [cell id]"""
1134 """%edit [cell id]"""
1134 ip = get_ipython()
1135 ip = get_ipython()
1135
1136
1136 ip.run_cell(u"def foo(): return 1", store_history=True)
1137 ip.run_cell(u"def foo(): return 1", store_history=True)
1137
1138
1138 # test
1139 # test
1139 _run_edit_test("1", exp_contents=ip.user_ns['In'][1], exp_is_temp=True)
1140 _run_edit_test("1", exp_contents=ip.user_ns['In'][1], exp_is_temp=True)
1140
1141
1141 def test_bookmark():
1142 def test_bookmark():
1142 ip = get_ipython()
1143 ip = get_ipython()
1143 ip.run_line_magic('bookmark', 'bmname')
1144 ip.run_line_magic('bookmark', 'bmname')
1144 with tt.AssertPrints('bmname'):
1145 with tt.AssertPrints('bmname'):
1145 ip.run_line_magic('bookmark', '-l')
1146 ip.run_line_magic('bookmark', '-l')
1146 ip.run_line_magic('bookmark', '-d bmname')
1147 ip.run_line_magic('bookmark', '-d bmname')
1147
1148
1148 def test_ls_magic():
1149 def test_ls_magic():
1149 ip = get_ipython()
1150 ip = get_ipython()
1150 json_formatter = ip.display_formatter.formatters['application/json']
1151 json_formatter = ip.display_formatter.formatters['application/json']
1151 json_formatter.enabled = True
1152 json_formatter.enabled = True
1152 lsmagic = ip.magic('lsmagic')
1153 lsmagic = ip.magic('lsmagic')
1153 with warnings.catch_warnings(record=True) as w:
1154 with warnings.catch_warnings(record=True) as w:
1154 j = json_formatter(lsmagic)
1155 j = json_formatter(lsmagic)
1155 nt.assert_equal(sorted(j), ['cell', 'line'])
1156 nt.assert_equal(sorted(j), ['cell', 'line'])
1156 nt.assert_equal(w, []) # no warnings
1157 nt.assert_equal(w, []) # no warnings
1157
1158
1158 def test_strip_initial_indent():
1159 def test_strip_initial_indent():
1159 def sii(s):
1160 def sii(s):
1160 lines = s.splitlines()
1161 lines = s.splitlines()
1161 return '\n'.join(code.strip_initial_indent(lines))
1162 return '\n'.join(code.strip_initial_indent(lines))
1162
1163
1163 nt.assert_equal(sii(" a = 1\nb = 2"), "a = 1\nb = 2")
1164 nt.assert_equal(sii(" a = 1\nb = 2"), "a = 1\nb = 2")
1164 nt.assert_equal(sii(" a\n b\nc"), "a\n b\nc")
1165 nt.assert_equal(sii(" a\n b\nc"), "a\n b\nc")
1165 nt.assert_equal(sii("a\n b"), "a\n b")
1166 nt.assert_equal(sii("a\n b"), "a\n b")
1166
1167
1167 def test_logging_magic_quiet_from_arg():
1168 def test_logging_magic_quiet_from_arg():
1168 _ip.config.LoggingMagics.quiet = False
1169 _ip.config.LoggingMagics.quiet = False
1169 lm = logging.LoggingMagics(shell=_ip)
1170 lm = logging.LoggingMagics(shell=_ip)
1170 with TemporaryDirectory() as td:
1171 with TemporaryDirectory() as td:
1171 try:
1172 try:
1172 with tt.AssertNotPrints(re.compile("Activating.*")):
1173 with tt.AssertNotPrints(re.compile("Activating.*")):
1173 lm.logstart('-q {}'.format(
1174 lm.logstart('-q {}'.format(
1174 os.path.join(td, "quiet_from_arg.log")))
1175 os.path.join(td, "quiet_from_arg.log")))
1175 finally:
1176 finally:
1176 _ip.logger.logstop()
1177 _ip.logger.logstop()
1177
1178
1178 def test_logging_magic_quiet_from_config():
1179 def test_logging_magic_quiet_from_config():
1179 _ip.config.LoggingMagics.quiet = True
1180 _ip.config.LoggingMagics.quiet = True
1180 lm = logging.LoggingMagics(shell=_ip)
1181 lm = logging.LoggingMagics(shell=_ip)
1181 with TemporaryDirectory() as td:
1182 with TemporaryDirectory() as td:
1182 try:
1183 try:
1183 with tt.AssertNotPrints(re.compile("Activating.*")):
1184 with tt.AssertNotPrints(re.compile("Activating.*")):
1184 lm.logstart(os.path.join(td, "quiet_from_config.log"))
1185 lm.logstart(os.path.join(td, "quiet_from_config.log"))
1185 finally:
1186 finally:
1186 _ip.logger.logstop()
1187 _ip.logger.logstop()
1187
1188
1188
1189
1189 def test_logging_magic_not_quiet():
1190 def test_logging_magic_not_quiet():
1190 _ip.config.LoggingMagics.quiet = False
1191 _ip.config.LoggingMagics.quiet = False
1191 lm = logging.LoggingMagics(shell=_ip)
1192 lm = logging.LoggingMagics(shell=_ip)
1192 with TemporaryDirectory() as td:
1193 with TemporaryDirectory() as td:
1193 try:
1194 try:
1194 with tt.AssertPrints(re.compile("Activating.*")):
1195 with tt.AssertPrints(re.compile("Activating.*")):
1195 lm.logstart(os.path.join(td, "not_quiet.log"))
1196 lm.logstart(os.path.join(td, "not_quiet.log"))
1196 finally:
1197 finally:
1197 _ip.logger.logstop()
1198 _ip.logger.logstop()
1198
1199
1199
1200
1200 def test_time_no_var_expand():
1201 def test_time_no_var_expand():
1201 _ip.user_ns['a'] = 5
1202 _ip.user_ns['a'] = 5
1202 _ip.user_ns['b'] = []
1203 _ip.user_ns['b'] = []
1203 _ip.magic('time b.append("{a}")')
1204 _ip.magic('time b.append("{a}")')
1204 assert _ip.user_ns['b'] == ['{a}']
1205 assert _ip.user_ns['b'] == ['{a}']
1205
1206
1206
1207
1207 # this is slow, put at the end for local testing.
1208 # this is slow, put at the end for local testing.
1208 def test_timeit_arguments():
1209 def test_timeit_arguments():
1209 "Test valid timeit arguments, should not cause SyntaxError (GH #1269)"
1210 "Test valid timeit arguments, should not cause SyntaxError (GH #1269)"
1210 if sys.version_info < (3,7):
1211 if sys.version_info < (3,7):
1211 _ip.magic("timeit -n1 -r1 ('#')")
1212 _ip.magic("timeit -n1 -r1 ('#')")
1212 else:
1213 else:
1213 # 3.7 optimize no-op statement like above out, and complain there is
1214 # 3.7 optimize no-op statement like above out, and complain there is
1214 # nothing in the for loop.
1215 # nothing in the for loop.
1215 _ip.magic("timeit -n1 -r1 a=('#')")
1216 _ip.magic("timeit -n1 -r1 a=('#')")
1216
1217
1217
1218
1218 TEST_MODULE = """
1219 TEST_MODULE = """
1219 print('Loaded my_tmp')
1220 print('Loaded my_tmp')
1220 if __name__ == "__main__":
1221 if __name__ == "__main__":
1221 print('I just ran a script')
1222 print('I just ran a script')
1222 """
1223 """
1223
1224
1224
1225
1225 def test_run_module_from_import_hook():
1226 def test_run_module_from_import_hook():
1226 "Test that a module can be loaded via an import hook"
1227 "Test that a module can be loaded via an import hook"
1227 with TemporaryDirectory() as tmpdir:
1228 with TemporaryDirectory() as tmpdir:
1228 fullpath = os.path.join(tmpdir, 'my_tmp.py')
1229 fullpath = os.path.join(tmpdir, 'my_tmp.py')
1229 with open(fullpath, 'w') as f:
1230 with open(fullpath, 'w') as f:
1230 f.write(TEST_MODULE)
1231 f.write(TEST_MODULE)
1231
1232
1232 class MyTempImporter(object):
1233 class MyTempImporter(object):
1233 def __init__(self):
1234 def __init__(self):
1234 pass
1235 pass
1235
1236
1236 def find_module(self, fullname, path=None):
1237 def find_module(self, fullname, path=None):
1237 if 'my_tmp' in fullname:
1238 if 'my_tmp' in fullname:
1238 return self
1239 return self
1239 return None
1240 return None
1240
1241
1241 def load_module(self, name):
1242 def load_module(self, name):
1242 import imp
1243 import imp
1243 return imp.load_source('my_tmp', fullpath)
1244 return imp.load_source('my_tmp', fullpath)
1244
1245
1245 def get_code(self, fullname):
1246 def get_code(self, fullname):
1246 with open(fullpath, 'r') as f:
1247 with open(fullpath, 'r') as f:
1247 return compile(f.read(), 'foo', 'exec')
1248 return compile(f.read(), 'foo', 'exec')
1248
1249
1249 def is_package(self, __):
1250 def is_package(self, __):
1250 return False
1251 return False
1251
1252
1252 sys.meta_path.insert(0, MyTempImporter())
1253 sys.meta_path.insert(0, MyTempImporter())
1253
1254
1254 with capture_output() as captured:
1255 with capture_output() as captured:
1255 _ip.magic("run -m my_tmp")
1256 _ip.magic("run -m my_tmp")
1256 _ip.run_cell("import my_tmp")
1257 _ip.run_cell("import my_tmp")
1257
1258
1258 output = "Loaded my_tmp\nI just ran a script\nLoaded my_tmp\n"
1259 output = "Loaded my_tmp\nI just ran a script\nLoaded my_tmp\n"
1259 nt.assert_equal(output, captured.stdout)
1260 nt.assert_equal(output, captured.stdout)
1260
1261
1261 sys.meta_path.pop(0)
1262 sys.meta_path.pop(0)
General Comments 0
You need to be logged in to leave comments. Login now