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