diff --git a/Makefile b/Makefile index 827a367a..1e261c65 100644 --- a/Makefile +++ b/Makefile @@ -53,7 +53,7 @@ sync: $(INSTALL_STAMP) lint: $(INSTALL_STAMP) dist $(POETRY) run isort --profile=black --lines-after-imports=2 ./tests/ $(NAME) $(SYNC_NAME) $(POETRY) run black ./tests/ $(NAME) - $(POETRY) run flake8 --ignore=W503,E501,F401,E731,E712 ./tests/ $(NAME) $(SYNC_NAME) + $(POETRY) run flake8 --ignore=E231,E501,E712,E731,F401,W503 ./tests/ $(NAME) $(SYNC_NAME) $(POETRY) run mypy ./tests/ $(NAME) $(SYNC_NAME) --ignore-missing-imports --exclude migrate.py --exclude _compat\.py$ $(POETRY) run bandit -r $(NAME) $(SYNC_NAME) -s B608 diff --git a/aredis_om/model/model.py b/aredis_om/model/model.py index f95d4ce5..9e1aed89 100644 --- a/aredis_om/model/model.py +++ b/aredis_om/model/model.py @@ -11,6 +11,7 @@ AbstractSet, Any, Callable, + ClassVar, Dict, List, Mapping, @@ -32,7 +33,7 @@ from ulid import ULID from .. import redis -from .._compat import BaseModel +from .._compat import PYDANTIC_V2, BaseModel from .._compat import FieldInfo as PydanticFieldInfo from .._compat import ( ModelField, @@ -1419,13 +1420,22 @@ def outer_type_or_annotation(field): class RedisModel(BaseModel, abc.ABC, metaclass=ModelMeta): pk: Optional[str] = Field(default=None, primary_key=True) + ConfigDict: ClassVar Meta = DefaultMeta - class Config: - orm_mode = True - arbitrary_types_allowed = True - extra = "allow" + if PYDANTIC_V2: + from pydantic import ConfigDict + + model_config = ConfigDict( + from_attributes=True, arbitrary_types_allowed=True, extra="allow" + ) + else: + + class Config: + orm_mode = True + arbitrary_types_allowed = True + extra = "allow" def __init__(__pydantic_self__, **data: Any) -> None: __pydantic_self__.validate_primary_key() @@ -1633,9 +1643,6 @@ def redisearch_schema(cls): def check(self): """Run all validations.""" - from pydantic.version import VERSION as PYDANTIC_VERSION - - PYDANTIC_V2 = PYDANTIC_VERSION.startswith("2.") if not PYDANTIC_V2: *_, validation_error = validate_model(self.__class__, self.__dict__) if validation_error: @@ -1657,8 +1664,8 @@ def __init_subclass__(cls, **kwargs): for typ in (Set, Mapping, List): if isinstance(origin, type) and issubclass(origin, typ): raise RedisModelError( - f"HashModels cannot index set, list," - f" or mapping fields. Field: {name}" + f"HashModels cannot index set, list, " + f"or mapping fields. Field: {name}" ) if isinstance(field_type, type) and issubclass(field_type, RedisModel): raise RedisModelError( @@ -1678,8 +1685,8 @@ def __init_subclass__(cls, **kwargs): for typ in (Set, Mapping, List): if issubclass(origin, typ): raise RedisModelError( - f"HashModels cannot index set, list," - f" or mapping fields. Field: {name}" + f"HashModels cannot index set, list, " + f"or mapping fields. Field: {name}" ) if issubclass(outer_type, RedisModel): diff --git a/docker-compose.yml b/docker-compose.yml index e7b0f7d9..4a3b0618 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,4 @@ -version: "3.8" - +--- services: redis: image: "redis/redis-stack:latest" diff --git a/docs/models.md b/docs/models.md index 31d1c7f7..79f174c8 100644 --- a/docs/models.md +++ b/docs/models.md @@ -142,10 +142,11 @@ from redis_om import HashModel class Customer(HashModel): # ... Fields ... - class Config: - orm_mode = True - arbitrary_types_allowed = True - extra = "allow" + model_config = ConfigDict( + from_attributes=True, + arbitrary_types_allowed=True, + extra="allow", + ) ``` Some features may not work correctly if you change these settings. diff --git a/tests/test_json_model.py b/tests/test_json_model.py index 267185a5..c09d84a3 100644 --- a/tests/test_json_model.py +++ b/tests/test_json_model.py @@ -882,9 +882,23 @@ async def test_schema(m, key_prefix): # We need to build the key prefix because it will differ based on whether # these tests were copied into the tests_sync folder and unasynce'd. key_prefix = m.Member.make_key(m.Member._meta.primary_key_pattern.format(pk="")) - assert ( - m.Member.redisearch_schema() - == f"ON JSON PREFIX 1 {key_prefix} SCHEMA $.pk AS pk TAG SEPARATOR | $.first_name AS first_name TAG SEPARATOR | CASESENSITIVE $.last_name AS last_name TAG SEPARATOR | $.email AS email TAG SEPARATOR | $.age AS age NUMERIC $.bio AS bio TAG SEPARATOR | $.bio AS bio_fts TEXT $.address.pk AS address_pk TAG SEPARATOR | $.address.city AS address_city TAG SEPARATOR | $.address.postal_code AS address_postal_code TAG SEPARATOR | $.address.note.pk AS address_note_pk TAG SEPARATOR | $.address.note.description AS address_note_description TAG SEPARATOR | $.orders[*].pk AS orders_pk TAG SEPARATOR | $.orders[*].items[*].pk AS orders_items_pk TAG SEPARATOR | $.orders[*].items[*].name AS orders_items_name TAG SEPARATOR |" + assert m.Member.redisearch_schema() == ( + f"ON JSON PREFIX 1 {key_prefix} SCHEMA " + "$.pk AS pk TAG SEPARATOR | " + "$.first_name AS first_name TAG SEPARATOR | CASESENSITIVE " + "$.last_name AS last_name TAG SEPARATOR | " + "$.email AS email TAG SEPARATOR | " + "$.age AS age NUMERIC " + "$.bio AS bio TAG SEPARATOR | " + "$.bio AS bio_fts TEXT " + "$.address.pk AS address_pk TAG SEPARATOR | " + "$.address.city AS address_city TAG SEPARATOR | " + "$.address.postal_code AS address_postal_code TAG SEPARATOR | " + "$.address.note.pk AS address_note_pk TAG SEPARATOR | " + "$.address.note.description AS address_note_description TAG SEPARATOR | " + "$.orders[*].pk AS orders_pk TAG SEPARATOR | " + "$.orders[*].items[*].pk AS orders_items_pk TAG SEPARATOR | " + "$.orders[*].items[*].name AS orders_items_name TAG SEPARATOR |" )