From e3c232e2cff405aa62b3b730ebb16fbc0b0ad2d8 Mon Sep 17 00:00:00 2001 From: Tatu Aalto Date: Mon, 10 Jul 2023 14:11:28 +0300 Subject: [PATCH] Add support for list in plugin import Fixes #112 --- src/robotlibcore.py | 20 ++++++++++++++------ utest/test_plugin_api.py | 12 ++++++++++++ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/robotlibcore.py b/src/robotlibcore.py index 4ca647f..341a302 100644 --- a/src/robotlibcore.py +++ b/src/robotlibcore.py @@ -21,7 +21,7 @@ import inspect import os from dataclasses import dataclass -from typing import Any, Callable, List, Optional, get_type_hints +from typing import Any, Callable, List, Optional, Union, get_type_hints from robot.api.deco import keyword # noqa F401 from robot.errors import DataError @@ -304,11 +304,11 @@ def __init__(self, argument_specification=None, documentation=None, argument_typ class PluginParser: - def __init__(self, base_class: Optional[Any] = None, python_object: List[Any] = []): + def __init__(self, base_class: Optional[Any] = None, python_object=None): self._base_class = base_class - self._python_object = python_object + self._python_object = python_object if python_object else [] - def parse_plugins(self, plugins: str) -> List: + def parse_plugins(self, plugins: Union[str, List[str]]) -> List: imported_plugins = [] importer = Importer("test library") for parsed_plugin in self._string_to_modules(plugins): @@ -327,11 +327,11 @@ def parse_plugins(self, plugins: str) -> List: def get_plugin_keywords(self, plugins: List): return DynamicCore(plugins).get_keyword_names() - def _string_to_modules(self, modules): + def _string_to_modules(self, modules: Union[str, List[str]]): parsed_modules: list = [] if not modules: return parsed_modules - for module in modules.split(","): + for module in self._modules_splitter(modules): module = module.strip() module_and_args = module.split(";") module_name = module_and_args.pop(0) @@ -346,3 +346,11 @@ def _string_to_modules(self, modules): module = Module(module=module_name, args=args, kw_args=kw_args) parsed_modules.append(module) return parsed_modules + + def _modules_splitter(self, modules: Union[str, List[str]]): + if isinstance(modules, str): + for module in modules.split(","): + yield module + else: + for module in modules: + yield module diff --git a/utest/test_plugin_api.py b/utest/test_plugin_api.py index 9b6d488..0826fbf 100644 --- a/utest/test_plugin_api.py +++ b/utest/test_plugin_api.py @@ -48,6 +48,18 @@ def test_parse_plugins(plugin_parser): assert isinstance(plugins[1], my_plugin_test.TestClassWithBase) +def test_parse_plugins_as_list(plugin_parser): + plugins = plugin_parser.parse_plugins(["my_plugin_test.TestClass"]) + assert len(plugins) == 1 + assert isinstance(plugins[0], my_plugin_test.TestClass) + plugins = plugin_parser.parse_plugins( + ["my_plugin_test.TestClass", "my_plugin_test.TestClassWithBase"] + ) + assert len(plugins) == 2 + assert isinstance(plugins[0], my_plugin_test.TestClass) + assert isinstance(plugins[1], my_plugin_test.TestClassWithBase) + + def test_parse_plugins_with_base(): parser = PluginParser(my_plugin_test.LibraryBase) plugins = parser.parse_plugins("my_plugin_test.TestClassWithBase")