1111from collections .abc import Mapping
1212from dataclasses import dataclass
1313from pathlib import Path
14- from typing import Annotated , Final , NamedTuple , final
14+ from typing import Annotated , Any , Final , NamedTuple , final
1515from typing_extensions import TypeGuard
1616
1717import tomli
@@ -42,6 +42,10 @@ def _is_list_of_strings(obj: object) -> TypeGuard[list[str]]:
4242 return isinstance (obj , list ) and all (isinstance (item , str ) for item in obj )
4343
4444
45+ def _is_nested_dict (obj : object ) -> TypeGuard [dict [str , dict [str , Any ]]]:
46+ return isinstance (obj , dict ) and all (isinstance (k , str ) and isinstance (v , dict ) for k , v in obj .items ())
47+
48+
4549@functools .cache
4650def _get_oldest_supported_python () -> str :
4751 with PYPROJECT_PATH .open ("rb" ) as config :
@@ -71,6 +75,8 @@ class StubtestSettings:
7175 ignore_missing_stub : bool
7276 platforms : list [str ]
7377 stubtest_requirements : list [str ]
78+ mypy_plugins : list [str ]
79+ mypy_plugins_config : dict [str , dict [str , Any ]]
7480
7581 def system_requirements_for_platform (self , platform : str ) -> list [str ]:
7682 assert platform in _STUBTEST_PLATFORM_MAPPING , f"Unrecognised platform { platform !r} "
@@ -93,6 +99,8 @@ def read_stubtest_settings(distribution: str) -> StubtestSettings:
9399 ignore_missing_stub : object = data .get ("ignore_missing_stub" , False )
94100 specified_platforms : object = data .get ("platforms" , ["linux" ])
95101 stubtest_requirements : object = data .get ("stubtest_requirements" , [])
102+ mypy_plugins : object = data .get ("mypy_plugins" , [])
103+ mypy_plugins_config : object = data .get ("mypy_plugins_config" , {})
96104
97105 assert type (skip ) is bool
98106 assert type (ignore_missing_stub ) is bool
@@ -104,6 +112,8 @@ def read_stubtest_settings(distribution: str) -> StubtestSettings:
104112 assert _is_list_of_strings (choco_dependencies )
105113 assert _is_list_of_strings (extras )
106114 assert _is_list_of_strings (stubtest_requirements )
115+ assert _is_list_of_strings (mypy_plugins )
116+ assert _is_nested_dict (mypy_plugins_config )
107117
108118 unrecognised_platforms = set (specified_platforms ) - _STUBTEST_PLATFORM_MAPPING .keys ()
109119 assert not unrecognised_platforms , f"Unrecognised platforms specified for { distribution !r} : { unrecognised_platforms } "
@@ -124,6 +134,8 @@ def read_stubtest_settings(distribution: str) -> StubtestSettings:
124134 ignore_missing_stub = ignore_missing_stub ,
125135 platforms = specified_platforms ,
126136 stubtest_requirements = stubtest_requirements ,
137+ mypy_plugins = mypy_plugins ,
138+ mypy_plugins_config = mypy_plugins_config ,
127139 )
128140
129141
@@ -179,6 +191,8 @@ def is_obsolete(self) -> bool:
179191 "ignore_missing_stub" ,
180192 "platforms" ,
181193 "stubtest_requirements" ,
194+ "mypy_plugins" ,
195+ "mypy_plugins_config" ,
182196 }
183197}
184198_DIST_NAME_RE : Final = re .compile (r"^[a-z0-9]([a-z0-9._-]*[a-z0-9])?$" , re .IGNORECASE )
0 commit comments