Example #1
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 #2
0
    def _register_with_pkg_resources(cls):
        """
        Ensure package resources can be loaded from this loader. May be called
        multiple times, as the operation is idempotent.
        """
        try:
            import pkg_resources
            # access an attribute in case a deferred importer is present
            pkg_resources.__name__
        except ImportError:
            return

        # Since pytest tests are always located in the file system, the
        #  DefaultProvider is appropriate.
        pkg_resources.register_loader_type(cls, pkg_resources.DefaultProvider)
Example #3
0
def install():
    """
    This installs a hook into setuptools' pkg_resources infrastructure, so that resource
    files can be found in files relative to the runnin executable, in addition to the
    usual egg and source lookup mechanisms.  This overrides the ZipProvider, since that
    is the lookup mechanism triggered within pkg_resources when running code out of a
    py2exe or py2app build's library.zip.
    """
    import os, sys
    import pkg_resources, zipimport

    platform_libdirs = {
        'darwin': '../Resources/pkg_resources',
        }
    exedir = os.path.dirname(sys.executable)
    libdir = platform_libdirs.get(sys.platform, 'pkg_resources')

    class Provider(pkg_resources.ZipProvider):

        def __init__(self, module):
            self._module_name = module.__name__
            pkg_resources.ZipProvider.__init__(self, module)

        def get_resource_filename(self, manager, resource_name):
            #print 'get_resource_filename(%s, %s)' % (manager, resource_name)
            path = [exedir, libdir] + self._module_name.split('.') + [resource_name]
            localfile = os.path.join(*path)
            #print '             checking(%s)' % (localfile,)
            if os.path.exists(localfile):
                #print 'found locally'
                return localfile
            else:
                try:
                    ret = pkg_resources.ZipProvider.get_resource_filename(self, manager, resource_name)
                    #print 'returning %s' % (ret,)
                    return ret
                except NotImplementedError:
                    #print 'get_resource_filename(%s,%s): not found' % (self._module_name, resource_name)
                    #import traceback
                    #traceback.print_exc()
                    return ''

    pkg_resources.register_loader_type(zipimport.zipimporter, Provider)
Example #4
0
 def __init__(self, package, pkg_resources=pkg_resources):
     loader = self._real_loader = getattr(package, '__loader__', None)
     if isinstance(loader, self.__class__):
         self._real_loader = None
     # We register ourselves as a __loader__ *only* to support the
     # setuptools _find_adapter adapter lookup; this class doesn't
     # actually support the PEP 302 loader "API".  This is
     # excusable due to the following statement in the spec:
     # ... Loader objects are not
     # required to offer any useful functionality (any such functionality,
     # such as the zipimport get_data() method mentioned above, is
     # optional)...
     # A __loader__ attribute is basically metadata, and setuptools
     # uses it as such.
     package.__loader__ = self
     # we call register_loader_type for every instantiation of this
     # class; that's OK, it's idempotent to do it more than once.
     pkg_resources.register_loader_type(self.__class__, OverrideProvider)
     self.overrides = []
     self.overridden_package_name = package.__name__
Example #5
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)
        # Embedded resources have precedence over filesystem...
        rel_path = path.relative_to(SYS_PREFIX)
        node = self.embedded_tree._get_tree_node(rel_path)
        if node is None:
            return path.is_dir()  # No match found; try the filesystem
        else:
            # str = file, dict = directory
            return not isinstance(node, str)

    def _listdir(self, path):
        # Prevent access outside the package
        path = self._normalize_path(path)
        if not self._is_relative_to_package(path):
            return []

        # Relative path for searching embedded resources
        rel_path = path.relative_to(SYS_PREFIX)
        # List content from embedded filesystem...
        content = self.embedded_tree.path_listdir(rel_path)
        # ... as well as the actual one
        if path.is_dir():
            # Use os.listdir() to avoid having to convert Path objects
            # to strings... Also make sure to de-duplicate the results
            path = str(path)  # not is_py36
            content = list(set(content + os.listdir(path)))
        return content


pkg_resources.register_loader_type(FrozenImporter, PyiFrozenProvider)
Example #7
0
        # both base and alias should be in sys.modules to handle recursive and
        # corecursive situations
        sys.modules[odoo_name] = sys.modules[openerp_name] = new_mod

        # execute source in context of module *after* putting everything in
        # sys.modules, so recursive import works
        execfile(modfile, new_mod.__dict__)

        # people import openerp.addons and expect openerp.addons.<module> to work
        setattr(odoo.addons, addon_name, new_mod)

        return sys.modules[name]
# need to register loader with setuptools as Jinja relies on it when using
# PackageLoader
pkg_resources.register_loader_type(AddonsHook, pkg_resources.DefaultProvider)

class OdooHook(object):
    """ Makes odoo package also available as openerp """

    def find_module(self, name, path=None):
        # openerp.addons.<identifier> should already be matched by AddonsHook,
        # only framework and subdirectories of modules should match
        if re.match(r'^openerp\b', name):
            return self

    def load_module(self, name):
        assert name not in sys.modules

        canonical = re.sub(r'^openerp(.*)', r'odoo\g<1>', name)
Example #8
0
# fix sys path to include dists
import sys
import os
sys.path.insert(0, 'distlib')

# register gae loader for pkg_resources
if os.environ.get('SERVER_SOFTWARE', 'Development')[0:11] == "Development":
    from google.appengine.tools.dev_appserver_import_hook import \
        HardenedModulesHook
    from pkg_resources import register_loader_type, DefaultProvider
    register_loader_type(HardenedModulesHook, DefaultProvider)

# disable chameleon debug module loader, gae does not allow tempdirs
import chameleon.template
from chameleon.loader import MemoryLoader
chameleon.template._make_module_loader = MemoryLoader
chameleon.template.BaseTemplate.loader = MemoryLoader()
Example #9
0
just registers some helper functions with the pkg_resources machinery.

You must import this module before using pkg_resources when signed imports
are in use.

"""

import sys
import signedimp
if "pkg_resources" in sys.modules:
    pkg_resources = sys.modules["pkg_resources"]
else:
    import pkg_resources

_find_adapter = pkg_resources._find_adapter
_provider_factories = pkg_resources._provider_factories
DefaultProvider  = pkg_resources.DefaultProvider

def _get_provider(mod):
    """Get the pkg_resources provider appropriate for the given loader.

    This basically calls back into the pkg_resources machinery to find the
    provider for the wrapper loader, and just returns that.
    """
    return _find_adapter(_provider_factories,mod.__loader__.loader)(mod)

pkg_resources.register_loader_type(signedimp.SignedLoader,_get_provider)
pkg_resources.register_loader_type(signedimp.DefaultImporter,DefaultProvider)


Example #10
0
just registers some helper functions with the pkg_resources machinery.

You must import this module before using pkg_resources when signed imports
are in use.

"""

import sys
import signedimp
if "pkg_resources" in sys.modules:
    pkg_resources = sys.modules["pkg_resources"]
else:
    import pkg_resources

_find_adapter = pkg_resources._find_adapter
_provider_factories = pkg_resources._provider_factories
DefaultProvider = pkg_resources.DefaultProvider


def _get_provider(mod):
    """Get the pkg_resources provider appropriate for the given loader.

    This basically calls back into the pkg_resources machinery to find the
    provider for the wrapper loader, and just returns that.
    """
    return _find_adapter(_provider_factories, mod.__loader__.loader)(mod)


pkg_resources.register_loader_type(signedimp.SignedLoader, _get_provider)
pkg_resources.register_loader_type(signedimp.DefaultImporter, DefaultProvider)
Example #11
0
#-----------------------------------------------------------------------------
# Copyright (c) 2013-2018, PyInstaller Development Team.
#
# Distributed under the terms of the GNU General Public License with exception
# for distributing bootloader.
#
# The full license is in the file COPYING.txt, distributed with this software.
#-----------------------------------------------------------------------------


import pkg_resources as res
from pyimod03_importers import FrozenImporter


# To make pkg_resources work with froze moduels we need to set the 'Provider'
# class for FrozenImporter. This class decides where to look for resources
# and other stuff. 'pkg_resources.NullProvider' is dedicated to PEP302
# import hooks like FrozenImporter is. It uses method __loader__.get_data() in
# methods pkg_resources.resource_string() and pkg_resources.resource_stream()
res.register_loader_type(FrozenImporter, res.NullProvider)
Example #12
0

# Again for Mac and pkg_resources:
@patch(os)
def uname():
    return ("AppEngine", "appengine-host", "0.0.0", "#1", "i386")


try:
    import pkg_resources
except ImportError:
    pass
else:
    if hasattr(os, "__loader__"):
        # This only seems to apply to the SDK
        pkg_resources.register_loader_type(type(os.__loader__), pkg_resources.DefaultProvider)


def get_file_dir(*parts):
    file_dir = os.path.dirname(__file__)
    if os.path.exists(os.path.join(file_dir, "appengine_monkey_files")):
        file_dir = os.path.join(file_dir, "appengine_monkey_files")
    if parts:
        file_dir = os.path.join(file_dir, *parts)
    return file_dir


def patch_modules():
    """
    Adds the module-replacements/ directory to the start of sys.path, and removes any modules that
    have already been loaded that instead should be loaded from module-replacements/
Example #13
0
        # both base and alias should be in sys.modules to handle recursive and
        # corecursive situations
        sys.modules[odoo_name] = sys.modules[openerp_name] = new_mod

        # execute source in context of module *after* putting everything in
        # sys.modules, so recursive import works
        exec(open(modfile, 'rb').read(), new_mod.__dict__)

        # people import openerp.addons and expect openerp.addons.<module> to work
        setattr(odoo.addons, addon_name, new_mod)

        return sys.modules[name]
# need to register loader with setuptools as Jinja relies on it when using
# PackageLoader
pkg_resources.register_loader_type(AddonsHook, pkg_resources.DefaultProvider)

class OdooHook(object):
    """ Makes odoo package also available as openerp """

    def find_module(self, name, path=None):
        # openerp.addons.<identifier> should already be matched by AddonsHook,
        # only framework and subdirectories of modules should match
        if re.match(r'^openerp\b', name):
            return self

    def load_module(self, name):
        assert name not in sys.modules

        canonical = re.sub(r'^openerp(.*)', r'odoo\g<1>', name)
Example #14
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 #15
0
class _KiwiProvider(pkg_resources.DefaultProvider):
    _my_resources = {}

    def __init__(self, module):
        pkg_resources.DefaultProvider.__init__(self, module)

        if module.__name__ in self._my_resources:
            self.module_path = self._my_resources[module.__name__]

    @classmethod
    def add_resource(cls, name, path=None):
        cls._my_resources[name] = path


pkg_resources.register_loader_type(type(None), _KiwiProvider)


class Environment:
    """Environment control

    When you want to access a resource on the filesystem, such as
    an image or a glade file you use this object.

    External libraries or applications are free to add extra directories"""
    def __init__(self, root='.'):
        self._root = root

    #
    #  Public
    #
Example #16
0
#-----------------------------------------------------------------------------
# Copyright (c) 2013-2016, PyInstaller Development Team.
#
# Distributed under the terms of the GNU General Public License with exception
# for distributing bootloader.
#
# The full license is in the file COPYING.txt, distributed with this software.
#-----------------------------------------------------------------------------

import pkg_resources as res
from pyimod03_importers import FrozenImporter

# To make pkg_resources work with froze moduels we need to set the 'Provider'
# class for FrozenImporter. This class decides where to look for resources
# and other stuff. 'pkg_resources.NullProvider' is dedicated to PEP302
# import hooks like FrozenImporter is. It uses method __loader__.get_data() in
# methods pkg_resources.resource_string() and pkg_resources.resource_stream()
res.register_loader_type(FrozenImporter, res.NullProvider)
Example #17
0
import pkg_resources
import sys

from pyimod03_importers import FrozenImporter

from mkhost import main

# Fix for pyinstaller
if getattr(sys, 'frozen', False):
    pkg_resources.register_loader_type(FrozenImporter,
                                       pkg_resources.DefaultProvider)

main()
Example #18
0
class _KiwiProvider(pkg_resources.DefaultProvider):
    _my_resources = {}

    def __init__(self, module):
        pkg_resources.DefaultProvider.__init__(self, module)

        if module.__name__ in self._my_resources:
            self.module_path = self._my_resources[module.__name__]

    @classmethod
    def add_resource(cls, name, path=None):
        cls._my_resources[name] = path


pkg_resources.register_loader_type(type(None), _KiwiProvider)


class Environment:
    """Environment control

    When you want to access a resource on the filesystem, such as
    an image or a glade file you use this object.

    External libraries or applications are free to add extra directories"""

    def __init__(self, root='.'):
        self._root = root

    #
    #  Public