diff --git a/IPython/extensions/cythonmagic.py b/IPython/extensions/cythonmagic.py index be8f808..a9c0432 100644 --- a/IPython/extensions/cythonmagic.py +++ b/IPython/extensions/cythonmagic.py @@ -15,6 +15,7 @@ Parts of this code were taken from Cython.inline. # The full license is in the file COPYING.txt, distributed with this software. #----------------------------------------------------------------------------- +import io import os, sys from importlib import import_module import imp @@ -32,6 +33,7 @@ from IPython.testing.skipdoctest import skip_doctest from IPython.core.magic_arguments import ( argument, magic_arguments, parse_argstring ) +from IPython.utils import py3compat import Cython from Cython.Compiler.Errors import CompileError @@ -90,7 +92,7 @@ class CythonMagics(Magics): if not module_name: raise ValueError('module name must be given') fname = module_name + '.pyx' - with io.open(fname, 'w', encoding='utf-8'): + with io.open(fname, 'w', encoding='utf-8') as f: f.write(cell) if 'pyximport' not in sys.modules: import pyximport @@ -125,8 +127,7 @@ class CythonMagics(Magics): """ args = parse_argstring(self.cython, line) code = cell if cell.endswith('\n') else cell+'\n' - # distutils.Extension cannot handle sources that a unicode - lib_dir=str(os.path.join(self.shell.ipython_dir,'cython')) + lib_dir=os.path.join(self.shell.ipython_dir, 'cython') cython_include_dirs=['.'] force=args.force quiet=True @@ -146,9 +147,9 @@ class CythonMagics(Magics): import numpy c_include_dirs.append(numpy.get_include()) pyx_file = os.path.join(lib_dir, module_name + '.pyx') - with io.open(pyx_file, 'w', encoding='utf-8'): + pyx_file = py3compat.unicode_to_str(pyx_file, encoding=sys.getfilesystemencoding()) + with io.open(pyx_file, 'w', encoding='utf-8') as f: f.write(code) - print [pyx_file] extension = Extension( name = module_name, sources = [pyx_file], diff --git a/IPython/extensions/tests/test_cythonmagic.py b/IPython/extensions/tests/test_cythonmagic.py index beb5da8..2092b0e 100644 --- a/IPython/extensions/tests/test_cythonmagic.py +++ b/IPython/extensions/tests/test_cythonmagic.py @@ -4,10 +4,11 @@ import os import nose.tools as nt +from IPython.utils import py3compat -code = """def f(x): +code = py3compat.str_to_unicode("""def f(x): return 2*x -""" +""") try: import Cython @@ -39,7 +40,8 @@ def test_cython(): ip = get_ipython() ip.run_cell_magic('cython', '', code) ip.ex('g = f(10)') - nt.assert_equals(ip.user_ns['g'], 20.0) + nt.assert_equals(ip.user_ns['g'], 20.0) + diff --git a/IPython/testing/iptest.py b/IPython/testing/iptest.py index 6bbde36..4af2e93 100644 --- a/IPython/testing/iptest.py +++ b/IPython/testing/iptest.py @@ -148,6 +148,7 @@ have['wx'] = test_for('wx') have['wx.aui'] = test_for('wx.aui') have['qt'] = test_for('IPython.external.qt') have['sqlite3'] = test_for('sqlite3') +have['cython'] = test_for('Cython') have['tornado'] = test_for('tornado.version_info', (2,1,0), callback=None) @@ -268,6 +269,9 @@ def make_exclude(): ipjoin('zmq', 'pylab'), ]) + if not have['cython']: + exclusions.extend([ipjoin('extensions', 'cythonmagic')]) + if not have['tornado']: exclusions.append(ipjoin('frontend', 'html')) diff --git a/docs/source/config/extensions/cythonmagic.txt b/docs/source/config/extensions/cythonmagic.txt new file mode 100644 index 0000000..f6b76fb --- /dev/null +++ b/docs/source/config/extensions/cythonmagic.txt @@ -0,0 +1,7 @@ +.. _extensions_cythonmagic: + +=========== +cythonmagic +=========== + +.. automodule:: IPython.extensions.cythonmagic diff --git a/docs/source/config/extensions/index.txt b/docs/source/config/extensions/index.txt index 300a751..4004ba3 100644 --- a/docs/source/config/extensions/index.txt +++ b/docs/source/config/extensions/index.txt @@ -71,6 +71,7 @@ Extensions bundled with IPython :maxdepth: 1 autoreload + cythonmagic parallelmagic storemagic sympyprinting