Path: blob/main/test/lib/python3.9/site-packages/setuptools/namespaces.py
4798 views
import os1from distutils import log2import itertools345flatten = itertools.chain.from_iterable678class Installer:910nspkg_ext = '-nspkg.pth'1112def install_namespaces(self):13nsp = self._get_all_ns_packages()14if not nsp:15return16filename, ext = os.path.splitext(self._get_target())17filename += self.nspkg_ext18self.outputs.append(filename)19log.info("Installing %s", filename)20lines = map(self._gen_nspkg_line, nsp)2122if self.dry_run:23# always generate the lines, even in dry run24list(lines)25return2627with open(filename, 'wt') as f:28f.writelines(lines)2930def uninstall_namespaces(self):31filename, ext = os.path.splitext(self._get_target())32filename += self.nspkg_ext33if not os.path.exists(filename):34return35log.info("Removing %s", filename)36os.remove(filename)3738def _get_target(self):39return self.target4041_nspkg_tmpl = (42"import sys, types, os",43"has_mfs = sys.version_info > (3, 5)",44"p = os.path.join(%(root)s, *%(pth)r)",45"importlib = has_mfs and __import__('importlib.util')",46"has_mfs and __import__('importlib.machinery')",47(48"m = has_mfs and "49"sys.modules.setdefault(%(pkg)r, "50"importlib.util.module_from_spec("51"importlib.machinery.PathFinder.find_spec(%(pkg)r, "52"[os.path.dirname(p)])))"53),54(55"m = m or "56"sys.modules.setdefault(%(pkg)r, types.ModuleType(%(pkg)r))"57),58"mp = (m or []) and m.__dict__.setdefault('__path__',[])",59"(p not in mp) and mp.append(p)",60)61"lines for the namespace installer"6263_nspkg_tmpl_multi = (64'm and setattr(sys.modules[%(parent)r], %(child)r, m)',65)66"additional line(s) when a parent package is indicated"6768def _get_root(self):69return "sys._getframe(1).f_locals['sitedir']"7071def _gen_nspkg_line(self, pkg):72pth = tuple(pkg.split('.'))73root = self._get_root()74tmpl_lines = self._nspkg_tmpl75parent, sep, child = pkg.rpartition('.')76if parent:77tmpl_lines += self._nspkg_tmpl_multi78return ';'.join(tmpl_lines) % locals() + '\n'7980def _get_all_ns_packages(self):81"""Return sorted list of all package namespaces"""82pkgs = self.distribution.namespace_packages or []83return sorted(flatten(map(self._pkg_names, pkgs)))8485@staticmethod86def _pkg_names(pkg):87"""88Given a namespace package, yield the components of that89package.9091>>> names = Installer._pkg_names('a.b.c')92>>> set(names) == set(['a', 'a.b', 'a.b.c'])93True94"""95parts = pkg.split('.')96while parts:97yield '.'.join(parts)98parts.pop()99100101class DevelopInstaller(Installer):102def _get_root(self):103return repr(str(self.egg_path))104105def _get_target(self):106return self.egg_link107108109