Skip to content

Commit 400158b

Browse files
committed
Refactor DCDoc usage
- Moved default text handling to a separate function - Prepare to read metadata fields from dataclasses.Field.metadata - Added a dataclass holder for the dataclass field metadata for documentation Signed-off-by: Cristian Le <[email protected]>
1 parent 4193c40 commit 400158b

File tree

2 files changed

+39
-4
lines changed

2 files changed

+39
-4
lines changed

src/scikit_build_core/settings/documentation.py

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

1010
from packaging.specifiers import SpecifierSet
1111
from packaging.version import Version
@@ -15,6 +15,10 @@
1515
if TYPE_CHECKING:
1616
from collections.abc import Generator
1717

18+
T = TypeVar("T")
19+
U = TypeVar("U")
20+
21+
1822
__all__ = ["pull_docs"]
1923

2024

@@ -56,6 +60,19 @@ def __str__(self) -> str:
5660
return f"{docs}\n{self.name} = {self.default}\n"
5761

5862

63+
def get_metadata_field(field: dataclasses.Field[U], field_name: str, default: T) -> T:
64+
if field_name in field.metadata:
65+
return cast("T", field.metadata[field_name])
66+
return default
67+
68+
69+
def sanitize_default_field(text: str) -> str:
70+
text = text.replace("'", '"')
71+
text = text.replace("True", "true")
72+
text = text.replace("False", "false")
73+
return text # noqa: RET504
74+
75+
5976
def mk_docs(dc: type[object], prefix: str = "") -> Generator[DCDoc, None, None]:
6077
"""
6178
Makes documentation for a dataclass.
@@ -87,7 +104,7 @@ def mk_docs(dc: type[object], prefix: str = "") -> Generator[DCDoc, None, None]:
87104
default = '""'
88105

89106
yield DCDoc(
90-
f"{prefix}{field.name}".replace("_", "-"),
91-
default.replace("'", '"').replace("True", "true").replace("False", "false"),
92-
docs[field.name],
107+
name=f"{prefix}{field.name}".replace("_", "-"),
108+
default=sanitize_default_field(default),
109+
docs=docs[field.name],
93110
)

src/scikit_build_core/settings/skbuild_model.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import dataclasses
2+
from collections.abc import Iterator, Mapping
23
from pathlib import Path
34
from typing import Any, Dict, List, Literal, Optional, Union
45

@@ -29,6 +30,23 @@ def __dir__() -> List[str]:
2930
return __all__
3031

3132

33+
@dataclasses.dataclass
34+
class SettingsFieldMetadata(Mapping[str, Any]):
35+
"""
36+
Convenience dataclass to store field metadata for documentation.
37+
"""
38+
39+
def __getitem__(self, key: str) -> Any:
40+
return getattr(self, key)
41+
42+
def __len__(self) -> int:
43+
return len(dataclasses.fields(self))
44+
45+
def __iter__(self) -> Iterator[str]:
46+
for field in dataclasses.fields(self):
47+
yield field.name
48+
49+
3250
class CMakeSettingsDefine(str):
3351
"""
3452
A str subtype for automatically normalizing bool and list values

0 commit comments

Comments
 (0)