##// END OF EJS Templates
Backport PR #9976: Let IPython.lib.guisupport detect terminal-integrated event loops...
Backport PR #9976: Let IPython.lib.guisupport detect terminal-integrated event loops Closes gh-9974 This is a bit more invasive than most backported changes, but it fixes a regression in IPython 5. My thinking: - The `guisupport` APIs that worked before should continue working until/unless we deprecate them. - There should be a common way to check if an event loop is already running in both the terminal and an IPython kernel. - It should be possible to check for any event loop, not just Qt and Wx (which `guisupport` has checks for). My plan is to make a public attribute `shell.active_eventloop`, which is either None or a string naming the event loop which IPython will run when waiting for input. E.g. `qt` or `gtk3`. (Todo: should we also expose the event loop object in cases where there is one? Not sure if anything useful can be done with it). This PR adds that attribute for terminal IPython; if we agree on it I'll make a separate PR for ipykernel. The functions in guisupport then become a convenient shortcut for checking this, and we can decide whether to deprecate them in favour or something more uniform, or add similar convenience functions for other common event loops. Signed-off-by: Thomas Kluyver <thomas@kluyver.me.uk>

File last commit:

r21134:02234da0
r23138:fb70b991
Show More
test_decorators.py
165 lines | 3.9 KiB | text/x-python | PythonLexer
Fernando Perez
Add new decorators to skip os-specific tests....
r1721 """Tests for the decorators we've created for IPython.
"""
Thomas Kluyver
Convert print statements to print function calls...
r13348 from __future__ import print_function
Fernando Perez
Add new decorators to skip os-specific tests....
r1721
# Module imports
# Std lib
import inspect
import sys
# Third party
import nose.tools as nt
# Our own
from IPython.testing import decorators as dec
#-----------------------------------------------------------------------------
# Utilities
# Note: copied from OInspect, kept here so the testing stuff doesn't create
# circular dependencies and is easier to reuse.
def getargspec(obj):
"""Get the names and default values of a function's arguments.
A tuple of four things is returned: (args, varargs, varkw, defaults).
'args' is a list of the argument names (it may contain nested lists).
'varargs' and 'varkw' are the names of the * and ** arguments or None.
'defaults' is an n-tuple of the default values of the last n arguments.
Modified version of inspect.getargspec from the Python Standard
Library."""
if inspect.isfunction(obj):
func_obj = obj
elif inspect.ismethod(obj):
Thomas Kluyver
Fix method special attributes...
r13370 func_obj = obj.__func__
Fernando Perez
Add new decorators to skip os-specific tests....
r1721 else:
Bradley M. Froehle
Apply most 2to3 raise fixes....
r7843 raise TypeError('arg is not a Python function')
Thomas Kluyver
Update function attribute names...
r13362 args, varargs, varkw = inspect.getargs(func_obj.__code__)
return args, varargs, varkw, func_obj.__defaults__
Fernando Perez
Add new decorators to skip os-specific tests....
r1721
#-----------------------------------------------------------------------------
# Testing functions
Fernando Perez
Add new testing support machinery with better parametric tests....
r2368 @dec.as_unittest
def trivial():
"""A trivial test"""
pass
Fernando Perez
Add new decorators to skip os-specific tests....
r1721 @dec.skip
def test_deliberately_broken():
"""A deliberately broken test - we want to skip this one."""
1/0
Brian Granger
Commiting fixes for running our test suite using trial and nose....
r1963 @dec.skip('Testing the skip decorator')
Fernando Perez
Add new decorators to skip os-specific tests....
r1721 def test_deliberately_broken2():
"""Another deliberately broken test - we want to skip this one."""
1/0
# Verify that we can correctly skip the doctest for a function at will, but
# that the docstring itself is NOT destroyed by the decorator.
def doctest_bad(x,y=1,**k):
"""A function whose doctest we need to skip.
>>> 1+1
3
"""
Thomas Kluyver
Convert print statements to print function calls...
r13348 print('x:',x)
print('y:',y)
print('k:',k)
Fernando Perez
Add new decorators to skip os-specific tests....
r1721
def call_doctest_bad():
"""Check that we can still call the decorated functions.
>>> doctest_bad(3,y=4)
x: 3
y: 4
k: {}
"""
pass
def test_skip_dt_decorator():
"""Doctest-skipping decorator should preserve the docstring.
"""
# Careful: 'check' must be a *verbatim* copy of the doctest_bad docstring!
check = """A function whose doctest we need to skip.
>>> 1+1
3
"""
# Fetch the docstring from doctest_bad after decoration.
val = doctest_bad.__doc__
Fernando Perez
Fix names so these doctests pass correctly when run in bare 'iptest IPython'
r2479 nt.assert_equal(check,val,"doctest_bad docstrings don't match")
Fernando Perez
Add new decorators to skip os-specific tests....
r1721
# Doctest skipping should work for class methods too
Fernando Perez
Fix names so these doctests pass correctly when run in bare 'iptest IPython'
r2479 class FooClass(object):
"""FooClass
Fernando Perez
Add new decorators to skip os-specific tests....
r1721
Example:
>>> 1+1
2
"""
def __init__(self,x):
Fernando Perez
Fix names so these doctests pass correctly when run in bare 'iptest IPython'
r2479 """Make a FooClass.
Fernando Perez
Add new decorators to skip os-specific tests....
r1721
Example:
Fernando Perez
Fix names so these doctests pass correctly when run in bare 'iptest IPython'
r2479 >>> f = FooClass(3)
Fernando Perez
Add new decorators to skip os-specific tests....
r1721 junk
"""
Thomas Kluyver
Convert print statements to print function calls...
r13348 print('Making a FooClass.')
Fernando Perez
Add new decorators to skip os-specific tests....
r1721 self.x = x
def bar(self,y):
"""Example:
Fernando Perez
Fix names so these doctests pass correctly when run in bare 'iptest IPython'
r2479 >>> ff = FooClass(3)
>>> ff.bar(0)
Fernando Perez
Add new decorators to skip os-specific tests....
r1721 boom!
>>> 1/0
bam!
"""
return 1/y
def baz(self,y):
"""Example:
Fernando Perez
Fix names so these doctests pass correctly when run in bare 'iptest IPython'
r2479 >>> ff2 = FooClass(3)
Making a FooClass.
>>> ff2.baz(3)
Fernando Perez
Add new decorators to skip os-specific tests....
r1721 True
"""
return self.x==y
def test_skip_dt_decorator2():
"""Doctest-skipping decorator should preserve function signature.
"""
# Hardcoded correct answer
dtargs = (['x', 'y'], None, 'k', (1,))
# Introspect out the value
dtargsr = getargspec(doctest_bad)
assert dtargsr==dtargs, \
"Incorrectly reconstructed args for doctest_bad: %s" % (dtargsr,)
@dec.skip_linux
def test_linux():
MinRK
check linux with startswith('linux') instead of =='linux2'...
r4138 nt.assert_false(sys.platform.startswith('linux'),"This test can't run under linux")
Fernando Perez
Add new decorators to skip os-specific tests....
r1721
@dec.skip_win32
def test_win32():
Bradley M. Froehle
s/nt.assert_not_equals/nt.assert_not_equal/
r7877 nt.assert_not_equal(sys.platform,'win32',"This test can't run under windows")
Fernando Perez
Add new decorators to skip os-specific tests....
r1721
@dec.skip_osx
def test_osx():
Bradley M. Froehle
s/nt.assert_not_equals/nt.assert_not_equal/
r7877 nt.assert_not_equal(sys.platform,'darwin',"This test can't run under osx")
Fernando Perez
Add new testing support machinery with better parametric tests....
r2368