Skip to content

Commit ac6a75b

Browse files
authored
fixed a potential bug (#337)
* fixed a potential bug Signed-off-by: wiseaidev <[email protected]> * add unit tests Signed-off-by: wiseaidev <[email protected]> * remove unnecessary logic related to six module Signed-off-by: wiseaidev <[email protected]> * remove six from dependencies Signed-off-by: wiseaidev <[email protected]> * pass "ignore" as a kwarg Signed-off-by: wiseaidev <[email protected]> * get rid of try catch and simplify logic Signed-off-by: wiseaidev <[email protected]> * rm poetry.lock Signed-off-by: wiseaidev <[email protected]> * rm poetry.lock Signed-off-by: wiseaidev <[email protected]> * run black Signed-off-by: wiseaidev <[email protected]> * fix mypy issue Signed-off-by: wiseaidev <[email protected]> * adjust other tests accordingly Signed-off-by: wiseaidev <[email protected]>
1 parent b103adb commit ac6a75b

File tree

3 files changed

+33
-32
lines changed

3 files changed

+33
-32
lines changed

aredis_om/model/model.py

+11-29
Original file line numberDiff line numberDiff line change
@@ -1179,50 +1179,32 @@ def find(cls, *expressions: Union[Any, Expression]) -> FindQuery:
11791179
@classmethod
11801180
def from_redis(cls, res: Any):
11811181
# TODO: Parsing logic copied from redisearch-py. Evaluate.
1182-
import six
1183-
from six.moves import xrange
1184-
from six.moves import zip as izip
1185-
11861182
def to_string(s):
1187-
if isinstance(s, six.string_types):
1183+
if isinstance(s, (str,)):
11881184
return s
1189-
elif isinstance(s, six.binary_type):
1190-
return s.decode("utf-8", "ignore")
1185+
elif isinstance(s, bytes):
1186+
return s.decode(errors="ignore")
11911187
else:
11921188
return s # Not a string we care about
11931189

11941190
docs = []
11951191
step = 2 # Because the result has content
11961192
offset = 1 # The first item is the count of total matches.
11971193

1198-
for i in xrange(1, len(res), step):
1199-
fields_offset = offset
1200-
1194+
for i in range(1, len(res), step):
12011195
fields = dict(
1202-
dict(
1203-
izip(
1204-
map(to_string, res[i + fields_offset][::2]),
1205-
map(to_string, res[i + fields_offset][1::2]),
1206-
)
1196+
zip(
1197+
map(to_string, res[i + offset][::2]),
1198+
map(to_string, res[i + offset][1::2]),
12071199
)
12081200
)
1209-
1210-
try:
1211-
del fields["id"]
1212-
except KeyError:
1213-
pass
1214-
1215-
try:
1216-
fields["json"] = fields["$"]
1217-
del fields["$"]
1218-
except KeyError:
1219-
pass
1220-
1221-
if "json" in fields:
1222-
json_fields = json.loads(fields["json"])
1201+
# $ means a json entry
1202+
if fields.get("$"):
1203+
json_fields = json.loads(fields.pop("$"))
12231204
doc = cls(**json_fields)
12241205
else:
12251206
doc = cls(**fields)
1207+
12261208
docs.append(doc)
12271209
return docs
12281210

pyproject.toml

-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ redis = ">=3.5.3,<5.0.0"
2727
aioredis = "^2.0.0"
2828
pydantic = "^1.8.2"
2929
click = "^8.0.1"
30-
six = "^1.16.0"
3130
pptree = "^3.1"
3231
types-redis = ">=3.5.9,<5.0.0"
3332
types-six = "^1.16.1"

tests/test_hash_model.py

+22-2
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class Order(BaseHashModel):
4343
created_on: datetime.datetime
4444

4545
class Member(BaseHashModel):
46+
id: int = Field(index=True)
4647
first_name: str = Field(index=True)
4748
last_name: str = Field(index=True)
4849
email: str = Field(index=True)
@@ -64,6 +65,7 @@ class Meta:
6465
@pytest_asyncio.fixture
6566
async def members(m):
6667
member1 = m.Member(
68+
id=0,
6769
first_name="Andrew",
6870
last_name="Brookins",
6971
@@ -73,6 +75,7 @@ async def members(m):
7375
)
7476

7577
member2 = m.Member(
78+
id=1,
7679
first_name="Kim",
7780
last_name="Brookins",
7881
@@ -82,6 +85,7 @@ async def members(m):
8285
)
8386

8487
member3 = m.Member(
88+
id=2,
8589
first_name="Andrew",
8690
last_name="Smith",
8791
@@ -129,6 +133,9 @@ async def test_exact_match_queries(members, m):
129133
).all()
130134
assert actual == [member2]
131135

136+
actual = await m.Member.find(m.Member.id == 0).all()
137+
assert actual == [member1]
138+
132139

133140
@py_test_mark_asyncio
134141
async def test_full_text_search_queries(members, m):
@@ -176,6 +183,7 @@ async def test_tag_queries_boolean_logic(members, m):
176183
@py_test_mark_asyncio
177184
async def test_tag_queries_punctuation(m):
178185
member1 = m.Member(
186+
id=0,
179187
first_name="Andrew, the Michael",
180188
last_name="St. Brookins-on-Pier",
181189
email="a|[email protected]", # NOTE: This string uses the TAG field separator.
@@ -186,6 +194,7 @@ async def test_tag_queries_punctuation(m):
186194
await member1.save()
187195

188196
member2 = m.Member(
197+
id=1,
189198
first_name="Bob",
190199
last_name="the Villain",
191200
email="a|[email protected]", # NOTE: This string uses the TAG field separator.
@@ -337,18 +346,19 @@ def test_validates_required_fields(m):
337346
# Raises ValidationError: last_name is required
338347
# TODO: Test the error value
339348
with pytest.raises(ValidationError):
340-
m.Member(first_name="Andrew", zipcode="97086", join_date=today)
349+
m.Member(id=0, first_name="Andrew", zipcode="97086", join_date=today)
341350

342351

343352
def test_validates_field(m):
344353
# Raises ValidationError: join_date is not a date
345354
# TODO: Test the error value
346355
with pytest.raises(ValidationError):
347-
m.Member(first_name="Andrew", last_name="Brookins", join_date="yesterday")
356+
m.Member(id=0, first_name="Andrew", last_name="Brookins", join_date="yesterday")
348357

349358

350359
def test_validation_passes(m):
351360
member = m.Member(
361+
id=0,
352362
first_name="Andrew",
353363
last_name="Brookins",
354364
@@ -362,6 +372,7 @@ def test_validation_passes(m):
362372
@py_test_mark_asyncio
363373
async def test_retrieve_first(m):
364374
member = m.Member(
375+
id=0,
365376
first_name="Simon",
366377
last_name="Prickett",
367378
@@ -373,6 +384,7 @@ async def test_retrieve_first(m):
373384
await member.save()
374385

375386
member2 = m.Member(
387+
id=1,
376388
first_name="Another",
377389
last_name="Member",
378390
@@ -384,6 +396,7 @@ async def test_retrieve_first(m):
384396
await member2.save()
385397

386398
member3 = m.Member(
399+
id=2,
387400
first_name="Third",
388401
last_name="Member",
389402
@@ -401,6 +414,7 @@ async def test_retrieve_first(m):
401414
@py_test_mark_asyncio
402415
async def test_saves_model_and_creates_pk(m):
403416
member = m.Member(
417+
id=0,
404418
first_name="Andrew",
405419
last_name="Brookins",
406420
@@ -418,6 +432,7 @@ async def test_saves_model_and_creates_pk(m):
418432
@py_test_mark_asyncio
419433
async def test_all_pks(m):
420434
member = m.Member(
435+
id=0,
421436
first_name="Simon",
422437
last_name="Prickett",
423438
@@ -429,6 +444,7 @@ async def test_all_pks(m):
429444
await member.save()
430445

431446
member1 = m.Member(
447+
id=1,
432448
first_name="Andrew",
433449
last_name="Brookins",
434450
@@ -449,6 +465,7 @@ async def test_all_pks(m):
449465
@py_test_mark_asyncio
450466
async def test_delete(m):
451467
member = m.Member(
468+
id=0,
452469
first_name="Simon",
453470
last_name="Prickett",
454471
@@ -465,6 +482,7 @@ async def test_delete(m):
465482
@py_test_mark_asyncio
466483
async def test_expire(m):
467484
member = m.Member(
485+
id=0,
468486
first_name="Expire",
469487
last_name="Test",
470488
@@ -529,6 +547,7 @@ class InvalidMember(m.BaseHashModel):
529547
@py_test_mark_asyncio
530548
async def test_saves_many(m):
531549
member1 = m.Member(
550+
id=0,
532551
first_name="Andrew",
533552
last_name="Brookins",
534553
@@ -537,6 +556,7 @@ async def test_saves_many(m):
537556
bio="This is the user bio.",
538557
)
539558
member2 = m.Member(
559+
id=1,
540560
first_name="Kim",
541561
last_name="Brookins",
542562

0 commit comments

Comments
 (0)