remove RunnerMeta, save path to class var instead

This commit is contained in:
Daniel 2023-12-11 00:00:16 +01:00
parent 7ec75cd6a0
commit edc8c9a2f5
3 changed files with 12 additions and 19 deletions

View file

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

View file

@ -5,7 +5,6 @@ from typing import TYPE_CHECKING, NamedTuple
from dotenv import dotenv_values from dotenv import dotenv_values
if TYPE_CHECKING: if TYPE_CHECKING:
from pytest_abra.coordinator import RunnerMeta
from pytest_abra.dir_manager import DirManager from pytest_abra.dir_manager import DirManager
from pytest_abra.runner import Runner from pytest_abra.runner import Runner
@ -25,7 +24,7 @@ class DependencyRule(NamedTuple):
class EnvManager: class EnvManager:
def __init__(self, env_paths: list[Path], RUNNER_DICT: dict[str, "RunnerMeta"]): def __init__(self, env_paths: list[Path], RUNNER_DICT: dict[str, type[Runner]]):
self.env_files: list[EnvFile] = self._get_env_files(env_paths) self.env_files: list[EnvFile] = self._get_env_files(env_paths)
self.dependency_rules: list[DependencyRule] = self._get_dependency_rules(self.env_files, RUNNER_DICT) 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) self.env_files = self.sort_env_files_by_rule(self.env_files, self.dependency_rules)
@ -43,10 +42,10 @@ class EnvManager:
return env_files return env_files
@staticmethod @staticmethod
def _get_dependency_rules(env_files: list[EnvFile], RUNNER_DICT: dict[str, "RunnerMeta"]) -> list[DependencyRule]: def _get_dependency_rules(env_files: list[EnvFile], RUNNER_DICT: dict[str, type[Runner]]) -> list[DependencyRule]:
dependency_rules: list[DependencyRule] = [] dependency_rules: list[DependencyRule] = []
for env_file in env_files: for env_file in env_files:
child_runner_class = RUNNER_DICT[env_file.env_type].cls child_runner_class = RUNNER_DICT[env_file.env_type]
for dependency in child_runner_class.dependencies: for dependency in child_runner_class.dependencies:
dependency_rule = DependencyRule(child=child_runner_class.env_type, dependency=dependency) dependency_rule = DependencyRule(child=child_runner_class.env_type, dependency=dependency)
dependency_rules.append(dependency_rule) dependency_rules.append(dependency_rule)

View file

@ -1,7 +1,7 @@
import os import os
from dataclasses import dataclass from dataclasses import dataclass
from pathlib import Path from pathlib import Path
from typing import TYPE_CHECKING, Callable, NamedTuple from typing import TYPE_CHECKING, Callable, NamedTuple, Optional
import pytest import pytest
from loguru import logger from loguru import logger
@ -31,11 +31,11 @@ class Runner:
tests: list[Test] = [] tests: list[Test] = []
cleanups: list[Test] = [] cleanups: list[Test] = []
dependencies: list[str] = [] dependencies: list[str] = []
_tests_path: Optional[Path] = None
def __init__(self, coordinator: "Coordinator", runner_index: int, runner_dir: Path): def __init__(self, coordinator: "Coordinator", runner_index: int):
self.coordinator = coordinator self.coordinator = coordinator
self.runner_index = runner_index self.runner_index = runner_index
self.runner_dir = runner_dir
self.DIR = coordinator.DIR self.DIR = coordinator.DIR
self.ENV = coordinator.ENV self.ENV = coordinator.ENV