aboutsummaryrefslogtreecommitdiffstats
path: root/setuptools
diff options
context:
space:
mode:
authorJason R. Coombs <jaraco@jaraco.com>2016-10-28 13:45:09 -0400
committerGitHub <noreply@github.com>2016-10-28 13:45:09 -0400
commit070b4e89c384cab1616f73f2c4a494d93c3bcd56 (patch)
tree2a9ec244a44eaea511eb58c129cd5384e1fd14e0 /setuptools
parent1e368654db5d501baffe21d32cc2594ac78ce36c (diff)
parent2e8ebcb618abb60af83a7155f6a0aad4ecfc10a1 (diff)
downloadexternal_python_setuptools-070b4e89c384cab1616f73f2c4a494d93c3bcd56.tar.gz
external_python_setuptools-070b4e89c384cab1616f73f2c4a494d93c3bcd56.tar.bz2
external_python_setuptools-070b4e89c384cab1616f73f2c4a494d93c3bcd56.zip
Merge pull request #832 from pypa/namespace-module
Add a namespace module.
Diffstat (limited to 'setuptools')
-rwxr-xr-xsetuptools/command/install_egg_info.py61
-rwxr-xr-xsetuptools/namespaces.py93
2 files changed, 95 insertions, 59 deletions
diff --git a/setuptools/command/install_egg_info.py b/setuptools/command/install_egg_info.py
index 7834e107..edc4718b 100755
--- a/setuptools/command/install_egg_info.py
+++ b/setuptools/command/install_egg_info.py
@@ -1,14 +1,13 @@
from distutils import log, dir_util
import os
-from setuptools.extern.six.moves import map
-
from setuptools import Command
+from setuptools import namespaces
from setuptools.archive_util import unpack_archive
import pkg_resources
-class install_egg_info(Command):
+class install_egg_info(namespaces.Installer, Command):
"""Install an .egg-info directory for the package"""
description = "Install an .egg-info directory for the package"
@@ -61,59 +60,3 @@ class install_egg_info(Command):
return dst
unpack_archive(self.source, self.target, skimmer)
-
- def install_namespaces(self):
- nsp = self._get_all_ns_packages()
- if not nsp:
- return
- filename, ext = os.path.splitext(self.target)
- filename += '-nspkg.pth'
- self.outputs.append(filename)
- log.info("Installing %s", filename)
- lines = map(self._gen_nspkg_line, nsp)
-
- if self.dry_run:
- # always generate the lines, even in dry run
- list(lines)
- return
-
- with open(filename, 'wt') as f:
- f.writelines(lines)
-
- _nspkg_tmpl = (
- "import sys, types, os",
- "pep420 = sys.version_info > (3, 3)",
- "p = os.path.join(sys._getframe(1).f_locals['sitedir'], *%(pth)r)",
- "ie = os.path.exists(os.path.join(p,'__init__.py'))",
- "m = not ie and not pep420 and "
- "sys.modules.setdefault(%(pkg)r, types.ModuleType(%(pkg)r))",
- "mp = (m or []) and m.__dict__.setdefault('__path__',[])",
- "(p not in mp) and mp.append(p)",
- )
- "lines for the namespace installer"
-
- _nspkg_tmpl_multi = (
- 'm and setattr(sys.modules[%(parent)r], %(child)r, m)',
- )
- "additional line(s) when a parent package is indicated"
-
- @classmethod
- def _gen_nspkg_line(cls, pkg):
- # ensure pkg is not a unicode string under Python 2.7
- pkg = str(pkg)
- pth = tuple(pkg.split('.'))
- tmpl_lines = cls._nspkg_tmpl
- parent, sep, child = pkg.rpartition('.')
- if parent:
- tmpl_lines += cls._nspkg_tmpl_multi
- return ';'.join(tmpl_lines) % locals() + '\n'
-
- def _get_all_ns_packages(self):
- """Return sorted list of all package namespaces"""
- nsp = set()
- for pkg in self.distribution.namespace_packages or []:
- pkg = pkg.split('.')
- while pkg:
- nsp.add('.'.join(pkg))
- pkg.pop()
- return sorted(nsp)
diff --git a/setuptools/namespaces.py b/setuptools/namespaces.py
new file mode 100755
index 00000000..cc934b7e
--- /dev/null
+++ b/setuptools/namespaces.py
@@ -0,0 +1,93 @@
+import os
+from distutils import log
+import itertools
+
+from setuptools.extern.six.moves import map
+
+
+flatten = itertools.chain.from_iterable
+
+
+class Installer:
+
+ nspkg_ext = '-nspkg.pth'
+
+ def install_namespaces(self):
+ nsp = self._get_all_ns_packages()
+ if not nsp:
+ return
+ filename, ext = os.path.splitext(self._get_target())
+ filename += self.nspkg_ext
+ self.outputs.append(filename)
+ log.info("Installing %s", filename)
+ lines = map(self._gen_nspkg_line, nsp)
+
+ if self.dry_run:
+ # always generate the lines, even in dry run
+ list(lines)
+ return
+
+ with open(filename, 'wt') as f:
+ f.writelines(lines)
+
+ def _get_target(self):
+ return self.target
+
+ _nspkg_tmpl = (
+ "import sys, types, os",
+ "pep420 = sys.version_info > (3, 3)",
+ "p = os.path.join(%(root)s, *%(pth)r)",
+ "ie = os.path.exists(os.path.join(p,'__init__.py'))",
+ "m = not ie and not pep420 and "
+ "sys.modules.setdefault(%(pkg)r, types.ModuleType(%(pkg)r))",
+ "mp = (m or []) and m.__dict__.setdefault('__path__',[])",
+ "(p not in mp) and mp.append(p)",
+ )
+ "lines for the namespace installer"
+
+ _nspkg_tmpl_multi = (
+ 'm and setattr(sys.modules[%(parent)r], %(child)r, m)',
+ )
+ "additional line(s) when a parent package is indicated"
+
+ def _get_root(self):
+ return "sys._getframe(1).f_locals['sitedir']"
+
+ def _gen_nspkg_line(self, pkg):
+ # ensure pkg is not a unicode string under Python 2.7
+ pkg = str(pkg)
+ pth = tuple(pkg.split('.'))
+ root = self._get_root()
+ tmpl_lines = self._nspkg_tmpl
+ parent, sep, child = pkg.rpartition('.')
+ if parent:
+ tmpl_lines += self._nspkg_tmpl_multi
+ return ';'.join(tmpl_lines) % locals() + '\n'
+
+ def _get_all_ns_packages(self):
+ """Return sorted list of all package namespaces"""
+ pkgs = self.distribution.namespace_packages or []
+ return sorted(flatten(map(self._pkg_names, pkgs)))
+
+ @staticmethod
+ def _pkg_names(pkg):
+ """
+ Given a namespace package, yield the components of that
+ package.
+
+ >>> names = Installer._pkg_names('a.b.c')
+ >>> set(names) == set(['a', 'a.b', 'a.b.c'])
+ True
+ """
+ parts = pkg.split('.')
+ while parts:
+ yield '.'.join(parts)
+ parts.pop()
+
+
+class DevelopInstaller(Installer):
+ def _get_root(self):
+ return repr(str(self.egg_path))
+
+ def _get_target(self):
+ return self.egg_link