chore(deps): update dependency ruff to ^0.12.0 (#5568)

Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com>
This commit is contained in:
Michael Genson
2025-06-24 02:46:49 -05:00
committed by GitHub
parent c965d12bf1
commit cea3ddc883
13 changed files with 67 additions and 93 deletions

View File

@@ -4,7 +4,7 @@ import re
from collections.abc import Sequence
from datetime import UTC, datetime
from enum import Enum
from typing import ClassVar, Protocol, Self, TypeVar
from typing import ClassVar, Protocol, Self
from humps.main import camelize
from pydantic import UUID4, AliasChoices, BaseModel, ConfigDict, Field, model_validator
@@ -14,8 +14,6 @@ from sqlalchemy.orm.interfaces import LoaderOption
from mealie.db.models._model_base import SqlAlchemyBase
T = TypeVar("T", bound=BaseModel)
HOUR_ONLY_TZ_PATTERN = re.compile(r"[+-]\d{2}$")
@@ -56,7 +54,7 @@ class MealieModel(BaseModel):
@model_validator(mode="before")
@classmethod
def fix_hour_only_tz(cls, data: T) -> T:
def fix_hour_only_tz[T: BaseModel](cls, data: T) -> T:
"""
Fixes datetimes with timezones that only have the hour portion.
@@ -82,7 +80,7 @@ class MealieModel(BaseModel):
Adds UTC timezone information to all datetimes in the model.
The server stores everything in UTC without timezone info.
"""
for field in self.model_fields:
for field in self.__class__.model_fields:
val = getattr(self, field)
if not isinstance(val, datetime):
continue
@@ -91,23 +89,25 @@ class MealieModel(BaseModel):
return self
def cast(self, cls: type[T], **kwargs) -> T:
def cast[T: BaseModel](self, cls: type[T], **kwargs) -> T:
"""
Cast the current model to another with additional arguments. Useful for
transforming DTOs into models that are saved to a database
"""
create_data = {field: getattr(self, field) for field in self.model_fields if field in cls.model_fields}
create_data = {
field: getattr(self, field) for field in self.__class__.model_fields if field in cls.model_fields
}
create_data.update(kwargs or {})
return cls(**create_data)
def map_to(self, dest: T) -> T:
def map_to[T: BaseModel](self, dest: T) -> T:
"""
Map matching values from the current model to another model. Model returned
for method chaining.
"""
for field in self.model_fields:
if field in dest.model_fields:
for field in self.__class__.model_fields:
if field in dest.__class__.model_fields:
setattr(dest, field, getattr(self, field))
return dest
@@ -117,18 +117,18 @@ class MealieModel(BaseModel):
Map matching values from another model to the current model.
"""
for field in src.model_fields:
if field in self.model_fields:
for field in src.__class__.model_fields:
if field in self.__class__.model_fields:
setattr(self, field, getattr(src, field))
def merge(self, src: T, replace_null=False):
def merge[T: BaseModel](self, src: T, replace_null=False):
"""
Replace matching values from another instance to the current instance.
"""
for field in src.model_fields:
for field in src.__class__.model_fields:
val = getattr(src, field)
if field in self.model_fields and (val is not None or replace_null):
if field in self.__class__.model_fields and (val is not None or replace_null):
setattr(self, field, val)
@classmethod

View File

@@ -1,24 +1,21 @@
from typing import TypeVar
from pydantic import BaseModel
T = TypeVar("T", bound=BaseModel)
U = TypeVar("U", bound=BaseModel)
def mapper(source: U, dest: T, **_) -> T:
def mapper[U: BaseModel, T: BaseModel](source: U, dest: T, **_) -> T:
"""
Map a source model to a destination model. Only top-level fields are mapped.
"""
for field in source.model_fields:
if field in dest.model_fields:
for field in source.__class__.model_fields:
if field in dest.__class__.model_fields:
setattr(dest, field, getattr(source, field))
return dest
def cast(source: U, dest: type[T], **kwargs) -> T:
create_data = {field: getattr(source, field) for field in source.model_fields if field in dest.model_fields}
def cast[U: BaseModel, T: BaseModel](source: U, dest: type[T], **kwargs) -> T:
create_data = {
field: getattr(source, field) for field in source.__class__.model_fields if field in dest.model_fields
}
create_data.update(kwargs or {})
return dest(**create_data)

View File

@@ -1,5 +1,5 @@
import enum
from typing import Annotated, Any, Generic, TypeVar
from typing import Annotated, Any
from urllib.parse import parse_qs, urlencode, urlsplit, urlunsplit
from humps import camelize
@@ -8,8 +8,6 @@ from pydantic_core.core_schema import ValidationInfo
from mealie.schema._mealie import MealieModel
DataT = TypeVar("DataT", bound=BaseModel)
class OrderDirection(str, enum.Enum):
asc = "asc"
@@ -50,7 +48,7 @@ class PaginationQuery(RequestQuery):
per_page: int = 50
class PaginationBase(BaseModel, Generic[DataT]):
class PaginationBase[DataT: BaseModel](BaseModel):
page: int = 1
per_page: int = 10
total: int = 0

View File

@@ -3,7 +3,7 @@ from __future__ import annotations
import re
from collections import deque
from enum import Enum
from typing import Any, TypeVar, cast
from typing import Any, cast
from uuid import UUID
import sqlalchemy as sa
@@ -19,8 +19,6 @@ from mealie.db.models._model_utils.datetime import NaiveDateTime
from mealie.db.models._model_utils.guid import GUID
from mealie.schema._mealie.mealie_model import MealieModel
Model = TypeVar("Model", bound=SqlAlchemyBase)
class RelationalKeyword(Enum):
IS = "IS"
@@ -274,7 +272,7 @@ class QueryFilterBuilder:
return consolidated_group_builder.self_group()
@classmethod
def get_model_and_model_attr_from_attr_string(
def get_model_and_model_attr_from_attr_string[Model: SqlAlchemyBase](
cls, attr_string: str, model: type[Model], *, query: sa.Select | None = None
) -> tuple[SqlAlchemyBase, InstrumentedAttribute, sa.Select | None]:
"""
@@ -343,7 +341,7 @@ class QueryFilterBuilder:
return model_attr
@classmethod
def _get_filter_element(
def _get_filter_element[Model: SqlAlchemyBase](
cls,
query: sa.Select,
component: QueryFilterBuilderComponent,
@@ -397,7 +395,7 @@ class QueryFilterBuilder:
return element
def filter_query(
def filter_query[Model: SqlAlchemyBase](
self, query: sa.Select, model: type[Model], column_aliases: dict[str, sa.ColumnElement] | None = None
) -> sa.Select:
"""

View File

@@ -1,6 +1,6 @@
from datetime import UTC, datetime, timedelta
from pathlib import Path
from typing import Annotated, Any, Generic, TypeVar
from typing import Annotated, Any
from uuid import UUID
from pydantic import UUID4, BaseModel, ConfigDict, Field, StringConstraints, field_validator
@@ -20,7 +20,6 @@ from mealie.schema.response.pagination import PaginationBase
from ...db.models.group import Group
from ..recipe import CategoryBase
DataT = TypeVar("DataT", bound=BaseModel)
DEFAULT_INTEGRATION_ID = "generic"
settings = get_app_settings()
@@ -102,7 +101,7 @@ class UserRatingOut(UserRatingCreate):
]
class UserRatings(BaseModel, Generic[DataT]):
class UserRatings[DataT: BaseModel](BaseModel):
ratings: list[DataT]