Created
February 4, 2016 14:26
-
-
Save ulope/224cdc803797ba802341 to your computer and use it in GitHub Desktop.
Dynamically generate a setuptools / pkg_resources entry point
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class FakeModuleFinderLoader(object): | |
def find_module(self, fullname, path=None): | |
if fullname == "fake_module": | |
return self | |
def load_module(self, fullname): | |
mod = sys.modules.setdefault(fullname, imp.new_module(fullname)) | |
mod.__file__ = "<fake_module>" | |
mod.__loader__ = self | |
mod.__package__ = fullname.rpartition('.')[0] | |
# Add attributes here | |
mod.__dict__['keyword_handler'] = lambda: dist, attr, value: print(dist, attr, value) | |
return mod | |
def fake_module_path_hook(path): | |
if path == "_FAKE_": | |
return FakeModuleFinderLoader() | |
class FakeMetadata(pkg_resources.EmptyProvider): | |
def has_metadata(self, name): | |
return name in ('PKG-INFO', 'entry_points.txt') | |
def get_metadata(self, name): | |
print("get_metadata", name) | |
if name == 'PKG-INFO': | |
return textwrap.dedent("""\ | |
Metadata-Version: 1.1 | |
Name: fake-package | |
Version: 1.0.0 | |
""") | |
elif name == 'entry_points.txt': | |
return textwrap.dedent("""\ | |
[distutils.setup_keywords] | |
keyword = fake_module:keyword_handler | |
""") | |
raise KeyError("No metadata except PKG-INFO and entry_points.txt is available") | |
def get_metadata_lines(self, name): | |
return pkg_resources.yield_lines(self.get_metadata(name)) | |
def fake_adapter(importer, path_item, only=False): | |
yield pkg_resources.Distribution(path_item, metadata=FakeMetadata()) | |
pkg_resources.register_finder(FakeModuleFinderLoader, fake_adapter) | |
sys.path_hooks.append(fake_module_path_hook) | |
pkg_resources.working_set.add_entry('_FAKE_') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment