##// END OF EJS Templates
back to dev
back to dev

File last commit:

r28101:e548ee23 merge
r28137:3339fad9
Show More
test_interactiveshell.py
1175 lines | 38.5 KiB | text/x-python | PythonLexer
/ IPython / core / tests / test_interactiveshell.py
Jörgen Stenarson
Adding test for safe_execfile call with non-ascii path
r5094 # -*- coding: utf-8 -*-
Fernando Perez
Fix bug with execution of naked multiline strings....
r3300 """Tests for the key interactiveshell module.
Historically the main classes in interactiveshell have been under-tested. This
module should grow as many single-method tests as possible to trap many of the
recurring bugs we seem to encounter with high-level interaction.
"""
MinRK
remove user_variables...
r16570 # Copyright (c) IPython Development Team.
# Distributed under the terms of the Modified BSD License.
Min RK
exercise calling run_cell_async as a coroutine
r24538 import asyncio
Thomas Kluyver
Add framework for AST transformations of input code.
r8220 import ast
Jörgen Stenarson
Adding test for safe_execfile call with non-ascii path
r5094 import os
Thomas Kluyver
Test process exit codes with terminating signal
r12774 import signal
Jörgen Stenarson
Adding test for safe_execfile call with non-ascii path
r5094 import shutil
Fernando Perez
Add support for finding cell magics with ?/??....
r6997 import sys
Jörgen Stenarson
Adding test for safe_execfile call with non-ascii path
r5094 import tempfile
Fernando Perez
Fix bug with execution of naked multiline strings....
r3300 import unittest
Matthias Bussonnier
MAINT: mock slowest test....
r28098 import pytest
Srinivas Reddy Thatiparthy
remove python2 specific code
r23064 from unittest import mock
Jörgen Stenarson
Adding test for safe_execfile call with non-ascii path
r5094 from os.path import join
MinRK
short error message on AliasError in run_cell...
r3822
Scott Sanderson
MAINT: Move `InputRejected` to `IPython.core.error`.
r17799 from IPython.core.error import InputRejected
Volker Braun
Also catch SyntaxErrors from InputTransformers in run_cell()...
r13525 from IPython.core.inputtransformer import InputTransformer
Min RK
exercise calling run_cell_async as a coroutine
r24538 from IPython.core import interactiveshell
MinRK
test exit code with csh...
r17016 from IPython.testing.decorators import (
skipif, skip_win32, onlyif_unicode_paths, onlyif_cmds_exist,
)
Thomas Kluyver
Add test that numpy, IPython.parallel and IPython.zmq aren't imported on startup.
r8085 from IPython.testing import tools as tt
MinRK
test exit code with csh...
r17016 from IPython.utils.process import find_cmd
Fernando Perez
Fix bug with execution of naked multiline strings....
r3300
#-----------------------------------------------------------------------------
Fernando Perez
Add support for finding cell magics with ?/??....
r6997 # Globals
#-----------------------------------------------------------------------------
# This is used by every single test, no point repeating it ad nauseam
#-----------------------------------------------------------------------------
Fernando Perez
Fix bug with execution of naked multiline strings....
r3300 # Tests
#-----------------------------------------------------------------------------
Matthias Bussonnier
move custom exception at module....
r21316 class DerivedInterrupt(KeyboardInterrupt):
pass
Fernando Perez
Fix bug with execution of naked multiline strings....
r3300 class InteractiveShellTestCase(unittest.TestCase):
def test_naked_string_cells(self):
"""Test that cells with only naked strings are fully executed"""
# First, single-line inputs
ip.run_cell('"a"\n')
Bradley M. Froehle
s/assertEquals/assertEqual/
r7874 self.assertEqual(ip.user_ns['_'], 'a')
Fernando Perez
Fix bug with execution of naked multiline strings....
r3300 # And also multi-line cells
ip.run_cell('"""a\nb"""\n')
Bradley M. Froehle
s/assertEquals/assertEqual/
r7874 self.assertEqual(ip.user_ns['_'], 'a\nb')
Paul Ivanov
added test for GH-306
r3499
Thomas Kluyver
Fix blank input crashing IPython, +unittest
r3441 def test_run_empty_cell(self):
"""Just make sure we don't get a horrible error with a blank
cell of input. Yes, I did overlook that."""
Thomas Kluyver
Don't increment execution_count on empty cells. +test.
r3706 old_xc = ip.execution_count
Thomas Kluyver
run_cell returns an ExecutionResult instance...
r19630 res = ip.run_cell('')
Bradley M. Froehle
s/assertEquals/assertEqual/
r7874 self.assertEqual(ip.execution_count, old_xc)
Thomas Kluyver
run_cell returns an ExecutionResult instance...
r19630 self.assertEqual(res.execution_count, None)
Fernando Perez
BUG: multi-line, multi-block cells were broken. Test added....
r3467
Paul Ivanov
added test for GH-306
r3499 def test_run_cell_multiline(self):
Fernando Perez
BUG: multi-line, multi-block cells were broken. Test added....
r3467 """Multi-block, multi-line cells must execute correctly.
"""
src = '\n'.join(["x=1",
"y=2",
"if 1:",
" x += 1",
" y += 1",])
Thomas Kluyver
run_cell returns an ExecutionResult instance...
r19630 res = ip.run_cell(src)
Bradley M. Froehle
s/assertEquals/assertEqual/
r7874 self.assertEqual(ip.user_ns['x'], 2)
self.assertEqual(ip.user_ns['y'], 3)
Thomas Kluyver
run_cell returns an ExecutionResult instance...
r19630 self.assertEqual(res.success, True)
self.assertEqual(res.result, None)
Paul Ivanov
added test for GH-306
r3499
def test_multiline_string_cells(self):
Paul Ivanov
added test for GH-307
r3500 "Code sprinkled with multiline strings should execute (GH-306)"
Paul Ivanov
added test for GH-306
r3499 ip.run_cell('tmp=0')
Bradley M. Froehle
s/assertEquals/assertEqual/
r7874 self.assertEqual(ip.user_ns['tmp'], 0)
Thomas Kluyver
run_cell returns an ExecutionResult instance...
r19630 res = ip.run_cell('tmp=1;"""a\nb"""\n')
Bradley M. Froehle
s/assertEquals/assertEqual/
r7874 self.assertEqual(ip.user_ns['tmp'], 1)
Thomas Kluyver
run_cell returns an ExecutionResult instance...
r19630 self.assertEqual(res.success, True)
self.assertEqual(res.result, "a\nb")
Paul Ivanov
added test for GH-307
r3500
def test_dont_cache_with_semicolon(self):
"Ending a line with semicolon should not cache the returned object (GH-307)"
oldlen = len(ip.user_ns['Out'])
Thomas Kluyver
Revert PR #5388...
r15886 for cell in ['1;', '1;1;']:
Thomas Kluyver
run_cell returns an ExecutionResult instance...
r19630 res = ip.run_cell(cell, store_history=True)
Shashi Gowda
Suppress output even when a comment follows ;. Fixes #4525.
r15883 newlen = len(ip.user_ns['Out'])
self.assertEqual(oldlen, newlen)
Thomas Kluyver
run_cell returns an ExecutionResult instance...
r19630 self.assertIsNone(res.result)
Shashi Gowda
Suppress output even when a comment follows ;. Fixes #4525.
r15883 i = 0
Paul Ivanov
added test for GH-307
r3500 #also test the default caching behavior
Thomas Kluyver
Revert PR #5388...
r15886 for cell in ['1', '1;1']:
Shashi Gowda
Suppress output even when a comment follows ;. Fixes #4525.
r15883 ip.run_cell(cell, store_history=True)
newlen = len(ip.user_ns['Out'])
i += 1
self.assertEqual(oldlen+i, newlen)
Paul Ivanov
added the skip_known decorator
r3503
Thomas Kluyver
run_cell returns an ExecutionResult instance...
r19630 def test_syntax_error(self):
res = ip.run_cell("raise = 3")
self.assertIsInstance(res.error_before_exec, SyntaxError)
Osher De Paz
raise an error when user tries to open a standard stream...
r27850 def test_open_standard_input_stream(self):
res = ip.run_cell("open(0)")
self.assertIsInstance(res.error_in_exec, ValueError)
def test_open_standard_output_stream(self):
res = ip.run_cell("open(1)")
self.assertIsInstance(res.error_in_exec, ValueError)
def test_open_standard_error_stream(self):
res = ip.run_cell("open(2)")
self.assertIsInstance(res.error_in_exec, ValueError)
Paul Ivanov
added test for GH-284: ensure In variable is works
r3501 def test_In_variable(self):
"Verify that In variable grows with user input (GH-284)"
oldlen = len(ip.user_ns['In'])
Thomas Kluyver
Change run_cell to not store history by default.
r4995 ip.run_cell('1;', store_history=True)
Paul Ivanov
added test for GH-284: ensure In variable is works
r3501 newlen = len(ip.user_ns['In'])
Bradley M. Froehle
s/assertEquals/assertEqual/
r7874 self.assertEqual(oldlen+1, newlen)
self.assertEqual(ip.user_ns['In'][-1],'1;')
Pablo Galindo
Recovered trailing whitespace
r22921
Thomas Kluyver
Test for magic names in multiline strings.
r3707 def test_magic_names_in_string(self):
Thomas Kluyver
Fix bug with magic names in multi-line strings. run_cell now uses inputsplitter for static transformations.
r3709 ip.run_cell('a = """\n%exit\n"""')
Bradley M. Froehle
s/assertEquals/assertEqual/
r7874 self.assertEqual(ip.user_ns['a'], '\n%exit\n')
Pablo Galindo
Recovered trailing whitespace
r22921
MinRK
fix SyntaxError on !(command)...
r3908 def test_trailing_newline(self):
"""test that running !(command) does not raise a SyntaxError"""
ip.run_cell('!(true)\n', False)
ip.run_cell('!(true)\n\n\n', False)
Pablo Galindo
Recovered trailing whitespace
r22921
Julian Taylor
Add test for non-ascii characters in PlainTextFormatter
r4281 def test_gh_597(self):
Thomas Kluyver
Brief docstring to explain test.
r4375 """Pretty-printing lists of objects with non-ascii reprs may cause
problems."""
Julian Taylor
Add test for non-ascii characters in PlainTextFormatter
r4281 class Spam(object):
Matthias Bussonnier
Misc modifications for pytest comppatibility...
r25115 def __repr__(self):
return "\xe9"*50
Julian Taylor
Add test for non-ascii characters in PlainTextFormatter
r4281 import IPython.core.formatters
f = IPython.core.formatters.PlainTextFormatter()
f([Spam(),Spam()])
Pablo Galindo
Recovered trailing whitespace
r22921
Thomas Kluyver
Use user_ns as global namespace if it is passed without user_module, and add test for pickling interactively defined objects....
r5456
Thomas Kluyver
Parse user code to AST using compiler flags....
r4795 def test_future_flags(self):
"""Check that future flags are used for parsing code (gh-777)"""
Paul Ivanov
restore test for __future__ imports...
r22975 ip.run_cell('from __future__ import barry_as_FLUFL')
Thomas Kluyver
Parse user code to AST using compiler flags....
r4795 try:
Paul Ivanov
restore test for __future__ imports...
r22975 ip.run_cell('prfunc_return_val = 1 <> 2')
Thomas Kluyver
Parse user code to AST using compiler flags....
r4795 assert 'prfunc_return_val' in ip.user_ns
finally:
# Reset compiler flags so we don't mess up other tests.
ip.compile.reset_compiler_flags()
Olivier Verdier
TST: add future unicode_literals test (#786)
r4811
Thomas Kluyver
Use user_ns as global namespace if it is passed without user_module, and add test for pickling interactively defined objects....
r5456 def test_can_pickle(self):
"Can we pickle objects defined interactively (GH-29)"
ip = get_ipython()
ip.reset()
ip.run_cell(("class Mylist(list):\n"
" def __init__(self,x=[]):\n"
" list.__init__(self,x)"))
ip.run_cell("w=Mylist([1,2,3])")
Pablo Galindo
Recovered trailing whitespace
r22921
Thomas Kluyver
Update imports for Python 3...
r13354 from pickle import dumps
Pablo Galindo
Recovered trailing whitespace
r22921
Thomas Kluyver
Use user_ns as global namespace if it is passed without user_module, and add test for pickling interactively defined objects....
r5456 # We need to swap in our main module - this is only necessary
# inside the test framework, because IPython puts the interactive module
# in place (but the test framework undoes this).
_main = sys.modules['__main__']
sys.modules['__main__'] = ip.user_module
try:
res = dumps(ip.user_ns["w"])
finally:
sys.modules['__main__'] = _main
self.assertTrue(isinstance(res, bytes))
Pablo Galindo
Recovered trailing whitespace
r22921
Thomas Kluyver
Use user_ns as global namespace if it is passed without user_module, and add test for pickling interactively defined objects....
r5456 def test_global_ns(self):
"Code in functions must be able to access variables outside them."
ip = get_ipython()
ip.run_cell("a = 10")
Thomas Kluyver
Tiny correction to test for interactiveshell scope.
r5465 ip.run_cell(("def f(x):\n"
Thomas Kluyver
Use user_ns as global namespace if it is passed without user_module, and add test for pickling interactively defined objects....
r5456 " return x + a"))
ip.run_cell("b = f(12)")
self.assertEqual(ip.user_ns["b"], 22)
MinRK
protect IPython from bad custom exception handlers...
r4991
def test_bad_custom_tb(self):
"""Check that InteractiveShell is protected from bad custom exception handlers"""
Thomas Kluyver
Deprecate io.{stdout,stderr} and shell.{write,write_err}...
r22192 ip.set_custom_exc((IOError,), lambda etype,value,tb: 1/0)
self.assertEqual(ip.custom_exceptions, (IOError,))
with tt.AssertPrints("Custom TB Handler failed", channel='stderr'):
MinRK
protect IPython from bad custom exception handlers...
r4991 ip.run_cell(u'raise IOError("foo")')
Thomas Kluyver
Deprecate io.{stdout,stderr} and shell.{write,write_err}...
r22192 self.assertEqual(ip.custom_exceptions, ())
MinRK
protect IPython from bad custom exception handlers...
r4991
MinRK
protect against bad return type of CustomTB...
r4999 def test_bad_custom_tb_return(self):
"""Check that InteractiveShell is protected from bad return types in custom exception handlers"""
Thomas Kluyver
Deprecate io.{stdout,stderr} and shell.{write,write_err}...
r22192 ip.set_custom_exc((NameError,),lambda etype,value,tb, tb_offset=None: 1)
self.assertEqual(ip.custom_exceptions, (NameError,))
with tt.AssertPrints("Custom TB Handler failed", channel='stderr'):
MinRK
protect against bad return type of CustomTB...
r4999 ip.run_cell(u'a=abracadabra')
Thomas Kluyver
Deprecate io.{stdout,stderr} and shell.{write,write_err}...
r22192 self.assertEqual(ip.custom_exceptions, ())
MinRK
protect against bad return type of CustomTB...
r4999
Thomas Kluyver
Add drop_by_id method to shell, to remove variables added by extensions.
r5068 def test_drop_by_id(self):
myvars = {"a":object(), "b":object(), "c": object()}
ip.push(myvars, interactive=False)
for name in myvars:
assert name in ip.user_ns, name
assert name in ip.user_ns_hidden, name
ip.user_ns['b'] = 12
ip.drop_by_id(myvars)
for name in ["a", "c"]:
assert name not in ip.user_ns, name
assert name not in ip.user_ns_hidden, name
assert ip.user_ns['b'] == 12
ip.reset()
Jörgen Stenarson
Adding test for safe_execfile call with non-ascii path
r5094
Fernando Perez
Add failing test for #822, will be fixed next
r5357 def test_var_expand(self):
Thomas Kluyver
Sort out unicode test for shell expansion.
r5366 ip.user_ns['f'] = u'Ca\xf1o'
self.assertEqual(ip.var_expand(u'echo $f'), u'echo Ca\xf1o')
MinRK
ignore errors in shell.var_expand...
r6124 self.assertEqual(ip.var_expand(u'echo {f}'), u'echo Ca\xf1o')
self.assertEqual(ip.var_expand(u'echo {f[:-1]}'), u'echo Ca\xf1')
self.assertEqual(ip.var_expand(u'echo {1*2}'), u'echo 2')
ICanWaitAndFishAllDay
ignore the single quotes string when parsing
r23620
self.assertEqual(ip.var_expand(u"grep x | awk '{print $1}'"), u"grep x | awk '{print $1}'")
Thomas Kluyver
Sort out unicode test for shell expansion.
r5366
ip.user_ns['f'] = b'Ca\xc3\xb1o'
Fernando Perez
Add failing test for #822, will be fixed next
r5357 # This should not raise any exception:
ip.var_expand(u'echo $f')
ICanWaitAndFishAllDay
ignore the single quotes string when parsing
r23620
Thomas Kluyver
Add failing test for issue gh-1878
r7331 def test_var_expand_local(self):
Thomas Kluyver
Test for local variable expansion in %magic commands.
r7333 """Test local variable expansion in !system and %magic calls"""
# !system
Samuel Gaist
[core][tests][interactiveshell] Remove nose
r26901 ip.run_cell(
"def test():\n"
' lvar = "ttt"\n'
" ret = !echo {lvar}\n"
" return ret[0]\n"
)
res = ip.user_ns["test"]()
self.assertIn("ttt", res)
Thomas Kluyver
Test for local variable expansion in %magic commands.
r7333 # %magic
Samuel Gaist
[core][tests][interactiveshell] Remove nose
r26901 ip.run_cell(
"def makemacro():\n"
' macroname = "macro_var_expand_locals"\n'
" %macro {macroname} codestr\n"
)
ip.user_ns["codestr"] = "str(12)"
ip.run_cell("makemacro()")
self.assertIn("macro_var_expand_locals", ip.user_ns)
Thomas Kluyver
Add failing test for variable expansion with self (reopened issue #1878).
r8224 def test_var_expand_self(self):
"""Test variable expansion with the name 'self', which was failing.
Pablo Galindo
Recovered trailing whitespace
r22921
Thomas Kluyver
Add failing test for variable expansion with self (reopened issue #1878).
r8224 See https://github.com/ipython/ipython/issues/1878#issuecomment-7698218
"""
Samuel Gaist
[core][tests][interactiveshell] Remove nose
r26901 ip.run_cell(
"class cTest:\n"
' classvar="see me"\n'
" def test(self):\n"
" res = !echo Variable: {self.classvar}\n"
" return res[0]\n"
)
self.assertIn("see me", ip.user_ns["cTest"]().test())
MinRK
ignore errors in shell.var_expand...
r6124 def test_bad_var_expand(self):
"""var_expand on invalid formats shouldn't raise"""
# SyntaxError
self.assertEqual(ip.var_expand(u"{'a':5}"), u"{'a':5}")
# NameError
self.assertEqual(ip.var_expand(u"{asdf}"), u"{asdf}")
# ZeroDivisionError
self.assertEqual(ip.var_expand(u"{1/0}"), u"{1/0}")
Pablo Galindo
Recovered trailing whitespace
r22921
Thomas Kluyver
Start of new callback system
r15597 def test_silent_postexec(self):
Thomas Kluyver
Rename pre/post_execute_explicit events to pre/post_run_cell
r15607 """run_cell(silent=True) doesn't invoke pre/post_run_cell callbacks"""
Thomas Kluyver
Start of new callback system
r15597 pre_explicit = mock.Mock()
pre_always = mock.Mock()
post_explicit = mock.Mock()
post_always = mock.Mock()
Fabio Niephaus
Ensure post event callbacks are always called....
r23982 all_mocks = [pre_explicit, pre_always, post_explicit, post_always]
Pablo Galindo
Recovered trailing whitespace
r22921
Thomas Kluyver
Rename pre/post_execute_explicit events to pre/post_run_cell
r15607 ip.events.register('pre_run_cell', pre_explicit)
Thomas Kluyver
Rename callbacks -> events (mostly), fire -> trigger
r15605 ip.events.register('pre_execute', pre_always)
Thomas Kluyver
Rename pre/post_execute_explicit events to pre/post_run_cell
r15607 ip.events.register('post_run_cell', post_explicit)
Thomas Kluyver
Rename callbacks -> events (mostly), fire -> trigger
r15605 ip.events.register('post_execute', post_always)
Pablo Galindo
Recovered trailing whitespace
r22921
Thomas Kluyver
Start of new callback system
r15597 try:
ip.run_cell("1", silent=True)
assert pre_always.called
assert not pre_explicit.called
assert post_always.called
assert not post_explicit.called
# double-check that non-silent exec did what we expected
# silent to avoid
ip.run_cell("1")
assert pre_explicit.called
assert post_explicit.called
Fabio Niephaus
Rename ExecutionRequest to ExecutionInfo; refactor
r23997 info, = pre_explicit.call_args[0]
result, = post_explicit.call_args[0]
self.assertEqual(info, result.info)
Fabio Niephaus
Ensure post event callbacks are always called....
r23982 # check that post hooks are always called
Fabio Niephaus
Add support for "finally" event callbacks....
r23909 [m.reset_mock() for m in all_mocks]
ip.run_cell("syntax error")
assert pre_always.called
assert pre_explicit.called
Fabio Niephaus
Ensure post event callbacks are always called....
r23982 assert post_always.called
assert post_explicit.called
Fabio Niephaus
Rename ExecutionRequest to ExecutionInfo; refactor
r23997 info, = pre_explicit.call_args[0]
result, = post_explicit.call_args[0]
self.assertEqual(info, result.info)
Thomas Kluyver
Start of new callback system
r15597 finally:
# remove post-exec
Nathaniel J. Smith
Remove EventManager reset methods, because they violate encapsulation....
r18547 ip.events.unregister('pre_run_cell', pre_explicit)
ip.events.unregister('pre_execute', pre_always)
ip.events.unregister('post_run_cell', post_explicit)
ip.events.unregister('post_execute', post_always)
Pablo Galindo
Recovered trailing whitespace
r22921
MinRK
add silent kwarg to run_cell...
r6802 def test_silent_noadvance(self):
"""run_cell(silent=True) doesn't advance execution_count"""
ec = ip.execution_count
# silent should force store_history=False
ip.run_cell("1", store_history=True, silent=True)
Pablo Galindo
Recovered trailing whitespace
r22921
Bradley M. Froehle
s/assertEquals/assertEqual/
r7874 self.assertEqual(ec, ip.execution_count)
MinRK
add silent kwarg to run_cell...
r6802 # double-check that non-silent exec did what we expected
# silent to avoid
ip.run_cell("1", store_history=True)
Bradley M. Froehle
s/assertEquals/assertEqual/
r7874 self.assertEqual(ec+1, ip.execution_count)
Pablo Galindo
Recovered trailing whitespace
r22921
MinRK
add silent kwarg to run_cell...
r6802 def test_silent_nodisplayhook(self):
"""run_cell(silent=True) doesn't trigger displayhook"""
d = dict(called=False)
Pablo Galindo
Recovered trailing whitespace
r22921
MinRK
add silent kwarg to run_cell...
r6802 trap = ip.display_trap
save_hook = trap.hook
Pablo Galindo
Recovered trailing whitespace
r22921
MinRK
add silent kwarg to run_cell...
r6802 def failing_hook(*args, **kwargs):
d['called'] = True
Pablo Galindo
Recovered trailing whitespace
r22921
MinRK
add silent kwarg to run_cell...
r6802 try:
trap.hook = failing_hook
Thomas Kluyver
run_cell returns an ExecutionResult instance...
r19630 res = ip.run_cell("1", silent=True)
MinRK
add silent kwarg to run_cell...
r6802 self.assertFalse(d['called'])
Thomas Kluyver
run_cell returns an ExecutionResult instance...
r19630 self.assertIsNone(res.result)
MinRK
add silent kwarg to run_cell...
r6802 # double-check that non-silent exec did what we expected
# silent to avoid
ip.run_cell("1")
self.assertTrue(d['called'])
finally:
trap.hook = save_hook
Fernando Perez
Add failing test for #822, will be fixed next
r5357
Fernando Perez
Add support for finding cell magics with ?/??....
r6997 def test_ofind_line_magic(self):
from IPython.core.magic import register_line_magic
Pablo Galindo
Recovered trailing whitespace
r22921
Fernando Perez
Add support for finding cell magics with ?/??....
r6997 @register_line_magic
def lmagic(line):
"A line magic"
# Get info on line magic
Nikita Kniazev
Preserve function/method identity in magic decorators...
r27102 lfind = ip._ofind("lmagic")
info = dict(
found=True,
isalias=False,
ismagic=True,
namespace="IPython internal",
obj=lmagic,
parent=None,
)
Samuel Gaist
[core][tests][interactiveshell] Remove nose
r26901 self.assertEqual(lfind, info)
Pablo Galindo
Recovered trailing whitespace
r22921
Fernando Perez
Add support for finding cell magics with ?/??....
r6997 def test_ofind_cell_magic(self):
from IPython.core.magic import register_cell_magic
Pablo Galindo
Recovered trailing whitespace
r22921
Fernando Perez
Add support for finding cell magics with ?/??....
r6997 @register_cell_magic
def cmagic(line, cell):
"A cell magic"
# Get info on cell magic
Nikita Kniazev
Preserve function/method identity in magic decorators...
r27102 find = ip._ofind("cmagic")
info = dict(
found=True,
isalias=False,
ismagic=True,
namespace="IPython internal",
obj=cmagic,
parent=None,
)
Samuel Gaist
[core][tests][interactiveshell] Remove nose
r26901 self.assertEqual(find, info)
immerrr
core.interactiveshell.ofind: don't evaluate property.fget (it may raise)
r17024
def test_ofind_property_with_error(self):
class A(object):
@property
def foo(self):
Matthias Bussonnier
Increase test coverage
r27561 raise NotImplementedError() # pragma: no cover
immerrr
core.interactiveshell.ofind: don't evaluate property.fget (it may raise)
r17024 a = A()
found = ip._ofind('a.foo', [('locals', locals())])
info = dict(found=True, isalias=False, ismagic=False,
namespace='locals', obj=A.foo, parent=a)
Samuel Gaist
[core][tests][interactiveshell] Remove nose
r26901 self.assertEqual(found, info)
immerrr
core.interactiveshell.ofind: don't evaluate property.fget (it may raise)
r17024
def test_ofind_multiple_attribute_lookups(self):
class A(object):
@property
def foo(self):
Matthias Bussonnier
Increase test coverage
r27561 raise NotImplementedError() # pragma: no cover
immerrr
core.interactiveshell.ofind: don't evaluate property.fget (it may raise)
r17024
a = A()
a.a = A()
a.a.a = A()
found = ip._ofind('a.a.a.foo', [('locals', locals())])
info = dict(found=True, isalias=False, ismagic=False,
namespace='locals', obj=A.foo, parent=a.a.a)
Samuel Gaist
[core][tests][interactiveshell] Remove nose
r26901 self.assertEqual(found, info)
immerrr
core.interactiveshell.ofind: don't evaluate property.fget (it may raise)
r17024
def test_ofind_slotted_attributes(self):
class A(object):
__slots__ = ['foo']
def __init__(self):
self.foo = 'bar'
a = A()
found = ip._ofind('a.foo', [('locals', locals())])
info = dict(found=True, isalias=False, ismagic=False,
namespace='locals', obj=a.foo, parent=a)
Samuel Gaist
[core][tests][interactiveshell] Remove nose
r26901 self.assertEqual(found, info)
immerrr
core.interactiveshell.ofind: don't evaluate property.fget (it may raise)
r17024
found = ip._ofind('a.bar', [('locals', locals())])
info = dict(found=False, isalias=False, ismagic=False,
namespace=None, obj=None, parent=a)
Samuel Gaist
[core][tests][interactiveshell] Remove nose
r26901 self.assertEqual(found, info)
immerrr
core.interactiveshell.ofind: don't evaluate property.fget (it may raise)
r17024
def test_ofind_prefers_property_to_instance_level_attribute(self):
class A(object):
@property
def foo(self):
return 'bar'
a = A()
Samuel Gaist
[core][tests][interactiveshell] Remove nose
r26901 a.__dict__["foo"] = "baz"
self.assertEqual(a.foo, "bar")
found = ip._ofind("a.foo", [("locals", locals())])
self.assertIs(found["obj"], A.foo)
immerrr
core.interactiveshell.ofind: don't evaluate property.fget (it may raise)
r17024
Matthias Bussonnier
Test that custom exceptions handlers can handle `SyntaxError`s
r22432 def test_custom_syntaxerror_exception(self):
called = []
def my_handler(shell, etype, value, tb, tb_offset=None):
called.append(etype)
shell.showtraceback((etype, value, tb), tb_offset=tb_offset)
ip.set_custom_exc((SyntaxError,), my_handler)
try:
ip.run_cell("1f")
# Check that this was called, and only once.
self.assertEqual(called, [SyntaxError])
finally:
# Reset the custom exception hook
ip.set_custom_exc((), None)
Thomas Kluyver
Add test for custom exception hook.
r7110 def test_custom_exception(self):
called = []
def my_handler(shell, etype, value, tb, tb_offset=None):
called.append(etype)
shell.showtraceback((etype, value, tb), tb_offset=tb_offset)
Pablo Galindo
Recovered trailing whitespace
r22921
Thomas Kluyver
Add test for custom exception hook.
r7110 ip.set_custom_exc((ValueError,), my_handler)
try:
Thomas Kluyver
run_cell returns an ExecutionResult instance...
r19630 res = ip.run_cell("raise ValueError('test')")
Thomas Kluyver
Add test for custom exception hook.
r7110 # Check that this was called, and only once.
self.assertEqual(called, [ValueError])
Thomas Kluyver
run_cell returns an ExecutionResult instance...
r19630 # Check that the error is on the result object
self.assertIsInstance(res.error_in_exec, ValueError)
Thomas Kluyver
Add test for custom exception hook.
r7110 finally:
# Reset the custom exception hook
ip.set_custom_exc((), None)
Pablo Galindo
Recovered trailing whitespace
r22921
takuya fujiwara
Fix lint warnings
r26276 @mock.patch("builtins.print")
takuya fujiwara
Add test for issue #11615
r26275 def test_showtraceback_with_surrogates(self, mocked_print):
values = []
takuya fujiwara
Fix lint warnings
r26277
takuya fujiwara
Fix lint warnings
r26276 def mock_print_func(value, sep=" ", end="\n", file=sys.stdout, flush=False):
takuya fujiwara
Add test for issue #11615
r26275 values.append(value)
takuya fujiwara
Fix lint warnings
r26276 if value == chr(0xD8FF):
raise UnicodeEncodeError("utf-8", chr(0xD8FF), 0, 1, "")
takuya fujiwara
Add test for issue #11615
r26275
# mock builtins.print
mocked_print.side_effect = mock_print_func
takuya fujiwara
Fix lint warnings
r26276 # ip._showtraceback() is replaced in globalipapp.py.
takuya fujiwara
Add test for issue #11615
r26275 # Call original method to test.
takuya fujiwara
Fix lint warnings
r26276 interactiveshell.InteractiveShell._showtraceback(ip, None, None, chr(0xD8FF))
takuya fujiwara
Fix lint warnings
r26277
takuya fujiwara
Add test for issue #11615
r26275 self.assertEqual(mocked_print.call_count, 2)
takuya fujiwara
Fix lint warnings
r26276 self.assertEqual(values, [chr(0xD8FF), "\\ud8ff"])
takuya fujiwara
Add test for issue #11615
r26275
Thomas Kluyver
Close handle on new temporary files before returning filename...
r17337 def test_mktempfile(self):
filename = ip.mktempfile()
# Check that we can open the file again on Windows
gousaiyang
Format code
r27495 with open(filename, "w", encoding="utf-8") as f:
f.write("abc")
Thomas Kluyver
Close handle on new temporary files before returning filename...
r17337
gousaiyang
Format code
r27495 filename = ip.mktempfile(data="blah")
with open(filename, "r", encoding="utf-8") as f:
self.assertEqual(f.read(), "blah")
Fernando Perez
Add failing test for #822, will be fixed next
r5357
Thomas Kluyver
Add failing test for issue gh-6282
r17592 def test_new_main_mod(self):
# Smoketest to check that this accepts a unicode module name
name = u'jiefmw'
mod = ip.new_main_mod(u'%s.py' % name, name)
self.assertEqual(mod.__name__, name)
Jeroen Demeyer
Print exception instead of "KeyboardInterrupt"...
r19114 def test_get_exception_only(self):
try:
raise KeyboardInterrupt
except KeyboardInterrupt:
msg = ip.get_exception_only()
self.assertEqual(msg, 'KeyboardInterrupt\n')
try:
raise DerivedInterrupt("foo")
except KeyboardInterrupt:
msg = ip.get_exception_only()
Paul Ivanov
remove sys_version for Python 3...
r22959 self.assertEqual(msg, 'IPython.core.tests.test_interactiveshell.DerivedInterrupt: foo\n')
Jeroen Demeyer
Print exception instead of "KeyboardInterrupt"...
r19114
Min RK
InteractiveShell.object_inspect_text must return text...
r22504 def test_inspect_text(self):
ip.run_cell('a = 5')
text = ip.object_inspect_text('a')
Srinivas Reddy Thatiparthy
remove unicode_type function
r23044 self.assertIsInstance(text, str)
Min RK
InteractiveShell.object_inspect_text must return text...
r22504
Sudarshan Raghunathan
Store last execution result in the interactive shell instance so it can be seen by post execute handlers
r23803 def test_last_execution_result(self):
""" Check that last execution result gets set correctly (GH-10702) """
result = ip.run_cell('a = 5; a')
self.assertTrue(ip.last_execution_succeeded)
self.assertEqual(ip.last_execution_result.result, 5)
result = ip.run_cell('a = x_invalid_id_x')
self.assertFalse(ip.last_execution_succeeded)
self.assertFalse(ip.last_execution_result.success)
self.assertIsInstance(ip.last_execution_result.error_in_exec, NameError)
Jesse Widner
Adds posix aliases after a %reset....
r24889 def test_reset_aliasing(self):
""" Check that standard posix aliases work after %reset. """
if os.name != 'posix':
return
ip.reset()
for cmd in ('clear', 'more', 'less', 'man'):
res = ip.run_cell('%' + cmd)
self.assertEqual(res.success, True)
Min RK
InteractiveShell.object_inspect_text must return text...
r22504
Jörgen Stenarson
Adding test for safe_execfile call with non-ascii path
r5094 class TestSafeExecfileNonAsciiPath(unittest.TestCase):
Thomas Kluyver
Skip some more tests that require unicode paths
r12168 @onlyif_unicode_paths
Jörgen Stenarson
Adding test for safe_execfile call with non-ascii path
r5094 def setUp(self):
self.BASETESTDIR = tempfile.mkdtemp()
self.TESTDIR = join(self.BASETESTDIR, u"åäö")
os.mkdir(self.TESTDIR)
gousaiyang
Format code
r27495 with open(
Matthias Bussonnier
typo and reformat
r27639 join(self.TESTDIR, "åäötestscript.py"), "w", encoding="utf-8"
gousaiyang
Format code
r27495 ) as sfile:
Jörgen Stenarson
Adding test for safe_execfile call with non-ascii path
r5094 sfile.write("pass\n")
Srinivas Reddy Thatiparthy
rename py3compat.getcwd() -> os.getcwd()
r23045 self.oldpath = os.getcwd()
Jörgen Stenarson
Adding test for safe_execfile call with non-ascii path
r5094 os.chdir(self.TESTDIR)
self.fname = u"åäötestscript.py"
def tearDown(self):
os.chdir(self.oldpath)
shutil.rmtree(self.BASETESTDIR)
Thomas Kluyver
Skip some more tests that require unicode paths
r12168 @onlyif_unicode_paths
Jörgen Stenarson
Adding test for safe_execfile call with non-ascii path
r5094 def test_1(self):
"""Test safe_execfile with non-ascii path
"""
Fernando Perez
Add support for finding cell magics with ?/??....
r6997 ip.safe_execfile(self.fname, {}, raise_exceptions=True)
Jörgen Stenarson
Add simple test for non-ascii characters in system_raw call.
r5314
Thomas Kluyver
Test process exit codes with terminating signal
r12774 class ExitCodeChecks(tt.TempFileMixin):
Matthias Bussonnier
Fix Mixin Inheritence in Xunit unittest....
r25113
def setUp(self):
self.system = ip.system_raw
Thomas Kluyver
Test process exit codes with terminating signal
r12774 def test_exit_code_ok(self):
self.system('exit 0')
self.assertEqual(ip.user_ns['_exit_code'], 0)
def test_exit_code_error(self):
self.system('exit 1')
self.assertEqual(ip.user_ns['_exit_code'], 1)
Pablo Galindo
Recovered trailing whitespace
r22921
Thomas Kluyver
Test process exit codes with terminating signal
r12774 @skipif(not hasattr(signal, 'SIGALRM'))
def test_exit_code_signal(self):
self.mktmp("import signal, time\n"
"signal.setitimer(signal.ITIMER_REAL, 0.1)\n"
"time.sleep(1)\n")
self.system("%s %s" % (sys.executable, self.fname))
self.assertEqual(ip.user_ns['_exit_code'], -signal.SIGALRM)
Pablo Galindo
Recovered trailing whitespace
r22921
MinRK
test exit code with csh...
r17016 @onlyif_cmds_exist("csh")
Matthias Bussonnier
Increase test coverage
r27561 def test_exit_code_signal_csh(self): # pragma: no cover
SHELL = os.environ.get("SHELL", None)
os.environ["SHELL"] = find_cmd("csh")
MinRK
test exit code with csh...
r17016 try:
self.test_exit_code_signal()
finally:
if SHELL is not None:
os.environ['SHELL'] = SHELL
else:
del os.environ['SHELL']
Thomas Kluyver
Test process exit codes with terminating signal
r12774
Matthias Bussonnier
Correctly tearDown some test cases with multiple inheritance....
r24394
Matthias Bussonnier
Fix Mixin Inheritence in Xunit unittest....
r25113 class TestSystemRaw(ExitCodeChecks):
def setUp(self):
super().setUp()
Min ho Kim
Fixed typos
r25167 self.system = ip.system_raw
Jörgen Stenarson
Add simple test for non-ascii characters in system_raw call.
r5314
Thomas Kluyver
Skip some more tests that require unicode paths
r12168 @onlyif_unicode_paths
Jörgen Stenarson
Add simple test for non-ascii characters in system_raw call.
r5314 def test_1(self):
"""Test system_raw with non-ascii cmd
"""
Thomas Kluyver
Test process exit codes with terminating signal
r12774 cmd = u'''python -c "'åäö'" '''
Fernando Perez
Add support for finding cell magics with ?/??....
r6997 ip.system_raw(cmd)
Fernando Perez
Add simple test for __IPYTHON__ in builtins.
r5493
Thomas Kluyver
Catch KeyboardInterrupt for !commands on Windows...
r18765 @mock.patch('subprocess.call', side_effect=KeyboardInterrupt)
@mock.patch('os.system', side_effect=KeyboardInterrupt)
def test_control_c(self, *mocks):
mvr
[issue6883] catch keyboardinterrupt if generated during shell.system() calls
r18732 try:
self.system("sleep 1 # wont happen")
Matthias Bussonnier
Increase test coverage
r27561 except KeyboardInterrupt: # pragma: no cove
Sammy Al Hashemi
Adding test for magic warnings
r26529 self.fail(
"system call should intercept "
"keyboard interrupt from subprocess.call"
)
self.assertEqual(ip.user_ns["_exit_code"], -signal.SIGINT)
Matthias Bussonnier
MAINT: mock slowest test....
r28098
@pytest.mark.parametrize("magic_cmd", ["pip", "conda", "cd"])
def test_magic_warnings(magic_cmd):
if sys.platform == "win32":
to_mock = "os.system"
expected_arg, expected_kwargs = magic_cmd, dict()
else:
to_mock = "subprocess.call"
expected_arg, expected_kwargs = magic_cmd, dict(
shell=True, executable=os.environ.get("SHELL", None)
)
with mock.patch(to_mock, return_value=0) as mock_sub:
with pytest.warns(Warning, match=r"You executed the system command"):
ip.system_raw(magic_cmd)
mock_sub.assert_called_once_with(expected_arg, **expected_kwargs)
mvr
[issue6883] catch keyboardinterrupt if generated during shell.system() calls
r18732
Thomas Kluyver
Test process exit codes with terminating signal
r12774 # TODO: Exit codes are currently ignored on Windows.
Matthias Bussonnier
Fix Mixin Inheritence in Xunit unittest....
r25113 class TestSystemPipedExitCode(ExitCodeChecks):
def setUp(self):
super().setUp()
Min ho Kim
Fixed typos
r25167 self.system = ip.system_piped
Thomas Kluyver
Test process exit codes with terminating signal
r12774
Thomas Kluyver
Add test for exit status from system_piped
r12767 @skip_win32
Thomas Kluyver
Test process exit codes with terminating signal
r12774 def test_exit_code_ok(self):
ExitCodeChecks.test_exit_code_ok(self)
@skip_win32
def test_exit_code_error(self):
ExitCodeChecks.test_exit_code_error(self)
@skip_win32
def test_exit_code_signal(self):
ExitCodeChecks.test_exit_code_signal(self)
Fernando Perez
Add simple test for __IPYTHON__ in builtins.
r5493
Matthias Bussonnier
Fix Mixin Inheritence in Xunit unittest....
r25113 class TestModules(tt.TempFileMixin):
Thomas Kluyver
Add test that numpy, IPython.parallel and IPython.zmq aren't imported on startup.
r8085 def test_extraneous_loads(self):
"""Test we're not loading modules on startup that we shouldn't.
"""
self.mktmp("import sys\n"
"print('numpy' in sys.modules)\n"
Min RK
ipython_parallel is now ipyparallel
r21326 "print('ipyparallel' in sys.modules)\n"
Min RK
ipython_kernel is now ipykernel
r21337 "print('ipykernel' in sys.modules)\n"
Thomas Kluyver
Add test that numpy, IPython.parallel and IPython.zmq aren't imported on startup.
r8085 )
out = "False\nFalse\nFalse\n"
tt.ipexec_validate(self.fname, out)
Thomas Kluyver
Add framework for AST transformations of input code.
r8220 class Negator(ast.NodeTransformer):
"""Negates all number literals in an AST."""
Matthias Bussonnier
Num ast has been renamed to Constant on 3.8
r24923
Matthias Bussonnier
comment why the changes and for which python version
r24932 # for python 3.7 and earlier
Thomas Kluyver
Add framework for AST transformations of input code.
r8220 def visit_Num(self, node):
node.n = -node.n
return node
Matthias Bussonnier
comment why the changes and for which python version
r24932 # for python 3.8+
def visit_Constant(self, node):
if isinstance(node.value, int):
return self.visit_Num(node)
return node
Matthias Bussonnier
Num ast has been renamed to Constant on 3.8
r24923
Thomas Kluyver
Add framework for AST transformations of input code.
r8220 class TestAstTransform(unittest.TestCase):
def setUp(self):
self.negator = Negator()
ip.ast_transformers.append(self.negator)
Pablo Galindo
Recovered trailing whitespace
r22921
Thomas Kluyver
Add framework for AST transformations of input code.
r8220 def tearDown(self):
ip.ast_transformers.remove(self.negator)
Matthias Bussonnier
Increase test coverage
r27561
def test_non_int_const(self):
with tt.AssertPrints("hello"):
ip.run_cell('print("hello")')
Thomas Kluyver
Add framework for AST transformations of input code.
r8220 def test_run_cell(self):
Matthias Bussonnier
Increase test coverage
r27561 with tt.AssertPrints("-34"):
ip.run_cell("print(12 + 22)")
Thomas Kluyver
Add framework for AST transformations of input code.
r8220 # A named reference to a number shouldn't be transformed.
Matthias Bussonnier
Increase test coverage
r27561 ip.user_ns["n"] = 55
with tt.AssertNotPrints("-55"):
ip.run_cell("print(n)")
Thomas Kluyver
Add tests for %timeit with AST transformations
r8485 def test_timeit(self):
called = set()
def f(x):
called.add(x)
ip.push({'f':f})
Pablo Galindo
Recovered trailing whitespace
r22921
Matthias Bussonnier
Use +/- if stdout encoding does not support ±
r23497 with tt.AssertPrints("std. dev. of"):
Thomas Kluyver
Add tests for %timeit with AST transformations
r8485 ip.run_line_magic("timeit", "-n1 f(1)")
Rémy Léone
Set litteral
r21804 self.assertEqual(called, {-1})
Thomas Kluyver
Add tests for %timeit with AST transformations
r8485 called.clear()
Pablo Galindo
Added mean + stdv to the %timeit magic - New tests pending - Corrected old ones
r22919
Matthias Bussonnier
Use +/- if stdout encoding does not support ±
r23497 with tt.AssertPrints("std. dev. of"):
Thomas Kluyver
Add tests for %timeit with AST transformations
r8485 ip.run_cell_magic("timeit", "-n1 f(2)", "f(3)")
Rémy Léone
Set litteral
r21804 self.assertEqual(called, {-2, -3})
Pablo Galindo
Recovered trailing whitespace
r22921
Thomas Kluyver
Make %time magic work with AST transformations
r8486 def test_time(self):
called = []
def f(x):
called.append(x)
ip.push({'f':f})
Pablo Galindo
Recovered trailing whitespace
r22921
Thomas Kluyver
Make %time magic work with AST transformations
r8486 # Test with an expression
Thomas Kluyver
Fix test for Windows...
r9901 with tt.AssertPrints("Wall time: "):
Thomas Kluyver
Make %time magic work with AST transformations
r8486 ip.run_line_magic("time", "f(5+9)")
self.assertEqual(called, [-14])
called[:] = []
Pablo Galindo
Recovered trailing whitespace
r22921
Thomas Kluyver
Make %time magic work with AST transformations
r8486 # Test with a statement (different code path)
Thomas Kluyver
Fix test for Windows...
r9901 with tt.AssertPrints("Wall time: "):
Thomas Kluyver
Make %time magic work with AST transformations
r8486 ip.run_line_magic("time", "a = f(-3 + -2)")
self.assertEqual(called, [5])
Pablo Galindo
Recovered trailing whitespace
r22921
Thomas Kluyver
Add test that macros are affected by AST transformations
r8488 def test_macro(self):
ip.push({'a':10})
# The AST transformation makes this do a+=-1
ip.define_macro("amacro", "a+=1\nprint(a)")
Pablo Galindo
Recovered trailing whitespace
r22921
Thomas Kluyver
Add test that macros are affected by AST transformations
r8488 with tt.AssertPrints("9"):
ip.run_cell("amacro")
with tt.AssertPrints("8"):
ip.run_cell("amacro")
Fernando Perez
Add simple test for __IPYTHON__ in builtins.
r5493
Matthias Bussonnier
Allow to mark transformers as having side effects...
r25925 class TestMiscTransform(unittest.TestCase):
def test_transform_only_once(self):
cleanup = 0
line_t = 0
def count_cleanup(lines):
nonlocal cleanup
cleanup += 1
return lines
def count_line_t(lines):
nonlocal line_t
line_t += 1
return lines
ip.input_transformer_manager.cleanup_transforms.append(count_cleanup)
ip.input_transformer_manager.line_transforms.append(count_line_t)
ip.run_cell('1')
assert cleanup == 1
assert line_t == 1
Thomas Kluyver
Fix missing locations in modified AST....
r8479 class IntegerWrapper(ast.NodeTransformer):
"""Wraps all integers in a call to Integer()"""
Matthias Bussonnier
comment why the changes and for which python version
r24932
# for Python 3.7 and earlier
# for Python 3.7 and earlier
Thomas Kluyver
Fix missing locations in modified AST....
r8479 def visit_Num(self, node):
if isinstance(node.n, int):
return ast.Call(func=ast.Name(id='Integer', ctx=ast.Load()),
args=[node], keywords=[])
Thomas Kluyver
Fix Integer() wrapper transformer, thanks to @asmeurer
r8508 return node
Thomas Kluyver
Fix missing locations in modified AST....
r8479
Matthias Bussonnier
comment why the changes and for which python version
r24932 # For Python 3.8+
def visit_Constant(self, node):
if isinstance(node.value, int):
return self.visit_Num(node)
return node
Matthias Bussonnier
Num ast has been renamed to Constant on 3.8
r24923
Thomas Kluyver
Fix missing locations in modified AST....
r8479 class TestAstTransform2(unittest.TestCase):
def setUp(self):
self.intwrapper = IntegerWrapper()
ip.ast_transformers.append(self.intwrapper)
Pablo Galindo
Recovered trailing whitespace
r22921
Thomas Kluyver
Fix missing locations in modified AST....
r8479 self.calls = []
def Integer(*args):
self.calls.append(args)
Thomas Kluyver
Add tests for %timeit with AST transformations
r8485 return args
Thomas Kluyver
Fix missing locations in modified AST....
r8479 ip.push({"Integer": Integer})
Pablo Galindo
Recovered trailing whitespace
r22921
Thomas Kluyver
Fix missing locations in modified AST....
r8479 def tearDown(self):
ip.ast_transformers.remove(self.intwrapper)
del ip.user_ns['Integer']
Pablo Galindo
Recovered trailing whitespace
r22921
Thomas Kluyver
Fix missing locations in modified AST....
r8479 def test_run_cell(self):
ip.run_cell("n = 2")
self.assertEqual(self.calls, [(2,)])
Pablo Galindo
Recovered trailing whitespace
r22921
Thomas Kluyver
Fix Integer() wrapper transformer, thanks to @asmeurer
r8508 # This shouldn't throw an error
ip.run_cell("o = 2.0")
self.assertEqual(ip.user_ns['o'], 2.0)
Matthias Bussonnier
Increase test coverage
r27561
def test_run_cell_non_int(self):
ip.run_cell("n = 'a'")
assert self.calls == []
Thomas Kluyver
Add tests for %timeit with AST transformations
r8485 def test_timeit(self):
called = set()
def f(x):
called.add(x)
ip.push({'f':f})
Pablo Galindo
Added mean + stdv to the %timeit magic - New tests pending - Corrected old ones
r22919
Matthias Bussonnier
Use +/- if stdout encoding does not support ±
r23497 with tt.AssertPrints("std. dev. of"):
Thomas Kluyver
Add tests for %timeit with AST transformations
r8485 ip.run_line_magic("timeit", "-n1 f(1)")
Rémy Léone
Set litteral
r21804 self.assertEqual(called, {(1,)})
Thomas Kluyver
Add tests for %timeit with AST transformations
r8485 called.clear()
Pablo Galindo
Added mean + stdv to the %timeit magic - New tests pending - Corrected old ones
r22919
Matthias Bussonnier
Use +/- if stdout encoding does not support ±
r23497 with tt.AssertPrints("std. dev. of"):
Thomas Kluyver
Add tests for %timeit with AST transformations
r8485 ip.run_cell_magic("timeit", "-n1 f(2)", "f(3)")
Rémy Léone
Set litteral
r21804 self.assertEqual(called, {(2,), (3,)})
Thomas Kluyver
Fix missing locations in modified AST....
r8479
Thomas Kluyver
Add test that a failing ast_transformer is unregistered.
r8221 class ErrorTransformer(ast.NodeTransformer):
"""Throws an error when it sees a number."""
Matthias Bussonnier
comment why the changes and for which python version
r24932
def visit_Constant(self, node):
if isinstance(node.value, int):
Matthias Bussonnier
Increase test coverage
r27561 raise ValueError("test")
Matthias Bussonnier
comment why the changes and for which python version
r24932 return node
Matthias Bussonnier
Num ast has been renamed to Constant on 3.8
r24923
Thomas Kluyver
Add test that a failing ast_transformer is unregistered.
r8221 class TestAstTransformError(unittest.TestCase):
def test_unregistering(self):
err_transformer = ErrorTransformer()
ip.ast_transformers.append(err_transformer)
Pablo Galindo
Recovered trailing whitespace
r22921
Matthias Bussonnier
Misc modifications for pytest comppatibility...
r25115 with self.assertWarnsRegex(UserWarning, "It will be unregistered"):
Thomas Kluyver
Add test that a failing ast_transformer is unregistered.
r8221 ip.run_cell("1 + 2")
Pablo Galindo
Recovered trailing whitespace
r22921
Thomas Kluyver
Add test that a failing ast_transformer is unregistered.
r8221 # This should have been removed.
Samuel Gaist
[core][tests][interactiveshell] Remove nose
r26901 self.assertNotIn(err_transformer, ip.ast_transformers)
Fernando Perez
Add simple test for __IPYTHON__ in builtins.
r5493
Scott Sanderson
DEV: AST transformers supplied to `InteractiveShell` can reject input....
r17798
class StringRejector(ast.NodeTransformer):
"""Throws an InputRejected when it sees a string literal.
Used to verify that NodeTransformers can signal that a piece of code should
not be executed by throwing an InputRejected.
"""
Matthias Bussonnier
comment why the changes and for which python version
r24932
Matthias Bussonnier
Attemt to fix ast transformer now that Num and Str atr the same Constant ast node...
r24924 # 3.8 only
def visit_Constant(self, node):
if isinstance(node.value, str):
raise InputRejected("test")
Matthias Bussonnier
Return current node instead of None
r24925 return node
Matthias Bussonnier
Attemt to fix ast transformer now that Num and Str atr the same Constant ast node...
r24924
Scott Sanderson
DEV: AST transformers supplied to `InteractiveShell` can reject input....
r17798
class TestAstTransformInputRejection(unittest.TestCase):
def setUp(self):
self.transformer = StringRejector()
ip.ast_transformers.append(self.transformer)
def tearDown(self):
ip.ast_transformers.remove(self.transformer)
def test_input_rejection(self):
"""Check that NodeTransformers can reject input."""
expect_exception_tb = tt.AssertPrints("InputRejected: test")
expect_no_cell_output = tt.AssertNotPrints("'unsafe'", suppress=False)
# Run the same check twice to verify that the transformer is not
# disabled after raising.
with expect_exception_tb, expect_no_cell_output:
ip.run_cell("'unsafe'")
with expect_exception_tb, expect_no_cell_output:
Thomas Kluyver
run_cell returns an ExecutionResult instance...
r19630 res = ip.run_cell("'unsafe'")
self.assertIsInstance(res.error_before_exec, InputRejected)
Scott Sanderson
DEV: AST transformers supplied to `InteractiveShell` can reject input....
r17798
Fernando Perez
Add simple test for __IPYTHON__ in builtins.
r5493 def test__IPYTHON__():
# This shouldn't raise a NameError, that's all
__IPYTHON__
MinRK
user_variables and user_expressions use rich repr API...
r10636
class DummyRepr(object):
def __repr__(self):
return "DummyRepr"
Pablo Galindo
Recovered trailing whitespace
r22921
MinRK
user_variables and user_expressions use rich repr API...
r10636 def _repr_html_(self):
return "<b>dummy</b>"
Pablo Galindo
Recovered trailing whitespace
r22921
MinRK
user_variables and user_expressions use rich repr API...
r10636 def _repr_javascript_(self):
return "console.log('hi');", {'key': 'value'}
Pablo Galindo
Recovered trailing whitespace
r22921
MinRK
user_variables and user_expressions use rich repr API...
r10636
def test_user_variables():
# enable all formatters
ip.display_formatter.active_types = ip.display_formatter.format_types
Pablo Galindo
Recovered trailing whitespace
r22921
MinRK
user_variables and user_expressions use rich repr API...
r10636 ip.user_ns['dummy'] = d = DummyRepr()
Rémy Léone
Set litteral
r21804 keys = {'dummy', 'doesnotexist'}
MinRK
remove user_variables...
r16570 r = ip.user_expressions({ key:key for key in keys})
MinRK
user_variables and user_expressions use rich repr API...
r10636
Samuel Gaist
[core][tests][interactiveshell] Remove nose
r26901 assert keys == set(r.keys())
dummy = r["dummy"]
assert {"status", "data", "metadata"} == set(dummy.keys())
assert dummy["status"] == "ok"
data = dummy["data"]
metadata = dummy["metadata"]
assert data.get("text/html") == d._repr_html_()
MinRK
user_variables and user_expressions use rich repr API...
r10636 js, jsmd = d._repr_javascript_()
Samuel Gaist
[core][tests][interactiveshell] Remove nose
r26901 assert data.get("application/javascript") == js
assert metadata.get("application/javascript") == jsmd
dne = r["doesnotexist"]
assert dne["status"] == "error"
assert dne["ename"] == "NameError"
MinRK
user_variables and user_expressions use rich repr API...
r10636 # back to text only
ip.display_formatter.active_types = ['text/plain']
Pablo Galindo
Recovered trailing whitespace
r22921
MinRK
user_variables and user_expressions use rich repr API...
r10636 def test_user_expression():
# enable all formatters
ip.display_formatter.active_types = ip.display_formatter.format_types
query = {
'a' : '1 + 2',
'b' : '1/0',
}
r = ip.user_expressions(query)
import pprint
pprint.pprint(r)
Samuel Gaist
[core][tests][interactiveshell] Remove nose
r26901 assert set(r.keys()) == set(query.keys())
a = r["a"]
assert {"status", "data", "metadata"} == set(a.keys())
assert a["status"] == "ok"
data = a["data"]
metadata = a["metadata"]
assert data.get("text/plain") == "3"
b = r["b"]
assert b["status"] == "error"
assert b["ename"] == "ZeroDivisionError"
MinRK
user_variables and user_expressions use rich repr API...
r10636 # back to text only
ip.display_formatter.active_types = ['text/plain']
Volker Braun
Also catch SyntaxErrors from InputTransformers in run_cell()...
r13525 class TestSyntaxErrorTransformer(unittest.TestCase):
"""Check that SyntaxError raised by an input transformer is handled by run_cell()"""
Thomas Kluyver
Start integrating new input transformation machinery into InteractiveShell
r24164 @staticmethod
def transformer(lines):
for line in lines:
Volker Braun
Also catch SyntaxErrors from InputTransformers in run_cell()...
r13525 pos = line.find('syntaxerror')
if pos >= 0:
e = SyntaxError('input contains "syntaxerror"')
e.text = line
e.offset = pos + 1
raise e
Thomas Kluyver
Start integrating new input transformation machinery into InteractiveShell
r24164 return lines
Volker Braun
Also catch SyntaxErrors from InputTransformers in run_cell()...
r13525
def setUp(self):
Thomas Kluyver
Update tests for input transformer raising SyntaxError
r24404 ip.input_transformers_post.append(self.transformer)
Volker Braun
Also catch SyntaxErrors from InputTransformers in run_cell()...
r13525
def tearDown(self):
Thomas Kluyver
Update tests for input transformer raising SyntaxError
r24404 ip.input_transformers_post.remove(self.transformer)
Volker Braun
Also catch SyntaxErrors from InputTransformers in run_cell()...
r13525
def test_syntaxerror_input_transformer(self):
with tt.AssertPrints('1234'):
ip.run_cell('1234')
with tt.AssertPrints('SyntaxError: invalid syntax'):
ip.run_cell('1 2 3') # plain python syntax error
with tt.AssertPrints('SyntaxError: input contains "syntaxerror"'):
ip.run_cell('2345 # syntaxerror') # input transformer syntax error
with tt.AssertPrints('3456'):
ip.run_cell('3456')
Min ho Kim
Fixed typos
r25167 class TestWarningSuppression(unittest.TestCase):
Matthias Bussonnier
Misc modifications for pytest comppatibility...
r25115 def test_warning_suppression(self):
ip.run_cell("import warnings")
try:
with self.assertWarnsRegex(UserWarning, "asdf"):
ip.run_cell("warnings.warn('asdf')")
# Here's the real test -- if we run that again, we should get the
# warning again. Traditionally, each warning was only issued once per
# IPython session (approximately), even if the user typed in new and
# different code that should have also triggered the warning, leading
# to much confusion.
with self.assertWarnsRegex(UserWarning, "asdf"):
ip.run_cell("warnings.warn('asdf')")
finally:
ip.run_cell("del warnings")
Matthias Bussonnier
Add test that interactive warning is shown.
r21392
Matthias Bussonnier
Misc modifications for pytest comppatibility...
r25115 def test_deprecation_warning(self):
ip.run_cell("""
Matthias Bussonnier
Add test that interactive warning is shown.
r21392 import warnings
def wrn():
warnings.warn(
"I AM A WARNING",
DeprecationWarning
)
""")
Matthias Bussonnier
Misc modifications for pytest comppatibility...
r25115 try:
with self.assertWarnsRegex(DeprecationWarning, "I AM A WARNING"):
ip.run_cell("wrn()")
finally:
ip.run_cell("del warnings")
ip.run_cell("del wrn")
Matthias Bussonnier
Test imported code does not raise deprecation warning.
r21393
class TestImportNoDeprecate(tt.TempFileMixin):
Matthias Bussonnier
Fix Mixin Inheritence in Xunit unittest....
r25113 def setUp(self):
Matthias Bussonnier
Test imported code does not raise deprecation warning.
r21393 """Make a valid python temp file."""
self.mktmp("""
import warnings
def wrn():
warnings.warn(
"I AM A WARNING",
DeprecationWarning
)
""")
Matthias Bussonnier
Fix Mixin Inheritence in Xunit unittest....
r25113 super().setUp()
Matthias Bussonnier
Test imported code does not raise deprecation warning.
r21393
def test_no_dep(self):
"""
No deprecation warning should be raised from imported functions
"""
ip.run_cell("from {} import wrn".format(self.fname))
with tt.AssertNotPrints("I AM A WARNING"):
ip.run_cell("wrn()")
ip.run_cell("del wrn")
Min RK
fix execution count when custom exception is caught during compile...
r24135
def test_custom_exc_count():
hook = mock.Mock(return_value=None)
ip.set_custom_exc((SyntaxError,), hook)
before = ip.execution_count
ip.run_cell("def foo()", store_history=True)
Min RK
restore default custom_exc after test
r24136 # restore default excepthook
ip.set_custom_exc((), None)
Samuel Gaist
[core][tests][interactiveshell] Remove nose
r26901 assert hook.call_count == 1
assert ip.execution_count == before + 1
Min RK
exercise calling run_cell_async as a coroutine
r24538
def test_run_cell_async():
ip.run_cell("import asyncio")
coro = ip.run_cell_async("await asyncio.sleep(0.01)\n5")
assert asyncio.iscoroutine(coro)
Min RK
avoid deprecated get_event_loop...
r27387 loop = asyncio.new_event_loop()
Min RK
exercise calling run_cell_async as a coroutine
r24538 result = loop.run_until_complete(coro)
assert isinstance(result, interactiveshell.ExecutionResult)
assert result.result == 5
Min RK
avoid deprecated asyncio.get_event_loop...
r27192 def test_run_cell_await():
ip.run_cell("import asyncio")
result = ip.run_cell("await asyncio.sleep(0.01); 10")
assert ip.user_ns["_"] == 10
def test_run_cell_asyncio_run():
ip.run_cell("import asyncio")
result = ip.run_cell("await asyncio.sleep(0.01); 1")
assert ip.user_ns["_"] == 1
result = ip.run_cell("asyncio.run(asyncio.sleep(0.01)); 2")
assert ip.user_ns["_"] == 2
result = ip.run_cell("await asyncio.sleep(0.01); 3")
assert ip.user_ns["_"] == 3
Min RK
exercise calling run_cell_async as a coroutine
r24538 def test_should_run_async():
Matthias Bussonnier
MAINT: mock slowest test....
r28098 assert not ip.should_run_async("a = 5", transformed_cell="a = 5")
assert ip.should_run_async("await x", transformed_cell="await x")
assert ip.should_run_async(
"import asyncio; await asyncio.sleep(1)",
transformed_cell="import asyncio; await asyncio.sleep(1)",
)
Nathan Goldbaum
Ensure set_custom_completer is working. Fixes #11272
r25490
def test_set_custom_completer():
num_completers = len(ip.Completer.matchers)
def foo(*args, **kwargs):
return "I'm a completer!"
ip.set_custom_completer(foo, 0)
# check that we've really added a new completer
assert len(ip.Completer.matchers) == num_completers + 1
# check that the first completer is the function we defined
assert ip.Completer.matchers[0]() == "I'm a completer!"
# clean up
ip.Completer.custom_matchers.pop()
Jacob Evan Shreve
Add some regression tests for this change
r28095
Jacob Evan Shreve
Isolate the attack tests with setUp and tearDown methods
r28096 class TestShowTracebackAttack(unittest.TestCase):
Jacob Evan Shreve
Add some regression tests for this change
r28095 """Test that the interactive shell is resilient against the client attack of
manipulating the showtracebacks method. These attacks shouldn't result in an
unhandled exception in the kernel."""
Jacob Evan Shreve
Isolate the attack tests with setUp and tearDown methods
r28096 def setUp(self):
self.orig_showtraceback = interactiveshell.InteractiveShell.showtraceback
def tearDown(self):
interactiveshell.InteractiveShell.showtraceback = self.orig_showtraceback
Jacob Evan Shreve
Add some regression tests for this change
r28095 def test_set_show_tracebacks_none(self):
"""Test the case of the client setting showtracebacks to None"""
result = ip.run_cell(
"""
import IPython.core.interactiveshell
IPython.core.interactiveshell.InteractiveShell.showtraceback = None
assert False, "This should not raise an exception"
"""
)
print(result)
assert result.result is None
assert isinstance(result.error_in_exec, TypeError)
assert str(result.error_in_exec) == "'NoneType' object is not callable"
def test_set_show_tracebacks_noop(self):
"""Test the case of the client setting showtracebacks to a no op lambda"""
result = ip.run_cell(
"""
import IPython.core.interactiveshell
IPython.core.interactiveshell.InteractiveShell.showtraceback = lambda *args, **kwargs: None
assert False, "This should not raise an exception"
"""
)
print(result)
assert result.result is None
assert isinstance(result.error_in_exec, AssertionError)
assert str(result.error_in_exec) == "This should not raise an exception"