Skip to content

Commit c76c025

Browse files
committed
🎨 Upgrade types syntax for Python 3.10
1 parent e427ccf commit c76c025

17 files changed

Lines changed: 103 additions & 124 deletions

tests/conftest.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import shutil
22
import subprocess
33
import sys
4-
from collections.abc import Generator
4+
from collections.abc import Callable, Generator
55
from dataclasses import dataclass, field
66
from pathlib import Path
7-
from typing import Any, Callable, Union
7+
from typing import Any
88
from unittest.mock import patch
99

1010
import pytest
@@ -35,7 +35,7 @@ def cov_tmp_path(tmp_path: Path) -> Generator[Path, None, None]:
3535
shutil.copy(coverage_path, coverage_destiny_path)
3636

3737

38-
def coverage_run(*, module: str, cwd: Union[str, Path]) -> subprocess.CompletedProcess:
38+
def coverage_run(*, module: str, cwd: str | Path) -> subprocess.CompletedProcess:
3939
result = subprocess.run(
4040
[
4141
"coverage",
@@ -53,7 +53,7 @@ def coverage_run(*, module: str, cwd: Union[str, Path]) -> subprocess.CompletedP
5353

5454

5555
def get_testing_print_function(
56-
calls: list[list[Union[str, dict[str, Any]]]],
56+
calls: list[list[str | dict[str, Any]]],
5757
) -> Callable[..., Any]:
5858
def new_print(*args: Any) -> None:
5959
data: list[Any] = []

tests/test_aliases.py

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
from typing import Union
2-
31
import pytest
42
from pydantic import BaseModel, ValidationError
53
from pydantic import Field as PField
@@ -28,14 +26,14 @@ class SQLModelUserWithConfig(SQLModelUser):
2826

2927

3028
@pytest.mark.parametrize("model", [PydanticUser, SQLModelUser])
31-
def test_create_with_field_name(model: Union[type[PydanticUser], type[SQLModelUser]]):
29+
def test_create_with_field_name(model: type[PydanticUser] | type[SQLModelUser]):
3230
with pytest.raises(ValidationError):
3331
model(full_name="Alice")
3432

3533

3634
@pytest.mark.parametrize("model", [PydanticUserWithConfig, SQLModelUserWithConfig])
3735
def test_create_with_field_name_with_config(
38-
model: Union[type[PydanticUserWithConfig], type[SQLModelUserWithConfig]],
36+
model: type[PydanticUserWithConfig] | type[SQLModelUserWithConfig],
3937
):
4038
user = model(full_name="Alice")
4139
assert user.full_name == "Alice"
@@ -46,28 +44,26 @@ def test_create_with_field_name_with_config(
4644
[PydanticUser, SQLModelUser, PydanticUserWithConfig, SQLModelUserWithConfig],
4745
)
4846
def test_create_with_alias(
49-
model: Union[
50-
type[PydanticUser],
51-
type[SQLModelUser],
52-
type[PydanticUserWithConfig],
53-
type[SQLModelUserWithConfig],
54-
],
47+
model: type[PydanticUser]
48+
| type[SQLModelUser]
49+
| type[PydanticUserWithConfig]
50+
| type[SQLModelUserWithConfig],
5551
):
5652
user = model(fullName="Bob") # using alias
5753
assert user.full_name == "Bob"
5854

5955

6056
@pytest.mark.parametrize("model", [PydanticUserWithConfig, SQLModelUserWithConfig])
6157
def test_create_with_both_prefers_alias(
62-
model: Union[type[PydanticUserWithConfig], type[SQLModelUserWithConfig]],
58+
model: type[PydanticUserWithConfig] | type[SQLModelUserWithConfig],
6359
):
6460
user = model(full_name="IGNORED", fullName="Charlie")
6561
assert user.full_name == "Charlie" # alias should take precedence
6662

6763

6864
@pytest.mark.parametrize("model", [PydanticUser, SQLModelUser])
6965
def test_dict_default_uses_field_names(
70-
model: Union[type[PydanticUser], type[SQLModelUser]],
66+
model: type[PydanticUser] | type[SQLModelUser],
7167
):
7268
user = model(fullName="Dana")
7369
data = user.model_dump()
@@ -78,7 +74,7 @@ def test_dict_default_uses_field_names(
7874

7975
@pytest.mark.parametrize("model", [PydanticUser, SQLModelUser])
8076
def test_dict_by_alias_uses_aliases(
81-
model: Union[type[PydanticUser], type[SQLModelUser]],
77+
model: type[PydanticUser] | type[SQLModelUser],
8278
):
8379
user = model(fullName="Dana")
8480
data = user.model_dump(by_alias=True)
@@ -89,7 +85,7 @@ def test_dict_by_alias_uses_aliases(
8985

9086
@pytest.mark.parametrize("model", [PydanticUser, SQLModelUser])
9187
def test_json_by_alias(
92-
model: Union[type[PydanticUser], type[SQLModelUser]],
88+
model: type[PydanticUser] | type[SQLModelUser],
9389
):
9490
user = model(fullName="Frank")
9591
json_data = user.model_dump_json(by_alias=True)
@@ -107,15 +103,15 @@ class SQLModelUserV2(SQLModel):
107103

108104
@pytest.mark.parametrize("model", [PydanticUserV2, SQLModelUserV2])
109105
def test_create_with_validation_alias(
110-
model: Union[type[PydanticUserV2], type[SQLModelUserV2]],
106+
model: type[PydanticUserV2] | type[SQLModelUserV2],
111107
):
112108
user = model(firstName="John")
113109
assert user.first_name == "John"
114110

115111

116112
@pytest.mark.parametrize("model", [PydanticUserV2, SQLModelUserV2])
117113
def test_serialize_with_serialization_alias(
118-
model: Union[type[PydanticUserV2], type[SQLModelUserV2]],
114+
model: type[PydanticUserV2] | type[SQLModelUserV2],
119115
):
120116
user = model(firstName="Jane")
121117
data = user.model_dump(by_alias=True)

tests/test_annotated_uuid.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import uuid
2-
from typing import Optional
32

43
from sqlmodel import Field, Session, SQLModel, create_engine, select
54

@@ -9,7 +8,7 @@ def test_annotated_optional_types(clear_sqlmodel) -> None:
98

109
class Hero(SQLModel, table=True):
1110
# Pydantic UUID4 is: Annotated[UUID, UuidVersion(4)]
12-
id: Optional[UUID4] = Field(default_factory=uuid.uuid4, primary_key=True)
11+
id: UUID4 | None = Field(default_factory=uuid.uuid4, primary_key=True)
1312

1413
engine = create_engine("sqlite:///:memory:")
1514
SQLModel.metadata.create_all(engine)

tests/test_field_sa_args_kwargs.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
1-
from typing import Optional
2-
31
from sqlalchemy import ForeignKey
42
from sqlmodel import Field, SQLModel, create_engine
53

64

75
def test_sa_column_args(clear_sqlmodel, caplog) -> None:
86
class Team(SQLModel, table=True):
9-
id: Optional[int] = Field(default=None, primary_key=True)
7+
id: int | None = Field(default=None, primary_key=True)
108
name: str
119

1210
class Hero(SQLModel, table=True):
13-
id: Optional[int] = Field(default=None, primary_key=True)
14-
team_id: Optional[int] = Field(
11+
id: int | None = Field(default=None, primary_key=True)
12+
team_id: int | None = Field(
1513
default=None,
1614
sa_column_args=[ForeignKey("team.id")],
1715
)
@@ -26,7 +24,7 @@ class Hero(SQLModel, table=True):
2624

2725
def test_sa_column_kargs(clear_sqlmodel, caplog) -> None:
2826
class Item(SQLModel, table=True):
29-
id: Optional[int] = Field(
27+
id: int | None = Field(
3028
default=None,
3129
sa_column_kwargs={"primary_key": True},
3230
)

tests/test_field_sa_column.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Annotated, Optional
1+
from typing import Annotated
22

33
import pytest
44
from sqlalchemy import Column, Integer, String
@@ -7,7 +7,7 @@
77

88
def test_sa_column_takes_precedence() -> None:
99
class Item(SQLModel, table=True):
10-
id: Optional[int] = Field(
10+
id: int | None = Field(
1111
default=None,
1212
sa_column=Column(String, primary_key=True, nullable=False),
1313
)
@@ -19,7 +19,7 @@ class Item(SQLModel, table=True):
1919

2020
def test_sa_column_with_annotated_metadata() -> None:
2121
class Item(SQLModel, table=True):
22-
id: Annotated[Optional[int], "meta"] = Field(
22+
id: Annotated[int | None, "meta"] = Field(
2323
default=None,
2424
sa_column=Column(String, primary_key=True, nullable=False),
2525
)
@@ -32,7 +32,7 @@ def test_sa_column_no_sa_args() -> None:
3232
with pytest.raises(RuntimeError):
3333

3434
class Item(SQLModel, table=True):
35-
id: Optional[int] = Field(
35+
id: int | None = Field(
3636
default=None,
3737
sa_column_args=[Integer],
3838
sa_column=Column(Integer, primary_key=True),
@@ -43,7 +43,7 @@ def test_sa_column_no_sa_kargs() -> None:
4343
with pytest.raises(RuntimeError):
4444

4545
class Item(SQLModel, table=True):
46-
id: Optional[int] = Field(
46+
id: int | None = Field(
4747
default=None,
4848
sa_column_kwargs={"primary_key": True},
4949
sa_column=Column(Integer, primary_key=True),
@@ -54,7 +54,7 @@ def test_sa_column_no_type() -> None:
5454
with pytest.raises(RuntimeError):
5555

5656
class Item(SQLModel, table=True):
57-
id: Optional[int] = Field(
57+
id: int | None = Field(
5858
default=None,
5959
sa_type=Integer,
6060
sa_column=Column(Integer, primary_key=True),
@@ -65,7 +65,7 @@ def test_sa_column_no_primary_key() -> None:
6565
with pytest.raises(RuntimeError):
6666

6767
class Item(SQLModel, table=True):
68-
id: Optional[int] = Field(
68+
id: int | None = Field(
6969
default=None,
7070
primary_key=True,
7171
sa_column=Column(Integer, primary_key=True),
@@ -76,7 +76,7 @@ def test_sa_column_no_nullable() -> None:
7676
with pytest.raises(RuntimeError):
7777

7878
class Item(SQLModel, table=True):
79-
id: Optional[int] = Field(
79+
id: int | None = Field(
8080
default=None,
8181
nullable=True,
8282
sa_column=Column(Integer, primary_key=True),
@@ -87,12 +87,12 @@ def test_sa_column_no_foreign_key() -> None:
8787
with pytest.raises(RuntimeError):
8888

8989
class Team(SQLModel, table=True):
90-
id: Optional[int] = Field(default=None, primary_key=True)
90+
id: int | None = Field(default=None, primary_key=True)
9191
name: str
9292

9393
class Hero(SQLModel, table=True):
94-
id: Optional[int] = Field(default=None, primary_key=True)
95-
team_id: Optional[int] = Field(
94+
id: int | None = Field(default=None, primary_key=True)
95+
team_id: int | None = Field(
9696
default=None,
9797
foreign_key="team.id",
9898
sa_column=Column(Integer, primary_key=True),
@@ -103,7 +103,7 @@ def test_sa_column_no_unique() -> None:
103103
with pytest.raises(RuntimeError):
104104

105105
class Item(SQLModel, table=True):
106-
id: Optional[int] = Field(
106+
id: int | None = Field(
107107
default=None,
108108
unique=True,
109109
sa_column=Column(Integer, primary_key=True),
@@ -114,7 +114,7 @@ def test_sa_column_no_index() -> None:
114114
with pytest.raises(RuntimeError):
115115

116116
class Item(SQLModel, table=True):
117-
id: Optional[int] = Field(
117+
id: int | None = Field(
118118
default=None,
119119
index=True,
120120
sa_column=Column(Integer, primary_key=True),
@@ -125,7 +125,7 @@ def test_sa_column_no_ondelete() -> None:
125125
with pytest.raises(RuntimeError):
126126

127127
class Item(SQLModel, table=True):
128-
id: Optional[int] = Field(
128+
id: int | None = Field(
129129
default=None,
130130
sa_column=Column(Integer, primary_key=True),
131131
ondelete="CASCADE",
Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
from typing import Optional
2-
31
import pytest
42
from sqlalchemy.orm import relationship
53
from sqlmodel import Field, Relationship, SQLModel
@@ -9,7 +7,7 @@ def test_sa_relationship_no_args() -> None:
97
with pytest.raises(RuntimeError): # pragma: no cover
108

119
class Team(SQLModel, table=True):
12-
id: Optional[int] = Field(default=None, primary_key=True)
10+
id: int | None = Field(default=None, primary_key=True)
1311
name: str = Field(index=True)
1412
headquarters: str
1513

@@ -20,20 +18,20 @@ class Team(SQLModel, table=True):
2018
)
2119

2220
class Hero(SQLModel, table=True):
23-
id: Optional[int] = Field(default=None, primary_key=True)
21+
id: int | None = Field(default=None, primary_key=True)
2422
name: str = Field(index=True)
2523
secret_name: str
26-
age: Optional[int] = Field(default=None, index=True)
24+
age: int | None = Field(default=None, index=True)
2725

28-
team_id: Optional[int] = Field(default=None, foreign_key="team.id")
29-
team: Optional[Team] = Relationship(back_populates="heroes")
26+
team_id: int | None = Field(default=None, foreign_key="team.id")
27+
team: Team | None = Relationship(back_populates="heroes")
3028

3129

3230
def test_sa_relationship_no_kwargs() -> None:
3331
with pytest.raises(RuntimeError): # pragma: no cover
3432

3533
class Team(SQLModel, table=True):
36-
id: Optional[int] = Field(default=None, primary_key=True)
34+
id: int | None = Field(default=None, primary_key=True)
3735
name: str = Field(index=True)
3836
headquarters: str
3937

@@ -44,10 +42,10 @@ class Team(SQLModel, table=True):
4442
)
4543

4644
class Hero(SQLModel, table=True):
47-
id: Optional[int] = Field(default=None, primary_key=True)
45+
id: int | None = Field(default=None, primary_key=True)
4846
name: str = Field(index=True)
4947
secret_name: str
50-
age: Optional[int] = Field(default=None, index=True)
48+
age: int | None = Field(default=None, index=True)
5149

52-
team_id: Optional[int] = Field(default=None, foreign_key="team.id")
53-
team: Optional[Team] = Relationship(back_populates="heroes")
50+
team_id: int | None = Field(default=None, foreign_key="team.id")
51+
team: Team | None = Relationship(back_populates="heroes")

tests/test_future_annotations.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
from __future__ import annotations
22

3-
from typing import Annotated, Optional
3+
from typing import Annotated
44

55
from sqlmodel import Field, Session, SQLModel, create_engine, select
66

77

88
def test_model_with_future_annotations(clear_sqlmodel):
99
class Hero(SQLModel, table=True):
10-
id: Annotated[Optional[int], Field(primary_key=True)] = None
10+
id: Annotated[int | None, Field(primary_key=True)] = None
1111
name: str
1212
secret_name: str
13-
age: Optional[int] = None
13+
age: int | None = None
1414

1515
hero = Hero(name="Deadpond", secret_name="Dive Wilson", age=25)
1616

@@ -35,13 +35,13 @@ class Hero(SQLModel, table=True):
3535

3636
def test_model_with_string_annotations(clear_sqlmodel):
3737
class Team(SQLModel, table=True):
38-
id: Annotated[Optional[int], Field(primary_key=True)] = None
38+
id: Annotated[int | None, Field(primary_key=True)] = None
3939
name: str
4040

4141
class Player(SQLModel, table=True):
42-
id: Annotated[Optional[int], Field(primary_key=True)] = None
42+
id: Annotated[int | None, Field(primary_key=True)] = None
4343
name: str
44-
team_id: Annotated[Optional[int], Field(foreign_key="team.id")] = None
44+
team_id: Annotated[int | None, Field(foreign_key="team.id")] = None
4545

4646
engine = create_engine("sqlite://")
4747
SQLModel.metadata.create_all(engine)

0 commit comments

Comments
 (0)