diff options
author | Wyatt Lee Baldwin <self@wyattbaldwin.com> | 2014-02-12 00:52:26 -0800 |
---|---|---|
committer | Wyatt Lee Baldwin <self@wyattbaldwin.com> | 2014-02-12 00:52:26 -0800 |
commit | 80fc5b6d418b2df0243989b1b8c999f795f3f55e (patch) | |
tree | de140863069aff43238daab5ec746a530ce97ac5 /setuptools | |
parent | c74177b8d8c565650abec45d2f90550be0c2702f (diff) | |
download | external_python_setuptools-80fc5b6d418b2df0243989b1b8c999f795f3f55e.tar.gz external_python_setuptools-80fc5b6d418b2df0243989b1b8c999f795f3f55e.tar.bz2 external_python_setuptools-80fc5b6d418b2df0243989b1b8c999f795f3f55e.zip |
Add support for PEP 420 namespace packages to find_packages()
On Python 3.3+, `find_packages()` now considers any subdirectory of the
start directory that's not a regular package (i.e., that doesn't have an
`__init__.py`) to be a namespace package.
The other way this supports PEP 420 is by making sure `__pycache__`
directories are never added to the list of packages.
Fixes issue #97
Diffstat (limited to 'setuptools')
-rw-r--r-- | setuptools/__init__.py | 5 | ||||
-rw-r--r-- | setuptools/tests/test_find_packages.py | 38 |
2 files changed, 42 insertions, 1 deletions
diff --git a/setuptools/__init__.py b/setuptools/__init__.py index a96e4c9d..86afab63 100644 --- a/setuptools/__init__.py +++ b/setuptools/__init__.py @@ -56,7 +56,10 @@ def find_packages(where='.', exclude=(), include=()): looks_like_package = ( '.' not in name and os.path.isdir(fn) - and os.path.isfile(os.path.join(fn, '__init__.py')) + and ( + os.path.isfile(os.path.join(fn, '__init__.py')) + or sys.version_info[:2] >= (3, 3) # PEP 420 + ) ) if looks_like_package: pkg_name = prefix + name diff --git a/setuptools/tests/test_find_packages.py b/setuptools/tests/test_find_packages.py index c50309d2..abb0dd61 100644 --- a/setuptools/tests/test_find_packages.py +++ b/setuptools/tests/test_find_packages.py @@ -1,12 +1,16 @@ """Tests for setuptools.find_packages().""" import os import shutil +import sys import tempfile import unittest from setuptools import find_packages +PEP420 = sys.version_info[:2] >= (3, 3) + + class TestFindPackages(unittest.TestCase): def setUp(self): @@ -58,6 +62,7 @@ class TestFindPackages(unittest.TestCase): fp.close() return path + @unittest.skipIf(PEP420, 'Not a PEP 420 env') def test_regular_package(self): self._touch('__init__.py', self.pkg_dir) packages = find_packages(self.dist_dir) @@ -80,3 +85,36 @@ class TestFindPackages(unittest.TestCase): self._touch('file.dat', data_dir) packages = find_packages(self.dist_dir) self.assertTrue('pkg.some.data' not in packages) + + @unittest.skipIf(not PEP420, 'PEP 420 only') + def test_pep420_ns_package(self): + packages = find_packages( + self.dist_dir, include=['pkg*'], exclude=['pkg.subpkg.assets']) + self.assertEqual(packages, ['pkg', 'pkg.nspkg', 'pkg.subpkg']) + + @unittest.skipIf(not PEP420, 'PEP 420 only') + def test_pep420_ns_package_no_includes(self): + packages = find_packages( + self.dist_dir, exclude=['pkg.subpkg.assets']) + self.assertEqual(packages, ['docs', 'pkg', 'pkg.nspkg', 'pkg.subpkg']) + + @unittest.skipIf(not PEP420, 'PEP 420 only') + def test_pep420_ns_package_no_includes_or_excludes(self): + packages = find_packages(self.dist_dir) + expected = [ + 'docs', 'pkg', 'pkg.nspkg', 'pkg.subpkg', 'pkg.subpkg.assets'] + self.assertEqual(packages, expected) + + @unittest.skipIf(not PEP420, 'PEP 420 only') + def test_regular_package_with_nested_pep420_ns_packages(self): + self._touch('__init__.py', self.pkg_dir) + packages = find_packages( + self.dist_dir, exclude=['docs', 'pkg.subpkg.assets']) + self.assertEqual(packages, ['pkg', 'pkg.nspkg', 'pkg.subpkg']) + + @unittest.skipIf(not PEP420, 'PEP 420 only') + def test_pep420_ns_package_no_non_package_dirs(self): + shutil.rmtree(self.docs_dir) + shutil.rmtree(os.path.join(self.dist_dir, 'pkg/subpkg/assets')) + packages = find_packages(self.dist_dir) + self.assertEqual(packages, ['pkg', 'pkg.nspkg', 'pkg.subpkg']) |