|
5 | 5 | import inspect |
6 | 6 | import textwrap |
7 | 7 | from pathlib import Path |
8 | | -from typing import TYPE_CHECKING |
| 8 | +from typing import TYPE_CHECKING, TypeVar, cast |
9 | 9 |
|
10 | 10 | from packaging.specifiers import SpecifierSet |
11 | 11 | from packaging.version import Version |
|
15 | 15 | if TYPE_CHECKING: |
16 | 16 | from collections.abc import Generator |
17 | 17 |
|
| 18 | +T = TypeVar("T") |
| 19 | +U = TypeVar("U") |
| 20 | + |
| 21 | + |
18 | 22 | __all__ = ["pull_docs"] |
19 | 23 |
|
20 | 24 |
|
@@ -56,6 +60,19 @@ def __str__(self) -> str: |
56 | 60 | return f"{docs}\n{self.name} = {self.default}\n" |
57 | 61 |
|
58 | 62 |
|
| 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 | + |
59 | 76 | def mk_docs(dc: type[object], prefix: str = "") -> Generator[DCDoc, None, None]: |
60 | 77 | """ |
61 | 78 | Makes documentation for a dataclass. |
@@ -87,7 +104,7 @@ def mk_docs(dc: type[object], prefix: str = "") -> Generator[DCDoc, None, None]: |
87 | 104 | default = '""' |
88 | 105 |
|
89 | 106 | 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], |
93 | 110 | ) |
0 commit comments