From 7065b680c4f19094739cea7e4d8adecc986d3816 Mon Sep 17 00:00:00 2001 From: Wh1isper <9573586@qq.com> Date: Sun, 16 Jun 2024 13:21:16 +0800 Subject: [PATCH 1/7] Fix parse error when no gropu --- redis/_parsers/helpers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/redis/_parsers/helpers.py b/redis/_parsers/helpers.py index 56d912c157..33cfa1327a 100644 --- a/redis/_parsers/helpers.py +++ b/redis/_parsers/helpers.py @@ -282,7 +282,7 @@ def parse_xinfo_stream(response, **options): data["last-entry"] = (last[0], pairs_to_dict(last[1])) else: data["entries"] = {_id: pairs_to_dict(entry) for _id, entry in data["entries"]} - if isinstance(data["groups"][0], list): + if len(data["groups"]) > 0 and isinstance(data["groups"][0], list): data["groups"] = [ pairs_to_dict(group, decode_keys=True) for group in data["groups"] ] From deda12b7fef262c8ad8b0901b2529c7af8b80b19 Mon Sep 17 00:00:00 2001 From: Wh1isper <9573586@qq.com> Date: Sun, 16 Jun 2024 13:25:15 +0800 Subject: [PATCH 2/7] Fix parse error when entry is None for redis 6.0 --- redis/_parsers/helpers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/redis/_parsers/helpers.py b/redis/_parsers/helpers.py index 33cfa1327a..40a57a5607 100644 --- a/redis/_parsers/helpers.py +++ b/redis/_parsers/helpers.py @@ -275,10 +275,10 @@ def parse_xinfo_stream(response, **options): data = {str_if_bytes(k): v for k, v in response.items()} if not options.get("full", False): first = data.get("first-entry") - if first is not None: + if first is not None and first[0] is not None: data["first-entry"] = (first[0], pairs_to_dict(first[1])) last = data["last-entry"] - if last is not None: + if last is not None and last[0] is not None: data["last-entry"] = (last[0], pairs_to_dict(last[1])) else: data["entries"] = {_id: pairs_to_dict(entry) for _id, entry in data["entries"]} From 395fef849815cb75d46b6558a90f5e85bf768d0b Mon Sep 17 00:00:00 2001 From: Wh1isper <9573586@qq.com> Date: Sun, 16 Jun 2024 14:01:28 +0800 Subject: [PATCH 3/7] Parse consumers --- redis/_parsers/helpers.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/redis/_parsers/helpers.py b/redis/_parsers/helpers.py index 40a57a5607..2341c92d8a 100644 --- a/redis/_parsers/helpers.py +++ b/redis/_parsers/helpers.py @@ -286,6 +286,11 @@ def parse_xinfo_stream(response, **options): data["groups"] = [ pairs_to_dict(group, decode_keys=True) for group in data["groups"] ] + for g in data["groups"]: + if g["consumers"] and g["consumers"][0] is not None: + g["consumers"] = [ + pairs_to_dict(c, decode_keys=True) for c in g["consumers"] + ] else: data["groups"] = [ {str_if_bytes(k): v for k, v in group.items()} From 7903ae7d775619280f6fb1dd81371388e06450c6 Mon Sep 17 00:00:00 2001 From: Wh1isper <9573586@qq.com> Date: Mon, 17 Jun 2024 16:01:57 +0800 Subject: [PATCH 4/7] Add tests on xinfo full --- tests/test_asyncio/test_commands.py | 21 +++++++++++++++++++++ tests/test_commands.py | 10 +++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/tests/test_asyncio/test_commands.py b/tests/test_asyncio/test_commands.py index a29b4a548a..ef28206f37 100644 --- a/tests/test_asyncio/test_commands.py +++ b/tests/test_asyncio/test_commands.py @@ -2919,6 +2919,27 @@ async def test_xinfo_stream(self, r: redis.Redis): assert info["first-entry"] == await get_stream_message(r, stream, m1) assert info["last-entry"] == await get_stream_message(r, stream, m2) + @skip_if_server_version_lt("6.0.0") + async def test_xinfo_stream_full(self, r: redis.Redis): + + stream = "stream" + group = "group" + m1 = await r.xadd(stream, {"foo": "bar"}) + info = await r.xinfo_stream(stream, full=True) + print(info) + assert info["length"] == 1 + assert len(info["groups"]) == 0 + + await r.xgroup_create(stream, group, 0) + info = await r.xinfo_stream(stream, full=True) + assert info["length"] == 1 + + await r.xreadgroup(group, "consumer", streams={stream: ">"}) + info = await r.xinfo_stream(stream, full=True) + consumer = info["groups"][0]["consumers"][0] + assert isinstance(consumer, dict) + + @skip_if_server_version_lt("5.0.0") async def test_xlen(self, r: redis.Redis): stream = "stream" diff --git a/tests/test_commands.py b/tests/test_commands.py index d0c235daf9..a9036b9c26 100644 --- a/tests/test_commands.py +++ b/tests/test_commands.py @@ -4457,9 +4457,12 @@ def test_xinfo_stream_full(self, r): stream = "stream" group = "group" m1 = r.xadd(stream, {"foo": "bar"}) - r.xgroup_create(stream, group, 0) info = r.xinfo_stream(stream, full=True) + assert info["length"] == 1 + assert len(info["groups"]) == 0 + r.xgroup_create(stream, group, 0) + info = r.xinfo_stream(stream, full=True) assert info["length"] == 1 assert_resp_response_in( r, @@ -4469,6 +4472,11 @@ def test_xinfo_stream_full(self, r): ) assert len(info["groups"]) == 1 + r.xreadgroup(group, "consumer", streams={stream: ">"}) + info = r.xinfo_stream(stream, full=True) + consumer = info["groups"][0]["consumers"][0] + assert isinstance(consumer, dict) + @skip_if_server_version_lt("5.0.0") def test_xlen(self, r): stream = "stream" From 5f2a80e24ea3323353faafdf674968bab523e230 Mon Sep 17 00:00:00 2001 From: Wh1isper <9573586@qq.com> Date: Mon, 17 Jun 2024 16:06:13 +0800 Subject: [PATCH 5/7] Fix lint issues --- tests/test_asyncio/test_commands.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tests/test_asyncio/test_commands.py b/tests/test_asyncio/test_commands.py index ef28206f37..9ae2c7da8a 100644 --- a/tests/test_asyncio/test_commands.py +++ b/tests/test_asyncio/test_commands.py @@ -2921,12 +2921,11 @@ async def test_xinfo_stream(self, r: redis.Redis): @skip_if_server_version_lt("6.0.0") async def test_xinfo_stream_full(self, r: redis.Redis): - stream = "stream" group = "group" - m1 = await r.xadd(stream, {"foo": "bar"}) + + await r.xadd(stream, {"foo": "bar"}) info = await r.xinfo_stream(stream, full=True) - print(info) assert info["length"] == 1 assert len(info["groups"]) == 0 @@ -2939,7 +2938,6 @@ async def test_xinfo_stream_full(self, r: redis.Redis): consumer = info["groups"][0]["consumers"][0] assert isinstance(consumer, dict) - @skip_if_server_version_lt("5.0.0") async def test_xlen(self, r: redis.Redis): stream = "stream" From b3afc13631ac9a82b7dcc03023bee4ae540d9c41 Mon Sep 17 00:00:00 2001 From: Wh1isper <9573586@qq.com> Date: Mon, 17 Jun 2024 16:12:41 +0800 Subject: [PATCH 6/7] Add test against xinfo_stream --- tests/test_asyncio/test_commands.py | 6 ++++++ tests/test_commands.py | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/tests/test_asyncio/test_commands.py b/tests/test_asyncio/test_commands.py index 9ae2c7da8a..37dc9723f1 100644 --- a/tests/test_asyncio/test_commands.py +++ b/tests/test_asyncio/test_commands.py @@ -2919,6 +2919,12 @@ async def test_xinfo_stream(self, r: redis.Redis): assert info["first-entry"] == await get_stream_message(r, stream, m1) assert info["last-entry"] == await get_stream_message(r, stream, m2) + await r.xtrim(stream, 0) + info = await r.xinfo_stream(stream) + assert info["length"] == 0 + assert info["first-entry"] == None + assert info["last-entry"] == None + @skip_if_server_version_lt("6.0.0") async def test_xinfo_stream_full(self, r: redis.Redis): stream = "stream" diff --git a/tests/test_commands.py b/tests/test_commands.py index a9036b9c26..31ab609c0c 100644 --- a/tests/test_commands.py +++ b/tests/test_commands.py @@ -4452,6 +4452,12 @@ def test_xinfo_stream(self, r): assert info["entries-added"] == 2 assert info["recorded-first-entry-id"] == m1 + r.xtrim(stream, 0) + info = r.xinfo_stream(stream) + assert info["length"] == 0 + assert info["first-entry"] == None + assert info["last-entry"] == None + @skip_if_server_version_lt("6.0.0") def test_xinfo_stream_full(self, r): stream = "stream" From e7b90641a3f51e6fe3e8d8cd31f416611d927604 Mon Sep 17 00:00:00 2001 From: Wh1isper <9573586@qq.com> Date: Mon, 17 Jun 2024 16:13:42 +0800 Subject: [PATCH 7/7] Fix lint issue --- tests/test_asyncio/test_commands.py | 4 ++-- tests/test_commands.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_asyncio/test_commands.py b/tests/test_asyncio/test_commands.py index 37dc9723f1..61c00541cb 100644 --- a/tests/test_asyncio/test_commands.py +++ b/tests/test_asyncio/test_commands.py @@ -2922,8 +2922,8 @@ async def test_xinfo_stream(self, r: redis.Redis): await r.xtrim(stream, 0) info = await r.xinfo_stream(stream) assert info["length"] == 0 - assert info["first-entry"] == None - assert info["last-entry"] == None + assert info["first-entry"] is None + assert info["last-entry"] is None @skip_if_server_version_lt("6.0.0") async def test_xinfo_stream_full(self, r: redis.Redis): diff --git a/tests/test_commands.py b/tests/test_commands.py index 31ab609c0c..d0071155ea 100644 --- a/tests/test_commands.py +++ b/tests/test_commands.py @@ -4455,8 +4455,8 @@ def test_xinfo_stream(self, r): r.xtrim(stream, 0) info = r.xinfo_stream(stream) assert info["length"] == 0 - assert info["first-entry"] == None - assert info["last-entry"] == None + assert info["first-entry"] is None + assert info["last-entry"] is None @skip_if_server_version_lt("6.0.0") def test_xinfo_stream_full(self, r):