Skip to content

Commit c31849c

Browse files
authored
Fix bug with Redis Set commands returns List instead of Set (#3399)
* Fix bug with Redis Set commands returns List instead of Set in RESP2 * Removed fixture, codestyle fixes * Fixed tests for async * Fixed asyncio cluster test cases * Added Sets alignment for RESP2 and RESP3 * Updated doctests
1 parent 7215a52 commit c31849c

File tree

7 files changed

+66
-60
lines changed

7 files changed

+66
-60
lines changed

Diff for: doctests/dt_set.py

+17-17
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,11 @@
5858
r.sadd("bikes:racing:usa", "bike:1", "bike:4")
5959
# HIDE_END
6060
res7 = r.sinter("bikes:racing:france", "bikes:racing:usa")
61-
print(res7) # >>> ['bike:1']
61+
print(res7) # >>> {'bike:1'}
6262
# STEP_END
6363

6464
# REMOVE_START
65-
assert res7 == ["bike:1"]
65+
assert res7 == {"bike:1"}
6666
# REMOVE_END
6767

6868
# STEP_START scard
@@ -83,12 +83,12 @@
8383
print(res9) # >>> 3
8484

8585
res10 = r.smembers("bikes:racing:france")
86-
print(res10) # >>> ['bike:1', 'bike:2', 'bike:3']
86+
print(res10) # >>> {'bike:1', 'bike:2', 'bike:3'}
8787
# STEP_END
8888

8989
# REMOVE_START
9090
assert res9 == 3
91-
assert res10 == ['bike:1', 'bike:2', 'bike:3']
91+
assert res10 == {'bike:1', 'bike:2', 'bike:3'}
9292
# REMOVE_END
9393

9494
# STEP_START smismember
@@ -109,11 +109,11 @@
109109
r.sadd("bikes:racing:usa", "bike:1", "bike:4")
110110

111111
res13 = r.sdiff("bikes:racing:france", "bikes:racing:usa")
112-
print(res13) # >>> ['bike:2', 'bike:3']
112+
print(res13) # >>> {'bike:2', 'bike:3'}
113113
# STEP_END
114114

115115
# REMOVE_START
116-
assert res13 == ['bike:2', 'bike:3']
116+
assert res13 == {'bike:2', 'bike:3'}
117117
r.delete("bikes:racing:france")
118118
r.delete("bikes:racing:usa")
119119
# REMOVE_END
@@ -124,27 +124,27 @@
124124
r.sadd("bikes:racing:italy", "bike:1", "bike:2", "bike:3", "bike:4")
125125

126126
res13 = r.sinter("bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy")
127-
print(res13) # >>> ['bike:1']
127+
print(res13) # >>> {'bike:1'}
128128

129129
res14 = r.sunion("bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy")
130-
print(res14) # >>> ['bike:1', 'bike:2', 'bike:3', 'bike:4']
130+
print(res14) # >>> {'bike:1', 'bike:2', 'bike:3', 'bike:4'}
131131

132132
res15 = r.sdiff("bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy")
133-
print(res15) # >>> []
133+
print(res15) # >>> {}
134134

135135
res16 = r.sdiff("bikes:racing:usa", "bikes:racing:france")
136-
print(res16) # >>> ['bike:4']
136+
print(res16) # >>> {'bike:4'}
137137

138138
res17 = r.sdiff("bikes:racing:france", "bikes:racing:usa")
139-
print(res17) # >>> ['bike:2', 'bike:3']
139+
print(res17) # >>> {'bike:2', 'bike:3'}
140140
# STEP_END
141141

142142
# REMOVE_START
143-
assert res13 == ['bike:1']
144-
assert res14 == ['bike:1', 'bike:2', 'bike:3', 'bike:4']
145-
assert res15 == []
146-
assert res16 == ['bike:4']
147-
assert res17 == ['bike:2', 'bike:3']
143+
assert res13 == {'bike:1'}
144+
assert res14 == {'bike:1', 'bike:2', 'bike:3', 'bike:4'}
145+
assert res15 == {}
146+
assert res16 == {'bike:4'}
147+
assert res17 == {'bike:2', 'bike:3'}
148148
r.delete("bikes:racing:france")
149149
r.delete("bikes:racing:usa")
150150
r.delete("bikes:racing:italy")
@@ -160,7 +160,7 @@
160160
print(res19) # >>> bike:3
161161

162162
res20 = r.smembers("bikes:racing:france")
163-
print(res20) # >>> ['bike:2', 'bike:4', 'bike:5']
163+
print(res20) # >>> {'bike:2', 'bike:4', 'bike:5'}
164164

165165
res21 = r.srandmember("bikes:racing:france")
166166
print(res21) # >>> bike:4

Diff for: redis/_parsers/helpers.py

+6
Original file line numberDiff line numberDiff line change
@@ -785,6 +785,9 @@ def string_keys_to_dict(key_string, callback):
785785

786786

787787
_RedisCallbacksRESP2 = {
788+
**string_keys_to_dict(
789+
"SDIFF SINTER SMEMBERS SUNION", lambda r: r and set(r) or set()
790+
),
788791
**string_keys_to_dict(
789792
"ZDIFF ZINTER ZPOPMAX ZPOPMIN ZRANGE ZRANGEBYSCORE ZRANK ZREVRANGE "
790793
"ZREVRANGEBYSCORE ZREVRANK ZUNION",
@@ -829,6 +832,9 @@ def string_keys_to_dict(key_string, callback):
829832

830833

831834
_RedisCallbacksRESP3 = {
835+
**string_keys_to_dict(
836+
"SDIFF SINTER SMEMBERS SUNION", lambda r: r and set(r) or set()
837+
),
832838
**string_keys_to_dict(
833839
"ZRANGE ZINTER ZPOPMAX ZPOPMIN ZRANGEBYSCORE ZREVRANGE ZREVRANGEBYSCORE "
834840
"ZUNION HGETALL XREADGROUP",

Diff for: tests/test_asyncio/test_cluster.py

+10-10
Original file line numberDiff line numberDiff line change
@@ -1752,38 +1752,38 @@ async def test_cluster_rpoplpush(self, r: RedisCluster) -> None:
17521752

17531753
async def test_cluster_sdiff(self, r: RedisCluster) -> None:
17541754
await r.sadd("{foo}a", "1", "2", "3")
1755-
assert set(await r.sdiff("{foo}a", "{foo}b")) == {b"1", b"2", b"3"}
1755+
assert await r.sdiff("{foo}a", "{foo}b") == {b"1", b"2", b"3"}
17561756
await r.sadd("{foo}b", "2", "3")
1757-
assert await r.sdiff("{foo}a", "{foo}b") == [b"1"]
1757+
assert await r.sdiff("{foo}a", "{foo}b") == {b"1"}
17581758

17591759
async def test_cluster_sdiffstore(self, r: RedisCluster) -> None:
17601760
await r.sadd("{foo}a", "1", "2", "3")
17611761
assert await r.sdiffstore("{foo}c", "{foo}a", "{foo}b") == 3
1762-
assert set(await r.smembers("{foo}c")) == {b"1", b"2", b"3"}
1762+
assert await r.smembers("{foo}c") == {b"1", b"2", b"3"}
17631763
await r.sadd("{foo}b", "2", "3")
17641764
assert await r.sdiffstore("{foo}c", "{foo}a", "{foo}b") == 1
1765-
assert await r.smembers("{foo}c") == [b"1"]
1765+
assert await r.smembers("{foo}c") == {b"1"}
17661766

17671767
async def test_cluster_sinter(self, r: RedisCluster) -> None:
17681768
await r.sadd("{foo}a", "1", "2", "3")
1769-
assert await r.sinter("{foo}a", "{foo}b") == []
1769+
assert await r.sinter("{foo}a", "{foo}b") == set()
17701770
await r.sadd("{foo}b", "2", "3")
1771-
assert set(await r.sinter("{foo}a", "{foo}b")) == {b"2", b"3"}
1771+
assert await r.sinter("{foo}a", "{foo}b") == {b"2", b"3"}
17721772

17731773
async def test_cluster_sinterstore(self, r: RedisCluster) -> None:
17741774
await r.sadd("{foo}a", "1", "2", "3")
17751775
assert await r.sinterstore("{foo}c", "{foo}a", "{foo}b") == 0
1776-
assert await r.smembers("{foo}c") == []
1776+
assert await r.smembers("{foo}c") == set()
17771777
await r.sadd("{foo}b", "2", "3")
17781778
assert await r.sinterstore("{foo}c", "{foo}a", "{foo}b") == 2
1779-
assert set(await r.smembers("{foo}c")) == {b"2", b"3"}
1779+
assert await r.smembers("{foo}c") == {b"2", b"3"}
17801780

17811781
async def test_cluster_smove(self, r: RedisCluster) -> None:
17821782
await r.sadd("{foo}a", "a1", "a2")
17831783
await r.sadd("{foo}b", "b1", "b2")
17841784
assert await r.smove("{foo}a", "{foo}b", "a1")
1785-
assert await r.smembers("{foo}a") == [b"a2"]
1786-
assert set(await r.smembers("{foo}b")) == {b"b1", b"b2", b"a1"}
1785+
assert await r.smembers("{foo}a") == {b"a2"}
1786+
assert await r.smembers("{foo}b") == {b"b1", b"b2", b"a1"}
17871787

17881788
async def test_cluster_sunion(self, r: RedisCluster) -> None:
17891789
await r.sadd("{foo}a", "1", "2")

Diff for: tests/test_asyncio/test_commands.py

+10-10
Original file line numberDiff line numberDiff line change
@@ -1415,34 +1415,34 @@ async def test_scard(self, r: redis.Redis):
14151415
@pytest.mark.onlynoncluster
14161416
async def test_sdiff(self, r: redis.Redis):
14171417
await r.sadd("a", "1", "2", "3")
1418-
assert set(await r.sdiff("a", "b")) == {b"1", b"2", b"3"}
1418+
assert await r.sdiff("a", "b") == {b"1", b"2", b"3"}
14191419
await r.sadd("b", "2", "3")
1420-
assert await r.sdiff("a", "b") == [b"1"]
1420+
assert await r.sdiff("a", "b") == {b"1"}
14211421

14221422
@pytest.mark.onlynoncluster
14231423
async def test_sdiffstore(self, r: redis.Redis):
14241424
await r.sadd("a", "1", "2", "3")
14251425
assert await r.sdiffstore("c", "a", "b") == 3
1426-
assert set(await r.smembers("c")) == {b"1", b"2", b"3"}
1426+
assert await r.smembers("c") == {b"1", b"2", b"3"}
14271427
await r.sadd("b", "2", "3")
14281428
assert await r.sdiffstore("c", "a", "b") == 1
1429-
assert await r.smembers("c") == [b"1"]
1429+
assert await r.smembers("c") == {b"1"}
14301430

14311431
@pytest.mark.onlynoncluster
14321432
async def test_sinter(self, r: redis.Redis):
14331433
await r.sadd("a", "1", "2", "3")
1434-
assert await r.sinter("a", "b") == []
1434+
assert await r.sinter("a", "b") == set()
14351435
await r.sadd("b", "2", "3")
1436-
assert set(await r.sinter("a", "b")) == {b"2", b"3"}
1436+
assert await r.sinter("a", "b") == {b"2", b"3"}
14371437

14381438
@pytest.mark.onlynoncluster
14391439
async def test_sinterstore(self, r: redis.Redis):
14401440
await r.sadd("a", "1", "2", "3")
14411441
assert await r.sinterstore("c", "a", "b") == 0
1442-
assert await r.smembers("c") == []
1442+
assert await r.smembers("c") == set()
14431443
await r.sadd("b", "2", "3")
14441444
assert await r.sinterstore("c", "a", "b") == 2
1445-
assert set(await r.smembers("c")) == {b"2", b"3"}
1445+
assert await r.smembers("c") == {b"2", b"3"}
14461446

14471447
async def test_sismember(self, r: redis.Redis):
14481448
await r.sadd("a", "1", "2", "3")
@@ -1460,8 +1460,8 @@ async def test_smove(self, r: redis.Redis):
14601460
await r.sadd("a", "a1", "a2")
14611461
await r.sadd("b", "b1", "b2")
14621462
assert await r.smove("a", "b", "a1")
1463-
assert await r.smembers("a") == [b"a2"]
1464-
assert set(await r.smembers("b")) == {b"b1", b"b2", b"a1"}
1463+
assert await r.smembers("a") == {b"a2"}
1464+
assert await r.smembers("b") == {b"b1", b"b2", b"a1"}
14651465

14661466
async def test_spop(self, r: redis.Redis):
14671467
s = [b"1", b"2", b"3"]

Diff for: tests/test_cache.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def r(request):
4141

4242
@pytest.mark.skipif(HIREDIS_AVAILABLE, reason="PythonParser only")
4343
@pytest.mark.onlynoncluster
44-
# @skip_if_resp_version(2)
44+
@skip_if_resp_version(2)
4545
@skip_if_server_version_lt("7.4.0")
4646
class TestCache:
4747
@pytest.mark.parametrize(

Diff for: tests/test_cluster.py

+12-12
Original file line numberDiff line numberDiff line change
@@ -1865,49 +1865,49 @@ def test_cluster_rpoplpush(self, r):
18651865

18661866
def test_cluster_sdiff(self, r):
18671867
r.sadd("{foo}a", "1", "2", "3")
1868-
assert set(r.sdiff("{foo}a", "{foo}b")) == {b"1", b"2", b"3"}
1868+
assert r.sdiff("{foo}a", "{foo}b") == {b"1", b"2", b"3"}
18691869
r.sadd("{foo}b", "2", "3")
1870-
assert r.sdiff("{foo}a", "{foo}b") == [b"1"]
1870+
assert r.sdiff("{foo}a", "{foo}b") == {b"1"}
18711871

18721872
def test_cluster_sdiffstore(self, r):
18731873
r.sadd("{foo}a", "1", "2", "3")
18741874
assert r.sdiffstore("{foo}c", "{foo}a", "{foo}b") == 3
1875-
assert set(r.smembers("{foo}c")) == {b"1", b"2", b"3"}
1875+
assert r.smembers("{foo}c") == {b"1", b"2", b"3"}
18761876
r.sadd("{foo}b", "2", "3")
18771877
assert r.sdiffstore("{foo}c", "{foo}a", "{foo}b") == 1
1878-
assert r.smembers("{foo}c") == [b"1"]
1878+
assert r.smembers("{foo}c") == {b"1"}
18791879

18801880
def test_cluster_sinter(self, r):
18811881
r.sadd("{foo}a", "1", "2", "3")
1882-
assert r.sinter("{foo}a", "{foo}b") == []
1882+
assert r.sinter("{foo}a", "{foo}b") == set()
18831883
r.sadd("{foo}b", "2", "3")
1884-
assert set(r.sinter("{foo}a", "{foo}b")) == {b"2", b"3"}
1884+
assert r.sinter("{foo}a", "{foo}b") == {b"2", b"3"}
18851885

18861886
def test_cluster_sinterstore(self, r):
18871887
r.sadd("{foo}a", "1", "2", "3")
18881888
assert r.sinterstore("{foo}c", "{foo}a", "{foo}b") == 0
1889-
assert r.smembers("{foo}c") == []
1889+
assert r.smembers("{foo}c") == set()
18901890
r.sadd("{foo}b", "2", "3")
18911891
assert r.sinterstore("{foo}c", "{foo}a", "{foo}b") == 2
1892-
assert set(r.smembers("{foo}c")) == {b"2", b"3"}
1892+
assert r.smembers("{foo}c") == {b"2", b"3"}
18931893

18941894
def test_cluster_smove(self, r):
18951895
r.sadd("{foo}a", "a1", "a2")
18961896
r.sadd("{foo}b", "b1", "b2")
18971897
assert r.smove("{foo}a", "{foo}b", "a1")
1898-
assert r.smembers("{foo}a") == [b"a2"]
1899-
assert set(r.smembers("{foo}b")) == {b"b1", b"b2", b"a1"}
1898+
assert r.smembers("{foo}a") == {b"a2"}
1899+
assert r.smembers("{foo}b") == {b"b1", b"b2", b"a1"}
19001900

19011901
def test_cluster_sunion(self, r):
19021902
r.sadd("{foo}a", "1", "2")
19031903
r.sadd("{foo}b", "2", "3")
1904-
assert set(r.sunion("{foo}a", "{foo}b")) == {b"1", b"2", b"3"}
1904+
assert r.sunion("{foo}a", "{foo}b") == {b"1", b"2", b"3"}
19051905

19061906
def test_cluster_sunionstore(self, r):
19071907
r.sadd("{foo}a", "1", "2")
19081908
r.sadd("{foo}b", "2", "3")
19091909
assert r.sunionstore("{foo}c", "{foo}a", "{foo}b") == 3
1910-
assert set(r.smembers("{foo}c")) == {b"1", b"2", b"3"}
1910+
assert r.smembers("{foo}c") == {b"1", b"2", b"3"}
19111911

19121912
@skip_if_server_version_lt("6.2.0")
19131913
def test_cluster_zdiff(self, r):

Diff for: tests/test_commands.py

+10-10
Original file line numberDiff line numberDiff line change
@@ -2247,25 +2247,25 @@ def test_scard(self, r):
22472247
@pytest.mark.onlynoncluster
22482248
def test_sdiff(self, r):
22492249
r.sadd("a", "1", "2", "3")
2250-
assert set(r.sdiff("a", "b")) == {b"1", b"2", b"3"}
2250+
assert r.sdiff("a", "b") == {b"1", b"2", b"3"}
22512251
r.sadd("b", "2", "3")
2252-
assert r.sdiff("a", "b") == [b"1"]
2252+
assert r.sdiff("a", "b") == {b"1"}
22532253

22542254
@pytest.mark.onlynoncluster
22552255
def test_sdiffstore(self, r):
22562256
r.sadd("a", "1", "2", "3")
22572257
assert r.sdiffstore("c", "a", "b") == 3
2258-
assert set(r.smembers("c")) == {b"1", b"2", b"3"}
2258+
assert r.smembers("c") == {b"1", b"2", b"3"}
22592259
r.sadd("b", "2", "3")
22602260
assert r.sdiffstore("c", "a", "b") == 1
2261-
assert r.smembers("c") == [b"1"]
2261+
assert r.smembers("c") == {b"1"}
22622262

22632263
@pytest.mark.onlynoncluster
22642264
def test_sinter(self, r):
22652265
r.sadd("a", "1", "2", "3")
2266-
assert r.sinter("a", "b") == []
2266+
assert r.sinter("a", "b") == set()
22672267
r.sadd("b", "2", "3")
2268-
assert set(r.sinter("a", "b")) == {b"2", b"3"}
2268+
assert r.sinter("a", "b") == {b"2", b"3"}
22692269

22702270
@pytest.mark.onlynoncluster
22712271
@skip_if_server_version_lt("7.0.0")
@@ -2280,10 +2280,10 @@ def test_sintercard(self, r):
22802280
def test_sinterstore(self, r):
22812281
r.sadd("a", "1", "2", "3")
22822282
assert r.sinterstore("c", "a", "b") == 0
2283-
assert r.smembers("c") == []
2283+
assert r.smembers("c") == set()
22842284
r.sadd("b", "2", "3")
22852285
assert r.sinterstore("c", "a", "b") == 2
2286-
assert set(r.smembers("c")) == {b"2", b"3"}
2286+
assert r.smembers("c") == {b"2", b"3"}
22872287

22882288
def test_sismember(self, r):
22892289
r.sadd("a", "1", "2", "3")
@@ -2308,8 +2308,8 @@ def test_smove(self, r):
23082308
r.sadd("a", "a1", "a2")
23092309
r.sadd("b", "b1", "b2")
23102310
assert r.smove("a", "b", "a1")
2311-
assert r.smembers("a") == [b"a2"]
2312-
assert set(r.smembers("b")) == {b"b1", b"b2", b"a1"}
2311+
assert r.smembers("a") == {b"a2"}
2312+
assert r.smembers("b") == {b"b1", b"b2", b"a1"}
23132313

23142314
def test_spop(self, r):
23152315
s = [b"1", b"2", b"3"]

0 commit comments

Comments
 (0)