123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- import sys
- import types
- import toolz
- from toolz.compatibility import import_module
- class TlzLoader(object):
- """ Finds and loads ``tlz`` modules when added to sys.meta_path"""
- def __init__(self):
- self.always_from_toolz = set([
- toolz.pipe,
- ])
- def _load_toolz(self, fullname):
- rv = {}
- package, dot, submodules = fullname.partition('.')
- try:
- module_name = ''.join(['cytoolz', dot, submodules])
- rv['cytoolz'] = import_module(module_name)
- except ImportError:
- pass
- try:
- module_name = ''.join(['toolz', dot, submodules])
- rv['toolz'] = import_module(module_name)
- except ImportError:
- pass
- if not rv:
- raise ImportError(fullname)
- return rv
- def find_module(self, fullname, path=None): # pragma: py3 no cover
- package, dot, submodules = fullname.partition('.')
- if package == 'tlz':
- return self
- def load_module(self, fullname): # pragma: py3 no cover
- if fullname in sys.modules: # pragma: no cover
- return sys.modules[fullname]
- spec = TlzSpec(fullname, self)
- module = self.create_module(spec)
- sys.modules[fullname] = module
- self.exec_module(module)
- return module
- def find_spec(self, fullname, path, target=None): # pragma: no cover
- package, dot, submodules = fullname.partition('.')
- if package == 'tlz':
- return TlzSpec(fullname, self)
- def create_module(self, spec):
- return types.ModuleType(spec.name)
- def exec_module(self, module):
- toolz_mods = self._load_toolz(module.__name__)
- fast_mod = toolz_mods.get('cytoolz') or toolz_mods['toolz']
- slow_mod = toolz_mods.get('toolz') or toolz_mods['cytoolz']
- module.__dict__.update(toolz.merge(fast_mod.__dict__, module.__dict__))
- package = fast_mod.__package__
- if package is not None:
- package, dot, submodules = package.partition('.')
- module.__package__ = ''.join(['tlz', dot, submodules])
- if not module.__doc__:
- module.__doc__ = fast_mod.__doc__
- # show file from toolz during introspection
- module.__file__ = slow_mod.__file__
- for k, v in fast_mod.__dict__.items():
- tv = slow_mod.__dict__.get(k)
- try:
- hash(tv)
- except TypeError:
- tv = None
- if tv in self.always_from_toolz:
- module.__dict__[k] = tv
- elif (
- isinstance(v, types.ModuleType)
- and v.__package__ == fast_mod.__name__
- ):
- package, dot, submodules = v.__name__.partition('.')
- module_name = ''.join(['tlz', dot, submodules])
- submodule = import_module(module_name)
- module.__dict__[k] = submodule
- class TlzSpec(object):
- def __init__(self, name, loader):
- self.name = name
- self.loader = loader
- self.origin = None
- self.submodule_search_locations = []
- self.loader_state = None
- self.cached = None
- self.parent = None
- self.has_location = False
- tlz_loader = TlzLoader()
- sys.meta_path.append(tlz_loader)
- tlz_loader.exec_module(sys.modules['tlz'])
|