def test_plugin_load_entry_point(tmpdir): root = tmpdir.mkdir('loader_mods') mod_file = root.join('file_mod.py') mod_file.write(MOCK_MODULE_CONTENT) # set up for manual load/import sys.path.append(root.strpath) # load the entry point try: entry_point = importlib_metadata.EntryPoint('test_plugin', 'file_mod', 'sopel.plugins') plugin = plugins.handlers.EntryPointPlugin(entry_point) plugin.load() finally: sys.path.remove(root.strpath) assert plugin.name == 'test_plugin' test_mod = plugin._module assert hasattr(test_mod, 'first_command') assert hasattr(test_mod, 'second_command') assert hasattr(test_mod, 'interval5s') assert hasattr(test_mod, 'interval10s') assert hasattr(test_mod, 'example_url') assert hasattr(test_mod, 'shutdown') assert hasattr(test_mod, 'ignored')
def default_plugins() -> "Dict[str,List[importlib_metadata.EntryPoint]]": import importlib_metadata # delayed heavy import return { "file_download": [ importlib_metadata.EntryPoint( group="miniwdl.plugin.file_download", name="s3", value="WDL.runtime.download:awscli_downloader", ), importlib_metadata.EntryPoint( group="miniwdl.plugin.file_download", name="gs", value="WDL.runtime.download:gsutil_downloader", ), ], "directory_download": [ importlib_metadata.EntryPoint( group="miniwdl.plugin.directory_download", name="s3", value="WDL.runtime.download:awscli_directory_downloader", ) ], "task": [], "workflow": [], "container_backend": [ importlib_metadata.EntryPoint( group="miniwdl.plugin.container_backend", name="docker_swarm", value="WDL.runtime.backend.docker_swarm:SwarmContainer", ), importlib_metadata.EntryPoint( group="miniwdl.plugin.container_backend", name="singularity", value="WDL.runtime.backend.singularity:SingularityContainer", ), importlib_metadata.EntryPoint( group="miniwdl.plugin.container_backend", name="podman", value="WDL.runtime.backend.podman:PodmanContainer", ), importlib_metadata.EntryPoint( group="miniwdl.plugin.container_backend", name="udocker", value="WDL.runtime.backend.udocker:UdockerContainer", ), ], "cache_backend": [ importlib_metadata.EntryPoint( group="miniwdl.plugin.cache_backend", name="dir", value="WDL.runtime.cache:CallCache", ) ], }
def entry_points(self): """Iterate over entry points.""" for group, eps_lines in self._entry_points.items(): for ep_line in eps_lines: name, value = ep_line.split('=', maxsplit=1) yield importlib_metadata.EntryPoint( # strip possible white space due to split on "=" name=name.strip(), value=value.strip(), group=group )
def test_entrypoint_tolerance(self): # loosely based on Pandas test from: # https://github.com/pandas-dev/pandas/pull/27488 mod = mock.Mock(__name__='_test_numba_bad_extension') mod.configure_mock(**{'init_func.side_effect': ValueError('broken')}) try: # will remove this module at the end of the test sys.modules[mod.__name__] = mod my_entrypoint = importlib_metadata.EntryPoint( 'init', '_test_numba_bad_extension:init_func', 'numba_extensions', ) with mock.patch.object( importlib_metadata, 'entry_points', return_value={'numba_extensions': (my_entrypoint, )}, ): from numba.core import entrypoints # Allow reinitialization entrypoints._already_initialized = False with warnings.catch_warnings(record=True) as w: entrypoints.init_all() bad_str = "Numba extension module '_test_numba_bad_extension'" for x in w: if bad_str in str(x): break else: raise ValueError("Expected warning message not found") # was our init function called? mod.init_func.assert_called_once() finally: # remove fake module if mod.__name__ in sys.modules: del sys.modules[mod.__name__]
def test_get_label_entrypoint(plugin_tmpfile): # set up for manual load/import distrib_dir = os.path.dirname(plugin_tmpfile.strpath) sys.path.append(distrib_dir) # load the entry point try: entry_point = importlib_metadata.EntryPoint('test_plugin', 'file_mod', 'sopel.plugins') plugin = handlers.EntryPointPlugin(entry_point) plugin.load() finally: sys.path.remove(distrib_dir) meta = plugin.get_meta_description() assert meta['name'] == 'test_plugin' assert meta['label'] == 'plugin label' assert meta['type'] == handlers.EntryPointPlugin.PLUGIN_TYPE assert meta['source'] == 'test_plugin = file_mod'
def test_init_entrypoint(self): # loosely based on Pandas test from: # https://github.com/pandas-dev/pandas/pull/27488 mod = mock.Mock(__name__='_test_numba_extension') try: # will remove this module at the end of the test sys.modules[mod.__name__] = mod my_entrypoint = importlib_metadata.EntryPoint( 'init', '_test_numba_extension:init_func', 'numba_extensions', ) with mock.patch.object( importlib_metadata, 'entry_points', return_value={'numba_extensions': (my_entrypoint, )}, ): from numba.core import entrypoints # Allow reinitialization entrypoints._already_initialized = False entrypoints.init_all() # was our init function called? mod.init_func.assert_called_once() # ensure we do not initialize twice entrypoints.init_all() mod.init_func.assert_called_once() finally: # remove fake module if mod.__name__ in sys.modules: del sys.modules[mod.__name__]
def __init__(self, *args): super(TestEntryPoints, self).__init__(*args) self.ep = importlib_metadata.EntryPoint('name', 'value', 'group')
ans = json.loads(v) assert isinstance(ans, dict) return ans def _parse_list(v: str) -> List[Any]: ans = json.loads(v) assert isinstance(ans, list) return ans DEFAULT_PLUGINS = { "file_download": [ importlib_metadata.EntryPoint( group="miniwdl.plugin.file_download", name="s3", value="WDL.runtime.download:awscli_downloader", ), importlib_metadata.EntryPoint( group="miniwdl.plugin.file_download", name="gs", value="WDL.runtime.download:gsutil_downloader", ), ], "directory_download": [ importlib_metadata.EntryPoint( group="miniwdl.plugin.directory_download", name="s3", value="WDL.runtime.download:awscli_directory_downloader", ) ],
def test_entrypoint_handles_type_extensions(self): # loosely based on Pandas test from: # https://github.com/pandas-dev/pandas/pull/27488 import numba def init_function(): # This init function would normally just call a module init via # import or similar, for the sake of testing, inline registration # of how to handle the global "_DummyClass". class DummyType(numba.types.Type): def __init__(self): super(DummyType, self).__init__(name='DummyType') @numba.extending.typeof_impl.register(_DummyClass) def typer_DummyClass(val, c): return DummyType() @numba.extending.register_model(DummyType) class DummyModel(numba.extending.models.StructModel): def __init__(self, dmm, fe_type): members = [ ('value', numba.types.float64), ] super(DummyModel, self).__init__(dmm, fe_type, members) @numba.extending.unbox(DummyType) def unbox_dummy(typ, obj, c): value_obj = c.pyapi.object_getattr_string(obj, "value") dummy_struct_proxy = numba.core.cgutils.create_struct_proxy( typ) dummy_struct = dummy_struct_proxy(c.context, c.builder) dummy_struct.value = c.pyapi.float_as_double(value_obj) c.pyapi.decref(value_obj) err_flag = c.pyapi.err_occurred() is_error = numba.core.cgutils.is_not_null(c.builder, err_flag) return numba.extending.NativeValue(dummy_struct._getvalue(), is_error=is_error) @numba.extending.box(DummyType) def box_dummy(typ, val, c): dummy_struct_proxy = numba.core.cgutils.create_struct_proxy( typ) dummy_struct = dummy_struct_proxy(c.context, c.builder) value_obj = c.pyapi.float_from_double(dummy_struct.value) serialized_clazz = c.pyapi.serialize_object(_DummyClass) class_obj = c.pyapi.unserialize(serialized_clazz) res = c.pyapi.call_function_objargs(class_obj, (value_obj, )) c.pyapi.decref(value_obj) c.pyapi.decref(class_obj) return res mod = types.ModuleType("_test_numba_init_sequence") mod.init_func = init_function try: # will remove this module at the end of the test sys.modules[mod.__name__] = mod my_entrypoint = importlib_metadata.EntryPoint( 'init', '_test_numba_init_sequence:init_func', 'numba_extensions', ) with mock.patch.object( importlib_metadata, 'entry_points', return_value={'numba_extensions': (my_entrypoint, )}, ): @njit def foo(x): return x ival = _DummyClass(10) foo(ival) finally: # remove fake module if mod.__name__ in sys.modules: del sys.modules[mod.__name__]
def __init__(self, *args): super(TestEntryPoints, self).__init__(*args) self.ep = importlib_metadata.EntryPoint("name", "value", "group")
def __init__(self, *args): super().__init__(*args) self.ep = importlib_metadata.EntryPoint(name='name', value='value', group='group')
ans = json.loads(v) assert isinstance(ans, dict) return ans def _parse_list(v: str) -> List[Any]: ans = json.loads(v) assert isinstance(ans, list) return ans DEFAULT_PLUGINS = { "file_download": [ importlib_metadata.EntryPoint( group="miniwdl.plugin.file_download", name="gs", value="WDL.runtime.download:gsutil_downloader", ) ], "task": [], "workflow": [], } def load_all_plugins(cfg: Loader, group: str) -> Iterable[Tuple[bool, Any]]: assert group in DEFAULT_PLUGINS.keys(), group enable_patterns = cfg["plugins"].get_list("enable_patterns") disable_patterns = cfg["plugins"].get_list("disable_patterns") for plugin in importlib_metadata.entry_points().get( f"miniwdl.plugin.{group}", DEFAULT_PLUGINS[group]): enabled = next(