11import dataclasses
2- from collections .abc import Iterator , Mapping
32from pathlib import Path
4- from typing import Any , Dict , List , Literal , Optional , Union
3+ from typing import Any , Dict , List , Literal , Optional , TypedDict , Union
54
65from packaging .specifiers import SpecifierSet
76from packaging .version import Version
2221 "SDistSettings" ,
2322 "ScikitBuildSettings" ,
2423 "SearchSettings" ,
24+ "SettingsFieldMetadata" ,
2525 "WheelSettings" ,
2626]
2727
@@ -30,27 +30,26 @@ def __dir__() -> List[str]:
3030 return __all__
3131
3232
33- @dataclasses .dataclass
34- class SettingsFieldMetadata (Mapping ): # type: ignore[type-arg]
35- """
36- Convenience dataclass to store field metadata for documentation.
37- """
38-
39- display_default : Optional [str ] = None
40- deprecated : bool = False
33+ class SettingsFieldMetadataInner (TypedDict ):
34+ display_default : Optional [str ]
35+ deprecated : bool
4136
42- def __contains__ (self , key : Any ) -> bool :
43- return any (key == field .name for field in dataclasses .fields (self ))
4437
45- def __getitem__ ( self , key : str ) -> Any :
46- return getattr ( self , key )
38+ class SettingsFieldMetadata ( TypedDict , total = False ) :
39+ skbuild : SettingsFieldMetadataInner
4740
48- def __len__ (self ) -> int :
49- return len (dataclasses .fields (self ))
5041
51- def __iter__ (self ) -> "Iterator[str]" :
52- for field in dataclasses .fields (self ):
53- yield field .name
42+ def mk_metadata (
43+ * , display_default : Optional [str ] = None , deprecated : bool = False
44+ ) -> SettingsFieldMetadata :
45+ """
46+ A helper function to create metadata for a field.
47+ """
48+ return SettingsFieldMetadata (
49+ skbuild = SettingsFieldMetadataInner (
50+ display_default = display_default , deprecated = deprecated
51+ )
52+ )
5453
5554
5655class CMakeSettingsDefine (str ):
@@ -78,7 +77,7 @@ def escape_semicolons(item: str) -> str:
7877@dataclasses .dataclass
7978class CMakeSettings :
8079 minimum_version : Optional [Version ] = dataclasses .field (
81- default = None , metadata = SettingsFieldMetadata (deprecated = True )
80+ default = None , metadata = mk_metadata (deprecated = True )
8281 )
8382 """
8483 DEPRECATED in 0.8; use version instead.
@@ -141,7 +140,7 @@ class SearchSettings:
141140@dataclasses .dataclass
142141class NinjaSettings :
143142 minimum_version : Optional [Version ] = dataclasses .field (
144- default = None , metadata = SettingsFieldMetadata (deprecated = True )
143+ default = None , metadata = mk_metadata (deprecated = True )
145144 )
146145 """
147146 DEPRECATED in 0.8; use version instead.
@@ -204,7 +203,7 @@ class SDistSettings:
204203class WheelSettings :
205204 packages : Optional [Union [List [str ], Dict [str , str ]]] = dataclasses .field (
206205 default = None ,
207- metadata = SettingsFieldMetadata (
206+ metadata = mk_metadata (
208207 display_default = '["src/<package>", "python/<package>", "<package>"]'
209208 ),
210209 )
@@ -334,7 +333,7 @@ class InstallSettings:
334333 """
335334
336335 strip : Optional [bool ] = dataclasses .field (
337- default = None , metadata = SettingsFieldMetadata (display_default = "true" )
336+ default = None , metadata = mk_metadata (display_default = "true" )
338337 )
339338 """
340339 Whether to strip the binaries. True for release builds on scikit-build-core
@@ -419,9 +418,7 @@ class ScikitBuildSettings:
419418
420419 minimum_version : Optional [Version ] = dataclasses .field (
421420 default = None ,
422- metadata = SettingsFieldMetadata (
423- display_default = '"{version}" # current version'
424- ),
421+ metadata = mk_metadata (display_default = '"{version}" # current version' ),
425422 )
426423 """
427424 If set, this will provide a method for backward compatibility.
0 commit comments