Skip to content

Commit ee1b204

Browse files
committed
Better pydantic validation example
1 parent 618e70a commit ee1b204

File tree

3 files changed

+52
-33
lines changed

3 files changed

+52
-33
lines changed

README.md

+16-9
Original file line numberDiff line numberDiff line change
@@ -68,23 +68,30 @@ with engine.connect() as conn:
6868
### With Pydantic Validation
6969

7070
```python
71-
72-
from pydantic import BaseModel, Field
73-
74-
from sqla_fancy_core import TableFactory
75-
76-
tf = TableFactory()
71+
def field(col, default=...):
72+
return col.info["field"](default)
7773

7874
# Define a table
7975
class User:
80-
name = tf.string("name", info={"field": Field(..., max_length=5)})
76+
name = tf.string(
77+
"name", info={"field": lambda default: Field(default, max_length=5)}
78+
)
8179
Table = tf("author")
8280

8381
# Define a pydantic schema
8482
class CreateUser(BaseModel):
85-
name: str = User.name.info["field"]
83+
name: str = field(User.name)
84+
85+
# Define a pydantic schema
86+
class UpdateUser(BaseModel):
87+
name: str | None = field(User.name, None)
8688

8789
assert CreateUser(name="John").model_dump() == {"name": "John"}
90+
assert UpdateUser(name="John").model_dump() == {"name": "John"}
91+
assert UpdateUser().model_dump(exclude_unset=True) == {}
92+
93+
with pytest.raises(ValueError):
94+
CreateUser()
8895
with pytest.raises(ValueError):
89-
CreateUser(name="John Doe")
96+
UpdateUser(name="John Doe")
9097
```

tests/test_field.py

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import pytest
2+
3+
4+
def test_field():
5+
from pydantic import BaseModel, Field
6+
7+
from sqla_fancy_core import TableFactory
8+
9+
tf = TableFactory()
10+
11+
def field(col, default=...):
12+
return col.info["field"](default)
13+
14+
# Define a table
15+
class User:
16+
name = tf.string(
17+
"name", info={"field": lambda default: Field(default, max_length=5)}
18+
)
19+
Table = tf("author")
20+
21+
# Define a pydantic schema
22+
class CreateUser(BaseModel):
23+
name: str = field(User.name)
24+
25+
# Define a pydantic schema
26+
class UpdateUser(BaseModel):
27+
name: str | None = field(User.name, None)
28+
29+
assert CreateUser(name="John").model_dump() == {"name": "John"}
30+
assert UpdateUser(name="John").model_dump() == {"name": "John"}
31+
assert UpdateUser().model_dump(exclude_unset=True) == {}
32+
33+
with pytest.raises(ValueError):
34+
CreateUser()
35+
with pytest.raises(ValueError):
36+
UpdateUser(name="John Doe")

tests/test_table_factory.py

-24
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
import pytest
2-
3-
41
def test_table_factory():
52
import sqlalchemy as sa
63

@@ -58,24 +55,3 @@ class Book:
5855
)
5956
result = conn.execute(qry).fetchall()
6057
assert result == [("John Doe", "My Book")], result
61-
62-
63-
def test_field():
64-
from pydantic import BaseModel, Field
65-
66-
from sqla_fancy_core import TableFactory
67-
68-
tf = TableFactory()
69-
70-
# Define a table
71-
class User:
72-
name = tf.string("name", info={"field": Field(..., max_length=5)})
73-
Table = tf("author")
74-
75-
# Define a pydantic schema
76-
class CreateUser(BaseModel):
77-
name: str = User.name.info["field"]
78-
79-
assert CreateUser(name="John").model_dump() == {"name": "John"}
80-
with pytest.raises(ValueError):
81-
CreateUser(name="John Doe")

0 commit comments

Comments
 (0)