diff --git a/mypy_stubs/typing_inspect/__init__.pyi b/mypy_stubs/typing_inspect/__init__.pyi index ac043787..a868926f 100644 --- a/mypy_stubs/typing_inspect/__init__.pyi +++ b/mypy_stubs/typing_inspect/__init__.pyi @@ -1,4 +1,5 @@ import typing as t def is_optional_type(typ: t.Any) -> bool: ... +def is_typevar(typ: t.Any) -> bool: ... def get_args(typ: t.Any) -> tuple: ... diff --git a/src/saturn_engine/utils/config.py b/src/saturn_engine/utils/config.py index 044997ba..11a2337e 100644 --- a/src/saturn_engine/utils/config.py +++ b/src/saturn_engine/utils/config.py @@ -11,6 +11,8 @@ from collections.abc import Mapping from enum import Enum +import typing_inspect + from . import CINamespace from .inspect import eval_class_annotations from .inspect import import_name @@ -55,7 +57,7 @@ def load_envvar(self: TConfig, envvar: str) -> TConfig: """Load an object from a path stored in an environment variable.""" return self.load_object(os.environ.get(envvar)) - def register_interface(self: TConfig, namespace: str, interface: Type) -> TConfig: + def register_interface(self: TConfig, namespace: str, interface: Any) -> TConfig: """Add an interface to the config under namespace. Interfaces are used to validate config keys and values. @@ -252,6 +254,9 @@ def check_type(obj: Any, typ: Any, scope: Any) -> bool: if typ is float: return isinstance(obj, (float, int)) + if typing_inspect.is_typevar(typ): + return True + if not isinstance(obj, typ): return False diff --git a/src/saturn_engine/worker/services/manager.py b/src/saturn_engine/worker/services/manager.py index c08b3a58..4169830e 100644 --- a/src/saturn_engine/worker/services/manager.py +++ b/src/saturn_engine/worker/services/manager.py @@ -17,6 +17,7 @@ class ServicesManager: def __init__(self, config: Config) -> None: self.strict = config.c.services_manager.strict_services + config = config.register_interface(Hooks.name, Hooks.Options()) self.services: Services = ServicesNamespace( config=config, hooks=Hooks.from_options(config.r.get("hooks", {})),