Examples (and tests) for python namespace packages

This commit is contained in:
Mike Romberg 2016-02-12 11:53:23 -07:00
commit ba158e7919
12 changed files with 133 additions and 2 deletions

View file

@ -10,7 +10,8 @@ import_packages_subdirs = \
from_init3 \
relativeimport1 \
relativeimport2 \
relativeimport3
relativeimport3 \
namespace_pkg
check: build
if test "x$(SRCDIR)" != x; then \

View file

@ -1,2 +1,4 @@
These are actually regression tests for SF bug #1297 (GH issue #7).
See individual READMEs in subdirectories.
The namespace_pkg is an example of python3's namespace packages.
See individual READMEs in subdirectories.

View file

@ -0,0 +1,20 @@
TOP = ../../..
PY3 = 1
SWIGEXE = $(TOP)/../swig
SWIG_LIB_DIR = $(TOP)/../$(TOP_BUILDDIR_TO_TOP_SRCDIR)Lib
SRCS = robin.c
TARGET = robin
INTERFACE = robin.i
check: build
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' PY3='$(PY3)' python_run
build:
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' SRCS='$(SRCS)' \
PY3='$(PY3)' \
SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \
TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' python
clean:
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' TARGET='$(TARGET)' python_clean
rm -rf path1 path2 path3 path4.zip

View file

@ -0,0 +1,25 @@
This is an example (and test) of using swig generated modules in the context
of python3's namespace packages:
https://www.python.org/dev/peps/pep-0420/
Consequently, this example requires python (3.3 or newer) to build and run.
This example creates a simple swig module named robin. The robin.py module
has a companion C module named _robin.so. The robin module is tested in four
ways:
1) As a non-package module (tested by nonpkg.py)
2) With robin.py and _robin.so in the brave package under the path1
subdirectory. (tested by normal.py)
3) With robin.py in path2/brave and _robin.so in path3/brave
(tested by split.py)
4) With robin.py contained in a zip file (path4.zip) as brave/robin.py and
_robin.so found on the filesystem under path3/brave (tested by zipsplit.py)
Note: Using namespace packages with subpackages (such as brave.sir.robin) where
robin.py is located in a zipfile requires python-3.5.1 or newer as
python's zipimporter only worked with packages of depth 1 until then.

View file

@ -0,0 +1,5 @@
# import robin as a module in the global namespace
import robin
assert(robin.run() == "AWAY!")

View file

@ -0,0 +1,7 @@
import sys
# Package brave found under one path
sys.path.insert(0, 'path1')
from brave import robin
assert(robin.run() == "AWAY!")

View file

@ -0,0 +1,3 @@
const char *run(void) {
return "AWAY!";
}

View file

@ -0,0 +1,7 @@
%module robin
%{
extern const char *run(void);
%}
const char *run(void);

View file

@ -0,0 +1,9 @@
import os, sys, setupPkg
setupPkg.copyMods()
# Run each test with a seperate interpreter
os.system(sys.executable + " nonpkg.py")
os.system(sys.executable + " normal.py")
os.system(sys.executable + " split.py")
os.system(sys.executable + " zipsplit.py")

View file

@ -0,0 +1,34 @@
#---------------------------------
# setup the namespace package dirs
#---------------------------------
import os, shutil, zipfile
def copyMods():
dirs = ['path1', 'path2', 'path3']
# Clean out any old package paths
for d in dirs:
if os.path.isdir(d):
shutil.rmtree(d)
for d in dirs:
os.mkdir(d)
os.mkdir(os.path.join(d, 'brave'))
shutil.copy('robin.py', os.path.join('path1', 'brave'))
shutil.copy('_robin.so', os.path.join('path1', 'brave'))
shutil.copy('robin.py', os.path.join('path2', 'brave'))
shutil.copy('_robin.so', os.path.join('path3', 'brave'))
mkzip()
def mkzip():
zf = zipfile.ZipFile("path4.zip", "w")
zf.writestr("brave/", b'')
zf.write('robin.py', 'brave/robin.py')
zf.close()
if __name__ == "__main__":
copyMods()

View file

@ -0,0 +1,9 @@
import sys
# Package brave split into two paths.
# path2/brave/robin.py and path3/brave/_robin.so
sys.path.insert(0, 'path2')
sys.path.insert(0, 'path3')
from brave import robin
assert(robin.run() == "AWAY!")

View file

@ -0,0 +1,9 @@
import sys
# Package brave split into two paths.
# brave/robin.py (in path4.zip) and path3/brave/_robin.so
sys.path.insert(0, 'path4.zip')
sys.path.insert(0, 'path3')
from brave import robin
assert(robin.run() == "AWAY!")