Use RunnerMeta to save path along with Runner subclass

This commit is contained in:
Daniel 2023-12-10 23:53:49 +01:00
parent 4f8bceb587
commit 7ec75cd6a0
3 changed files with 21 additions and 20 deletions

View file

@ -2,6 +2,7 @@ import importlib
import re
import sys
from pathlib import Path
from typing import NamedTuple
from loguru import logger
@ -12,6 +13,11 @@ from pytest_abra.runner import Runner
from pytest_abra.utils import rmtree
class RunnerMeta(NamedTuple):
cls: type[Runner]
path: Path
class Coordinator:
def __init__(
self,
@ -54,8 +60,9 @@ class Coordinator:
"""Creates an instance of the correct Runner class for each given env file"""
runners: list[Runner] = []
for index, env_file in enumerate(env_files):
RunnerClass = self.RUNNER_DICT[env_file.env_config["TYPE"]]
runners.append(RunnerClass(coordinator=self, runner_index=index))
meta = self.RUNNER_DICT[env_file.env_config["TYPE"]]
RunnerClass = meta.cls
runners.append(RunnerClass(coordinator=self, runner_index=index, runner_dir=meta.path))
return runners
def combine_html(self) -> None:
@ -89,21 +96,14 @@ class Coordinator:
rmtree(trace_root_dir)
@staticmethod
def create_runner_dict(recipes_dir: Path) -> dict[str, type["Runner"]]:
def create_runner_dict(recipes_dir: Path) -> dict[str, RunnerMeta]:
"""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,
}
The Runner classes are automatically imported with importlib. The imports are successful
because recipes_dir is added to sys.path.
"""
RUNNER_DICT: dict[str, type["Runner"]] = dict()
RUNNER_DICT: dict[str, RunnerMeta] = dict()
runner_discovery_pattern = re.compile("Runner.+")
# make it possible to import modules from recipes_dir
@ -116,5 +116,5 @@ class Coordinator:
assert len(runner_class_names) == 1
runner_class_name = runner_class_names[0]
RunnerClass: type[Runner] = getattr(module, runner_class_name)
RUNNER_DICT[RunnerClass.env_type] = RunnerClass
RUNNER_DICT[RunnerClass.env_type] = RunnerMeta(cls=RunnerClass, path=module_path)
return RUNNER_DICT