diff --git a/python/online/fxreader/pr34/commands_typed/cli_bootstrap.py b/python/online/fxreader/pr34/commands_typed/cli_bootstrap.py index c114649..44304ef 100644 --- a/python/online/fxreader/pr34/commands_typed/cli_bootstrap.py +++ b/python/online/fxreader/pr34/commands_typed/cli_bootstrap.py @@ -13,7 +13,7 @@ import logging from typing import (Optional, Any, cast, Type, TypeVar,) from typing_extensions import ( - Self, BinaryIO, + Self, BinaryIO, overload, ) logger = logging.getLogger(__name__) @@ -61,21 +61,45 @@ class PyProject: Key = TypeVar('Key') Value = TypeVar('Value') +@overload def check_dict( value: Any, KT: Type[Key], VT: Type[Value], +) -> dict[Key, Value]: ... + +@overload +def check_dict( + value: Any, + KT: Type[Key], +) -> dict[Key, Any]: ... + +def check_dict( + value: Any, + KT: Type[Key], + VT: Optional[Type[Value]] = None, ) -> dict[Key, Value]: assert isinstance(value, dict) value2 = cast(dict[Any, Any], value) + assert all([ - isinstance(k, KT) and isinstance(v, VT) + isinstance(k, KT) and ( + VT is None or + isinstance(v, VT) + ) for k, v in value2.items() ]) - return cast( - dict[Key, Value], - value, - ) + + if VT is None: + return cast( + dict[Key, Any], + value, + ) + else: + return cast( + dict[Key, Value], + value, + ) def pyproject_load( d: pathlib.Path, @@ -97,9 +121,21 @@ def pyproject_load( dict ) - for k, v in content['project']['optional-dependencies'].items(): - assert isinstance(v, list) - assert isinstance(k, str) + for k, v in check_dict( + check_dict( + check_dict( + content, + str, + # Any, + )['project'], + str, + # Any, + )['optional-dependencies'], + str, + list[Any], + ).items(): + # assert isinstance(v, list) + # assert isinstance(k, str) dependencies[k] = v