Skip to content

Instantly share code, notes, and snippets.

@ulope
Created February 4, 2016 14:26
Show Gist options
  • Save ulope/224cdc803797ba802341 to your computer and use it in GitHub Desktop.
Save ulope/224cdc803797ba802341 to your computer and use it in GitHub Desktop.
Dynamically generate a setuptools / pkg_resources entry point
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