From 96ea5097c99252cbc83532a54c10044c8659eb02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Ma=C5=9Blanka?= <piotr.maslanka@henrietta.com.pl> Date: Mon, 23 Mar 2020 17:47:44 +0100 Subject: [PATCH] proper handling of Extensions in the list --- example/example.pyx | 2 ++ example/setup.py | 16 ++++++++++------ example/tests/test_test.py | 4 ++++ snakehouse/build.py | 16 ++++++++++++---- 4 files changed, 28 insertions(+), 10 deletions(-) create mode 100644 example/example.pyx diff --git a/example/example.pyx b/example/example.pyx new file mode 100644 index 0000000..4dcfb73 --- /dev/null +++ b/example/example.pyx @@ -0,0 +1,2 @@ +def test(x, y): + return x+y diff --git a/example/setup.py b/example/setup.py index ac57f4d..1f05629 100644 --- a/example/setup.py +++ b/example/setup.py @@ -1,23 +1,27 @@ from setuptools import setup, find_packages from snakehouse import Multibuild, build +from setuptools import Extension +# note that you can include standard Extension classes in this list, those won't be touched +# and will be directed directly to Cython.Build.cythonize() cython_multibuilds = [ Multibuild('example_module', ['example_module/test.pyx', 'example_module/test2.pyx', 'example_module/test3/test3.pyx', - 'example_module/test_n.c']) + 'example_module/test_n.c']), + Extension('example', ['example.pyx']) ] # first argument is used directly by snakehouse, the rest and **kwargs are passed to -# Cython.Build.cythonize +# Cython.Build.cythonize() ext_modules = build(cython_multibuilds, - compiler_directives={ - 'language_level': '3', - }) + compiler_directives={ + 'language_level': '3', + }) setup(name='example_module', version='0.1', - packages=find_packages(include=['example_module']), + packages=['example_module', 'example'], install_requires=[ 'Cython', 'snakehouse' ], diff --git a/example/tests/test_test.py b/example/tests/test_test.py index b60c3cf..fdd3675 100644 --- a/example/tests/test_test.py +++ b/example/tests/test_test.py @@ -1,10 +1,14 @@ from example_module.test import times_two from example_module.test2 import times_three, times_five from example_module.test3.test3 import times_four +from example import test import unittest class TestExample(unittest.TestCase): + def test_test(self): + self.assertEqual(test(2, 3), 5) + def test_five(self): self.assertEqual(times_five(2), 10) diff --git a/snakehouse/build.py b/snakehouse/build.py index 2f2900c..cfc9614 100644 --- a/snakehouse/build.py +++ b/snakehouse/build.py @@ -1,7 +1,15 @@ +import typing as tp from Cython.Build import cythonize +from setuptools import Extension +from .multibuild import Multibuild -def build(extensions, *args, **kwargs): - for multibuild in extensions: - multibuild.generate() - return cythonize([ext.for_cythonize() for ext in extensions], *args, **kwargs) +def build(extensions: tp.List[tp.Union[Multibuild, Extension]], *args, **kwargs): + returns = [] + for multi_build in extensions: + if isinstance(multi_build, Extension): + returns.append(multi_build) + else: + multi_build.generate() + returns.append(multi_build.for_cythonize()) + return cythonize(returns, *args, **kwargs) -- GitLab