Skip to content

Commit 2970f6b

Browse files
committed
➖ Drop support for Pydantic v1
1 parent 8d00ed4 commit 2970f6b

10 files changed

Lines changed: 23 additions & 119 deletions

File tree

.github/workflows/test.yml

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,6 @@ jobs:
2626
strategy:
2727
matrix:
2828
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"]
29-
pydantic-version: ["v2"]
30-
include:
31-
- python-version: "3.9"
32-
pydantic-version: "v1"
33-
- python-version: "3.10"
34-
pydantic-version: "v1"
35-
- python-version: "3.11"
36-
pydantic-version: "v1"
37-
- python-version: "3.12"
38-
pydantic-version: "v1"
3929
fail-fast: false
4030
runs-on: ubuntu-latest
4131
env:
@@ -63,9 +53,6 @@ jobs:
6353
limit-access-to-actor: true
6454
- name: Install Dependencies
6555
run: uv sync --locked --all-extras --dev
66-
- name: Install Pydantic v1
67-
if: matrix.pydantic-version == 'v1'
68-
run: uv pip install "pydantic<2.0.0"
6956
- name: Lint
7057
run: uv run --no-sync scripts/lint.sh
7158
- run: mkdir coverage
@@ -77,7 +64,7 @@ jobs:
7764
- name: Store coverage files
7865
uses: actions/upload-artifact@v4
7966
with:
80-
name: coverage-${{ matrix.python-version }}-${{ matrix.pydantic-version }}
67+
name: coverage-${{ matrix.python-version }}
8168
path: coverage
8269
include-hidden-files: true
8370

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ dependencies = [
3434
"rignore >= 0.5.1",
3535
"httpx >= 0.27.0",
3636
"rich-toolkit >= 0.14.5",
37-
"pydantic[email] >= 1.6.1",
37+
"pydantic[email] >= 2.0",
3838
"sentry-sdk >= 2.20.0",
3939
"fastar >= 0.8.0",
4040
]

src/fastapi_cloud_cli/commands/deploy.py

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import rignore
1414
import typer
1515
from httpx import Client
16-
from pydantic import BaseModel, EmailStr, ValidationError
16+
from pydantic import BaseModel, EmailStr, TypeAdapter, ValidationError
1717
from rich.text import Text
1818
from rich_toolkit import RichToolkit
1919
from rich_toolkit.menu import Option
@@ -24,11 +24,6 @@
2424
from fastapi_cloud_cli.utils.apps import AppConfig, get_app_config, write_app_config
2525
from fastapi_cloud_cli.utils.auth import is_logged_in
2626
from fastapi_cloud_cli.utils.cli import get_rich_toolkit, handle_http_errors
27-
from fastapi_cloud_cli.utils.pydantic_compat import (
28-
TypeAdapter,
29-
model_dump,
30-
model_validate,
31-
)
3227

3328
logger = logging.getLogger(__name__)
3429

@@ -109,7 +104,7 @@ def _get_teams() -> List[Team]:
109104

110105
data = response.json()["data"]
111106

112-
return [model_validate(Team, team) for team in data]
107+
return [Team.model_validate(team) for team in data]
113108

114109

115110
class AppResponse(BaseModel):
@@ -126,7 +121,7 @@ def _create_app(team_id: str, app_name: str) -> AppResponse:
126121

127122
response.raise_for_status()
128123

129-
return model_validate(AppResponse, response.json())
124+
return AppResponse.model_validate(response.json())
130125

131126

132127
class DeploymentStatus(str, Enum):
@@ -179,7 +174,7 @@ def _create_deployment(app_id: str) -> CreateDeploymentResponse:
179174
response = client.post(f"/apps/{app_id}/deployments/")
180175
response.raise_for_status()
181176

182-
return model_validate(CreateDeploymentResponse, response.json())
177+
return CreateDeploymentResponse.model_validate(response.json())
183178

184179

185180
class RequestUploadResponse(BaseModel):
@@ -204,7 +199,7 @@ def _upload_deployment(deployment_id: str, archive_path: Path) -> None:
204199
response = fastapi_client.post(f"/deployments/{deployment_id}/upload")
205200
response.raise_for_status()
206201

207-
upload_data = model_validate(RequestUploadResponse, response.json())
202+
upload_data = RequestUploadResponse.model_validate(response.json())
208203
logger.debug("Received upload URL: %s", upload_data.url)
209204

210205
logger.debug("Starting file upload to S3")
@@ -239,7 +234,7 @@ def _get_app(app_slug: str) -> Optional[AppResponse]:
239234

240235
data = response.json()
241236

242-
return model_validate(AppResponse, data)
237+
return AppResponse.model_validate(data)
243238

244239

245240
def _get_apps(team_id: str) -> List[AppResponse]:
@@ -249,7 +244,7 @@ def _get_apps(team_id: str) -> List[AppResponse]:
249244

250245
data = response.json()["data"]
251246

252-
return [model_validate(AppResponse, app) for app in data]
247+
return [AppResponse.model_validate(app) for app in data]
253248

254249

255250
WAITING_MESSAGES = [
@@ -432,7 +427,7 @@ def _send_waitlist_form(
432427
with toolkit.progress("Sending your request...") as progress:
433428
with APIClient() as client:
434429
with handle_http_errors(progress):
435-
response = client.post("/users/waiting-list", json=model_dump(result))
430+
response = client.post("/users/waiting-list", json=result.model_dump())
436431

437432
response.raise_for_status()
438433

@@ -457,7 +452,7 @@ def _waitlist_form(toolkit: RichToolkit) -> None:
457452

458453
toolkit.print_line()
459454

460-
result = model_validate(SignupToWaitingList, {"email": email})
455+
result = SignupToWaitingList.model_validate({"email": email})
461456

462457
if toolkit.confirm(
463458
"Do you want to get access faster by giving us more information?",
@@ -481,8 +476,7 @@ def _waitlist_form(toolkit: RichToolkit) -> None:
481476
result = form.run() # type: ignore
482477

483478
try:
484-
result = model_validate(
485-
SignupToWaitingList,
479+
result = SignupToWaitingList.model_validate(
486480
{
487481
"email": email,
488482
**result, # type: ignore

src/fastapi_cloud_cli/commands/env.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
from fastapi_cloud_cli.utils.auth import is_logged_in
1212
from fastapi_cloud_cli.utils.cli import get_rich_toolkit, handle_http_errors
1313
from fastapi_cloud_cli.utils.env import validate_environment_variable_name
14-
from fastapi_cloud_cli.utils.pydantic_compat import model_validate
1514

1615
logger = logging.getLogger(__name__)
1716

@@ -30,7 +29,7 @@ def _get_environment_variables(app_id: str) -> EnvironmentVariableResponse:
3029
response = client.get(f"/apps/{app_id}/environment-variables/")
3130
response.raise_for_status()
3231

33-
return model_validate(EnvironmentVariableResponse, response.json())
32+
return EnvironmentVariableResponse.model_validate(response.json())
3433

3534

3635
def _delete_environment_variable(app_id: str, name: str) -> bool:

src/fastapi_cloud_cli/commands/login.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
write_auth_config,
1717
)
1818
from fastapi_cloud_cli.utils.cli import get_rich_toolkit, handle_http_errors
19-
from fastapi_cloud_cli.utils.pydantic_compat import model_validate_json
2019

2120
logger = logging.getLogger(__name__)
2221

@@ -44,7 +43,7 @@ def _start_device_authorization(
4443

4544
response.raise_for_status()
4645

47-
return model_validate_json(AuthorizationData, response.text)
46+
return AuthorizationData.model_validate_json(response.text)
4847

4948

5049
def _fetch_access_token(client: httpx.Client, device_code: str, interval: int) -> str:
@@ -74,7 +73,7 @@ def _fetch_access_token(client: httpx.Client, device_code: str, interval: int) -
7473

7574
time.sleep(interval)
7675

77-
response_data = model_validate_json(TokenResponse, response.text)
76+
response_data = TokenResponse.model_validate_json(response.text)
7877

7978
return response_data.access_token
8079

src/fastapi_cloud_cli/utils/api.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,12 @@
1414
)
1515

1616
import httpx
17-
from pydantic import BaseModel, Field, ValidationError
17+
from pydantic import BaseModel, Field, TypeAdapter, ValidationError
1818
from typing_extensions import Annotated, ParamSpec
1919

2020
from fastapi_cloud_cli import __version__
2121
from fastapi_cloud_cli.config import Settings
2222
from fastapi_cloud_cli.utils.auth import get_auth_token
23-
from fastapi_cloud_cli.utils.pydantic_compat import TypeAdapter
2423

2524
logger = logging.getLogger(__name__)
2625

@@ -48,8 +47,8 @@ class BuildLogLineMessage(BaseModel):
4847

4948

5049
BuildLogLine = Union[BuildLogLineMessage, BuildLogLineGeneric]
51-
BuildLogAdapter = TypeAdapter[BuildLogLine](
52-
Annotated[BuildLogLine, Field(discriminator="type")] # type: ignore
50+
BuildLogAdapter: TypeAdapter[BuildLogLine] = TypeAdapter(
51+
Annotated[BuildLogLine, Field(discriminator="type")]
5352
)
5453

5554

src/fastapi_cloud_cli/utils/apps.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
from pydantic import BaseModel
66

7-
from fastapi_cloud_cli.utils.pydantic_compat import model_dump_json, model_validate_json
87

98
logger = logging.getLogger("fastapi_cli")
109

@@ -23,7 +22,7 @@ def get_app_config(path_to_deploy: Path) -> Optional[AppConfig]:
2322
return None
2423

2524
logger.debug("App config loaded successfully")
26-
return model_validate_json(AppConfig, config_path.read_text(encoding="utf-8"))
25+
return AppConfig.model_validate_json(config_path.read_text(encoding="utf-8"))
2726

2827

2928
README = """
@@ -52,7 +51,7 @@ def write_app_config(path_to_deploy: Path, app_config: AppConfig) -> None:
5251
config_path.parent.mkdir(parents=True, exist_ok=True)
5352

5453
config_path.write_text(
55-
model_dump_json(app_config),
54+
app_config.model_dump_json(),
5655
encoding="utf-8",
5756
)
5857
readme_path.write_text(README, encoding="utf-8")

src/fastapi_cloud_cli/utils/auth.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
from pydantic import BaseModel
99

10-
from fastapi_cloud_cli.utils.pydantic_compat import model_dump_json, model_validate_json
1110

1211
from .config import get_auth_path
1312

@@ -22,7 +21,7 @@ def write_auth_config(auth_data: AuthConfig) -> None:
2221
auth_path = get_auth_path()
2322
logger.debug("Writing auth config to: %s", auth_path)
2423

25-
auth_path.write_text(model_dump_json(auth_data), encoding="utf-8")
24+
auth_path.write_text(auth_data.model_dump_json(), encoding="utf-8")
2625
logger.debug("Auth config written successfully")
2726

2827

@@ -46,7 +45,7 @@ def read_auth_config() -> Optional[AuthConfig]:
4645
return None
4746

4847
logger.debug("Auth config loaded successfully")
49-
return model_validate_json(AuthConfig, auth_path.read_text(encoding="utf-8"))
48+
return AuthConfig.model_validate_json(auth_path.read_text(encoding="utf-8"))
5049

5150

5251
def get_auth_token() -> Optional[str]:

src/fastapi_cloud_cli/utils/pydantic_compat.py

Lines changed: 0 additions & 72 deletions
This file was deleted.

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)