use dynamically created RUNNER_DICT
This commit is contained in:
parent
7ac62a6e80
commit
be25b7e849
4 changed files with 35 additions and 54 deletions
|
|
@ -1,3 +1,5 @@
|
|||
import importlib
|
||||
import re
|
||||
from pathlib import Path
|
||||
|
||||
from loguru import logger
|
||||
|
|
@ -6,8 +8,6 @@ from abratest.dir_manager import DirManager
|
|||
from abratest.env_manager import EnvFile, EnvManager
|
||||
from abratest.html_helper import merge_html_files
|
||||
from abratest.runner import Runner
|
||||
from abratest.runner_dict import RUNNER_DICT
|
||||
from abratest.runner_manager import RunnerManager
|
||||
from abratest.utils import rmtree
|
||||
|
||||
|
||||
|
|
@ -19,9 +19,9 @@ class Coordinator:
|
|||
out_string += f"session_id = {session_id}"
|
||||
logger.info(f"initialize Coordinator instance with\nenv_paths_list =\n{out_string}")
|
||||
|
||||
self.RUNNER_DICT = self.create_runner_dict(recipes_dir)
|
||||
self.DIR = DirManager(output_dir=output_dir, session_id=session_id, recipes_dir=recipes_dir)
|
||||
self.ENV = EnvManager(env_paths_list)
|
||||
runner_manager = RunnerManager(recipes_dir)
|
||||
self.ENV = EnvManager(env_paths_list, self.RUNNER_DICT)
|
||||
|
||||
def setup_test(self) -> None:
|
||||
logger.info("calling setup_test()")
|
||||
|
|
@ -43,10 +43,10 @@ class Coordinator:
|
|||
"""Creates an instance of the correct Runner class for each given env file"""
|
||||
runners: list[Runner] = []
|
||||
for env_file in env_files:
|
||||
RunnerClass = RUNNER_DICT[env_file.config["TYPE"]]
|
||||
RunnerClass = self.RUNNER_DICT[env_file.config["TYPE"]]
|
||||
dependency_classes: list[type[Runner]] = []
|
||||
for dependency in RunnerClass.dependencies:
|
||||
dependency_classes.append(RUNNER_DICT[dependency])
|
||||
dependency_classes.append(self.RUNNER_DICT[dependency])
|
||||
runner_instance = RunnerClass(dotenv_path=env_file.env_path, DIR=self.DIR)
|
||||
runner_instance._dependency_runners = dependency_classes
|
||||
runners.append(runner_instance)
|
||||
|
|
@ -81,3 +81,28 @@ class Coordinator:
|
|||
new_path = get_new_path(self.DIR.RECORDS, f.parent.name)
|
||||
f.parent.rename(new_path)
|
||||
rmtree(trace_root_dir)
|
||||
|
||||
@staticmethod
|
||||
def create_runner_dict(recipes_dir: Path) -> dict[str, type["Runner"]]:
|
||||
"""Creates a dictionary holding all the RunnerClasses that can be discovered in recipes_dir
|
||||
|
||||
example:
|
||||
RUNNER_DICT: dict[str, type["Runner"]] = {
|
||||
"authentik": RunnerAuthentik,
|
||||
"wordpress": RunnerWordpress,
|
||||
"nextcloud": RunnerNextcloud,
|
||||
}
|
||||
"""
|
||||
|
||||
RUNNER_DICT: dict[str, type["Runner"]] = dict()
|
||||
runner_discovery_pattern = re.compile("Runner.+")
|
||||
|
||||
for module_path in recipes_dir.rglob("*/runner*.py"):
|
||||
rel_path = module_path.relative_to(recipes_dir).as_posix().replace("/", ".").replace(".py", "")
|
||||
module = importlib.import_module(rel_path)
|
||||
runner_class_names = [name for name in dir(module) if runner_discovery_pattern.match(name)]
|
||||
assert len(runner_class_names) == 1
|
||||
runner_class_name = runner_class_names[0]
|
||||
RunnerClass: type[Runner] = getattr(module, runner_class_name)
|
||||
RUNNER_DICT[RunnerClass.name] = RunnerClass
|
||||
return RUNNER_DICT
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ from typing import NamedTuple
|
|||
from dotenv import dotenv_values
|
||||
|
||||
from abratest.dir_manager import DirManager
|
||||
from abratest.runner_dict import RUNNER_DICT
|
||||
from abratest.runner import Runner
|
||||
|
||||
|
||||
class EnvFile(NamedTuple):
|
||||
|
|
@ -23,9 +23,9 @@ class DependencyRule(NamedTuple):
|
|||
|
||||
|
||||
class EnvManager:
|
||||
def __init__(self, env_paths_list: list[Path]):
|
||||
def __init__(self, env_paths_list: list[Path], RUNNER_DICT: dict[str, type["Runner"]]):
|
||||
self.env_files: list[EnvFile] = self._get_env_files(env_paths_list)
|
||||
self.dependency_rules: list[DependencyRule] = self._get_dependency_rules(self.env_files)
|
||||
self.dependency_rules: list[DependencyRule] = self._get_dependency_rules(self.env_files, RUNNER_DICT)
|
||||
self.env_files = self.sort_env_files_by_rule(self.env_files, self.dependency_rules)
|
||||
|
||||
@staticmethod
|
||||
|
|
@ -41,7 +41,7 @@ class EnvManager:
|
|||
return env_files
|
||||
|
||||
@staticmethod
|
||||
def _get_dependency_rules(env_files: list[EnvFile]) -> list[DependencyRule]:
|
||||
def _get_dependency_rules(env_files: list[EnvFile], RUNNER_DICT: dict[str, type["Runner"]]) -> list[DependencyRule]:
|
||||
dependency_rules: list[DependencyRule] = []
|
||||
for env_file in env_files:
|
||||
child_runner_class = RUNNER_DICT[env_file.env_type]
|
||||
|
|
|
|||
|
|
@ -1,16 +0,0 @@
|
|||
from typing import TYPE_CHECKING
|
||||
|
||||
from authentik.tests_authentik.runner_authentik import RunnerAuthentik
|
||||
from nextcloud.tests_nextcloud.runner_nextcloud import RunnerNextcloud
|
||||
from wordpress.tests_wordpress.runner_wordpress import RunnerWordpress
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from abratest.runner import Runner
|
||||
|
||||
# Register all runners here. Each .env file with TYPE=authentik will be run with RunnerAuthentik
|
||||
|
||||
RUNNER_DICT: dict[str, type["Runner"]] = {
|
||||
"authentik": RunnerAuthentik,
|
||||
"wordpress": RunnerWordpress,
|
||||
"nextcloud": RunnerNextcloud,
|
||||
}
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
# should replace static RUNNER_DICT
|
||||
|
||||
import importlib
|
||||
import re
|
||||
from pathlib import Path
|
||||
|
||||
from icecream import ic
|
||||
|
||||
from abratest.runner import Runner
|
||||
|
||||
PATTERN = re.compile("Runner.+")
|
||||
|
||||
|
||||
class RunnerManager:
|
||||
def __init__(self, recipes_dir: Path):
|
||||
RUNNER_DICT_NEW = dict()
|
||||
|
||||
for module_path in recipes_dir.rglob("*/runner*.py"):
|
||||
rel_path = module_path.relative_to(recipes_dir).as_posix().replace("/", ".").replace(".py", "")
|
||||
ic(rel_path)
|
||||
module = importlib.import_module(rel_path)
|
||||
runner_class_names = [name for name in dir(module) if PATTERN.match(name)]
|
||||
assert len(runner_class_names) == 1
|
||||
runner_class_name = runner_class_names[0]
|
||||
RunnerClass: type[Runner] = getattr(module, runner_class_name)
|
||||
RUNNER_DICT_NEW[RunnerClass.name] = RunnerClass
|
||||
print(RUNNER_DICT_NEW)
|
||||
exit()
|
||||
Loading…
Add table
Add a link
Reference in a new issue