diff --git a/Makefile b/Makefile index 03e023f0..e3b79796 100644 --- a/Makefile +++ b/Makefile @@ -41,7 +41,7 @@ install: ## Install the project and @if [ "$(VENV_EXISTS)" ]; then $(MAKE) destroy; fi @if [ "$(VENV_EXISTS)" ]; then $(MAKE) clean; fi @if [ "$(USING_PDM)" ]; then $(PDM) config venv.in_project true && python3 -m venv --copies .venv && . $(ENV_PREFIX)/activate && $(ENV_PREFIX)/pip install --quiet -U wheel setuptools cython mypy build pip; fi - @if [ "$(USING_PDM)" ]; then $(PDM) install -G:all; fi + @if [ "$(USING_PDM)" ]; then $(PDM) use -f .venv && $(PDM) install -d -G:all; fi @echo "=> Install complete! Note: If you want to re-install re-run 'make install'" diff --git a/advanced_alchemy/base.py b/advanced_alchemy/base.py index 2d06e34a..f716767f 100644 --- a/advanced_alchemy/base.py +++ b/advanced_alchemy/base.py @@ -5,7 +5,7 @@ import contextlib import re from datetime import date, datetime, timezone -from typing import TYPE_CHECKING, Any, ClassVar, Protocol, TypeVar, runtime_checkable +from typing import TYPE_CHECKING, Any, Protocol, TypeVar, runtime_checkable from uuid import UUID from sqlalchemy import Date, Index, MetaData, Sequence, String, UniqueConstraint @@ -33,7 +33,9 @@ if TYPE_CHECKING: from sqlalchemy.sql import FromClause - from sqlalchemy.sql.schema import _NamingSchemaParameter as NamingSchemaParameter + from sqlalchemy.sql.schema import ( + _NamingSchemaParameter as NamingSchemaParameter, # pyright: ignore[reportPrivateUsage] + ) from sqlalchemy.types import TypeEngine @@ -78,11 +80,11 @@ """Regular expression for table name""" -def merge_table_arguments( +def merge_table_arguments( # pyright: ignore[reportUnknownParameterType] cls: DeclarativeBase, *mixins: Any, - table_args: dict | tuple | None = None, -) -> tuple | dict: + table_args: dict | tuple | None = None, # pyright: ignore[reportMissingTypeArgument,reportUnknownParameterType] +) -> tuple | dict: # pyright: ignore[reportMissingTypeArgument] """Merge Table Arguments. When using mixins that include their own table args, it is difficult to append info into the model such as a comment. @@ -92,7 +94,7 @@ def merge_table_arguments( Args: cls (DeclarativeBase): This is the model that will get the table args *mixins (Any): The mixins to add into the model - table_args: additional information to add to tableargs + table_args: additional information to add to table_args Returns: tuple | dict: The merged __table_args__ property @@ -100,19 +102,19 @@ def merge_table_arguments( args: list[Any] = [] kwargs: dict[str, Any] = {} - mixin_table_args = (getattr(super(base_cls, cls), "__table_args__", None) for base_cls in (cls, *mixins)) + mixin_table_args = (getattr(super(base_cls, cls), "__table_args__", None) for base_cls in (cls, *mixins)) # pyright: ignore[reportArgumentType,reportUnknownArgumentType] - for arg_to_merge in (*mixin_table_args, table_args): + for arg_to_merge in (*mixin_table_args, table_args): # pyright: ignore[reportUnknownVariableType] if arg_to_merge: if isinstance(arg_to_merge, tuple): - last_positional_arg = arg_to_merge[-1] - args.extend(arg_to_merge[:-1]) + last_positional_arg = arg_to_merge[-1] # pyright: ignore[reportUnknownVariableType] + args.extend(arg_to_merge[:-1]) # pyright: ignore[reportUnknownArgumentType] if isinstance(last_positional_arg, dict): - kwargs.update(last_positional_arg) + kwargs.update(last_positional_arg) # pyright: ignore[reportUnknownArgumentType] else: args.append(last_positional_arg) elif isinstance(arg_to_merge, dict): - kwargs.update(arg_to_merge) + kwargs.update(arg_to_merge) # pyright: ignore[reportUnknownArgumentType] if args: if kwargs: @@ -126,8 +128,8 @@ class ModelProtocol(Protocol): """The base SQLAlchemy model protocol.""" __table__: FromClause - __mapper__: Mapper - __name__: ClassVar[str] + __mapper__: Mapper # pyright: ignore[reportMissingTypeArgument] + __name__: str def to_dict(self, exclude: set[str] | None = None) -> dict[str, Any]: """Convert model to dictionary. @@ -204,9 +206,9 @@ class AuditColumns: class BasicAttributes: """Basic attributes for SQLALchemy tables and queries.""" - __name__: ClassVar[str] + __name__: str __table__: FromClause - __mapper__: Mapper + __mapper__: Mapper # pyright: ignore[reportMissingTypeArgument] def to_dict(self, exclude: set[str] | None = None) -> dict[str, Any]: """Convert model to dictionary. @@ -217,7 +219,7 @@ def to_dict(self, exclude: set[str] | None = None) -> dict[str, Any]: exclude = {"sa_orm_sentinel", "_sentinel"}.union(self._sa_instance_state.unloaded).union(exclude or []) # type: ignore[attr-defined] return { field: getattr(self, field) - for field in self.__mapper__.columns.keys() # noqa: SIM118 + for field in self.__mapper__.columns.keys() # pyright: ignore[reportUnknownMemberType] # noqa: SIM118 if field not in exclude } @@ -257,7 +259,7 @@ def _create_unique_slug_constraint(*_args: Any, **kwargs: Any) -> bool: return not kwargs["dialect"].name.startswith("spanner") @declared_attr.directive - def __table_args__(cls) -> tuple | dict: + def __table_args__(cls) -> tuple | dict: # pyright: ignore[reportMissingTypeArgument,reportUnknownParameterType] return ( UniqueConstraint( cls.slug, diff --git a/advanced_alchemy/repository/_async.py b/advanced_alchemy/repository/_async.py index 8f851460..a65f66a1 100644 --- a/advanced_alchemy/repository/_async.py +++ b/advanced_alchemy/repository/_async.py @@ -2,7 +2,7 @@ import random import string -from typing import TYPE_CHECKING, Any, Final, Iterable, Literal, cast +from typing import TYPE_CHECKING, Any, Final, Iterable, List, Literal, cast from sqlalchemy import ( Result, @@ -1281,7 +1281,7 @@ async def list( instances = list(result.scalars()) for instance in instances: self._expunge(instance, auto_expunge=auto_expunge) - return instances + return cast("List[ModelT]", instances) def filter_collection_by_kwargs( self, diff --git a/advanced_alchemy/repository/_sync.py b/advanced_alchemy/repository/_sync.py index f304f2de..2e938ffd 100644 --- a/advanced_alchemy/repository/_sync.py +++ b/advanced_alchemy/repository/_sync.py @@ -4,7 +4,7 @@ import random import string -from typing import TYPE_CHECKING, Any, Final, Iterable, Literal, cast +from typing import TYPE_CHECKING, Any, Final, Iterable, List, Literal, cast from sqlalchemy import ( Result, @@ -1282,7 +1282,7 @@ def list( instances = list(result.scalars()) for instance in instances: self._expunge(instance, auto_expunge=auto_expunge) - return instances + return cast("List[ModelT]", instances) def filter_collection_by_kwargs( self, diff --git a/advanced_alchemy/repository/typing.py b/advanced_alchemy/repository/typing.py index dada6df1..2e25bc70 100644 --- a/advanced_alchemy/repository/typing.py +++ b/advanced_alchemy/repository/typing.py @@ -1,31 +1,23 @@ -from typing import TYPE_CHECKING, Any, Tuple, TypeVar +from typing import TYPE_CHECKING, Any, Tuple, TypeVar, Union if TYPE_CHECKING: - from sqlalchemy import Select + from sqlalchemy import RowMapping, Select from advanced_alchemy import base - from advanced_alchemy.repository._async import SQLAlchemyAsyncRepository - from advanced_alchemy.repository._sync import SQLAlchemySyncRepository __all__ = ( "ModelT", "SelectT", "RowT", - "SQLAlchemySyncRepositoryT", - "SQLAlchemyAsyncRepositoryT", "MISSING", ) T = TypeVar("T") ModelT = TypeVar("ModelT", bound="base.ModelProtocol") - - SelectT = TypeVar("SelectT", bound="Select[Any]") RowT = TypeVar("RowT", bound=Tuple[Any, ...]) - - -SQLAlchemySyncRepositoryT = TypeVar("SQLAlchemySyncRepositoryT", bound="SQLAlchemySyncRepository") -SQLAlchemyAsyncRepositoryT = TypeVar("SQLAlchemyAsyncRepositoryT", bound="SQLAlchemyAsyncRepository") +RowMappingT = TypeVar("RowMappingT", bound="RowMapping") +ModelOrRowMappingT = TypeVar("ModelOrRowMappingT", bound="Union[base.ModelProtocol, RowMapping]") class _MISSING: diff --git a/advanced_alchemy/service/_converters.py b/advanced_alchemy/service/_converters.py index ee3c892c..efaddf9a 100644 --- a/advanced_alchemy/service/_converters.py +++ b/advanced_alchemy/service/_converters.py @@ -13,16 +13,16 @@ from uuid import UUID from advanced_alchemy.filters import FilterTypes, LimitOffset -from advanced_alchemy.repository.typing import ModelT +from advanced_alchemy.repository.typing import ModelOrRowMappingT from advanced_alchemy.service.pagination import OffsetPagination if TYPE_CHECKING: from sqlalchemy import ColumnElement - from advanced_alchemy.service.typing import FilterTypeT, ModelDTOT, RowMappingT + from advanced_alchemy.service.typing import FilterTypeT, ModelDTOT try: - from msgspec import Struct, convert + from msgspec import Struct, convert # pyright: ignore[reportAssignmentType] except ImportError: # pragma: nocover class Struct: # type: ignore[no-redef] @@ -34,11 +34,11 @@ def convert(*args: Any, **kwargs: Any) -> Any: # type: ignore[no-redef] # noqa: try: - from pydantic import BaseModel - from pydantic.type_adapter import TypeAdapter + from pydantic.main import ModelMetaclass # pyright: ignore[reportAssignmentType] + from pydantic.type_adapter import TypeAdapter # pyright: ignore[reportAssignmentType] except ImportError: # pragma: nocover - class BaseModel: # type: ignore[no-redef] + class ModelMetaclass: # type: ignore[no-redef] """Placeholder Implementation""" class TypeAdapter: # type: ignore[no-redef] @@ -81,13 +81,13 @@ def _default_deserializer( def _find_filter( filter_type: type[FilterTypeT], - *filters: Sequence[FilterTypes | ColumnElement[bool]] | Sequence[FilterTypes], + filters: Sequence[FilterTypes | ColumnElement[bool]] | Sequence[FilterTypes], ) -> FilterTypeT | None: """Get the filter specified by filter type from the filters. Args: filter_type: The type of filter to find. - *filters: filter types to apply to the query + filters: filter types to apply to the query Returns: The match filter instance or None @@ -99,18 +99,11 @@ def _find_filter( def to_schema( - data: ModelT | Sequence[ModelT] | Sequence[RowMappingT] | RowMappingT, + data: ModelOrRowMappingT | Sequence[ModelOrRowMappingT], total: int | None = None, filters: Sequence[FilterTypes | ColumnElement[bool]] | Sequence[FilterTypes] = EMPTY_FILTER, - schema_type: type[ModelT | ModelDTOT | RowMappingT] | None = None, -) -> ( - ModelT - | OffsetPagination[ModelT] - | ModelDTOT - | OffsetPagination[ModelDTOT] - | RowMappingT - | OffsetPagination[RowMappingT] -): + schema_type: type[ModelDTOT] | None = None, +) -> ModelOrRowMappingT | OffsetPagination[ModelOrRowMappingT] | ModelDTOT | OffsetPagination[ModelDTOT]: if schema_type is not None and issubclass(schema_type, Struct): if not isinstance(data, Sequence): return convert( # type: ignore # noqa: PGH003 @@ -124,7 +117,7 @@ def to_schema( ], ), ) - limit_offset = _find_filter(LimitOffset, *filters) + limit_offset = _find_filter(LimitOffset, filters=filters) total = total or len(data) limit_offset = limit_offset if limit_offset is not None else LimitOffset(limit=len(data), offset=0) return OffsetPagination[schema_type]( # type: ignore[valid-type] @@ -144,10 +137,10 @@ def to_schema( total=total, ) - if schema_type is not None and issubclass(schema_type, BaseModel): + if schema_type is not None and issubclass(schema_type, ModelMetaclass): if not isinstance(data, Sequence): - return TypeAdapter(schema_type).validate_python(data, from_attributes=True) # type: ignore # noqa: PGH003 - limit_offset = _find_filter(LimitOffset, *filters) + return TypeAdapter(schema_type).validate_python(data, from_attributes=True) # pyright: ignore[reportUnknownVariableType,reportUnknownMemberType,reportAttributeAccessIssue,reportCallIssue] + limit_offset = _find_filter(LimitOffset, filters=filters) total = total if total else len(data) limit_offset = limit_offset if limit_offset is not None else LimitOffset(limit=len(data), offset=0) return OffsetPagination[schema_type]( # type: ignore[valid-type] @@ -157,12 +150,12 @@ def to_schema( total=total, ) if not issubclass(type(data), Sequence): - return data # type: ignore[return-value] - limit_offset = _find_filter(LimitOffset, *filters) + return cast("ModelOrRowMappingT", data) + limit_offset = _find_filter(LimitOffset, filters=filters) total = total or len(data) # type: ignore[arg-type] limit_offset = limit_offset if limit_offset is not None else LimitOffset(limit=len(data), offset=0) # type: ignore[arg-type] - return OffsetPagination[ModelT]( - items=data, # type: ignore[arg-type] + return OffsetPagination[ModelOrRowMappingT]( + items=cast("List[ModelOrRowMappingT]", data), limit=limit_offset.limit, offset=limit_offset.offset, total=total, diff --git a/advanced_alchemy/service/_util.py b/advanced_alchemy/service/_util.py index 51bbfc74..99a22e55 100644 --- a/advanced_alchemy/service/_util.py +++ b/advanced_alchemy/service/_util.py @@ -18,9 +18,9 @@ from advanced_alchemy.base import ModelProtocol from advanced_alchemy.filters import FilterTypes - from advanced_alchemy.repository.typing import ModelT + from advanced_alchemy.repository.typing import ModelOrRowMappingT from advanced_alchemy.service.pagination import OffsetPagination - from advanced_alchemy.service.typing import ModelDTOT, RowMappingT + from advanced_alchemy.service.typing import ModelDTOT class ResultConverter: @@ -29,110 +29,51 @@ class ResultConverter: @overload def to_schema( self, - data: RowMappingT, + data: ModelOrRowMappingT, total: int | None = None, filters: Sequence[FilterTypes | ColumnElement[bool]] | Sequence[FilterTypes] = EMPTY_FILTER, - ) -> RowMappingT: ... + ) -> ModelOrRowMappingT: ... @overload def to_schema( self, - data: Sequence[RowMappingT], + data: Sequence[ModelOrRowMappingT], total: int | None = None, filters: Sequence[FilterTypes | ColumnElement[bool]] | Sequence[FilterTypes] = EMPTY_FILTER, - ) -> OffsetPagination[RowMappingT]: ... + ) -> OffsetPagination[ModelOrRowMappingT]: ... @overload def to_schema( self, - data: RowMapping, + data: ModelProtocol | RowMapping, total: int | None = None, filters: Sequence[FilterTypes | ColumnElement[bool]] | Sequence[FilterTypes] = EMPTY_FILTER, - schema_type: type[ModelDTOT] | None = None, + schema_type: type[ModelDTOT] = ..., ) -> ModelDTOT: ... @overload def to_schema( self, - data: Sequence[RowMapping], + data: Sequence[ModelOrRowMappingT], total: int | None = None, filters: Sequence[FilterTypes | ColumnElement[bool]] | Sequence[FilterTypes] = EMPTY_FILTER, - schema_type: type[ModelDTOT] | None = None, + schema_type: type[ModelDTOT] = ..., ) -> OffsetPagination[ModelDTOT]: ... - @overload - def to_schema( - self, - data: ModelT, - total: int | None = None, - filters: Sequence[FilterTypes | ColumnElement[bool]] | Sequence[FilterTypes] = EMPTY_FILTER, - ) -> ModelT: ... - - @overload - def to_schema( - self, - data: Sequence[ModelT], - total: int | None = None, - filters: Sequence[FilterTypes | ColumnElement[bool]] | Sequence[FilterTypes] = EMPTY_FILTER, - ) -> OffsetPagination[ModelT]: ... - - @overload def to_schema( self, - data: ModelT, - total: int | None = None, - filters: Sequence[FilterTypes | ColumnElement[bool]] | Sequence[FilterTypes] = EMPTY_FILTER, - schema_type: type[ModelT] = ..., - ) -> ModelT: ... - - @overload - def to_schema( - self, - data: Sequence[ModelT], - total: int | None = None, - filters: Sequence[FilterTypes | ColumnElement[bool]] | Sequence[FilterTypes] = EMPTY_FILTER, - schema_type: type[ModelT] = ..., - ) -> OffsetPagination[ModelT]: ... - - @overload - def to_schema( - self, - data: ModelProtocol, + data: ModelOrRowMappingT | Sequence[ModelOrRowMappingT], total: int | None = None, filters: Sequence[FilterTypes | ColumnElement[bool]] | Sequence[FilterTypes] = EMPTY_FILTER, schema_type: type[ModelDTOT] | None = None, - ) -> ModelDTOT: ... - - @overload - def to_schema( - self, - data: Sequence[ModelT], - total: int | None = None, - filters: Sequence[FilterTypes | ColumnElement[bool]] | Sequence[FilterTypes] = EMPTY_FILTER, - schema_type: type[ModelDTOT] | None = None, - ) -> OffsetPagination[ModelDTOT]: ... - - def to_schema( - self, - data: ModelT | Sequence[ModelT] | Sequence[RowMappingT] | RowMappingT, - total: int | None = None, - filters: Sequence[FilterTypes | ColumnElement[bool]] | Sequence[FilterTypes] = EMPTY_FILTER, - schema_type: type[ModelDTOT | ModelT] | None = None, - ) -> ( - ModelT - | OffsetPagination[ModelT] - | ModelDTOT - | OffsetPagination[ModelDTOT] - | RowMapping - | OffsetPagination[RowMappingT] - ): + ) -> ModelOrRowMappingT | OffsetPagination[ModelOrRowMappingT] | ModelDTOT | OffsetPagination[ModelDTOT]: """Convert the object to a response schema. When `schema_type` is None, the model is returned with no conversion. Args: data: The return from one of the service calls. total: the total number of rows in the data - schema_type: Collection route filters. filters: Collection route filters. + schema_type: Collection route filters. Returns: The list of instances retrieved from the repository. diff --git a/advanced_alchemy/service/typing.py b/advanced_alchemy/service/typing.py index 7795988d..10845a97 100644 --- a/advanced_alchemy/service/typing.py +++ b/advanced_alchemy/service/typing.py @@ -8,14 +8,13 @@ from typing import Any, TypeVar -from sqlalchemy import RowMapping # noqa: TCH002 from typing_extensions import TypeAlias from advanced_alchemy.filters import FilterTypes from advanced_alchemy.repository.typing import ModelT # noqa: TCH001 try: - from msgspec import Struct + from msgspec import Struct # pyright: ignore[reportAssignmentType,reportUnknownVariableType,reportMissingImports] except ImportError: # pragma: nocover class Struct: # type: ignore[no-redef] @@ -23,7 +22,9 @@ class Struct: # type: ignore[no-redef] try: - from pydantic import BaseModel + from pydantic import ( # pyright: ignore[reportAssignmentType,reportUnknownVariableType,reportMissingImports] + BaseModel, # pyright: ignore[reportAssignmentType,reportUnknownVariableType,reportMissingImports] + ) except ImportError: # pragma: nocover class BaseModel: # type: ignore[no-redef] @@ -34,4 +35,5 @@ class BaseModel: # type: ignore[no-redef] ModelDictListT: TypeAlias = "list[ModelT | dict[str, Any]] | list[dict[str, Any]]" FilterTypeT = TypeVar("FilterTypeT", bound=FilterTypes) ModelDTOT = TypeVar("ModelDTOT", bound="Struct | BaseModel") -RowMappingT = TypeVar("RowMappingT", bound="RowMapping") +PydanticModelDTOT = TypeVar("PydanticModelDTOT", bound="BaseModel") +StructModelDTOT = TypeVar("StructModelDTOT", bound="Struct") diff --git a/pdm.lock b/pdm.lock index 8fb6aa4e..2d5fd930 100644 --- a/pdm.lock +++ b/pdm.lock @@ -336,16 +336,16 @@ files = [ [[package]] name = "babel" -version = "2.14.0" -requires_python = ">=3.7" +version = "2.15.0" +requires_python = ">=3.8" summary = "Internationalization utilities" groups = ["docs"] dependencies = [ "pytz>=2015.7; python_version < \"3.9\"", ] files = [ - {file = "Babel-2.14.0-py3-none-any.whl", hash = "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287"}, - {file = "Babel-2.14.0.tar.gz", hash = "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363"}, + {file = "Babel-2.15.0-py3-none-any.whl", hash = "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb"}, + {file = "babel-2.15.0.tar.gz", hash = "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413"}, ] [[package]] @@ -434,13 +434,13 @@ files = [ [[package]] name = "blinker" -version = "1.8.1" +version = "1.8.2" requires_python = ">=3.8" summary = "Fast, simple object-to-object and broadcast signaling" groups = ["extensions"] files = [ - {file = "blinker-1.8.1-py3-none-any.whl", hash = "sha256:5f1cdeff423b77c31b89de0565cd03e5275a03028f44b2b15f912632a58cced6"}, - {file = "blinker-1.8.1.tar.gz", hash = "sha256:da44ec748222dcd0105ef975eed946da197d5bdf8bafb6aa92f5bc89da63fa25"}, + {file = "blinker-1.8.2-py3-none-any.whl", hash = "sha256:1779309f71bf239144b9399d06ae925637cf6634cf6bd131104184531bf67c01"}, + {file = "blinker-1.8.2.tar.gz", hash = "sha256:8f77b09d3bf7c795e969e9486f39c2c5e9c39d4ee07424be2bc594ece9642d83"}, ] [[package]] @@ -812,7 +812,7 @@ files = [ [[package]] name = "cryptography" -version = "42.0.5" +version = "42.0.7" requires_python = ">=3.7" summary = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." groups = ["dev"] @@ -820,38 +820,38 @@ dependencies = [ "cffi>=1.12; platform_python_implementation != \"PyPy\"", ] files = [ - {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16"}, - {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da"}, - {file = "cryptography-42.0.5-cp37-abi3-win32.whl", hash = "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74"}, - {file = "cryptography-42.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940"}, - {file = "cryptography-42.0.5-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30"}, - {file = "cryptography-42.0.5-cp39-abi3-win32.whl", hash = "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413"}, - {file = "cryptography-42.0.5-cp39-abi3-win_amd64.whl", hash = "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd"}, - {file = "cryptography-42.0.5.tar.gz", hash = "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1"}, + {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a987f840718078212fdf4504d0fd4c6effe34a7e4740378e59d47696e8dfb477"}, + {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd13b5e9b543532453de08bcdc3cc7cebec6f9883e886fd20a92f26940fd3e7a"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a79165431551042cc9d1d90e6145d5d0d3ab0f2d66326c201d9b0e7f5bf43604"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a47787a5e3649008a1102d3df55424e86606c9bae6fb77ac59afe06d234605f8"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:02c0eee2d7133bdbbc5e24441258d5d2244beb31da5ed19fbb80315f4bbbff55"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5e44507bf8d14b36b8389b226665d597bc0f18ea035d75b4e53c7b1ea84583cc"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7f8b25fa616d8b846aef64b15c606bb0828dbc35faf90566eb139aa9cff67af2"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:93a3209f6bb2b33e725ed08ee0991b92976dfdcf4e8b38646540674fc7508e13"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e6b8f1881dac458c34778d0a424ae5769de30544fc678eac51c1c8bb2183e9da"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3de9a45d3b2b7d8088c3fbf1ed4395dfeff79d07842217b38df14ef09ce1d8d7"}, + {file = "cryptography-42.0.7-cp37-abi3-win32.whl", hash = "sha256:789caea816c6704f63f6241a519bfa347f72fbd67ba28d04636b7c6b7da94b0b"}, + {file = "cryptography-42.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:8cb8ce7c3347fcf9446f201dc30e2d5a3c898d009126010cbd1f443f28b52678"}, + {file = "cryptography-42.0.7-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:a3a5ac8b56fe37f3125e5b72b61dcde43283e5370827f5233893d461b7360cd4"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:779245e13b9a6638df14641d029add5dc17edbef6ec915688f3acb9e720a5858"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d563795db98b4cd57742a78a288cdbdc9daedac29f2239793071fe114f13785"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:31adb7d06fe4383226c3e963471f6837742889b3c4caa55aac20ad951bc8ffda"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:efd0bf5205240182e0f13bcaea41be4fdf5c22c5129fc7ced4a0282ac86998c9"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a9bc127cdc4ecf87a5ea22a2556cab6c7eda2923f84e4f3cc588e8470ce4e42e"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3577d029bc3f4827dd5bf8bf7710cac13527b470bbf1820a3f394adb38ed7d5f"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2e47577f9b18723fa294b0ea9a17d5e53a227867a0a4904a1a076d1646d45ca1"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1a58839984d9cb34c855197043eaae2c187d930ca6d644612843b4fe8513c886"}, + {file = "cryptography-42.0.7-cp39-abi3-win32.whl", hash = "sha256:e6b79d0adb01aae87e8a44c2b64bc3f3fe59515280e00fb6d57a7267a2583cda"}, + {file = "cryptography-42.0.7-cp39-abi3-win_amd64.whl", hash = "sha256:16268d46086bb8ad5bf0a2b5544d8a9ed87a0e33f5e77dd3c3301e63d941a83b"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2954fccea107026512b15afb4aa664a5640cd0af630e2ee3962f2602693f0c82"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:362e7197754c231797ec45ee081f3088a27a47c6c01eff2ac83f60f85a50fe60"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f698edacf9c9e0371112792558d2f705b5645076cc0aaae02f816a0171770fd"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5482e789294854c28237bba77c4c83be698be740e31a3ae5e879ee5444166582"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e9b2a6309f14c0497f348d08a065d52f3020656f675819fc405fb63bbcd26562"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d8e3098721b84392ee45af2dd554c947c32cc52f862b6a3ae982dbb90f577f14"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c65f96dad14f8528a447414125e1fc8feb2ad5a272b8f68477abbcc1ea7d94b9"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36017400817987670037fbb0324d71489b6ead6231c9604f8fc1f7d008087c68"}, + {file = "cryptography-42.0.7.tar.gz", hash = "sha256:ecbfbc00bf55888edda9868a4cf927205de8499e7fabe6c050322298382953f2"}, ] [[package]] @@ -996,12 +996,11 @@ files = [ [[package]] name = "editorconfig" -version = "0.12.3" +version = "0.12.4" summary = "EditorConfig File Locator and Interpreter for Python" groups = ["extensions"] files = [ - {file = "EditorConfig-0.12.3-py3-none-any.whl", hash = "sha256:6b0851425aa875b08b16789ee0eeadbd4ab59666e9ebe728e526314c4a2e52c1"}, - {file = "EditorConfig-0.12.3.tar.gz", hash = "sha256:57f8ce78afcba15c8b18d46b5170848c88d56fd38f05c2ec60dbbfcb8996e89e"}, + {file = "EditorConfig-0.12.4.tar.gz", hash = "sha256:24857fa1793917dd9ccf0c7810a07e05404ce9b823521c7dce22a4fb5d125f80"}, ] [[package]] @@ -1044,7 +1043,7 @@ files = [ [[package]] name = "faker" -version = "25.0.1" +version = "25.2.0" requires_python = ">=3.8" summary = "Faker is a Python package that generates fake data for you." groups = ["dev", "extensions"] @@ -1052,8 +1051,8 @@ dependencies = [ "python-dateutil>=2.4", ] files = [ - {file = "Faker-25.0.1-py3-none-any.whl", hash = "sha256:6737cc6d591cd83421fdc5e494f6e2c1a6e32266214f158b745aa9fa15687c98"}, - {file = "Faker-25.0.1.tar.gz", hash = "sha256:c153505618801f1704807b258a6010ea8cabf91f66f4788939bfdba83b887e76"}, + {file = "Faker-25.2.0-py3-none-any.whl", hash = "sha256:cfe97c4857c4c36ee32ea4aaabef884895992e209bae4cbd26807cf3e05c6918"}, + {file = "Faker-25.2.0.tar.gz", hash = "sha256:45b84f47ff1ef86e3d1a8d11583ca871ecf6730fad0660edadc02576583a2423"}, ] [[package]] @@ -1082,18 +1081,18 @@ files = [ [[package]] name = "fastapi-cli" -version = "0.0.2" +version = "0.0.3" requires_python = ">=3.8" summary = "Run and manage FastAPI apps from the command line with FastAPI CLI. 🚀" groups = ["dev", "extensions"] dependencies = [ "fastapi", "typer>=0.12.3", - "uvicorn[standard]>=0.29.0", + "uvicorn[standard]>=0.15.0", ] files = [ - {file = "fastapi_cli-0.0.2-py3-none-any.whl", hash = "sha256:d7a8ec89fd52ad16c52de9fe7299e4b22c7a32e1bf28aa886e5517e4927423dd"}, - {file = "fastapi_cli-0.0.2.tar.gz", hash = "sha256:589565ba758432632eadcf7b950e0ec76bb283b549784d9df17f261a8a9de476"}, + {file = "fastapi_cli-0.0.3-py3-none-any.whl", hash = "sha256:ae233115f729945479044917d949095e829d2d84f56f55ce1ca17627872825a5"}, + {file = "fastapi_cli-0.0.3.tar.gz", hash = "sha256:3b6e4d2c4daee940fb8db59ebbfd60a72c4b962bcf593e263e4cc69da4ea3d7f"}, ] [[package]] @@ -1143,21 +1142,21 @@ files = [ [[package]] name = "git-cliff" -version = "2.2.1" +version = "2.2.2" requires_python = ">=3.7" summary = "A highly customizable changelog generator ⛰️" groups = ["docs"] files = [ - {file = "git_cliff-2.2.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:f7c6550733a60e135f821ac999ee6804f185089ae6b7bb4f91dad32a8d95a2d5"}, - {file = "git_cliff-2.2.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e624814e9273f8a4000fb7425842a7c062631234a84092a9d551f24520c956db"}, - {file = "git_cliff-2.2.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:548c994d902e74e2e104e4603ac29419020d3d54eaf5ce3b8e17e77493448faf"}, - {file = "git_cliff-2.2.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:739447e3c22c7aa964f0900b4f63234a5ff8246988797a70f3245fc37cebf1b5"}, - {file = "git_cliff-2.2.1-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:aea2aa2250b5fff738294e7eee1c458ba4dadc81fc823d31f29eb1c689ee09d0"}, - {file = "git_cliff-2.2.1-py3-none-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0645822f4ff4aaf68e7fa61fd31a583ccef9793a71b0a34c50c9fac43d90a254"}, - {file = "git_cliff-2.2.1-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:01a02869e3b186f173d1f14db11f7c7130394195fc6e352ac0e3cd505d65104f"}, - {file = "git_cliff-2.2.1-py3-none-win32.whl", hash = "sha256:e98bf87ee7b22eacdba0e74016f93b6d6d1fea6cb2cf67742c3aaa1614fafef9"}, - {file = "git_cliff-2.2.1-py3-none-win_amd64.whl", hash = "sha256:e57155dbb3a895c09ed358137d0d1d30d3f15971456f3c48ede9bfd37434ce75"}, - {file = "git_cliff-2.2.1.tar.gz", hash = "sha256:6db64534dc5ec3d7656b9be6ddf7004cfd1ddf8f815f66d41bc9330f42b61d6d"}, + {file = "git_cliff-2.2.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:3a3af4cb34b11875c9c2939d5eae41def33e1cc2bb837069ab61ac2bdec47ad2"}, + {file = "git_cliff-2.2.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:8f631e193ea668d4527cf50a258a8e1597058e46021e3ec44a33b4c343e0fee9"}, + {file = "git_cliff-2.2.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65e7aac3357c75aaaccfe737a38772cada41d734ca86c2ca496ca60fa1e3f2ee"}, + {file = "git_cliff-2.2.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a59730f49e212c4583a967e9ddea7f6c507cee01d461f4c4602a366999e3be73"}, + {file = "git_cliff-2.2.2-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:0f411a58df635ce779d0048db19d347a0eeb37f3d061e08335659c587518b4cc"}, + {file = "git_cliff-2.2.2-py3-none-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6def651f6c44b527f33822c8e063383f2596eab7f0796d06213a31c22302d2c4"}, + {file = "git_cliff-2.2.2-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:aa3888fc975a0d55a8434ef0ad0d481e918ad761c191a64b29f3ed9337843538"}, + {file = "git_cliff-2.2.2-py3-none-win32.whl", hash = "sha256:96155b457dec726dcebed2c5a3fecb3994c7991a4ce0779515907fd53945c13d"}, + {file = "git_cliff-2.2.2-py3-none-win_amd64.whl", hash = "sha256:fa5017b3e204f5cc7c7b4442a082fa9ae6f40736e55353649fcc12e6bb7632be"}, + {file = "git_cliff-2.2.2.tar.gz", hash = "sha256:1ff34e6659cac3f9fa01645e1edf5bce333d22738a6579be7b8e79c636a6c25f"}, ] [[package]] @@ -1424,18 +1423,18 @@ files = [ [[package]] name = "grpcio-status" -version = "1.60.0" +version = "1.62.2" requires_python = ">=3.6" summary = "Status proto mapping for gRPC" groups = ["dev"] dependencies = [ "googleapis-common-protos>=1.5.5", - "grpcio>=1.60.0", + "grpcio>=1.62.2", "protobuf>=4.21.6", ] files = [ - {file = "grpcio-status-1.60.0.tar.gz", hash = "sha256:f10e0b6db3adc0fdc244b71962814ee982996ef06186446b5695b9fa635aa1ab"}, - {file = "grpcio_status-1.60.0-py3-none-any.whl", hash = "sha256:7d383fa36e59c1e61d380d91350badd4d12ac56e4de2c2b831b050362c3c572e"}, + {file = "grpcio-status-1.62.2.tar.gz", hash = "sha256:62e1bfcb02025a1cd73732a2d33672d3e9d0df4d21c12c51e0bbcaf09bab742a"}, + {file = "grpcio_status-1.62.2-py3-none-any.whl", hash = "sha256:206ddf0eb36bc99b033f03b2c8e95d319f0044defae9b41ae21408e7e0cda48f"}, ] [[package]] @@ -1640,7 +1639,7 @@ files = [ [[package]] name = "jinja2" -version = "3.1.3" +version = "3.1.4" requires_python = ">=3.7" summary = "A very fast and expressive template engine." groups = ["dev", "docs", "extensions"] @@ -1648,13 +1647,13 @@ dependencies = [ "MarkupSafe>=2.0", ] files = [ - {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, - {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, ] [[package]] name = "jsbeautifier" -version = "1.14.11" +version = "1.15.1" summary = "JavaScript unobfuscator and beautifier." groups = ["extensions"] dependencies = [ @@ -1662,7 +1661,7 @@ dependencies = [ "six>=1.13.0", ] files = [ - {file = "jsbeautifier-1.14.11.tar.gz", hash = "sha256:6b632581ea60dd1c133cd25a48ad187b4b91f526623c4b0fb5443ef805250505"}, + {file = "jsbeautifier-1.15.1.tar.gz", hash = "sha256:ebd733b560704c602d744eafc839db60a1ee9326e30a2a80c4adb8718adc1b24"}, ] [[package]] @@ -2253,7 +2252,7 @@ files = [ [[package]] name = "polyfactory" -version = "2.15.0" +version = "2.16.0" requires_python = "<4.0,>=3.8" summary = "Mock data generation factories" groups = ["dev", "extensions"] @@ -2262,8 +2261,8 @@ dependencies = [ "typing-extensions>=4.6.0", ] files = [ - {file = "polyfactory-2.15.0-py3-none-any.whl", hash = "sha256:ff5b6a8742cbd6fbde9f81310b9732d5421fbec31916d6ede5a977753110fbe9"}, - {file = "polyfactory-2.15.0.tar.gz", hash = "sha256:a3ff5263756ad74acf4001f04c1b6aab7d1197cbaa070352df79573a8dcd85ec"}, + {file = "polyfactory-2.16.0-py3-none-any.whl", hash = "sha256:168d8e50b77e91e35e691e8b3eedac43d7e423a6857fa26d473def96d53f0ecf"}, + {file = "polyfactory-2.16.0.tar.gz", hash = "sha256:03d8c706b70c4782ac8e637d0f6ab52760a7d11b712da5936a95a8f7022b2688"}, ] [[package]] @@ -2399,7 +2398,7 @@ files = [ [[package]] name = "psycopg-pool" -version = "3.2.1" +version = "3.2.2" requires_python = ">=3.8" summary = "Connection Pool for Psycopg" groups = ["dev"] @@ -2407,8 +2406,8 @@ dependencies = [ "typing-extensions>=4.4", ] files = [ - {file = "psycopg-pool-3.2.1.tar.gz", hash = "sha256:6509a75c073590952915eddbba7ce8b8332a440a31e77bba69561483492829ad"}, - {file = "psycopg_pool-3.2.1-py3-none-any.whl", hash = "sha256:060b551d1b97a8d358c668be58b637780b884de14d861f4f5ecc48b7563aafb7"}, + {file = "psycopg_pool-3.2.2-py3-none-any.whl", hash = "sha256:273081d0fbfaced4f35e69200c89cb8fbddfe277c38cc86c235b90a2ec2c8153"}, + {file = "psycopg_pool-3.2.2.tar.gz", hash = "sha256:9e22c370045f6d7f2666a5ad1b0caf345f9f1912195b0b25d0d3bcc4f3a7389c"}, ] [[package]] @@ -2644,13 +2643,13 @@ files = [ [[package]] name = "pygments" -version = "2.17.2" -requires_python = ">=3.7" +version = "2.18.0" +requires_python = ">=3.8" summary = "Pygments is a syntax highlighting package written in Python." groups = ["dev", "docs", "extensions"] files = [ - {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, - {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, ] [[package]] @@ -2969,7 +2968,7 @@ files = [ [[package]] name = "rich-click" -version = "1.8.0" +version = "1.8.1" requires_python = ">=3.7" summary = "Format click help output nicely with rich" groups = ["dev", "extensions"] @@ -2979,8 +2978,8 @@ dependencies = [ "typing-extensions", ] files = [ - {file = "rich_click-1.8.0-py3-none-any.whl", hash = "sha256:846f504eb83a948d864888b2d73c71e52c310490c2babceac57e388aead086e2"}, - {file = "rich_click-1.8.0.tar.gz", hash = "sha256:f8cad0d67d286d6cd6fc9f69f2d6f25c6c4c2d99fb9d6cb3b8987b593dbe6fa8"}, + {file = "rich_click-1.8.1-py3-none-any.whl", hash = "sha256:0cf0bf84404e78379bd2722db88cb07ffd0535440e20a05943d5b02249d90f8a"}, + {file = "rich_click-1.8.1.tar.gz", hash = "sha256:73c2ec88a66d7bf6b8c32783539d1c9c92c7c75847f14186092d27f83b206e8a"}, ] [[package]] @@ -3187,7 +3186,7 @@ files = [ [[package]] name = "shibuya" -version = "2024.4.27" +version = "2024.5.10" requires_python = ">=3.7" summary = "A clean, responsive, and customizable Sphinx documentation theme with light/dark mode." groups = ["docs"] @@ -3195,8 +3194,8 @@ dependencies = [ "Sphinx", ] files = [ - {file = "shibuya-2024.4.27-py3-none-any.whl", hash = "sha256:b0eaf3ae415eaefb898ca1ad07012c86f6ef12f43aaad73f0d8ef9a13d42bd5e"}, - {file = "shibuya-2024.4.27.tar.gz", hash = "sha256:6c7c83d49ae3f1d56c0d4c4ccddd31f5dab4aed4e6caf8f397f4de5da5af1911"}, + {file = "shibuya-2024.5.10-py3-none-any.whl", hash = "sha256:a1868bc5cd4605742b3cb75d0da2f8ee933873ee052398b8a7d1b2aba51159de"}, + {file = "shibuya-2024.5.10.tar.gz", hash = "sha256:3ff7cf4c6af90bb7c6d29322afc9f1fb76f0af8a86045f80f93cb32f3e496f8a"}, ] [[package]] @@ -4090,7 +4089,7 @@ files = [ [[package]] name = "virtualenv" -version = "20.26.1" +version = "20.26.2" requires_python = ">=3.7" summary = "Virtual Python Environment builder" groups = ["linting"] @@ -4100,8 +4099,8 @@ dependencies = [ "platformdirs<5,>=3.9.1", ] files = [ - {file = "virtualenv-20.26.1-py3-none-any.whl", hash = "sha256:7aa9982a728ae5892558bff6a2839c00b9ed145523ece2274fad6f414690ae75"}, - {file = "virtualenv-20.26.1.tar.gz", hash = "sha256:604bfdceaeece392802e6ae48e69cec49168b9c5f4a44e483963f9242eb0e78b"}, + {file = "virtualenv-20.26.2-py3-none-any.whl", hash = "sha256:a624db5e94f01ad993d476b9ee5346fdf7b9de43ccaee0e0197012dc838a0e9b"}, + {file = "virtualenv-20.26.2.tar.gz", hash = "sha256:82bf0f4eebbb78d36ddaee0283d43fe5736b53880b8a8cdcd37390a07ac3741c"}, ] [[package]] @@ -4284,7 +4283,7 @@ files = [ [[package]] name = "werkzeug" -version = "3.0.2" +version = "3.0.3" requires_python = ">=3.8" summary = "The comprehensive WSGI web application library." groups = ["extensions"] @@ -4292,8 +4291,8 @@ dependencies = [ "MarkupSafe>=2.1.1", ] files = [ - {file = "werkzeug-3.0.2-py3-none-any.whl", hash = "sha256:3aac3f5da756f93030740bc235d3e09449efcf65f2f55e3602e1d851b8f48795"}, - {file = "werkzeug-3.0.2.tar.gz", hash = "sha256:e39b645a6ac92822588e7b39a692e7828724ceae0b0d702ef96701f90e70128d"}, + {file = "werkzeug-3.0.3-py3-none-any.whl", hash = "sha256:fc9645dc43e03e4d630d23143a04a7f947a9a3b5727cd535fdfe155a17cc48c8"}, + {file = "werkzeug-3.0.3.tar.gz", hash = "sha256:097e5bfda9f0aba8da6b8545146def481d06aa7d3266e7448e2cccf67dd8bd18"}, ] [[package]] diff --git a/pyproject.toml b/pyproject.toml index aad85015..aae5d8aa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -307,7 +307,7 @@ warn_unused_configs = true warn_unused_ignores = true [[tool.mypy.overrides]] -disable_error_code = "attr-defined" +disable_error_code = "attr-defined,type-var" disallow_untyped_decorators = false module = "tests.*" warn_unused_ignores = false diff --git a/tests/integration/test_repository.py b/tests/integration/test_repository.py index d5f68484..edbb283f 100644 --- a/tests/integration/test_repository.py +++ b/tests/integration/test_repository.py @@ -109,7 +109,7 @@ @pytest.fixture(autouse=True) -def _clear_in_memory_db() -> Generator[None, None, None]: +def _clear_in_memory_db() -> Generator[None, None, None]: # pyright: ignore[reportUnusedFunction] try: yield finally: @@ -1173,7 +1173,7 @@ async def test_repo_list_and_count_method_empty(book_repo: BookRepository) -> No @pytest.fixture() def frozen_datetime() -> Generator[Coordinates, None, None]: - with travel(datetime.utcnow, tick=False) as frozen: + with travel(datetime.utcnow, tick=False) as frozen: # pyright: ignore[reportDeprecated] yield frozen @@ -1188,7 +1188,7 @@ async def test_repo_created_updated( if isinstance(author_repo, (SQLAlchemyAsyncMockRepository, SQLAlchemySyncMockRepository)): pytest.skip(f"{SQLAlchemyAsyncMockRepository.__name__} does not update created/updated columns") - if isinstance(author_repo, SQLAlchemyAsyncRepository): + if isinstance(author_repo, SQLAlchemyAsyncRepository): # pyright: ignore[reportUnnecessaryIsInstance] config = SQLAlchemyAsyncConfig( engine_instance=author_repo.session.get_bind(), # type: ignore[arg-type] ) @@ -1237,7 +1237,7 @@ async def test_repo_created_updated_no_listener( with contextlib.suppress(InvalidRequestError): event.remove(Session, "before_flush", touch_updated_timestamp) - if isinstance(author_repo, SQLAlchemyAsyncRepository): + if isinstance(author_repo, SQLAlchemyAsyncRepository): # pyright: ignore[reportUnnecessaryIsInstance] config = SQLAlchemyAsyncConfig( enable_touch_updated_timestamp_listener=False, engine_instance=author_repo.session.get_bind(), # type: ignore[arg-type] @@ -1333,7 +1333,7 @@ async def test_repo_add_many_method( async def test_repo_update_many_method(author_repo: AnyAuthorRepository) -> None: - if author_repo._dialect.name.startswith("spanner") and os.environ.get("SPANNER_EMULATOR_HOST"): + if author_repo._dialect.name.startswith("spanner") and os.environ.get("SPANNER_EMULATOR_HOST"): # pyright: ignore[reportPrivateUsage] pytest.skip("Skipped on emulator") objs = await maybe_async(author_repo.list()) @@ -2030,7 +2030,7 @@ async def test_service_create_many_method( async def test_service_update_many_method(author_service: AuthorService) -> None: - if author_service.repository._dialect.name.startswith("spanner") and os.environ.get("SPANNER_EMULATOR_HOST"): + if author_service.repository._dialect.name.startswith("spanner") and os.environ.get("SPANNER_EMULATOR_HOST"): # pyright: ignore[reportPrivateUsage] pytest.skip("Skipped on emulator") objs = await maybe_async(author_service.list())