Skip to content

Commit ced24cb

Browse files
committed
refactor: use TypedDict
Signed-off-by: Henry Schreiner <[email protected]>
1 parent 30093e6 commit ced24cb

File tree

2 files changed

+29
-39
lines changed

2 files changed

+29
-39
lines changed

src/scikit_build_core/settings/documentation.py

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,18 @@
44
import dataclasses
55
import inspect
66
import textwrap
7+
import typing
78
from pathlib import Path
8-
from typing import TYPE_CHECKING, TypeVar, cast
99

1010
from packaging.specifiers import SpecifierSet
1111
from packaging.version import Version
1212

1313
from .. import __version__
1414
from .._compat.typing import get_args, get_origin
1515

16-
if TYPE_CHECKING:
16+
if typing.TYPE_CHECKING:
1717
from collections.abc import Generator
1818

19-
T = TypeVar("T")
20-
U = TypeVar("U")
21-
2219

2320
__all__ = ["pull_docs"]
2421

@@ -65,12 +62,6 @@ def __str__(self) -> str:
6562
return f"{docs}\n{self.name} = {self.default}\n"
6663

6764

68-
def get_metadata_field(field: dataclasses.Field[U], field_name: str, default: T) -> T:
69-
if field_name in field.metadata:
70-
return cast("T", field.metadata[field_name])
71-
return default
72-
73-
7465
def sanitize_default_field(text: str) -> str:
7566
return text.replace("'", '"').replace("True", "true").replace("False", "false")
7667

@@ -94,7 +85,9 @@ def mk_docs(dc: type[object], prefix: str = "") -> Generator[DCDoc, None, None]:
9485
yield from mk_docs(field_type, prefix=f"{prefix}{field.name}[].")
9586
continue
9687

97-
if default_before_format := get_metadata_field(field, "display_default", None):
88+
if default_before_format := field.metadata.get("skbuild", {}).get(
89+
"display_default", None
90+
):
9891
assert isinstance(default_before_format, str)
9992
default = default_before_format.format(
10093
version=version_display,
@@ -114,5 +107,5 @@ def mk_docs(dc: type[object], prefix: str = "") -> Generator[DCDoc, None, None]:
114107
name=f"{prefix}{field.name}".replace("_", "-"),
115108
default=sanitize_default_field(default),
116109
docs=docs[field.name],
117-
deprecated=get_metadata_field(field, "deprecated", False), # noqa: FBT003
110+
deprecated=field.metadata.get("skbuild", {}).get("deprecated", False),
118111
)

src/scikit_build_core/settings/skbuild_model.py

Lines changed: 23 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import dataclasses
2-
from collections.abc import Iterator, Mapping
32
from 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

65
from packaging.specifiers import SpecifierSet
76
from packaging.version import Version
@@ -22,6 +21,7 @@
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

5655
class CMakeSettingsDefine(str):
@@ -78,7 +77,7 @@ def escape_semicolons(item: str) -> str:
7877
@dataclasses.dataclass
7978
class 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
142141
class 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:
204203
class 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

Comments
 (0)