##// END OF EJS Templates
Merge pull request #913 from takluyver/py3-tests2...
Fernando Perez -
r5208:9463121c merge
parent child Browse files
Show More
@@ -31,6 +31,7 b' except ImportError:'
31
31
32 # IPython's own
32 # IPython's own
33 from IPython.core import page
33 from IPython.core import page
34 from IPython.testing.skipdoctest import skip_doctest_py3
34 from IPython.utils import PyColorize
35 from IPython.utils import PyColorize
35 from IPython.utils import io
36 from IPython.utils import io
36 from IPython.utils import py3compat
37 from IPython.utils import py3compat
@@ -297,6 +298,8 b' class Inspector:'
297 else:
298 else:
298 print >>io.stdout, header,self.format(output),
299 print >>io.stdout, header,self.format(output),
299
300
301 # In Python 3, all classes are new-style, so they all have __init__.
302 @skip_doctest_py3
300 def pdoc(self,obj,oname='',formatter = None):
303 def pdoc(self,obj,oname='',formatter = None):
301 """Print the docstring for any object.
304 """Print the docstring for any object.
302
305
@@ -219,4 +219,4 b' class TestSafeExecfileNonAsciiPath(unittest.TestCase):'
219 def test_1(self):
219 def test_1(self):
220 """Test safe_execfile with non-ascii path
220 """Test safe_execfile with non-ascii path
221 """
221 """
222 _ip.shell.safe_execfile(self.fname, raise_exceptions=True)
222 _ip.shell.safe_execfile(self.fname, {}, raise_exceptions=True)
@@ -324,7 +324,9 b' def check_cpaste(code, should_fail=False):'
324 _ip.user_ns['code_ran'] = False
324 _ip.user_ns['code_ran'] = False
325
325
326 src = StringIO()
326 src = StringIO()
327 src.encoding = None # IPython expects stdin to have an encoding attribute
327 if not hasattr(src, 'encoding'):
328 # IPython expects stdin to have an encoding attribute
329 src.encoding = None
328 src.write('\n')
330 src.write('\n')
329 src.write(code)
331 src.write(code)
330 src.write('\n--\n')
332 src.write('\n--\n')
@@ -11,6 +11,7 b' import IPython.testing.tools as tt'
11
11
12 from IPython.extensions.autoreload import AutoreloadInterface
12 from IPython.extensions.autoreload import AutoreloadInterface
13 from IPython.core.hooks import TryNext
13 from IPython.core.hooks import TryNext
14 from IPython.testing.decorators import knownfailureif
14
15
15 #-----------------------------------------------------------------------------
16 #-----------------------------------------------------------------------------
16 # Test fixture
17 # Test fixture
@@ -293,8 +294,12 b' x = -99'
293 self.shell.run_code("pass") # trigger reload
294 self.shell.run_code("pass") # trigger reload
294 nt.assert_equal(mod.x, -99)
295 nt.assert_equal(mod.x, -99)
295
296
297 # The autoreload extension needs to be updated for Python 3.2, as .pyc files
298 # are stored in a different location. See gh-846.
299 @knownfailureif(sys.version_info >= (3,2))
296 def test_smoketest_aimport(self):
300 def test_smoketest_aimport(self):
297 self._check_smoketest(use_aimport=True)
301 self._check_smoketest(use_aimport=True)
298
302
303 @knownfailureif(sys.version_info >= (3,2))
299 def test_smoketest_autoreload(self):
304 def test_smoketest_autoreload(self):
300 self._check_smoketest(use_aimport=False)
305 self._check_smoketest(use_aimport=False)
@@ -13,6 +13,7 b' import unittest'
13
13
14 # IPython imports
14 # IPython imports
15 from IPython.lib import irunner
15 from IPython.lib import irunner
16 from IPython.testing.decorators import known_failure_py3
16
17
17 # Testing code begins
18 # Testing code begins
18 class RunnerTestCase(unittest.TestCase):
19 class RunnerTestCase(unittest.TestCase):
@@ -56,6 +57,8 b' class RunnerTestCase(unittest.TestCase):'
56 self.assert_(mismatch==0,'Number of mismatched lines: %s' %
57 self.assert_(mismatch==0,'Number of mismatched lines: %s' %
57 mismatch)
58 mismatch)
58
59
60 # irunner isn't working on Python 3 (due to pexpect)
61 @known_failure_py3
59 def testIPython(self):
62 def testIPython(self):
60 """Test the IPython runner."""
63 """Test the IPython runner."""
61 source = """
64 source = """
@@ -129,6 +132,7 b' In [12]: exit'
129 runner = irunner.IPythonRunner(out=self.out)
132 runner = irunner.IPythonRunner(out=self.out)
130 self._test_runner(runner,source,output)
133 self._test_runner(runner,source,output)
131
134
135 @known_failure_py3
132 def testPython(self):
136 def testPython(self):
133 """Test the Python runner."""
137 """Test the Python runner."""
134 runner = irunner.PythonRunner(out=self.out)
138 runner = irunner.PythonRunner(out=self.out)
@@ -22,6 +22,7 b' class RunnerTestCase(unittest.TestCase):'
22 self.out = StringIO.StringIO()
22 self.out = StringIO.StringIO()
23 #self.out = sys.stdout
23 #self.out = sys.stdout
24
24
25 @decorators.known_failure_py3
25 def _test_runner(self,runner,source,output):
26 def _test_runner(self,runner,source,output):
26 """Test that a given runner's input/output match."""
27 """Test that a given runner's input/output match."""
27
28
@@ -82,6 +83,7 b' Out\\[6\\]: True'
82 runner = irunner.IPythonRunner(out=self.out)
83 runner = irunner.IPythonRunner(out=self.out)
83 self._test_runner(runner,source,output)
84 self._test_runner(runner,source,output)
84
85
86 @decorators.known_failure_py3
85 @decorators.skipif_not_matplotlib
87 @decorators.skipif_not_matplotlib
86 def test_pylab_import_all_disabled(self):
88 def test_pylab_import_all_disabled(self):
87 "Verify that plot is not available when pylab_import_all = False"
89 "Verify that plot is not available when pylab_import_all = False"
@@ -16,9 +16,8 b' Authors:'
16 # Imports
16 # Imports
17 #-----------------------------------------------------------------------------
17 #-----------------------------------------------------------------------------
18
18
19 from base64 import encodestring
20 from .nbbase import from_dict
19 from .nbbase import from_dict
21 from .rwbase import NotebookReader, NotebookWriter, base64_decode
20 from .rwbase import NotebookReader, NotebookWriter, restore_bytes
22 import json
21 import json
23
22
24 #-----------------------------------------------------------------------------
23 #-----------------------------------------------------------------------------
@@ -26,9 +25,10 b' import json'
26 #-----------------------------------------------------------------------------
25 #-----------------------------------------------------------------------------
27
26
28 class BytesEncoder(json.JSONEncoder):
27 class BytesEncoder(json.JSONEncoder):
28 """A JSON encoder that accepts b64 (and other *ascii*) bytestrings."""
29 def default(self, obj):
29 def default(self, obj):
30 if isinstance(obj, bytes):
30 if isinstance(obj, bytes):
31 return unicode(encodestring(bytes))
31 return obj.decode('ascii')
32 return json.JSONEncoder.default(self, obj)
32 return json.JSONEncoder.default(self, obj)
33
33
34
34
@@ -40,7 +40,7 b' class JSONReader(NotebookReader):'
40 return nb
40 return nb
41
41
42 def to_notebook(self, d, **kwargs):
42 def to_notebook(self, d, **kwargs):
43 return base64_decode(from_dict(d))
43 return restore_bytes(from_dict(d))
44
44
45
45
46 class JSONWriter(NotebookWriter):
46 class JSONWriter(NotebookWriter):
@@ -19,31 +19,67 b' Authors:'
19 from base64 import encodestring, decodestring
19 from base64 import encodestring, decodestring
20 import pprint
20 import pprint
21
21
22 from IPython.utils.py3compat import str_to_bytes
23
22 #-----------------------------------------------------------------------------
24 #-----------------------------------------------------------------------------
23 # Code
25 # Code
24 #-----------------------------------------------------------------------------
26 #-----------------------------------------------------------------------------
25
27
28 def restore_bytes(nb):
29 """Restore bytes of image data from unicode-only formats.
30
31 Base64 encoding is handled elsewhere. Bytes objects in the notebook are
32 always b64-encoded. We DO NOT encode/decode around file formats.
33 """
34 for ws in nb.worksheets:
35 for cell in ws.cells:
36 if cell.cell_type == 'code':
37 for output in cell.outputs:
38 if 'png' in output:
39 output.png = str_to_bytes(output.png, 'ascii')
40 if 'jpeg' in output:
41 output.jpeg = str_to_bytes(output.jpeg, 'ascii')
42 return nb
43
44
45 # b64 encode/decode are never actually used, because all bytes objects in
46 # the notebook are already b64-encoded, and we don't need/want to double-encode
47
26 def base64_decode(nb):
48 def base64_decode(nb):
27 """Base64 encode all bytes objects in the notebook."""
49 """Restore all bytes objects in the notebook from base64-encoded strings.
50
51 Note: This is never used
52 """
28 for ws in nb.worksheets:
53 for ws in nb.worksheets:
29 for cell in ws.cells:
54 for cell in ws.cells:
30 if cell.cell_type == 'code':
55 if cell.cell_type == 'code':
31 if 'png' in cell:
56 for output in cell.outputs:
32 cell.png = bytes(decodestring(cell.png))
57 if 'png' in output:
33 if 'jpeg' in cell:
58 if isinstance(output.png, unicode):
34 cell.jpeg = bytes(decodestring(cell.jpeg))
59 output.png = output.png.encode('ascii')
60 output.png = decodestring(output.png)
61 if 'jpeg' in output:
62 if isinstance(output.jpeg, unicode):
63 output.jpeg = output.jpeg.encode('ascii')
64 output.jpeg = decodestring(output.jpeg)
35 return nb
65 return nb
36
66
37
67
38 def base64_encode(nb):
68 def base64_encode(nb):
39 """Base64 decode all binary objects in the notebook."""
69 """Base64 encode all bytes objects in the notebook.
70
71 These will be b64-encoded unicode strings
72
73 Note: This is never used
74 """
40 for ws in nb.worksheets:
75 for ws in nb.worksheets:
41 for cell in ws.cells:
76 for cell in ws.cells:
42 if cell.cell_type == 'code':
77 if cell.cell_type == 'code':
43 if 'png' in cell:
78 for output in cell.outputs:
44 cell.png = unicode(encodestring(cell.png))
79 if 'png' in output:
45 if 'jpeg' in cell:
80 output.png = encodestring(output.png).decode('ascii')
46 cell.jpeg = unicode(encodestring(cell.jpeg))
81 if 'jpeg' in output:
82 output.jpeg = encodestring(output.jpeg).decode('ascii')
47 return nb
83 return nb
48
84
49
85
@@ -1,10 +1,15 b''
1 import os
2 from base64 import encodestring
3
1 from ..nbbase import (
4 from ..nbbase import (
2 NotebookNode,
5 NotebookNode,
3 new_code_cell, new_text_cell, new_worksheet, new_notebook, new_output,
6 new_code_cell, new_text_cell, new_worksheet, new_notebook, new_output,
4 new_metadata, new_author
7 new_metadata, new_author
5 )
8 )
6
9
7
10 # some random base64-encoded *bytes*
11 png = encodestring(os.urandom(5))
12 jpeg = encodestring(os.urandom(6))
8
13
9 ws = new_worksheet(name='worksheet1')
14 ws = new_worksheet(name='worksheet1')
10
15
@@ -42,8 +47,8 b' ws.cells.append(new_code_cell('
42 output_text=u'<array a>',
47 output_text=u'<array a>',
43 output_html=u'The HTML rep',
48 output_html=u'The HTML rep',
44 output_latex=u'$a$',
49 output_latex=u'$a$',
45 output_png=b'data',
50 output_png=png,
46 output_jpeg=b'data',
51 output_jpeg=jpeg,
47 output_svg=u'<svg>',
52 output_svg=u'<svg>',
48 output_json=u'json data',
53 output_json=u'json data',
49 output_javascript=u'var i=0;',
54 output_javascript=u'var i=0;',
@@ -53,8 +58,8 b' ws.cells.append(new_code_cell('
53 output_text=u'<array a>',
58 output_text=u'<array a>',
54 output_html=u'The HTML rep',
59 output_html=u'The HTML rep',
55 output_latex=u'$a$',
60 output_latex=u'$a$',
56 output_png=b'data',
61 output_png=png,
57 output_jpeg=b'data',
62 output_jpeg=jpeg,
58 output_svg=u'<svg>',
63 output_svg=u'<svg>',
59 output_json=u'json data',
64 output_json=u'json data',
60 output_javascript=u'var i=0;'
65 output_javascript=u'var i=0;'
@@ -323,6 +323,9 b" skipif_not_sympy = skip_without('sympy')"
323
323
324 skip_known_failure = knownfailureif(True,'This test is known to fail')
324 skip_known_failure = knownfailureif(True,'This test is known to fail')
325
325
326 known_failure_py3 = knownfailureif(sys.version_info[0] >= 3,
327 'This test is known to fail on Python 3.')
328
326 # A null 'decorator', useful to make more readable code that needs to pick
329 # A null 'decorator', useful to make more readable code that needs to pick
327 # between different decorators based on OS or other conditions
330 # between different decorators based on OS or other conditions
328 null_deco = lambda f: f
331 null_deco = lambda f: f
@@ -4,6 +4,7 b' The IPython.testing.decorators module triggers various extra imports, including'
4 numpy and sympy if they're present. Since this decorator is used in core parts
4 numpy and sympy if they're present. Since this decorator is used in core parts
5 of IPython, it's in a separate module so that running IPython doesn't trigger
5 of IPython, it's in a separate module so that running IPython doesn't trigger
6 those imports."""
6 those imports."""
7 import sys
7
8
8 def skip_doctest(f):
9 def skip_doctest(f):
9 """Decorator - mark a function or method for skipping its doctest.
10 """Decorator - mark a function or method for skipping its doctest.
@@ -13,3 +14,8 b' def skip_doctest(f):'
13 etc."""
14 etc."""
14 f.skip_doctest = True
15 f.skip_doctest = True
15 return f
16 return f
17
18 def skip_doctest_py3(f):
19 """Decorator - skip the doctest under Python 3."""
20 f.skip_doctest = (sys.version_info[0] >= 3)
21 return f
General Comments 0
You need to be logged in to leave comments. Login now