Skip to content

Commit ddfb054

Browse files
authored
add: Ability to set default and additional kwargs on ModelField (#16)
1 parent 4cf32fa commit ddfb054

10 files changed

Lines changed: 393 additions & 216 deletions

File tree

Makefile

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,7 @@ lint:
1212
uv run ruff check . --fix --unsafe-fixes
1313

1414
test:
15-
uv run pytest tests -s -v
15+
uv run pytest tests -s -v
16+
17+
test-filter:
18+
uv run pytest tests -v -s -k $(filter)

fastapi_forge/dtos.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Annotated, Self
1+
from typing import Annotated, Any, Self
22

33
from pydantic import (
44
BaseModel,
@@ -44,6 +44,10 @@ class ModelField(_Base):
4444
nullable: bool = False
4545
unique: bool = False
4646
index: bool = False
47+
48+
default_value: str | None = None
49+
extra_kwargs: dict[str, Any] | None = None
50+
4751
metadata: ModelFieldMetadata = ModelFieldMetadata()
4852

4953
@computed_field
@@ -74,6 +78,14 @@ def _validate(self) -> Self:
7478
if metadata.is_foreign_key and self.type != FieldDataType.UUID:
7579
msg = "Foreign Keys must be of type UUID."
7680
raise ValueError(msg)
81+
82+
if self.extra_kwargs and any(
83+
k == "default" for k, _ in self.extra_kwargs.items()
84+
):
85+
msg = "The 'default' argument should be set through the default attr."
86+
raise ValueError(
87+
msg,
88+
)
7789
return self
7890

7991
@computed_field
@@ -199,6 +211,16 @@ def _validate(self) -> Self:
199211
f"Model '{self.name}' contains duplicate relationship field names.",
200212
)
201213

214+
if sum(field.metadata.is_created_at_timestamp for field in self.fields) > 1:
215+
raise ValueError(
216+
f"Model '{self.name}' has more than one 'created_at_timestamp' fields."
217+
)
218+
219+
if sum(field.metadata.is_updated_at_timestamp for field in self.fields) > 1:
220+
raise ValueError(
221+
f"Model '{self.name}' has more than one 'updated_at_timestamp' fields."
222+
)
223+
202224
return self
203225

204226
@model_validator(mode="after")

fastapi_forge/example-projects/game_zone.yaml

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,14 @@ project:
2020
type: String
2121
- name: created_at
2222
type: DateTime
23+
default_value: datetime.now(timezone.utc)
2324
metadata:
2425
is_created_at_timestamp: true
2526
- name: updated_at
2627
type: DateTime
28+
default_value: datetime.now(timezone.utc)
29+
extra_kwargs:
30+
onupdate: datetime.now(timezone.utc)
2731
metadata:
2832
is_updated_at_timestamp: true
2933
relationships: []
@@ -45,10 +49,14 @@ project:
4549
nullable: true
4650
- name: created_at
4751
type: DateTime
52+
default_value: datetime.now(timezone.utc)
4853
metadata:
4954
is_created_at_timestamp: true
5055
- name: updated_at
5156
type: DateTime
57+
default_value: datetime.now(timezone.utc)
58+
extra_kwargs:
59+
onupdate: datetime.now(timezone.utc)
5260
metadata:
5361
is_updated_at_timestamp: true
5462
relationships:
@@ -75,10 +83,14 @@ project:
7583
nullable: true
7684
- name: created_at
7785
type: DateTime
86+
default_value: datetime.now(timezone.utc)
7887
metadata:
7988
is_created_at_timestamp: true
8089
- name: updated_at
8190
type: DateTime
91+
default_value: datetime.now(timezone.utc)
92+
extra_kwargs:
93+
onupdate: datetime.now(timezone.utc)
8294
metadata:
8395
is_updated_at_timestamp: true
8496
relationships: []
@@ -90,19 +102,21 @@ project:
90102
primary_key: true
91103
- name: purchase_date
92104
type: DateTime
93-
metadata:
94-
is_created_at_timestamp: true
95105
- name: playtime_hours
96106
type: Integer
97107
- name: achievements_unlocked
98108
type: Integer
99109
default: 0
100110
- name: created_at
101111
type: DateTime
112+
default_value: datetime.now(timezone.utc)
102113
metadata:
103114
is_created_at_timestamp: true
104115
- name: updated_at
105116
type: DateTime
117+
default_value: datetime.now(timezone.utc)
118+
extra_kwargs:
119+
onupdate: datetime.now(timezone.utc)
106120
metadata:
107121
is_updated_at_timestamp: true
108122
relationships:
@@ -126,10 +140,14 @@ project:
126140
type: Integer
127141
- name: created_at
128142
type: DateTime
143+
default_value: datetime.now(timezone.utc)
129144
metadata:
130145
is_created_at_timestamp: true
131146
- name: updated_at
132147
type: DateTime
148+
default_value: datetime.now(timezone.utc)
149+
extra_kwargs:
150+
onupdate: datetime.now(timezone.utc)
133151
metadata:
134152
is_updated_at_timestamp: true
135153
relationships:
@@ -154,10 +172,14 @@ project:
154172
nullable: true
155173
- name: created_at
156174
type: DateTime
175+
default_value: datetime.now(timezone.utc)
157176
metadata:
158177
is_created_at_timestamp: true
159178
- name: updated_at
160179
type: DateTime
180+
default_value: datetime.now(timezone.utc)
181+
extra_kwargs:
182+
onupdate: datetime.now(timezone.utc)
161183
metadata:
162184
is_updated_at_timestamp: true
163185
relationships:

0 commit comments

Comments
 (0)