def register_finders(): """Register finders necessary for PEX to function properly.""" # If the previous finder is set, then we've already monkeypatched, so skip. global __PREVIOUS_FINDER if __PREVIOUS_FINDER: return # save previous finder so that it can be restored previous_finder = _get_finder(zipimport.zipimporter) assert previous_finder, 'This appears to be using an incompatible setuptools.' # replace the zip finder with our own implementation of find_eggs_in_zip which uses the correct # metadata handler, in addition to find_wheels_in_zip pkg_resources.register_finder( zipimport.zipimporter, ChainedFinder.of(find_eggs_in_zip, find_wheels_in_zip)) # append the wheel finder _add_finder(pkgutil.ImpImporter, find_wheels_on_path) if importlib_bootstrap is not None: _add_finder(importlib_bootstrap.FileFinder, find_wheels_on_path) __PREVIOUS_FINDER = previous_finder
def initialize_pkg_resources(): import pkg_resources def distribution_finder(finder, entry, only): for name in finder.listdir(""): if is_dist_info(name): yield pkg_resources.Distribution.from_location(entry, name) pkg_resources.register_finder(AssetFinder, distribution_finder) pkg_resources.working_set = pkg_resources.WorkingSet() class AssetProvider(pkg_resources.NullProvider): def __init__(self, module): super().__init__(module) self.finder = self.loader.finder def _has(self, path): return self.finder.exists(self.finder.zip_path(path)) def _isdir(self, path): return self.finder.isdir(self.finder.zip_path(path)) def _listdir(self, path): return self.finder.listdir(self.finder.zip_path(path)) pkg_resources.register_loader_type(AssetLoader, AssetProvider)
def initialize_pkg_resources(): # Because so much code requires pkg_resources without declaring setuptools as a dependency, # we include it in the bootstrap ZIP. We don't include the rest of setuptools, because it's # much larger and much less likely to be useful. If the user installs setuptools via pip, # then that copy of pkg_resources will take priority because the requirements ZIP is # earlier on sys.path. import pkg_resources def distribution_finder(finder, entry, only): for name in finder.listdir(""): if name.endswith(".dist-info"): yield pkg_resources.Distribution.from_location(entry, name) pkg_resources.register_finder(AssetFinder, distribution_finder) pkg_resources.working_set = pkg_resources.WorkingSet() class AssetProvider(pkg_resources.NullProvider): def __init__(self, module): super().__init__(module) self.finder = self.loader.finder def _has(self, path): return self.finder.exists(self.finder.zip_path(path)) def _isdir(self, path): return self.finder.isdir(self.finder.zip_path(path)) def _listdir(self, path): return self.finder.listdir(self.finder.zip_path(path)) pkg_resources.register_loader_type(AssetLoader, AssetProvider)
def monkeypatch_pkg_resources(): """ There is a bug in pkg_resources ZipProvider, so fix it. Filed https://bitbucket.org/tarek/distribute/issue/274 """ import pkg_resources _EggMetadata = pkg_resources.EggMetadata def normalized_elements(path): path_split = path.split('/') while path_split[-1] in ('', '.'): path_split.pop(-1) return path_split class EggMetadata(_EggMetadata): def __init__(self, *args, **kw): _EggMetadata.__init__(self, *args, **kw) def _fn(self, base, resource_name): return '/'.join(normalized_elements(_EggMetadata._fn(self, base, resource_name))) def _zipinfo_name(self, fspath): fspath = normalized_elements(fspath) zip_pre = normalized_elements(self.zip_pre) if fspath[:len(zip_pre)] == zip_pre: return '/'.join(fspath[len(zip_pre):]) raise AssertionError( "%s is not a subpath of %s" % (fspath, self.zip_pre) ) # TODO(wickman) Send pull request to setuptools to allow registering a factory for # zipfile.ZipFile def build_zipmanifest(path): zipinfo = dict() def contents_as_zipfile(path): new_zf = zipfile.ZipFile(StringIO(Nested.read(path))) new_zf.filename = path return new_zf zfile = contents_as_zipfile(path) try: for zitem in zfile.namelist(): zpath = zitem.replace('/', os.sep) zipinfo[zpath] = zfile.getinfo(zitem) assert zipinfo[zpath] is not None finally: zfile.close() return zipinfo pkg_resources.zipimport = sys.modules[__name__] # if monkeypatching after import pkg_resources.build_zipmanifest = build_zipmanifest pkg_resources.EggMetadata = EggMetadata try: pkg_resources.register_finder(EggZipImporter, pkg_resources.find_in_zip) except AttributeError: # setuptools 2.1+ move find_in_zip to find_eggs_in_zip to make it clear this does not # do wheels. pkg_resources.register_finder(EggZipImporter, pkg_resources.find_eggs_in_zip) pkg_resources.register_namespace_handler(EggZipImporter, pkg_resources.file_ns_handler) pkg_resources.register_loader_type(EggZipImporter, pkg_resources.ZipProvider)
def _add_finder(importer, finder): """Register a new pkg_resources path finder that does not replace the existing finder.""" existing_finder = _get_finder(importer) if not existing_finder: pkg_resources.register_finder(importer, finder) else: pkg_resources.register_finder(importer, ChainedFinder.of(existing_finder, finder))
def unregister_finders(): """Unregister finders necessary for PEX to function properly.""" global __PREVIOUS_FINDER if not __PREVIOUS_FINDER: return pkg_resources.register_finder(zipimport.zipimporter, __PREVIOUS_FINDER) _remove_finder(pkgutil.ImpImporter, find_wheels_on_path) __PREVIOUS_FINDER = None
def unregister_finders(): """Unregister finders necessary for PEX to function properly.""" global __PREVIOUS_FINDER if not __PREVIOUS_FINDER: return pkg_resources.register_finder(zipimport.zipimporter, __PREVIOUS_FINDER) _remove_finder(pkgutil.ImpImporter, find_wheels_on_path) if importlib_bootstrap is not None: _remove_finder(importlib_bootstrap.FileFinder, find_wheels_on_path) __PREVIOUS_FINDER = None
def register_finders(): """Register finders necessary for PEX to function properly.""" # If the previous finder is set, then we've already monkeypatched, so skip. global __PREVIOUS_FINDER if __PREVIOUS_FINDER: return # save previous finder so that it can be restored previous_finder = _get_finder(zipimport.zipimporter) assert previous_finder, 'This appears to be using an incompatible setuptools.' # replace the zip finder with our own implementation of find_eggs_in_zip which uses the correct # metadata handler, in addition to find_wheels_in_zip pkg_resources.register_finder( zipimport.zipimporter, ChainedFinder.of(find_eggs_in_zip, find_wheels_in_zip)) # append the wheel finder _add_finder(pkgutil.ImpImporter, find_wheels_on_path) __PREVIOUS_FINDER = previous_finder
def monkeypatch_pkg_resources(): """ There is a bug in pkg_resources ZipProvider, so fix it. Filed https://bitbucket.org/tarek/distribute/issue/274 """ import pkg_resources _EggMetadata = pkg_resources.EggMetadata def normalized_elements(path): path_split = path.split('/') while path_split[-1] in ('', '.'): path_split.pop(-1) return path_split class EggMetadata(_EggMetadata): def __init__(self, *args, **kw): _EggMetadata.__init__(self, *args, **kw) def _fn(self, base, resource_name): return '/'.join( normalized_elements(_EggMetadata._fn(self, base, resource_name))) def _zipinfo_name(self, fspath): fspath = normalized_elements(fspath) zip_pre = normalized_elements(self.zip_pre) if fspath[:len(zip_pre)] == zip_pre: return '/'.join(fspath[len(zip_pre):]) raise AssertionError("%s is not a subpath of %s" % (fspath, self.zip_pre)) pkg_resources.zipimport = sys.modules[ __name__] # if monkeypatching after import pkg_resources.EggMetadata = EggMetadata pkg_resources.register_finder(EggZipImporter, pkg_resources.find_in_zip) pkg_resources.register_namespace_handler(EggZipImporter, pkg_resources.file_ns_handler) pkg_resources.register_loader_type(EggZipImporter, pkg_resources.ZipProvider)
def _bootstrap_eggs(): # Install customized resource provider and distribution finder so that pkg_resources # can work with py2exe packaged application. import pkg_resources import cPickle as pickle import zipimport import os.path class InstalledProvider(pkg_resources.DefaultProvider): # Make resource paths for all packages to be relative to executable def __init__(self, module): self.module_path = os.path.dirname(sys.executable) class StringMetadata(pkg_resources.EmptyProvider): def __init__(self, metadata): self._metadata = metadata def has_metadata(self, name): return name in self._metadata def get_metadata(self, name): return self._metadata[name] def installed_finder(importer, path_item, only=False): # with py2exe we will ever have one path_item (library.zip) that contains all distributions try: packages = pickle.loads(importer.get_data("packages.pickle")) except IOError: pass # file not found else: for egg_name, metadata in packages.iteritems(): yield pkg_resources.Distribution.from_location( path_item, egg_name, metadata=StringMetadata(metadata)) pkg_resources.register_finder(zipimport.zipimporter, installed_finder) pkg_resources.register_loader_type(zipimport.zipimporter, InstalledProvider)
def monkeypatch_pkg_resources(): """ There is a bug in pkg_resources ZipProvider, so fix it. Filed https://bitbucket.org/tarek/distribute/issue/274 """ import pkg_resources _EggMetadata = pkg_resources.EggMetadata def normalized_elements(path): path_split = path.split('/') while path_split[-1] in ('', '.'): path_split.pop(-1) return path_split class EggMetadata(_EggMetadata): def __init__(self, *args, **kw): _EggMetadata.__init__(self, *args, **kw) def _fn(self, base, resource_name): return '/'.join(normalized_elements(_EggMetadata._fn(self, base, resource_name))) def _zipinfo_name(self, fspath): fspath = normalized_elements(fspath) zip_pre = normalized_elements(self.zip_pre) if fspath[:len(zip_pre)] == zip_pre: return '/'.join(fspath[len(zip_pre):]) raise AssertionError( "%s is not a subpath of %s" % (fspath, self.zip_pre) ) pkg_resources.zipimport = sys.modules[__name__] # if monkeypatching after import pkg_resources.EggMetadata = EggMetadata pkg_resources.register_finder(EggZipImporter, pkg_resources.find_in_zip) pkg_resources.register_namespace_handler(EggZipImporter, pkg_resources.file_ns_handler) pkg_resources.register_loader_type(EggZipImporter, pkg_resources.ZipProvider)
def register_finders(): """ Register pkg_resources finders that work with wheels (but not eggs). These replace the default pkg_resources finders. This function should be called before calling pkg_resources.find_distributions(). """ global __REGISTERED if __REGISTERED: return pkg_resources.register_finder(zipimport.zipimporter, find_wheels_in_zip) pkg_resources.register_finder(pkgutil.ImpImporter, find_on_path) if hasattr(importlib_machinery, "FileFinder"): pkg_resources.register_finder(importlib_machinery.FileFinder, find_on_path) __REGISTERED = True
def _remove_finder(importer, finder): """Remove an existing finder from pkg_resources.""" existing_finder = _get_finder(importer) if not existing_finder: return if isinstance(existing_finder, ChainedFinder): try: existing_finder.finders.remove(finder) except ValueError: return if len(existing_finder.finders) == 1: pkg_resources.register_finder(importer, existing_finder.finders[0]) elif len(existing_finder.finders) == 0: pkg_resources.register_finder(importer, pkg_resources.find_nothing) else: pkg_resources.register_finder(importer, pkg_resources.find_nothing)
def monkeypatch_pkg_resources(): """ There is a bug in pkg_resources ZipProvider, so fix it. Filed https://bitbucket.org/tarek/distribute/issue/274 """ import pkg_resources _EggMetadata = pkg_resources.EggMetadata def normalized_elements(path): path_split = path.split('/') while path_split[-1] in ('', '.'): path_split.pop(-1) return path_split class EggMetadata(_EggMetadata): def __init__(self, *args, **kw): _EggMetadata.__init__(self, *args, **kw) def _fn(self, base, resource_name): return '/'.join( normalized_elements(_EggMetadata._fn(self, base, resource_name))) def _zipinfo_name(self, fspath): fspath = normalized_elements(fspath) zip_pre = normalized_elements(self.zip_pre) if fspath[:len(zip_pre)] == zip_pre: return '/'.join(fspath[len(zip_pre):]) raise AssertionError("%s is not a subpath of %s" % (fspath, self.zip_pre)) # TODO(wickman) Send pull request to setuptools to allow registering a factory for # zipfile.ZipFile def build_zipmanifest(path): zipinfo = dict() def contents_as_zipfile(path): new_zf = zipfile.ZipFile(StringIO(Nested.read(path))) new_zf.filename = path return new_zf zfile = contents_as_zipfile(path) try: for zitem in zfile.namelist(): zpath = zitem.replace('/', os.sep) zipinfo[zpath] = zfile.getinfo(zitem) assert zipinfo[zpath] is not None finally: zfile.close() return zipinfo pkg_resources.zipimport = sys.modules[ __name__] # if monkeypatching after import pkg_resources.build_zipmanifest = build_zipmanifest pkg_resources.EggMetadata = EggMetadata pkg_resources.register_finder(EggZipImporter, pkg_resources.find_in_zip) pkg_resources.register_namespace_handler(EggZipImporter, pkg_resources.file_ns_handler) pkg_resources.register_loader_type(EggZipImporter, pkg_resources.ZipProvider)
def _register_model_finder(): sys.path_hooks.insert(0, ModelImporter) pkg_resources.register_finder(ModelImporter, _model_finder)