Skip to content

Commit 69c7891

Browse files
committed
lintining
1 parent 69cb9ef commit 69c7891

File tree

5 files changed

+99
-66
lines changed

5 files changed

+99
-66
lines changed

aredis_om/_compat.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
from pydantic.version import VERSION as PYDANTIC_VERSION
2-
from typing_extensions import Annotated, Literal, get_args, get_origin
31
from dataclasses import dataclass, is_dataclass
42
from typing import (
53
Any,
@@ -16,26 +14,28 @@
1614
Union,
1715
)
1816

17+
from pydantic.version import VERSION as PYDANTIC_VERSION
18+
from typing_extensions import Annotated, Literal, get_args, get_origin
1919

2020

2121
PYDANTIC_V2 = PYDANTIC_VERSION.startswith("2.")
2222

2323
if PYDANTIC_V2:
24+
2425
def use_pydantic_2_plus():
2526
return True
26-
from pydantic import BaseModel, validator
27+
28+
from pydantic import BaseModel, TypeAdapter
29+
from pydantic import ValidationError as ValidationError
30+
from pydantic import validator
2731
from pydantic._internal._model_construction import ModelMetaclass
28-
from pydantic.fields import FieldInfo
29-
from pydantic_core import PydanticUndefined as Undefined, PydanticUndefinedType as UndefinedType
32+
from pydantic._internal._repr import Representation
3033
from pydantic.deprecated.json import ENCODERS_BY_TYPE
31-
from pydantic import TypeAdapter
32-
from pydantic import ValidationError as ValidationError
33-
34-
34+
from pydantic.fields import FieldInfo
3535
from pydantic.v1.main import validate_model
36-
3736
from pydantic.v1.typing import NoArgAnyCallable
38-
from pydantic._internal._repr import Representation
37+
from pydantic_core import PydanticUndefined as Undefined
38+
from pydantic_core import PydanticUndefinedType as UndefinedType
3939

4040
@dataclass
4141
class ModelField:
@@ -87,13 +87,13 @@ def __hash__(self) -> int:
8787
# ModelField to its JSON Schema.
8888
return id(self)
8989

90-
9190
else:
9291
from pydantic import BaseModel, validator
9392
from pydantic.fields import FieldInfo, ModelField, Undefined, UndefinedType
9493
from pydantic.json import ENCODERS_BY_TYPE
9594
from pydantic.main import ModelMetaclass, validate_model
9695
from pydantic.typing import NoArgAnyCallable
9796
from pydantic.utils import Representation
97+
9898
def use_pydantic_2_plus():
9999
return False

aredis_om/model/model.py

Lines changed: 75 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -76,15 +76,18 @@
7676

7777

7878
def get_outer_type(field):
79-
if hasattr(field, 'outer_type_'):
79+
if hasattr(field, "outer_type_"):
8080
return field.outer_type_
81-
elif isinstance(field.annotation, type) or is_supported_container_type(field.annotation):
81+
elif isinstance(field.annotation, type) or is_supported_container_type(
82+
field.annotation
83+
):
8284
return field.annotation
83-
elif not isinstance(field.annotation.__args__[0], type):
84-
return field.annotation.__args__[0].__origin__
85+
# elif not isinstance(field.annotation.__args__[0], type):
86+
# return field.annotation.__args__[0].__origin__
8587
else:
8688
return field.annotation.__args__[0]
8789

90+
8891
class RedisModelError(Exception):
8992
"""Raised when a problem exists in the definition of a RedisModel."""
9093

@@ -116,7 +119,9 @@ def __str__(self):
116119
return str(self.name)
117120

118121

119-
ExpressionOrModelField = Union["Expression", "NegatedExpression", ModelField, PydanticFieldInfo]
122+
ExpressionOrModelField = Union[
123+
"Expression", "NegatedExpression", ModelField, PydanticFieldInfo
124+
]
120125

121126

122127
def embedded(cls):
@@ -140,8 +145,8 @@ def validate_model_fields(model: Type["RedisModel"], field_values: Dict[str, Any
140145
if "__" in field_name:
141146
obj = model
142147
for sub_field in field_name.split("__"):
143-
if not isinstance(obj, ModelMeta) and hasattr(obj, 'field'):
144-
obj = getattr(obj, 'field').annotation
148+
if not isinstance(obj, ModelMeta) and hasattr(obj, "field"):
149+
obj = getattr(obj, "field").annotation
145150

146151
if not hasattr(obj, sub_field):
147152
raise QuerySyntaxError(
@@ -496,7 +501,9 @@ def validate_sort_fields(self, sort_fields: List[str]):
496501
f"does not exist on the model {self.model}"
497502
)
498503
field_proxy = getattr(self.model, field_name)
499-
if isinstance(field_proxy.field, FieldInfo) or isinstance(field_proxy.field, PydanticFieldInfo):
504+
if isinstance(field_proxy.field, FieldInfo) or isinstance(
505+
field_proxy.field, PydanticFieldInfo
506+
):
500507
field_info = field_proxy.field
501508
else:
502509
field_info = field_proxy.field.field_info
@@ -510,7 +517,7 @@ def validate_sort_fields(self, sort_fields: List[str]):
510517

511518
@staticmethod
512519
def resolve_field_type(field: ModelField, op: Operators) -> RediSearchFieldTypes:
513-
if not hasattr(field, 'field_info'):
520+
if not hasattr(field, "field_info"):
514521
field_info = field
515522
else:
516523
field_info = field.field_info
@@ -528,6 +535,9 @@ def resolve_field_type(field: ModelField, op: Operators) -> RediSearchFieldTypes
528535

529536
field_type = outer_type_or_annotation(field)
530537

538+
if not isinstance(field_type, type):
539+
field_type = field_type.__origin__
540+
531541
# TODO: GEO fields
532542
container_type = get_origin(field_type)
533543

@@ -1270,10 +1280,11 @@ def __new__(cls, name, bases, attrs, **kwargs): # noqa C901
12701280
for base_candidate in bases:
12711281
if hasattr(base_candidate, field_name):
12721282
inner_field = getattr(base_candidate, field_name)
1273-
if hasattr(inner_field, 'field') and isinstance(getattr(inner_field, 'field'), FieldInfo):
1274-
field.metadata.append(getattr(inner_field, 'field'))
1275-
field = getattr(inner_field, 'field')
1276-
1283+
if hasattr(inner_field, "field") and isinstance(
1284+
getattr(inner_field, "field"), FieldInfo
1285+
):
1286+
field.metadata.append(getattr(inner_field, "field"))
1287+
field = getattr(inner_field, "field")
12771288

12781289
if not field.alias:
12791290
field.alias = field_name
@@ -1288,9 +1299,11 @@ def __new__(cls, name, bases, attrs, **kwargs): # noqa C901
12881299
# Check if this is our FieldInfo version with extended ORM metadata.
12891300
# if isinstance(field.field_info, FieldInfo):
12901301
field_info = None
1291-
if hasattr(field, 'field_info') and isinstance(field.field_info, FieldInfo):
1302+
if hasattr(field, "field_info") and isinstance(field.field_info, FieldInfo):
12921303
field_info = field.field_info
1293-
elif field_name in attrs and isinstance(attrs.__getitem__(field_name), FieldInfo):
1304+
elif field_name in attrs and isinstance(
1305+
attrs.__getitem__(field_name), FieldInfo
1306+
):
12941307
field_info = attrs.__getitem__(field_name)
12951308
field.field_info = field_info
12961309

@@ -1344,9 +1357,9 @@ def __new__(cls, name, bases, attrs, **kwargs): # noqa C901
13441357

13451358

13461359
def outer_type_or_annotation(field):
1347-
if hasattr(field, 'outer_type_'):
1360+
if hasattr(field, "outer_type_"):
13481361
return field.outer_type_
1349-
elif not hasattr(field.annotation, '__args__'):
1362+
elif not hasattr(field.annotation, "__args__"):
13501363
if not isinstance(field.annotation, type):
13511364
raise AttributeError(f"could not extract outer type from field {field}")
13521365
return field.annotation
@@ -1355,7 +1368,7 @@ def outer_type_or_annotation(field):
13551368

13561369

13571370
class RedisModel(BaseModel, abc.ABC, metaclass=ModelMeta):
1358-
# class RedisModel(BaseModel, abc.ABC):
1371+
# class RedisModel(BaseModel, abc.ABC):
13591372
pk: Optional[str] = Field(default=None, primary_key=True)
13601373
# pk: Optional[str] = Field(default=None, primary_key=True)
13611374

@@ -1376,7 +1389,7 @@ def __lt__(self, other):
13761389

13771390
def key(self):
13781391
"""Return the Redis key for this model."""
1379-
if hasattr(self._meta.primary_key.field, 'name'):
1392+
if hasattr(self._meta.primary_key.field, "name"):
13801393
pk = getattr(self, self._meta.primary_key.field.name)
13811394
else:
13821395
pk = getattr(self, self._meta.primary_key.name)
@@ -1427,8 +1440,13 @@ def validate_primary_key(cls):
14271440
"""Check for a primary key. We need one (and only one)."""
14281441
primary_keys = 0
14291442
for name, field in cls.__fields__.items():
1430-
if not hasattr(field, 'field_info'):
1431-
if not isinstance(field, FieldInfo) and hasattr(field, 'metadata') and len(field.metadata) > 0 and isinstance(field.metadata[0], FieldInfo):
1443+
if not hasattr(field, "field_info"):
1444+
if (
1445+
not isinstance(field, FieldInfo)
1446+
and hasattr(field, "metadata")
1447+
and len(field.metadata) > 0
1448+
and isinstance(field.metadata[0], FieldInfo)
1449+
):
14321450
field_info = field.metadata[0]
14331451
else:
14341452
field_info = field
@@ -1568,6 +1586,7 @@ def redisearch_schema(cls):
15681586
def check(self):
15691587
"""Run all validations."""
15701588
from pydantic.version import VERSION as PYDANTIC_VERSION
1589+
15711590
PYDANTIC_V2 = PYDANTIC_VERSION.startswith("2.")
15721591
if not PYDANTIC_V2:
15731592
*_, validation_error = validate_model(self.__class__, self.__dict__)
@@ -1579,7 +1598,7 @@ class HashModel(RedisModel, abc.ABC):
15791598
def __init_subclass__(cls, **kwargs):
15801599
super().__init_subclass__(**kwargs)
15811600

1582-
if hasattr(cls, '__annotations__'):
1601+
if hasattr(cls, "__annotations__"):
15831602
for name, field_type in cls.__annotations__.items():
15841603
origin = get_origin(field_type)
15851604
for typ in (Set, Mapping, List):
@@ -1589,8 +1608,12 @@ def __init_subclass__(cls, **kwargs):
15891608
f" or mapping fields. Field: {name}"
15901609
)
15911610
if isinstance(field_type, type) and issubclass(field_type, RedisModel):
1592-
raise RedisModelError(f"HashModels cannot index embedded model fields. Field: {name}")
1593-
elif isinstance(field_type, type) and dataclasses.is_dataclass(field_type):
1611+
raise RedisModelError(
1612+
f"HashModels cannot index embedded model fields. Field: {name}"
1613+
)
1614+
elif isinstance(field_type, type) and dataclasses.is_dataclass(
1615+
field_type
1616+
):
15941617
raise RedisModelError(
15951618
f"HashModels cannot index dataclass fields. Field: {name}"
15961619
)
@@ -1698,10 +1721,15 @@ def schema_for_fields(cls):
16981721
_type = outer_type_or_annotation(field)
16991722
is_subscripted_type = get_origin(_type)
17001723

1701-
if not isinstance(field, FieldInfo) and hasattr(field, 'metadata') and len(field.metadata) > 0 and isinstance(field.metadata[0], FieldInfo):
1724+
if (
1725+
not isinstance(field, FieldInfo)
1726+
and hasattr(field, "metadata")
1727+
and len(field.metadata) > 0
1728+
and isinstance(field.metadata[0], FieldInfo)
1729+
):
17021730
field = field.metadata[0]
17031731

1704-
if not hasattr(field, 'field_info'):
1732+
if not hasattr(field, "field_info"):
17051733
field_info = field
17061734
else:
17071735
field_info = field.field_info
@@ -1712,9 +1740,7 @@ def schema_for_fields(cls):
17121740
f"{name} TAG SEPARATOR {SINGLE_VALUE_TAG_FIELD_SEPARATOR}"
17131741
)
17141742
else:
1715-
redisearch_field = cls.schema_for_type(
1716-
name, _type, field_info
1717-
)
1743+
redisearch_field = cls.schema_for_type(name, _type, field_info)
17181744
schema_parts.append(redisearch_field)
17191745
elif getattr(field_info, "index", None) is True:
17201746
schema_parts.append(cls.schema_for_type(name, _type, field_info))
@@ -1730,9 +1756,7 @@ def schema_for_fields(cls):
17301756
log.warning("Model %s defined an empty list field: %s", cls, name)
17311757
continue
17321758
embedded_cls = embedded_cls[0]
1733-
schema_parts.append(
1734-
cls.schema_for_type(name, embedded_cls, field_info)
1735-
)
1759+
schema_parts.append(cls.schema_for_type(name, embedded_cls, field_info))
17361760
elif issubclass(_type, RedisModel):
17371761
schema_parts.append(cls.schema_for_type(name, _type, field_info))
17381762
return schema_parts
@@ -1875,7 +1899,7 @@ def schema_for_fields(cls):
18751899
for name, field in cls.__dict__.items():
18761900
if isinstance(field, FieldInfo):
18771901
if not field.annotation:
1878-
field.annotation = cls.__annotations__.get(name)
1902+
field.annotation = cls.__annotations__.get(name)
18791903
fields[name] = field
18801904
for name, field in cls.__annotations__.items():
18811905
if name in fields:
@@ -1884,22 +1908,23 @@ def schema_for_fields(cls):
18841908

18851909
for name, field in fields.items():
18861910
_type = get_outer_type(field)
1887-
if not isinstance(field, FieldInfo) and hasattr(field, 'metadata') and len(field.metadata) > 0 and isinstance(field.metadata[0], FieldInfo):
1911+
if (
1912+
not isinstance(field, FieldInfo)
1913+
and hasattr(field, "metadata")
1914+
and len(field.metadata) > 0
1915+
and isinstance(field.metadata[0], FieldInfo)
1916+
):
18881917
field = field.metadata[0]
18891918

1890-
if hasattr(field, 'field_info'):
1919+
if hasattr(field, "field_info"):
18911920
field_info = field.field_info
18921921
else:
18931922
field_info = field
18941923
if getattr(field_info, "primary_key", None):
18951924
if issubclass(_type, str):
1896-
redisearch_field = (
1897-
f"$.{name} AS {name} TAG SEPARATOR {SINGLE_VALUE_TAG_FIELD_SEPARATOR}"
1898-
)
1925+
redisearch_field = f"$.{name} AS {name} TAG SEPARATOR {SINGLE_VALUE_TAG_FIELD_SEPARATOR}"
18991926
else:
1900-
redisearch_field = cls.schema_for_type(
1901-
name, _type, field_info
1902-
)
1927+
redisearch_field = cls.schema_for_type(name, _type, field_info)
19031928
schema_parts.append(redisearch_field)
19041929
continue
19051930
schema_parts.append(
@@ -1982,9 +2007,13 @@ def schema_for_type(
19822007
name_prefix = f"{name_prefix}_{name}" if name_prefix else name
19832008
sub_fields = []
19842009
for embedded_name, field in typ.__fields__.items():
1985-
if hasattr(field, 'field_info'):
2010+
if hasattr(field, "field_info"):
19862011
field_info = field.field_info
1987-
elif hasattr(field, 'metadata') and len(field.metadata) > 0 and isinstance(field.metadata[0], FieldInfo):
2012+
elif (
2013+
hasattr(field, "metadata")
2014+
and len(field.metadata) > 0
2015+
and isinstance(field.metadata[0], FieldInfo)
2016+
):
19882017
field_info = field.metadata[0]
19892018
else:
19902019
field_info = field
@@ -2031,6 +2060,9 @@ def schema_for_type(
20312060
"See docs: TODO"
20322061
)
20332062

2063+
if not isinstance(typ, type):
2064+
typ = field_info.annotation.__args__[0].__origin__
2065+
20342066
# TODO: GEO field
20352067
if is_vector and vector_options:
20362068
schema = f"{path} AS {index_field_name} {vector_options.schema}"

tests/_compat.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
from aredis_om._compat import use_pydantic_2_plus, PYDANTIC_V2
1+
from aredis_om._compat import PYDANTIC_V2, use_pydantic_2_plus
2+
23

34
if not use_pydantic_2_plus() and PYDANTIC_V2:
4-
from pydantic.v1 import ValidationError, EmailStr
5+
from pydantic.v1 import EmailStr, ValidationError
56
elif PYDANTIC_V2:
6-
from pydantic import ValidationError
7-
from pydantic import EmailStr, PositiveInt
7+
from pydantic import EmailStr, PositiveInt, ValidationError
88

99
else:
1010
from pydantic import EmailStr, ValidationError

tests/test_hash_model.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,7 @@ def test_validates_required_fields(m):
391391
try:
392392
m.Member(id=0, first_name="Andrew", zipcode="97086", join_date=today)
393393
except Exception as e:
394-
raise e;
394+
raise e
395395

396396

397397
def test_validates_field(m):

0 commit comments

Comments
 (0)