Example #1
0
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
Example #2
0
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)
Example #3
0
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)
Example #4
0
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)
Example #5
0
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))
Example #6
0
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))
Example #7
0
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
Example #8
0
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
Example #9
0
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
Example #10
0
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)
Example #11
0
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)
Example #12
0
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)
Example #13
0
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
Example #14
0
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)
Example #15
0
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)
Example #16
0
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)
Example #17
0
def _register_model_finder():
    sys.path_hooks.insert(0, ModelImporter)
    pkg_resources.register_finder(ModelImporter, _model_finder)