示例#1
0
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')
示例#2
0
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",
            )
        ],
    }
示例#3
0
 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
             )
示例#4
0
    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__]
示例#5
0
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'
示例#6
0
    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__]
示例#7
0
 def __init__(self, *args):
     super(TestEntryPoints, self).__init__(*args)
     self.ep = importlib_metadata.EntryPoint('name', 'value', 'group')
示例#8
0
    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",
        )
    ],
示例#9
0
    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__]
示例#10
0
 def __init__(self, *args):
     super(TestEntryPoints, self).__init__(*args)
     self.ep = importlib_metadata.EntryPoint("name", "value", "group")
示例#11
0
 def __init__(self, *args):
     super().__init__(*args)
     self.ep = importlib_metadata.EntryPoint(name='name',
                                             value='value',
                                             group='group')
示例#12
0
    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(