Skip to content

Commit a941bce

Browse files
committed
feat: Ensure we have real Python 3.9 to 3.13 compatibility
1 parent be28d8e commit a941bce

File tree

9 files changed

+32
-31
lines changed

9 files changed

+32
-31
lines changed

.pre-commit-config.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
repos:
22
- repo: https://github.com/pre-commit/pre-commit-hooks
3-
rev: v4.6.0
3+
rev: v5.0.0
44
hooks:
55
- id: end-of-file-fixer
66
- id: check-added-large-files
77
- id: check-merge-conflict
88
- id: check-docstring-first
99
- id: debug-statements
1010
- repo: https://github.com/astral-sh/ruff-pre-commit
11-
rev: v0.6.1
11+
rev: v0.8.1
1212
hooks:
1313
- id: ruff
1414
args: [--fix, --exit-non-zero-on-fix]
@@ -17,7 +17,7 @@ repos:
1717
hooks:
1818
- id: python-safety-dependencies-check
1919
- repo: https://github.com/alessandrojcm/commitlint-pre-commit-hook
20-
rev: v9.16.0
20+
rev: v9.19.0
2121
hooks:
2222
- id: commitlint
2323
stages: [commit-msg]

pydantic_async_validation/fastapi.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
1+
from collections.abc import Generator
12
from contextlib import contextmanager
2-
from typing import Generator, List, Optional, Tuple, Union
3+
from typing import Optional, Union
34

45
from fastapi.exceptions import RequestValidationError
56
from pydantic import ValidationError
67
from pydantic_core import ErrorDetails
78

89

910
def _prefix_request_errors(
10-
prefix: Tuple[Union[int, str], ...],
11-
errors: List[ErrorDetails],
12-
) -> List[ErrorDetails]:
11+
prefix: tuple[Union[int, str], ...],
12+
errors: list[ErrorDetails],
13+
) -> list[ErrorDetails]:
1314
"""Add prefix to errors in preparation for request validation error conversion."""
1415

1516
return [
@@ -25,7 +26,7 @@ def _prefix_request_errors(
2526

2627
@contextmanager
2728
def ensure_request_validation_errors(
28-
prefix: Optional[Union[Tuple[Union[int, str], ...], str]] = None,
29+
prefix: Optional[Union[tuple[Union[int, str], ...], str]] = None,
2930
) -> Generator[None, None, None]:
3031
"""
3132
Converter for `ValidationError` to `RequestValidationError`.

pydantic_async_validation/metaclasses.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import TYPE_CHECKING, Any, List, Optional, Tuple
1+
from typing import TYPE_CHECKING, Any, Optional
22

33
from pydantic._internal._model_construction import ModelMetaclass
44

@@ -21,10 +21,10 @@ def __new__(
2121
namespace: dict[str, Any],
2222
**kwargs: Any,
2323
) -> Any:
24-
async_field_validators: List[Tuple[List[str], ValidationInfo]] = []
25-
async_model_validators: List[ValidationInfo] = []
24+
async_field_validators: list[tuple[list[str], ValidationInfo]] = []
25+
async_model_validators: list[ValidationInfo] = []
2626

27-
async_field_validator_fields: Optional[List[str]]
27+
async_field_validator_fields: Optional[list[str]]
2828
async_field_validator_config: Optional[ValidationInfo]
2929
async_model_validator_config: Optional[ValidationInfo]
3030

pydantic_async_validation/mixins.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import ClassVar, List, Tuple, Union
1+
from typing import ClassVar, Union
22

33
import pydantic
44
from pydantic_core import InitErrorDetails, PydanticCustomError, ValidationError
@@ -19,8 +19,8 @@ class AsyncValidationModelMixin(
1919
metaclass=AsyncValidationModelMetaclass,
2020
):
2121
# MUST match names defined in constants.py!
22-
pydantic_model_async_field_validators: ClassVar[List[Tuple[List[str], ValidationInfo]]]
23-
pydantic_model_async_model_validators: ClassVar[List[ValidationInfo]]
22+
pydantic_model_async_field_validators: ClassVar[list[tuple[list[str], ValidationInfo]]]
23+
pydantic_model_async_model_validators: ClassVar[list[ValidationInfo]]
2424

2525
async def model_async_validate(self) -> None:
2626
"""
@@ -82,7 +82,7 @@ async def model_async_validate(self) -> None:
8282

8383
# Also call async validation on attribute values
8484
async def extend_with_validation_errors_by(
85-
prefix: Tuple[Union[int, str], ...],
85+
prefix: tuple[Union[int, str], ...],
8686
instance: AsyncValidationModelMixin,
8787
) -> None:
8888
try:

pydantic_async_validation/utils.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from functools import wraps
22
from inspect import Signature, signature
3-
from typing import Callable, List, Tuple, Union, cast
3+
from typing import Callable, Union, cast
44

55
from pydantic import PydanticUserError
66
from pydantic_core import ErrorDetails, InitErrorDetails, PydanticCustomError
@@ -163,9 +163,9 @@ def generic_model_validator_wrapper(
163163

164164

165165
def prefix_errors(
166-
prefix: Tuple[Union[int, str], ...],
167-
errors: Union[List[InitErrorDetails], List[ErrorDetails]],
168-
) -> List[InitErrorDetails]:
166+
prefix: tuple[Union[int, str], ...],
167+
errors: Union[list[InitErrorDetails], list[ErrorDetails]],
168+
) -> list[InitErrorDetails]:
169169
"""
170170
Extend all errors passed as list to include an additional prefix.
171171

pydantic_async_validation/validators.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from types import FunctionType
2-
from typing import TYPE_CHECKING, Any, Callable, Optional, Tuple
2+
from typing import TYPE_CHECKING, Any, Callable, Optional
33

44
from pydantic.errors import PydanticUserError
55

@@ -64,7 +64,7 @@ def async_field_validator(
6464
code='validator-instance-method',
6565
)
6666

67-
field_names: Tuple[str, ...] = __field_name, *additional_field_names
67+
field_names: tuple[str, ...] = __field_name, *additional_field_names
6868

6969
def dec(func: Callable) -> Callable:
7070
setattr(

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,12 @@ pyright = ">=1.1.350,<1.2"
2727

2828
[tool.ruff]
2929
line-length = 115
30-
target-version = "py38"
30+
target-version = "py39"
3131
output-format = "grouped"
3232

3333
[tool.ruff.lint]
3434
select = ["F","E","W","C","I","N","UP","ANN","S","B","A","COM","C4","T20","PT","ARG","TD","RUF"]
35-
ignore = ["A001","A002","A003","ANN101","ANN102","ANN401","C901","N8","B008","F405","F821"]
35+
ignore = ["A001","A002","A003","ANN401","C901","N8","B008","F405","F821"]
3636

3737
[tool.ruff.lint.per-file-ignores]
3838
"__init__.py" = ["F401"]

tests/test_field_validators.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Any, Dict, List, Set, Tuple
1+
from typing import Any
22

33
import pydantic
44
import pytest
@@ -129,9 +129,9 @@ async def validate_name(self, config: ValidationInfo) -> None:
129129
async def test_async_validation_will_call_sub_model_validation():
130130
class OtherModel(AsyncValidationModelMixin, pydantic.BaseModel):
131131
something: SomethingModel
132-
something_list: List[SomethingModel]
133-
something_tuple: Tuple[SomethingModel]
134-
somethings_by_name: Dict[str, SomethingModel]
132+
something_list: list[SomethingModel]
133+
something_tuple: tuple[SomethingModel]
134+
somethings_by_name: dict[str, SomethingModel]
135135

136136
instance = OtherModel(
137137
something=SomethingModel(name="invalid", age=1),

tests/test_model_validators.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Any, Dict, List
1+
from typing import Any
22

33
import pydantic
44
import pytest
@@ -94,8 +94,8 @@ async def validate_name(self, config: ValidationInfo) -> None:
9494
async def test_async_validation_will_call_sub_model_validation():
9595
class OtherModel(AsyncValidationModelMixin, pydantic.BaseModel):
9696
something: SomethingModel
97-
somethings: List[SomethingModel]
98-
somethings_by_name: Dict[str, SomethingModel]
97+
somethings: list[SomethingModel]
98+
somethings_by_name: dict[str, SomethingModel]
9999

100100
instance = OtherModel(
101101
something=SomethingModel(name="invalid", age=1),

0 commit comments

Comments
 (0)