Skip to content

Commit a5e2cad

Browse files
committed
dream: PEP 695 type aliases for pydantic Annotated types
Dream dream-2026-07-23.1 finding 015.
1 parent bc89984 commit a5e2cad

3 files changed

Lines changed: 11 additions & 7 deletions

File tree

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ dependencies = [
99
"httpx>=0.27.0",
1010
"pyyaml>=6.0",
1111
"typing-extensions>=4.0.0",
12-
"pydantic>=2.0.0",
12+
"pydantic>=2.11.0",
1313
]
1414

1515
[project.optional-dependencies]

src/bloomy/models.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,14 @@ def _parse_optional_float(v: Any) -> float | None:
3333
return float(v)
3434

3535

36-
# Reusable annotated types for optional fields that may come as empty strings
37-
OptionalDatetime = Annotated[datetime | None, BeforeValidator(_parse_optional_datetime)]
38-
OptionalFloat = Annotated[float | None, BeforeValidator(_parse_optional_float)]
36+
# Reusable annotated types for optional fields that may come as empty strings.
37+
# PEP 695 named aliases (requires pydantic>=2.11 for full support).
38+
type OptionalDatetime = Annotated[
39+
datetime | None, BeforeValidator(_parse_optional_datetime)
40+
]
41+
type OptionalFloat = Annotated[float | None, BeforeValidator(_parse_optional_float)]
3942
# Coerces a nullable value (e.g. a datetime or None) into a bool (present = True)
40-
IsPresent = Annotated[bool, BeforeValidator(lambda v: v is not None and v != "")]
43+
type IsPresent = Annotated[bool, BeforeValidator(lambda v: v is not None and v != "")]
4144

4245

4346
class GoalStatus(StrEnum):
@@ -370,7 +373,8 @@ class HeadlineDetails(BloomyBaseModel):
370373
closed_at: str | None = None
371374

372375

373-
# HeadlineListItem is identical to HeadlineDetails - use type alias
376+
# HeadlineListItem is identical to HeadlineDetails - use assignment alias so the
377+
# name remains callable (PEP 695 `type` produces a non-callable TypeAliasType).
374378
HeadlineListItem = HeadlineDetails
375379

376380

uv.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)