Team Ai
Datasetpublic

codekingpro/portable-devtools

sourceHugging Faceupdated 5mo agoView on Hugging Face
1likes15kdownloads
namespaces.py102 linesDownload Raw Back to setuptools
1import itertools2import os3 4from .compat import py3125 6from distutils import log7 8flatten = itertools.chain.from_iterable9 10 11class Installer:12    nspkg_ext = '-nspkg.pth'13 14    def install_namespaces(self) -> None:15        nsp = self._get_all_ns_packages()16        if not nsp:17            return18        filename = self._get_nspkg_file()19        self.outputs.append(filename)20        log.info("Installing %s", filename)21        lines = map(self._gen_nspkg_line, nsp)22 23        with open(filename, 'wt', encoding=py312.PTH_ENCODING) as f:24            # Python<3.13 requires encoding="locale" instead of "utf-8"25            # See: python/cpython#7710226            f.writelines(lines)27 28    def uninstall_namespaces(self) -> None:29        filename = self._get_nspkg_file()30        if not os.path.exists(filename):31            return32        log.info("Removing %s", filename)33        os.remove(filename)34 35    def _get_nspkg_file(self):36        filename, _ = os.path.splitext(self._get_target())37        return filename + self.nspkg_ext38 39    def _get_target(self):40        return self.target41 42    _nspkg_tmpl = (43        "import sys, types, os",44        "p = os.path.join(%(root)s, *%(pth)r)",45        "importlib = __import__('importlib.util')",46        "__import__('importlib.machinery')",47        (48            "m = "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        ("m = m or sys.modules.setdefault(%(pkg)r, types.ModuleType(%(pkg)r))"),55        "mp = (m or []) and m.__dict__.setdefault('__path__',[])",56        "(p not in mp) and mp.append(p)",57    )58    "lines for the namespace installer"59 60    _nspkg_tmpl_multi = ('m and setattr(sys.modules[%(parent)r], %(child)r, m)',)61    "additional line(s) when a parent package is indicated"62 63    def _get_root(self):64        return "sys._getframe(1).f_locals['sitedir']"65 66    def _gen_nspkg_line(self, pkg):67        pth = tuple(pkg.split('.'))68        root = self._get_root()69        tmpl_lines = self._nspkg_tmpl70        parent, sep, child = pkg.rpartition('.')71        if parent:72            tmpl_lines += self._nspkg_tmpl_multi73        return ';'.join(tmpl_lines) % locals() + '\n'74 75    def _get_all_ns_packages(self):76        """Return sorted list of all package namespaces"""77        pkgs = self.distribution.namespace_packages or []78        return sorted(set(flatten(map(self._pkg_names, pkgs))))79 80    @staticmethod81    def _pkg_names(pkg):82        """83        Given a namespace package, yield the components of that84        package.85 86        >>> names = Installer._pkg_names('a.b.c')87        >>> set(names) == set(['a', 'a.b', 'a.b.c'])88        True89        """90        parts = pkg.split('.')91        while parts:92            yield '.'.join(parts)93            parts.pop()94 95 96class DevelopInstaller(Installer):97    def _get_root(self):98        return repr(str(self.egg_path))99 100    def _get_target(self):101        return self.egg_link102 
codekingpro/portable-devtools · Team Ai