##// END OF EJS Templates
Remove uses of @parametric decorator
Thomas Kluyver -
Show More
@@ -1,121 +1,118 b''
1 1 #-----------------------------------------------------------------------------
2 2 # Copyright (C) 2010-2011, IPython Development Team.
3 3 #
4 4 # Distributed under the terms of the Modified BSD License.
5 5 #
6 6 # The full license is in the file COPYING.txt, distributed with this software.
7 7 #-----------------------------------------------------------------------------
8 8
9 from nose.tools import assert_equal, assert_true
9 from nose.tools import assert_equal
10 10
11 11 from IPython.external import argparse
12 12 from IPython.core.magic_arguments import (argument, argument_group, kwds,
13 13 magic_arguments, parse_argstring, real_name)
14 from IPython.testing.decorators import parametric
15 14
16 15
17 16 @magic_arguments()
18 17 @argument('-f', '--foo', help="an argument")
19 18 def magic_foo1(self, args):
20 19 """ A docstring.
21 20 """
22 21 return parse_argstring(magic_foo1, args)
23 22
24 23
25 24 @magic_arguments()
26 25 def magic_foo2(self, args):
27 26 """ A docstring.
28 27 """
29 28 return parse_argstring(magic_foo2, args)
30 29
31 30
32 31 @magic_arguments()
33 32 @argument('-f', '--foo', help="an argument")
34 33 @argument_group('Group')
35 34 @argument('-b', '--bar', help="a grouped argument")
36 35 @argument_group('Second Group')
37 36 @argument('-z', '--baz', help="another grouped argument")
38 37 def magic_foo3(self, args):
39 38 """ A docstring.
40 39 """
41 40 return parse_argstring(magic_foo3, args)
42 41
43 42
44 43 @magic_arguments()
45 44 @kwds(argument_default=argparse.SUPPRESS)
46 45 @argument('-f', '--foo', help="an argument")
47 46 def magic_foo4(self, args):
48 47 """ A docstring.
49 48 """
50 49 return parse_argstring(magic_foo4, args)
51 50
52 51
53 52 @magic_arguments('frobnicate')
54 53 @argument('-f', '--foo', help="an argument")
55 54 def magic_foo5(self, args):
56 55 """ A docstring.
57 56 """
58 57 return parse_argstring(magic_foo5, args)
59 58
60 59
61 60 @magic_arguments()
62 61 @argument('-f', '--foo', help="an argument")
63 62 def magic_magic_foo(self, args):
64 63 """ A docstring.
65 64 """
66 65 return parse_argstring(magic_magic_foo, args)
67 66
68 67
69 68 @magic_arguments()
70 69 @argument('-f', '--foo', help="an argument")
71 70 def foo(self, args):
72 71 """ A docstring.
73 72 """
74 73 return parse_argstring(foo, args)
75 74
76 75
77 @parametric
78 76 def test_magic_arguments():
79 # Ideally, these would be doctests, but I could not get it to work.
80 yield assert_equal(magic_foo1.__doc__, '%foo1 [-f FOO]\n\n A docstring.\n\noptional arguments:\n -f FOO, --foo FOO an argument\n')
81 yield assert_equal(getattr(magic_foo1, 'argcmd_name', None), None)
82 yield assert_equal(real_name(magic_foo1), 'foo1')
83 yield assert_equal(magic_foo1(None, ''), argparse.Namespace(foo=None))
84 yield assert_true(hasattr(magic_foo1, 'has_arguments'))
85
86 yield assert_equal(magic_foo2.__doc__, '%foo2\n\n A docstring.\n')
87 yield assert_equal(getattr(magic_foo2, 'argcmd_name', None), None)
88 yield assert_equal(real_name(magic_foo2), 'foo2')
89 yield assert_equal(magic_foo2(None, ''), argparse.Namespace())
90 yield assert_true(hasattr(magic_foo2, 'has_arguments'))
91
92 yield assert_equal(magic_foo3.__doc__, '%foo3 [-f FOO] [-b BAR] [-z BAZ]\n\n A docstring.\n\noptional arguments:\n -f FOO, --foo FOO an argument\n\nGroup:\n -b BAR, --bar BAR a grouped argument\n\nSecond Group:\n -z BAZ, --baz BAZ another grouped argument\n')
93 yield assert_equal(getattr(magic_foo3, 'argcmd_name', None), None)
94 yield assert_equal(real_name(magic_foo3), 'foo3')
95 yield assert_equal(magic_foo3(None, ''),
77 assert_equal(magic_foo1.__doc__, '%foo1 [-f FOO]\n\n A docstring.\n\noptional arguments:\n -f FOO, --foo FOO an argument\n')
78 assert_equal(getattr(magic_foo1, 'argcmd_name', None), None)
79 assert_equal(real_name(magic_foo1), 'foo1')
80 assert_equal(magic_foo1(None, ''), argparse.Namespace(foo=None))
81 assert hasattr(magic_foo1, 'has_arguments')
82
83 assert_equal(magic_foo2.__doc__, '%foo2\n\n A docstring.\n')
84 assert_equal(getattr(magic_foo2, 'argcmd_name', None), None)
85 assert_equal(real_name(magic_foo2), 'foo2')
86 assert_equal(magic_foo2(None, ''), argparse.Namespace())
87 assert hasattr(magic_foo2, 'has_arguments')
88
89 assert_equal(magic_foo3.__doc__, '%foo3 [-f FOO] [-b BAR] [-z BAZ]\n\n A docstring.\n\noptional arguments:\n -f FOO, --foo FOO an argument\n\nGroup:\n -b BAR, --bar BAR a grouped argument\n\nSecond Group:\n -z BAZ, --baz BAZ another grouped argument\n')
90 assert_equal(getattr(magic_foo3, 'argcmd_name', None), None)
91 assert_equal(real_name(magic_foo3), 'foo3')
92 assert_equal(magic_foo3(None, ''),
96 93 argparse.Namespace(bar=None, baz=None, foo=None))
97 yield assert_true(hasattr(magic_foo3, 'has_arguments'))
98
99 yield assert_equal(magic_foo4.__doc__, '%foo4 [-f FOO]\n\n A docstring.\n\noptional arguments:\n -f FOO, --foo FOO an argument\n')
100 yield assert_equal(getattr(magic_foo4, 'argcmd_name', None), None)
101 yield assert_equal(real_name(magic_foo4), 'foo4')
102 yield assert_equal(magic_foo4(None, ''), argparse.Namespace())
103 yield assert_true(hasattr(magic_foo4, 'has_arguments'))
104
105 yield assert_equal(magic_foo5.__doc__, '%frobnicate [-f FOO]\n\n A docstring.\n\noptional arguments:\n -f FOO, --foo FOO an argument\n')
106 yield assert_equal(getattr(magic_foo5, 'argcmd_name', None), 'frobnicate')
107 yield assert_equal(real_name(magic_foo5), 'frobnicate')
108 yield assert_equal(magic_foo5(None, ''), argparse.Namespace(foo=None))
109 yield assert_true(hasattr(magic_foo5, 'has_arguments'))
110
111 yield assert_equal(magic_magic_foo.__doc__, '%magic_foo [-f FOO]\n\n A docstring.\n\noptional arguments:\n -f FOO, --foo FOO an argument\n')
112 yield assert_equal(getattr(magic_magic_foo, 'argcmd_name', None), None)
113 yield assert_equal(real_name(magic_magic_foo), 'magic_foo')
114 yield assert_equal(magic_magic_foo(None, ''), argparse.Namespace(foo=None))
115 yield assert_true(hasattr(magic_magic_foo, 'has_arguments'))
116
117 yield assert_equal(foo.__doc__, '%foo [-f FOO]\n\n A docstring.\n\noptional arguments:\n -f FOO, --foo FOO an argument\n')
118 yield assert_equal(getattr(foo, 'argcmd_name', None), None)
119 yield assert_equal(real_name(foo), 'foo')
120 yield assert_equal(foo(None, ''), argparse.Namespace(foo=None))
121 yield assert_true(hasattr(foo, 'has_arguments'))
94 assert hasattr(magic_foo3, 'has_arguments')
95
96 assert_equal(magic_foo4.__doc__, '%foo4 [-f FOO]\n\n A docstring.\n\noptional arguments:\n -f FOO, --foo FOO an argument\n')
97 assert_equal(getattr(magic_foo4, 'argcmd_name', None), None)
98 assert_equal(real_name(magic_foo4), 'foo4')
99 assert_equal(magic_foo4(None, ''), argparse.Namespace())
100 assert hasattr(magic_foo4, 'has_arguments')
101
102 assert_equal(magic_foo5.__doc__, '%frobnicate [-f FOO]\n\n A docstring.\n\noptional arguments:\n -f FOO, --foo FOO an argument\n')
103 assert_equal(getattr(magic_foo5, 'argcmd_name', None), 'frobnicate')
104 assert_equal(real_name(magic_foo5), 'frobnicate')
105 assert_equal(magic_foo5(None, ''), argparse.Namespace(foo=None))
106 assert hasattr(magic_foo5, 'has_arguments')
107
108 assert_equal(magic_magic_foo.__doc__, '%magic_foo [-f FOO]\n\n A docstring.\n\noptional arguments:\n -f FOO, --foo FOO an argument\n')
109 assert_equal(getattr(magic_magic_foo, 'argcmd_name', None), None)
110 assert_equal(real_name(magic_magic_foo), 'magic_foo')
111 assert_equal(magic_magic_foo(None, ''), argparse.Namespace(foo=None))
112 assert hasattr(magic_magic_foo, 'has_arguments')
113
114 assert_equal(foo.__doc__, '%foo [-f FOO]\n\n A docstring.\n\noptional arguments:\n -f FOO, --foo FOO an argument\n')
115 assert_equal(getattr(foo, 'argcmd_name', None), None)
116 assert_equal(real_name(foo), 'foo')
117 assert_equal(foo(None, ''), argparse.Namespace(foo=None))
118 assert hasattr(foo, 'has_arguments')
@@ -1,99 +1,96 b''
1 1 """Tests for input manipulation machinery."""
2 2
3 3 #-----------------------------------------------------------------------------
4 4 # Imports
5 5 #-----------------------------------------------------------------------------
6 6 import nose.tools as nt
7 7
8 8 from IPython.core.prefilter import AutocallChecker
9 9 from IPython.testing import decorators as dec
10 10 from IPython.testing.globalipapp import get_ipython
11 11
12 12 #-----------------------------------------------------------------------------
13 13 # Tests
14 14 #-----------------------------------------------------------------------------
15 15 ip = get_ipython()
16 16
17 @dec.parametric
18 17 def test_prefilter():
19 18 """Test user input conversions"""
20 19
21 20 # pairs of (raw, expected correct) input
22 21 pairs = [ ('2+2','2+2'),
23 22 ]
24 23
25 24 for raw, correct in pairs:
26 yield nt.assert_equal(ip.prefilter(raw), correct)
25 nt.assert_equal(ip.prefilter(raw), correct)
27 26
28 27
29 @dec.parametric
30 28 def test_autocall_binops():
31 29 """See https://github.com/ipython/ipython/issues/81"""
32 30 ip.magic('autocall 2')
33 31 f = lambda x: x
34 32 ip.user_ns['f'] = f
35 33 try:
36 yield nt.assert_equal(ip.prefilter('f 1'),'f(1)')
34 nt.assert_equal(ip.prefilter('f 1'),'f(1)')
37 35 for t in ['f +1', 'f -1']:
38 yield nt.assert_equal(ip.prefilter(t), t)
36 nt.assert_equal(ip.prefilter(t), t)
39 37
40 38 # Run tests again with a more permissive exclude_regexp, which will
41 39 # allow transformation of binary operations ('f -1' -> 'f(-1)').
42 40 pm = ip.prefilter_manager
43 41 ac = AutocallChecker(shell=pm.shell, prefilter_manager=pm,
44 42 config=pm.config)
45 43 try:
46 44 ac.priority = 1
47 45 ac.exclude_regexp = r'^[,&^\|\*/]|^is |^not |^in |^and |^or '
48 46 pm.sort_checkers()
49 47
50 yield nt.assert_equal(ip.prefilter('f -1'), 'f(-1)')
51 yield nt.assert_equal(ip.prefilter('f +1'), 'f(+1)')
48 nt.assert_equal(ip.prefilter('f -1'), 'f(-1)')
49 nt.assert_equal(ip.prefilter('f +1'), 'f(+1)')
52 50 finally:
53 51 pm.unregister_checker(ac)
54 52 finally:
55 53 ip.magic('autocall 0')
56 54 del ip.user_ns['f']
57 55
58 56
59 @dec.parametric
60 57 def test_issue_114():
61 58 """Check that multiline string literals don't expand as magic
62 59 see http://github.com/ipython/ipython/issues/114"""
63 60
64 61 template = '"""\n%s\n"""'
65 62 # Store the current value of multi_line_specials and turn it off before
66 63 # running test, since it could be true (case in which the test doesn't make
67 64 # sense, as multiline string literals *will* expand as magic in that case).
68 65 msp = ip.prefilter_manager.multi_line_specials
69 66 ip.prefilter_manager.multi_line_specials = False
70 67 try:
71 68 for mgk in ip.magics_manager.lsmagic()['line']:
72 69 raw = template % mgk
73 yield nt.assert_equal(ip.prefilter(raw), raw)
70 nt.assert_equal(ip.prefilter(raw), raw)
74 71 finally:
75 72 ip.prefilter_manager.multi_line_specials = msp
76 73
77 74
78 75 def test_prefilter_attribute_errors():
79 76 """Capture exceptions thrown by user objects on attribute access.
80 77
81 78 See http://github.com/ipython/ipython/issues/988."""
82 79
83 80 class X(object):
84 81 def __getattr__(self, k):
85 82 raise ValueError('broken object')
86 83 def __call__(self, x):
87 84 return x
88 85
89 86 # Create a callable broken object
90 87 ip.user_ns['x'] = X()
91 88 ip.magic('autocall 2')
92 89 try:
93 90 # Even if x throws an attribute error when looking at its rewrite
94 91 # attribute, we should not crash. So the test here is simply making
95 92 # the prefilter call and not having an exception.
96 93 ip.prefilter('x 1')
97 94 finally:
98 95 del ip.user_ns['x']
99 96 ip.magic('autocall 0')
@@ -1,140 +1,138 b''
1 1 """Tests for pylab tools module.
2 2 """
3 3 #-----------------------------------------------------------------------------
4 4 # Copyright (c) 2011, the IPython Development Team.
5 5 #
6 6 # Distributed under the terms of the Modified BSD License.
7 7 #
8 8 # The full license is in the file COPYING.txt, distributed with this software.
9 9 #-----------------------------------------------------------------------------
10 10
11 11 #-----------------------------------------------------------------------------
12 12 # Imports
13 13 #-----------------------------------------------------------------------------
14 14 from __future__ import print_function
15 15
16 16 # Stdlib imports
17 17
18 18 # Third-party imports
19 19 import matplotlib; matplotlib.use('Agg')
20 20 import nose.tools as nt
21 21
22 22 from matplotlib import pyplot as plt
23 23 import numpy as np
24 24
25 25 # Our own imports
26 26 from IPython.core.interactiveshell import InteractiveShell
27 from IPython.testing import decorators as dec
28 27 from .. import pylabtools as pt
29 28
30 29 #-----------------------------------------------------------------------------
31 30 # Globals and constants
32 31 #-----------------------------------------------------------------------------
33 32
34 33 #-----------------------------------------------------------------------------
35 34 # Local utilities
36 35 #-----------------------------------------------------------------------------
37 36
38 37 #-----------------------------------------------------------------------------
39 38 # Classes and functions
40 39 #-----------------------------------------------------------------------------
41 40
42 @dec.parametric
43 41 def test_figure_to_svg():
44 42 # simple empty-figure test
45 43 fig = plt.figure()
46 yield nt.assert_equal(pt.print_figure(fig, 'svg'), None)
44 nt.assert_equal(pt.print_figure(fig, 'svg'), None)
47 45
48 46 plt.close('all')
49 47
50 48 # simple check for at least svg-looking output
51 49 fig = plt.figure()
52 50 ax = fig.add_subplot(1,1,1)
53 51 ax.plot([1,2,3])
54 52 plt.draw()
55 53 svg = pt.print_figure(fig, 'svg')[:100].lower()
56 yield nt.assert_true('doctype svg' in svg)
54 nt.assert_in('doctype svg', svg)
57 55
58 56
59 57 def test_import_pylab():
60 58 ip = get_ipython()
61 59 ns = {}
62 60 pt.import_pylab(ns, import_all=False)
63 61 nt.assert_true('plt' in ns)
64 62 nt.assert_equal(ns['np'], np)
65 63
66 64 class TestPylabSwitch(object):
67 65 class Shell(InteractiveShell):
68 66 def enable_gui(self, gui):
69 67 pass
70 68
71 69 def setup(self):
72 70 import matplotlib
73 71 def act_mpl(backend):
74 72 matplotlib.rcParams['backend'] = backend
75 73
76 74 # Save rcParams since they get modified
77 75 self._saved_rcParams = matplotlib.rcParams
78 76 matplotlib.rcParams = dict(backend='Qt4Agg')
79 77
80 78 # Mock out functions
81 79 self._save_am = pt.activate_matplotlib
82 80 pt.activate_matplotlib = act_mpl
83 81 self._save_ip = pt.import_pylab
84 82 pt.import_pylab = lambda *a,**kw:None
85 83 self._save_cis = pt.configure_inline_support
86 84 pt.configure_inline_support = lambda *a,**kw:None
87 85
88 86 def teardown(self):
89 87 pt.activate_matplotlib = self._save_am
90 88 pt.import_pylab = self._save_ip
91 89 pt.configure_inline_support = self._save_cis
92 90 import matplotlib
93 91 matplotlib.rcParams = self._saved_rcParams
94 92
95 93 def test_qt(self):
96 94 s = self.Shell()
97 95 gui, backend = s.enable_matplotlib(None)
98 96 nt.assert_equal(gui, 'qt')
99 97 nt.assert_equal(s.pylab_gui_select, 'qt')
100 98
101 99 gui, backend = s.enable_matplotlib('inline')
102 100 nt.assert_equal(gui, 'inline')
103 101 nt.assert_equal(s.pylab_gui_select, 'qt')
104 102
105 103 gui, backend = s.enable_matplotlib('qt')
106 104 nt.assert_equal(gui, 'qt')
107 105 nt.assert_equal(s.pylab_gui_select, 'qt')
108 106
109 107 gui, backend = s.enable_matplotlib('inline')
110 108 nt.assert_equal(gui, 'inline')
111 109 nt.assert_equal(s.pylab_gui_select, 'qt')
112 110
113 111 gui, backend = s.enable_matplotlib()
114 112 nt.assert_equal(gui, 'qt')
115 113 nt.assert_equal(s.pylab_gui_select, 'qt')
116 114
117 115 def test_inline(self):
118 116 s = self.Shell()
119 117 gui, backend = s.enable_matplotlib('inline')
120 118 nt.assert_equal(gui, 'inline')
121 119 nt.assert_equal(s.pylab_gui_select, None)
122 120
123 121 gui, backend = s.enable_matplotlib('inline')
124 122 nt.assert_equal(gui, 'inline')
125 123 nt.assert_equal(s.pylab_gui_select, None)
126 124
127 125 gui, backend = s.enable_matplotlib('qt')
128 126 nt.assert_equal(gui, 'qt')
129 127 nt.assert_equal(s.pylab_gui_select, 'qt')
130 128
131 129 def test_qt_gtk(self):
132 130 s = self.Shell()
133 131 gui, backend = s.enable_matplotlib('qt')
134 132 nt.assert_equal(gui, 'qt')
135 133 nt.assert_equal(s.pylab_gui_select, 'qt')
136 134
137 135 gui, backend = s.enable_matplotlib('gtk')
138 136 nt.assert_equal(gui, 'qt')
139 137 nt.assert_equal(s.pylab_gui_select, 'qt')
140 138
@@ -1,60 +1,59 b''
1 1 """Tests for kernel utility functions
2 2
3 3 Authors
4 4 -------
5 5 * MinRK
6 6 """
7 7 #-----------------------------------------------------------------------------
8 8 # Copyright (c) 2011, the IPython Development Team.
9 9 #
10 10 # Distributed under the terms of the Modified BSD License.
11 11 #
12 12 # The full license is in the file COPYING.txt, distributed with this software.
13 13 #-----------------------------------------------------------------------------
14 14
15 15 #-----------------------------------------------------------------------------
16 16 # Imports
17 17 #-----------------------------------------------------------------------------
18 18
19 19 # Third-party imports
20 20 import nose.tools as nt
21 21
22 22 # Our own imports
23 23 from IPython.testing import decorators as dec
24 24 from IPython.kernel.launcher import swallow_argv
25 25
26 26 #-----------------------------------------------------------------------------
27 27 # Classes and functions
28 28 #-----------------------------------------------------------------------------
29 29
30 @dec.parametric
31 30 def test_swallow_argv():
32 31 tests = [
33 32 # expected , argv , aliases, flags
34 33 (['-a', '5'], ['-a', '5'], None, None),
35 34 (['5'], ['-a', '5'], None, ['a']),
36 35 ([], ['-a', '5'], ['a'], None),
37 36 ([], ['-a', '5'], ['a'], ['a']),
38 37 ([], ['--foo'], None, ['foo']),
39 38 ([], ['--foo'], ['foobar'], []),
40 39 ([], ['--foo', '5'], ['foo'], []),
41 40 ([], ['--foo=5'], ['foo'], []),
42 41 (['--foo=5'], ['--foo=5'], [], ['foo']),
43 42 (['5'], ['--foo', '5'], [], ['foo']),
44 43 (['bar'], ['--foo', '5', 'bar'], ['foo'], ['foo']),
45 44 (['bar'], ['--foo=5', 'bar'], ['foo'], ['foo']),
46 45 (['5','bar'], ['--foo', '5', 'bar'], None, ['foo']),
47 46 (['bar'], ['--foo', '5', 'bar'], ['foo'], None),
48 47 (['bar'], ['--foo=5', 'bar'], ['foo'], None),
49 48 ]
50 49 for expected, argv, aliases, flags in tests:
51 50 stripped = swallow_argv(argv, aliases=aliases, flags=flags)
52 51 message = '\n'.join(['',
53 52 "argv: %r" % argv,
54 53 "aliases: %r" % aliases,
55 54 "flags : %r" % flags,
56 55 "expected : %r" % expected,
57 56 "returned : %r" % stripped,
58 57 ])
59 yield nt.assert_equal(expected, stripped, message)
58 nt.assert_equal(expected, stripped, message)
60 59
@@ -1,516 +1,484 b''
1 1 """Test suite for our zeromq-based messaging specification.
2 2 """
3 3 #-----------------------------------------------------------------------------
4 4 # Copyright (C) 2010-2011 The IPython Development Team
5 5 #
6 6 # Distributed under the terms of the BSD License. The full license is in
7 7 # the file COPYING.txt, distributed as part of this software.
8 8 #-----------------------------------------------------------------------------
9 9
10 10 import re
11 11 from subprocess import PIPE
12 12 from Queue import Empty
13 13
14 14 import nose.tools as nt
15 15
16 16 from IPython.kernel import KernelManager
17 17
18 from IPython.testing import decorators as dec
19 18 from IPython.utils.traitlets import (
20 19 HasTraits, TraitError, Bool, Unicode, Dict, Integer, List, Enum, Any,
21 20 )
22 21
23 22 #-----------------------------------------------------------------------------
24 23 # Global setup and utilities
25 24 #-----------------------------------------------------------------------------
26 25
27 26 STARTUP_TIMEOUT = 60
28 27 TIMEOUT = 15
29 28
30 29 def setup():
31 30 global KM, KC
32 31 KM = KernelManager()
33 32 KM.start_kernel(stdout=PIPE, stderr=PIPE)
34 33 KC = KM.client()
35 34 KC.start_channels()
36 35
37 36 # wait for kernel to be ready
38 37 try:
39 38 msg = KC.iopub_channel.get_msg(block=True, timeout=STARTUP_TIMEOUT)
40 39 except Empty:
41 40 pass
42 41 msg_id = KC.kernel_info()
43 42 KC.get_shell_msg(block=True, timeout=STARTUP_TIMEOUT)
44 43 flush_channels()
45 44
46 45
47 46 def teardown():
48 47 KC.stop_channels()
49 48 KM.shutdown_kernel()
50 49
51 50
52 51 def flush_channels(kc=None):
53 52 """flush any messages waiting on the queue"""
54 53 if kc is None:
55 54 kc = KC
56 55 for channel in (kc.shell_channel, kc.iopub_channel):
57 56 while True:
58 57 try:
59 58 msg = channel.get_msg(block=True, timeout=0.1)
60 59 except Empty:
61 60 break
62 61 else:
63 62 list(validate_message(msg))
64 63
65 64
66 65 def execute(code='', kc=None, **kwargs):
67 66 """wrapper for doing common steps for validating an execution request"""
68 67 if kc is None:
69 68 kc = KC
70 69 msg_id = kc.execute(code=code, **kwargs)
71 70 reply = kc.get_shell_msg(timeout=TIMEOUT)
72 71 list(validate_message(reply, 'execute_reply', msg_id))
73 72 busy = kc.get_iopub_msg(timeout=TIMEOUT)
74 73 list(validate_message(busy, 'status', msg_id))
75 74 nt.assert_equal(busy['content']['execution_state'], 'busy')
76 75
77 76 if not kwargs.get('silent'):
78 77 pyin = kc.get_iopub_msg(timeout=TIMEOUT)
79 78 list(validate_message(pyin, 'pyin', msg_id))
80 79 nt.assert_equal(pyin['content']['code'], code)
81 80
82 81 return msg_id, reply['content']
83 82
84 83 #-----------------------------------------------------------------------------
85 84 # MSG Spec References
86 85 #-----------------------------------------------------------------------------
87 86
88 87
89 88 class Reference(HasTraits):
90 89
91 90 """
92 91 Base class for message spec specification testing.
93 92
94 93 This class is the core of the message specification test. The
95 94 idea is that child classes implement trait attributes for each
96 95 message keys, so that message keys can be tested against these
97 96 traits using :meth:`check` method.
98 97
99 98 """
100 99
101 100 def check(self, d):
102 101 """validate a dict against our traits"""
103 102 for key in self.trait_names():
104 yield nt.assert_true(key in d, "Missing key: %r, should be found in %s" % (key, d))
103 nt.assert_in(key, d)
105 104 # FIXME: always allow None, probably not a good idea
106 105 if d[key] is None:
107 106 continue
108 107 try:
109 108 setattr(self, key, d[key])
110 109 except TraitError as e:
111 yield nt.assert_true(False, str(e))
110 nt.assert_true(False, str(e))
112 111
113 112
114 113 class RMessage(Reference):
115 114 msg_id = Unicode()
116 115 msg_type = Unicode()
117 116 header = Dict()
118 117 parent_header = Dict()
119 118 content = Dict()
120 119
121 120 class RHeader(Reference):
122 121 msg_id = Unicode()
123 122 msg_type = Unicode()
124 123 session = Unicode()
125 124 username = Unicode()
126 125
127 126 class RContent(Reference):
128 127 status = Enum((u'ok', u'error'))
129 128
130 129
131 130 class ExecuteReply(Reference):
132 131 execution_count = Integer()
133 132 status = Enum((u'ok', u'error'))
134 133
135 134 def check(self, d):
136 for tst in Reference.check(self, d):
137 yield tst
135 Reference.check(self, d)
138 136 if d['status'] == 'ok':
139 for tst in ExecuteReplyOkay().check(d):
140 yield tst
137 ExecuteReplyOkay().check(d)
141 138 elif d['status'] == 'error':
142 for tst in ExecuteReplyError().check(d):
143 yield tst
139 ExecuteReplyError().check(d)
144 140
145 141
146 142 class ExecuteReplyOkay(Reference):
147 143 payload = List(Dict)
148 144 user_variables = Dict()
149 145 user_expressions = Dict()
150 146
151 147
152 148 class ExecuteReplyError(Reference):
153 149 ename = Unicode()
154 150 evalue = Unicode()
155 151 traceback = List(Unicode)
156 152
157 153
158 154 class OInfoReply(Reference):
159 155 name = Unicode()
160 156 found = Bool()
161 157 ismagic = Bool()
162 158 isalias = Bool()
163 159 namespace = Enum((u'builtin', u'magics', u'alias', u'Interactive'))
164 160 type_name = Unicode()
165 161 string_form = Unicode()
166 162 base_class = Unicode()
167 163 length = Integer()
168 164 file = Unicode()
169 165 definition = Unicode()
170 166 argspec = Dict()
171 167 init_definition = Unicode()
172 168 docstring = Unicode()
173 169 init_docstring = Unicode()
174 170 class_docstring = Unicode()
175 171 call_def = Unicode()
176 172 call_docstring = Unicode()
177 173 source = Unicode()
178 174
179 175 def check(self, d):
180 for tst in Reference.check(self, d):
181 yield tst
176 Reference.check(self, d)
182 177 if d['argspec'] is not None:
183 for tst in ArgSpec().check(d['argspec']):
184 yield tst
178 ArgSpec().check(d['argspec'])
185 179
186 180
187 181 class ArgSpec(Reference):
188 182 args = List(Unicode)
189 183 varargs = Unicode()
190 184 varkw = Unicode()
191 185 defaults = List()
192 186
193 187
194 188 class Status(Reference):
195 189 execution_state = Enum((u'busy', u'idle', u'starting'))
196 190
197 191
198 192 class CompleteReply(Reference):
199 193 matches = List(Unicode)
200 194
201 195
202 196 def Version(num, trait=Integer):
203 197 return List(trait, default_value=[0] * num, minlen=num, maxlen=num)
204 198
205 199
206 200 class KernelInfoReply(Reference):
207 201
208 202 protocol_version = Version(2)
209 203 ipython_version = Version(4, Any)
210 204 language_version = Version(3)
211 205 language = Unicode()
212 206
213 207 def _ipython_version_changed(self, name, old, new):
214 208 for v in new:
215 nt.assert_true(
216 isinstance(v, int) or isinstance(v, basestring),
217 'expected int or string as version component, got {0!r}'
218 .format(v))
209 assert isinstance(v, int) or isinstance(v, basestring), \
210 'expected int or string as version component, got {0!r}'.format(v)
219 211
220 212
221 213 # IOPub messages
222 214
223 215 class PyIn(Reference):
224 216 code = Unicode()
225 217 execution_count = Integer()
226 218
227 219
228 220 PyErr = ExecuteReplyError
229 221
230 222
231 223 class Stream(Reference):
232 224 name = Enum((u'stdout', u'stderr'))
233 225 data = Unicode()
234 226
235 227
236 228 mime_pat = re.compile(r'\w+/\w+')
237 229
238 230 class DisplayData(Reference):
239 231 source = Unicode()
240 232 metadata = Dict()
241 233 data = Dict()
242 234 def _data_changed(self, name, old, new):
243 235 for k,v in new.iteritems():
244 nt.assert_true(mime_pat.match(k))
245 nt.assert_true(isinstance(v, basestring), "expected string data, got %r" % v)
236 assert mime_pat.match(k)
237 nt.assert_is_instance(v, basestring)
246 238
247 239
248 240 class PyOut(Reference):
249 241 execution_count = Integer()
250 242 data = Dict()
251 243 def _data_changed(self, name, old, new):
252 244 for k,v in new.iteritems():
253 nt.assert_true(mime_pat.match(k))
254 nt.assert_true(isinstance(v, basestring), "expected string data, got %r" % v)
245 assert mime_pat.match(k)
246 nt.assert_is_instance(v, basestring)
255 247
256 248
257 249 references = {
258 250 'execute_reply' : ExecuteReply(),
259 251 'object_info_reply' : OInfoReply(),
260 252 'status' : Status(),
261 253 'complete_reply' : CompleteReply(),
262 254 'kernel_info_reply': KernelInfoReply(),
263 255 'pyin' : PyIn(),
264 256 'pyout' : PyOut(),
265 257 'pyerr' : PyErr(),
266 258 'stream' : Stream(),
267 259 'display_data' : DisplayData(),
268 260 }
269 261 """
270 262 Specifications of `content` part of the reply messages.
271 263 """
272 264
273 265
274 266 def validate_message(msg, msg_type=None, parent=None):
275 267 """validate a message
276 268
277 269 This is a generator, and must be iterated through to actually
278 270 trigger each test.
279 271
280 272 If msg_type and/or parent are given, the msg_type and/or parent msg_id
281 273 are compared with the given values.
282 274 """
283 275 RMessage().check(msg)
284 276 if msg_type:
285 yield nt.assert_equal(msg['msg_type'], msg_type)
277 nt.assert_equal(msg['msg_type'], msg_type)
286 278 if parent:
287 yield nt.assert_equal(msg['parent_header']['msg_id'], parent)
279 nt.assert_equal(msg['parent_header']['msg_id'], parent)
288 280 content = msg['content']
289 281 ref = references[msg['msg_type']]
290 for tst in ref.check(content):
291 yield tst
282 ref.check(content)
292 283
293 284
294 285 #-----------------------------------------------------------------------------
295 286 # Tests
296 287 #-----------------------------------------------------------------------------
297 288
298 289 # Shell channel
299 290
300 @dec.parametric
301 291 def test_execute():
302 292 flush_channels()
303 293
304 294 msg_id = KC.execute(code='x=1')
305 295 reply = KC.get_shell_msg(timeout=TIMEOUT)
306 for tst in validate_message(reply, 'execute_reply', msg_id):
307 yield tst
296 validate_message(reply, 'execute_reply', msg_id)
308 297
309 298
310 @dec.parametric
311 299 def test_execute_silent():
312 300 flush_channels()
313 301 msg_id, reply = execute(code='x=1', silent=True)
314 302
315 303 # flush status=idle
316 304 status = KC.iopub_channel.get_msg(timeout=TIMEOUT)
317 for tst in validate_message(status, 'status', msg_id):
318 yield tst
305 validate_message(status, 'status', msg_id)
319 306 nt.assert_equal(status['content']['execution_state'], 'idle')
320 307
321 yield nt.assert_raises(Empty, KC.iopub_channel.get_msg, timeout=0.1)
308 nt.assert_raises(Empty, KC.iopub_channel.get_msg, timeout=0.1)
322 309 count = reply['execution_count']
323 310
324 311 msg_id, reply = execute(code='x=2', silent=True)
325 312
326 313 # flush status=idle
327 314 status = KC.iopub_channel.get_msg(timeout=TIMEOUT)
328 for tst in validate_message(status, 'status', msg_id):
329 yield tst
330 yield nt.assert_equal(status['content']['execution_state'], 'idle')
315 validate_message(status, 'status', msg_id)
316 nt.assert_equal(status['content']['execution_state'], 'idle')
331 317
332 yield nt.assert_raises(Empty, KC.iopub_channel.get_msg, timeout=0.1)
318 nt.assert_raises(Empty, KC.iopub_channel.get_msg, timeout=0.1)
333 319 count_2 = reply['execution_count']
334 yield nt.assert_equal(count_2, count)
320 nt.assert_equal(count_2, count)
335 321
336 322
337 @dec.parametric
338 323 def test_execute_error():
339 324 flush_channels()
340 325
341 326 msg_id, reply = execute(code='1/0')
342 yield nt.assert_equal(reply['status'], 'error')
343 yield nt.assert_equal(reply['ename'], 'ZeroDivisionError')
327 nt.assert_equal(reply['status'], 'error')
328 nt.assert_equal(reply['ename'], 'ZeroDivisionError')
344 329
345 330 pyerr = KC.iopub_channel.get_msg(timeout=TIMEOUT)
346 for tst in validate_message(pyerr, 'pyerr', msg_id):
347 yield tst
331 validate_message(pyerr, 'pyerr', msg_id)
348 332
349 333
350 334 def test_execute_inc():
351 335 """execute request should increment execution_count"""
352 336 flush_channels()
353 337
354 338 msg_id, reply = execute(code='x=1')
355 339 count = reply['execution_count']
356 340
357 341 flush_channels()
358 342
359 343 msg_id, reply = execute(code='x=2')
360 344 count_2 = reply['execution_count']
361 345 nt.assert_equal(count_2, count+1)
362 346
363 347
364 348 def test_user_variables():
365 349 flush_channels()
366 350
367 351 msg_id, reply = execute(code='x=1', user_variables=['x'])
368 352 user_variables = reply['user_variables']
369 353 nt.assert_equal(user_variables, {u'x': {
370 354 u'status': u'ok',
371 355 u'data': {u'text/plain': u'1'},
372 356 u'metadata': {},
373 357 }})
374 358
375 359
376 360 def test_user_variables_fail():
377 361 flush_channels()
378 362
379 363 msg_id, reply = execute(code='x=1', user_variables=['nosuchname'])
380 364 user_variables = reply['user_variables']
381 365 foo = user_variables['nosuchname']
382 366 nt.assert_equal(foo['status'], 'error')
383 367 nt.assert_equal(foo['ename'], 'KeyError')
384 368
385 369
386 370 def test_user_expressions():
387 371 flush_channels()
388 372
389 373 msg_id, reply = execute(code='x=1', user_expressions=dict(foo='x+1'))
390 374 user_expressions = reply['user_expressions']
391 375 nt.assert_equal(user_expressions, {u'foo': {
392 376 u'status': u'ok',
393 377 u'data': {u'text/plain': u'2'},
394 378 u'metadata': {},
395 379 }})
396 380
397 381
398 382 def test_user_expressions_fail():
399 383 flush_channels()
400 384
401 385 msg_id, reply = execute(code='x=0', user_expressions=dict(foo='nosuchname'))
402 386 user_expressions = reply['user_expressions']
403 387 foo = user_expressions['foo']
404 388 nt.assert_equal(foo['status'], 'error')
405 389 nt.assert_equal(foo['ename'], 'NameError')
406 390
407 391
408 @dec.parametric
409 392 def test_oinfo():
410 393 flush_channels()
411 394
412 395 msg_id = KC.object_info('a')
413 396 reply = KC.get_shell_msg(timeout=TIMEOUT)
414 for tst in validate_message(reply, 'object_info_reply', msg_id):
415 yield tst
397 validate_message(reply, 'object_info_reply', msg_id)
416 398
417 399
418 @dec.parametric
419 400 def test_oinfo_found():
420 401 flush_channels()
421 402
422 403 msg_id, reply = execute(code='a=5')
423 404
424 405 msg_id = KC.object_info('a')
425 406 reply = KC.get_shell_msg(timeout=TIMEOUT)
426 for tst in validate_message(reply, 'object_info_reply', msg_id):
427 yield tst
407 validate_message(reply, 'object_info_reply', msg_id)
428 408 content = reply['content']
429 yield nt.assert_true(content['found'])
409 assert content['found']
430 410 argspec = content['argspec']
431 yield nt.assert_true(argspec is None, "didn't expect argspec dict, got %r" % argspec)
411 nt.assert_is(argspec, None)
432 412
433 413
434 @dec.parametric
435 414 def test_oinfo_detail():
436 415 flush_channels()
437 416
438 417 msg_id, reply = execute(code='ip=get_ipython()')
439 418
440 419 msg_id = KC.object_info('ip.object_inspect', detail_level=2)
441 420 reply = KC.get_shell_msg(timeout=TIMEOUT)
442 for tst in validate_message(reply, 'object_info_reply', msg_id):
443 yield tst
421 validate_message(reply, 'object_info_reply', msg_id)
444 422 content = reply['content']
445 yield nt.assert_true(content['found'])
423 assert content['found']
446 424 argspec = content['argspec']
447 yield nt.assert_true(isinstance(argspec, dict), "expected non-empty argspec dict, got %r" % argspec)
448 yield nt.assert_equal(argspec['defaults'], [0])
425 nt.assert_is_instance(argspec, dict, "expected non-empty argspec dict, got %r" % argspec)
426 nt.assert_equal(argspec['defaults'], [0])
449 427
450 428
451 @dec.parametric
452 429 def test_oinfo_not_found():
453 430 flush_channels()
454 431
455 432 msg_id = KC.object_info('dne')
456 433 reply = KC.get_shell_msg(timeout=TIMEOUT)
457 for tst in validate_message(reply, 'object_info_reply', msg_id):
458 yield tst
434 validate_message(reply, 'object_info_reply', msg_id)
459 435 content = reply['content']
460 yield nt.assert_false(content['found'])
436 nt.assert_false(content['found'])
461 437
462 438
463 @dec.parametric
464 439 def test_complete():
465 440 flush_channels()
466 441
467 442 msg_id, reply = execute(code="alpha = albert = 5")
468 443
469 444 msg_id = KC.complete('al', 'al', 2)
470 445 reply = KC.get_shell_msg(timeout=TIMEOUT)
471 for tst in validate_message(reply, 'complete_reply', msg_id):
472 yield tst
446 validate_message(reply, 'complete_reply', msg_id)
473 447 matches = reply['content']['matches']
474 448 for name in ('alpha', 'albert'):
475 yield nt.assert_true(name in matches, "Missing match: %r" % name)
449 nt.assert_in(name, matches)
476 450
477 451
478 @dec.parametric
479 452 def test_kernel_info_request():
480 453 flush_channels()
481 454
482 455 msg_id = KC.kernel_info()
483 456 reply = KC.get_shell_msg(timeout=TIMEOUT)
484 for tst in validate_message(reply, 'kernel_info_reply', msg_id):
485 yield tst
457 validate_message(reply, 'kernel_info_reply', msg_id)
486 458
487 459
488 460 # IOPub channel
489 461
490 462
491 @dec.parametric
492 463 def test_stream():
493 464 flush_channels()
494 465
495 466 msg_id, reply = execute("print('hi')")
496 467
497 468 stdout = KC.iopub_channel.get_msg(timeout=TIMEOUT)
498 for tst in validate_message(stdout, 'stream', msg_id):
499 yield tst
469 validate_message(stdout, 'stream', msg_id)
500 470 content = stdout['content']
501 yield nt.assert_equal(content['name'], u'stdout')
502 yield nt.assert_equal(content['data'], u'hi\n')
471 nt.assert_equal(content['name'], u'stdout')
472 nt.assert_equal(content['data'], u'hi\n')
503 473
504 474
505 @dec.parametric
506 475 def test_display_data():
507 476 flush_channels()
508 477
509 478 msg_id, reply = execute("from IPython.core.display import display; display(1)")
510 479
511 480 display = KC.iopub_channel.get_msg(timeout=TIMEOUT)
512 for tst in validate_message(display, 'display_data', parent=msg_id):
513 yield tst
481 validate_message(display, 'display_data', parent=msg_id)
514 482 data = display['content']['data']
515 yield nt.assert_equal(data['text/plain'], u'1')
483 nt.assert_equal(data['text/plain'], u'1')
516 484
@@ -1,47 +1,41 b''
1 1 """Test the IPython.kernel public API
2 2
3 3 Authors
4 4 -------
5 5 * MinRK
6 6 """
7 7 #-----------------------------------------------------------------------------
8 8 # Copyright (c) 2013, the IPython Development Team.
9 9 #
10 10 # Distributed under the terms of the Modified BSD License.
11 11 #
12 12 # The full license is in the file COPYING.txt, distributed with this software.
13 13 #-----------------------------------------------------------------------------
14 14
15 15 import nose.tools as nt
16 16
17 from IPython.testing import decorators as dec
18
19 17 from IPython.kernel import launcher, connect
20 18 from IPython import kernel
21 19
22 20 #-----------------------------------------------------------------------------
23 21 # Classes and functions
24 22 #-----------------------------------------------------------------------------
25 23
26 @dec.parametric
27 24 def test_kms():
28 25 for base in ("", "Multi"):
29 26 KM = base + "KernelManager"
30 yield nt.assert_true(KM in dir(kernel), KM)
27 nt.assert_in(KM, dir(kernel))
31 28
32 @dec.parametric
33 29 def test_kcs():
34 30 for base in ("", "Blocking"):
35 31 KM = base + "KernelClient"
36 yield nt.assert_true(KM in dir(kernel), KM)
32 nt.assert_in(KM, dir(kernel))
37 33
38 @dec.parametric
39 34 def test_launcher():
40 35 for name in launcher.__all__:
41 yield nt.assert_true(name in dir(kernel), name)
36 nt.assert_in(name, dir(kernel))
42 37
43 @dec.parametric
44 38 def test_connect():
45 39 for name in connect.__all__:
46 yield nt.assert_true(name in dir(kernel), name)
40 nt.assert_in(name, dir(kernel))
47 41
@@ -1,241 +1,228 b''
1 1 """test serialization tools"""
2 2
3 3 #-------------------------------------------------------------------------------
4 4 # Copyright (C) 2011 The IPython Development Team
5 5 #
6 6 # Distributed under the terms of the BSD License. The full license is in
7 7 # the file COPYING, distributed as part of this software.
8 8 #-------------------------------------------------------------------------------
9 9
10 10 #-------------------------------------------------------------------------------
11 11 # Imports
12 12 #-------------------------------------------------------------------------------
13 13
14 14 import pickle
15 15 from collections import namedtuple
16 16
17 17 import nose.tools as nt
18 18
19 19 # from unittest import TestCaes
20 20 from IPython.kernel.zmq.serialize import serialize_object, unserialize_object
21 21 from IPython.testing import decorators as dec
22 22 from IPython.utils.pickleutil import CannedArray, CannedClass
23 23 from IPython.parallel import interactive
24 24
25 25 #-------------------------------------------------------------------------------
26 26 # Globals and Utilities
27 27 #-------------------------------------------------------------------------------
28 28
29 29 def roundtrip(obj):
30 30 """roundtrip an object through serialization"""
31 31 bufs = serialize_object(obj)
32 32 obj2, remainder = unserialize_object(bufs)
33 33 nt.assert_equals(remainder, [])
34 34 return obj2
35 35
36 36 class C(object):
37 37 """dummy class for """
38 38
39 39 def __init__(self, **kwargs):
40 40 for key,value in kwargs.iteritems():
41 41 setattr(self, key, value)
42 42
43 43 SHAPES = ((100,), (1024,10), (10,8,6,5), (), (0,))
44 44 DTYPES = ('uint8', 'float64', 'int32', [('g', 'float32')], '|S10')
45 45 #-------------------------------------------------------------------------------
46 46 # Tests
47 47 #-------------------------------------------------------------------------------
48 48
49 @dec.parametric
50 49 def test_roundtrip_simple():
51 50 for obj in [
52 51 'hello',
53 52 dict(a='b', b=10),
54 53 [1,2,'hi'],
55 54 (b'123', 'hello'),
56 55 ]:
57 56 obj2 = roundtrip(obj)
58 yield nt.assert_equals(obj, obj2)
57 nt.assert_equal(obj, obj2)
59 58
60 @dec.parametric
61 59 def test_roundtrip_nested():
62 60 for obj in [
63 61 dict(a=range(5), b={1:b'hello'}),
64 62 [range(5),[range(3),(1,[b'whoda'])]],
65 63 ]:
66 64 obj2 = roundtrip(obj)
67 yield nt.assert_equals(obj, obj2)
65 nt.assert_equal(obj, obj2)
68 66
69 @dec.parametric
70 67 def test_roundtrip_buffered():
71 68 for obj in [
72 69 dict(a=b"x"*1025),
73 70 b"hello"*500,
74 71 [b"hello"*501, 1,2,3]
75 72 ]:
76 73 bufs = serialize_object(obj)
77 yield nt.assert_equals(len(bufs), 2)
74 nt.assert_equal(len(bufs), 2)
78 75 obj2, remainder = unserialize_object(bufs)
79 yield nt.assert_equals(remainder, [])
80 yield nt.assert_equals(obj, obj2)
76 nt.assert_equal(remainder, [])
77 nt.assert_equal(obj, obj2)
81 78
82 79 def _scrub_nan(A):
83 80 """scrub nans out of empty arrays
84 81
85 82 since nan != nan
86 83 """
87 84 import numpy
88 85 if A.dtype.fields and A.shape:
89 86 for field in A.dtype.fields.keys():
90 87 try:
91 88 A[field][numpy.isnan(A[field])] = 0
92 89 except (TypeError, NotImplementedError):
93 90 # e.g. str dtype
94 91 pass
95 92
96 @dec.parametric
97 93 @dec.skip_without('numpy')
98 94 def test_numpy():
99 95 import numpy
100 96 from numpy.testing.utils import assert_array_equal
101 97 for shape in SHAPES:
102 98 for dtype in DTYPES:
103 99 A = numpy.empty(shape, dtype=dtype)
104 100 _scrub_nan(A)
105 101 bufs = serialize_object(A)
106 102 B, r = unserialize_object(bufs)
107 yield nt.assert_equals(r, [])
108 yield nt.assert_equals(A.shape, B.shape)
109 yield nt.assert_equals(A.dtype, B.dtype)
110 yield assert_array_equal(A,B)
103 nt.assert_equal(r, [])
104 nt.assert_equal(A.shape, B.shape)
105 nt.assert_equal(A.dtype, B.dtype)
106 assert_array_equal(A,B)
111 107
112 @dec.parametric
113 108 @dec.skip_without('numpy')
114 109 def test_recarray():
115 110 import numpy
116 111 from numpy.testing.utils import assert_array_equal
117 112 for shape in SHAPES:
118 113 for dtype in [
119 114 [('f', float), ('s', '|S10')],
120 115 [('n', int), ('s', '|S1'), ('u', 'uint32')],
121 116 ]:
122 117 A = numpy.empty(shape, dtype=dtype)
123 118 _scrub_nan(A)
124 119
125 120 bufs = serialize_object(A)
126 121 B, r = unserialize_object(bufs)
127 yield nt.assert_equals(r, [])
128 yield nt.assert_equals(A.shape, B.shape)
129 yield nt.assert_equals(A.dtype, B.dtype)
130 yield assert_array_equal(A,B)
122 nt.assert_equal(r, [])
123 nt.assert_equal(A.shape, B.shape)
124 nt.assert_equal(A.dtype, B.dtype)
125 assert_array_equal(A,B)
131 126
132 @dec.parametric
133 127 @dec.skip_without('numpy')
134 128 def test_numpy_in_seq():
135 129 import numpy
136 130 from numpy.testing.utils import assert_array_equal
137 131 for shape in SHAPES:
138 132 for dtype in DTYPES:
139 133 A = numpy.empty(shape, dtype=dtype)
140 134 _scrub_nan(A)
141 135 bufs = serialize_object((A,1,2,b'hello'))
142 136 canned = pickle.loads(bufs[0])
143 yield nt.assert_true(canned[0], CannedArray)
137 nt.assert_is_instance(canned[0], CannedArray)
144 138 tup, r = unserialize_object(bufs)
145 139 B = tup[0]
146 yield nt.assert_equals(r, [])
147 yield nt.assert_equals(A.shape, B.shape)
148 yield nt.assert_equals(A.dtype, B.dtype)
149 yield assert_array_equal(A,B)
140 nt.assert_equal(r, [])
141 nt.assert_equal(A.shape, B.shape)
142 nt.assert_equal(A.dtype, B.dtype)
143 assert_array_equal(A,B)
150 144
151 @dec.parametric
152 145 @dec.skip_without('numpy')
153 146 def test_numpy_in_dict():
154 147 import numpy
155 148 from numpy.testing.utils import assert_array_equal
156 149 for shape in SHAPES:
157 150 for dtype in DTYPES:
158 151 A = numpy.empty(shape, dtype=dtype)
159 152 _scrub_nan(A)
160 153 bufs = serialize_object(dict(a=A,b=1,c=range(20)))
161 154 canned = pickle.loads(bufs[0])
162 yield nt.assert_true(canned['a'], CannedArray)
155 nt.assert_is_instance(canned['a'], CannedArray)
163 156 d, r = unserialize_object(bufs)
164 157 B = d['a']
165 yield nt.assert_equals(r, [])
166 yield nt.assert_equals(A.shape, B.shape)
167 yield nt.assert_equals(A.dtype, B.dtype)
168 yield assert_array_equal(A,B)
158 nt.assert_equal(r, [])
159 nt.assert_equal(A.shape, B.shape)
160 nt.assert_equal(A.dtype, B.dtype)
161 assert_array_equal(A,B)
169 162
170 @dec.parametric
171 163 def test_class():
172 164 @interactive
173 165 class C(object):
174 166 a=5
175 167 bufs = serialize_object(dict(C=C))
176 168 canned = pickle.loads(bufs[0])
177 yield nt.assert_true(canned['C'], CannedClass)
169 nt.assert_is_instance(canned['C'], CannedClass)
178 170 d, r = unserialize_object(bufs)
179 171 C2 = d['C']
180 yield nt.assert_equal(C2.a, C.a)
172 nt.assert_equal(C2.a, C.a)
181 173
182 @dec.parametric
183 174 def test_class_oldstyle():
184 175 @interactive
185 176 class C:
186 177 a=5
187 178
188 179 bufs = serialize_object(dict(C=C))
189 180 canned = pickle.loads(bufs[0])
190 yield nt.assert_true(isinstance(canned['C'], CannedClass))
181 nt.assert_is_instance(canned['C'], CannedClass)
191 182 d, r = unserialize_object(bufs)
192 183 C2 = d['C']
193 yield nt.assert_equal(C2.a, C.a)
184 nt.assert_equal(C2.a, C.a)
194 185
195 @dec.parametric
196 186 def test_tuple():
197 187 tup = (lambda x:x, 1)
198 188 bufs = serialize_object(tup)
199 189 canned = pickle.loads(bufs[0])
200 yield nt.assert_true(isinstance(canned, tuple))
190 nt.assert_is_instance(canned, tuple)
201 191 t2, r = unserialize_object(bufs)
202 yield nt.assert_equal(t2[0](t2[1]), tup[0](tup[1]))
192 nt.assert_equal(t2[0](t2[1]), tup[0](tup[1]))
203 193
204 194 point = namedtuple('point', 'x y')
205 195
206 @dec.parametric
207 196 def test_namedtuple():
208 197 p = point(1,2)
209 198 bufs = serialize_object(p)
210 199 canned = pickle.loads(bufs[0])
211 yield nt.assert_true(isinstance(canned, point))
200 nt.assert_is_instance(canned, point)
212 201 p2, r = unserialize_object(bufs, globals())
213 yield nt.assert_equal(p2.x, p.x)
214 yield nt.assert_equal(p2.y, p.y)
202 nt.assert_equal(p2.x, p.x)
203 nt.assert_equal(p2.y, p.y)
215 204
216 @dec.parametric
217 205 def test_list():
218 206 lis = [lambda x:x, 1]
219 207 bufs = serialize_object(lis)
220 208 canned = pickle.loads(bufs[0])
221 yield nt.assert_true(isinstance(canned, list))
209 nt.assert_is_instance(canned, list)
222 210 l2, r = unserialize_object(bufs)
223 yield nt.assert_equal(l2[0](l2[1]), lis[0](lis[1]))
211 nt.assert_equal(l2[0](l2[1]), lis[0](lis[1]))
224 212
225 @dec.parametric
226 213 def test_class_inheritance():
227 214 @interactive
228 215 class C(object):
229 216 a=5
230 217
231 218 @interactive
232 219 class D(C):
233 220 b=10
234 221
235 222 bufs = serialize_object(dict(D=D))
236 223 canned = pickle.loads(bufs[0])
237 yield nt.assert_true(canned['D'], CannedClass)
224 nt.assert_is_instance(canned['D'], CannedClass)
238 225 d, r = unserialize_object(bufs)
239 226 D2 = d['D']
240 yield nt.assert_equal(D2.a, D.a)
241 yield nt.assert_equal(D2.b, D.b)
227 nt.assert_equal(D2.a, D.a)
228 nt.assert_equal(D2.b, D.b)
@@ -1,133 +1,131 b''
1 1 """Test suite for our JSON utilities.
2 2 """
3 3 #-----------------------------------------------------------------------------
4 4 # Copyright (C) 2010-2011 The IPython Development Team
5 5 #
6 6 # Distributed under the terms of the BSD License. The full license is in
7 7 # the file COPYING.txt, distributed as part of this software.
8 8 #-----------------------------------------------------------------------------
9 9
10 10 #-----------------------------------------------------------------------------
11 11 # Imports
12 12 #-----------------------------------------------------------------------------
13 13 # stdlib
14 14 import datetime
15 15 import json
16 16 from base64 import decodestring
17 17
18 18 # third party
19 19 import nose.tools as nt
20 20
21 21 # our own
22 from IPython.testing import decorators as dec
23 22 from IPython.utils import jsonutil, tz
24 23 from ..jsonutil import json_clean, encode_images
25 24 from ..py3compat import unicode_to_str, str_to_bytes
26 25
27 26 #-----------------------------------------------------------------------------
28 27 # Test functions
29 28 #-----------------------------------------------------------------------------
30 29
31 30 def test():
32 31 # list of input/expected output. Use None for the expected output if it
33 32 # can be the same as the input.
34 33 pairs = [(1, None), # start with scalars
35 34 (1.0, None),
36 35 ('a', None),
37 36 (True, None),
38 37 (False, None),
39 38 (None, None),
40 39 # complex numbers for now just go to strings, as otherwise they
41 40 # are unserializable
42 41 (1j, '1j'),
43 42 # Containers
44 43 ([1, 2], None),
45 44 ((1, 2), [1, 2]),
46 45 (set([1, 2]), [1, 2]),
47 46 (dict(x=1), None),
48 47 ({'x': 1, 'y':[1,2,3], '1':'int'}, None),
49 48 # More exotic objects
50 49 ((x for x in range(3)), [0, 1, 2]),
51 50 (iter([1, 2]), [1, 2]),
52 51 ]
53 52
54 53 for val, jval in pairs:
55 54 if jval is None:
56 55 jval = val
57 56 out = json_clean(val)
58 57 # validate our cleanup
59 58 nt.assert_equal(out, jval)
60 59 # and ensure that what we return, indeed encodes cleanly
61 60 json.loads(json.dumps(out))
62 61
63 62
64 63
65 @dec.parametric
66 64 def test_encode_images():
67 65 # invalid data, but the header and footer are from real files
68 66 pngdata = b'\x89PNG\r\n\x1a\nblahblahnotactuallyvalidIEND\xaeB`\x82'
69 67 jpegdata = b'\xff\xd8\xff\xe0\x00\x10JFIFblahblahjpeg(\xa0\x0f\xff\xd9'
70 68
71 69 fmt = {
72 70 'image/png' : pngdata,
73 71 'image/jpeg' : jpegdata,
74 72 }
75 73 encoded = encode_images(fmt)
76 74 for key, value in fmt.iteritems():
77 75 # encoded has unicode, want bytes
78 76 decoded = decodestring(encoded[key].encode('ascii'))
79 yield nt.assert_equal(decoded, value)
77 nt.assert_equal(decoded, value)
80 78 encoded2 = encode_images(encoded)
81 yield nt.assert_equal(encoded, encoded2)
79 nt.assert_equal(encoded, encoded2)
82 80
83 81 b64_str = {}
84 82 for key, encoded in encoded.iteritems():
85 83 b64_str[key] = unicode_to_str(encoded)
86 84 encoded3 = encode_images(b64_str)
87 yield nt.assert_equal(encoded3, b64_str)
85 nt.assert_equal(encoded3, b64_str)
88 86 for key, value in fmt.iteritems():
89 87 # encoded3 has str, want bytes
90 88 decoded = decodestring(str_to_bytes(encoded3[key]))
91 yield nt.assert_equal(decoded, value)
89 nt.assert_equal(decoded, value)
92 90
93 91 def test_lambda():
94 92 jc = json_clean(lambda : 1)
95 93 assert isinstance(jc, str)
96 94 assert '<lambda>' in jc
97 95 json.dumps(jc)
98 96
99 97 def test_extract_dates():
100 98 timestamps = [
101 99 '2013-07-03T16:34:52.249482',
102 100 '2013-07-03T16:34:52.249482Z',
103 101 '2013-07-03T16:34:52.249482Z-0800',
104 102 '2013-07-03T16:34:52.249482Z+0800',
105 103 '2013-07-03T16:34:52.249482Z+08:00',
106 104 '2013-07-03T16:34:52.249482Z-08:00',
107 105 '2013-07-03T16:34:52.249482-0800',
108 106 '2013-07-03T16:34:52.249482+0800',
109 107 '2013-07-03T16:34:52.249482+08:00',
110 108 '2013-07-03T16:34:52.249482-08:00',
111 109 ]
112 110 extracted = jsonutil.extract_dates(timestamps)
113 111 ref = extracted[0]
114 112 for dt in extracted:
115 113 nt.assert_true(isinstance(dt, datetime.datetime))
116 114 nt.assert_equal(dt, ref)
117 115
118 116 def test_date_default():
119 117 data = dict(today=datetime.datetime.now(), utcnow=tz.utcnow())
120 118 jsondata = json.dumps(data, default=jsonutil.date_default)
121 119 nt.assert_in("+00", jsondata)
122 120 nt.assert_equal(jsondata.count("+00"), 1)
123 121 extracted = jsonutil.extract_dates(json.loads(jsondata))
124 122 for dt in extracted.values():
125 123 nt.assert_true(isinstance(dt, datetime.datetime))
126 124
127 125 def test_exception():
128 126 bad_dicts = [{1:'number', '1':'string'},
129 127 {True:'bool', 'True':'string'},
130 128 ]
131 129 for d in bad_dicts:
132 130 nt.assert_raises(ValueError, json_clean, d)
133 131
General Comments 0
You need to be logged in to leave comments. Login now