Skip to content

Commit a93aab1

Browse files
authored
Merge pull request #333 from InjectiveLabs/fix/pagination_next_key
Fix/pagination next key
2 parents ece0283 + eadfc3d commit a93aab1

File tree

9 files changed

+564
-488
lines changed

9 files changed

+564
-488
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22

33
All notable changes to this project will be documented in this file.
44

5+
## [1.5.3] - 2024-06-12
6+
### Changed
7+
- Changed parameter `key` from the PaginationOption class.
8+
- Fixed an error when using the next page key in PaginationOption, causing incorrect pagination responses.
9+
510
## [1.5.2] - 2024-05-10
611
### Changed
712
- Updated `protobuf` dependency version to ">=5.26.1"
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import asyncio
2+
3+
from pyinjective.async_client import AsyncClient
4+
from pyinjective.client.model.pagination import PaginationOption
5+
from pyinjective.core.network import Network
6+
7+
8+
async def main() -> None:
9+
network = Network.testnet()
10+
client = AsyncClient(network)
11+
pagination = PaginationOption(
12+
limit=10,
13+
count_total=True,
14+
)
15+
first_result = await client.fetch_total_supply(
16+
pagination=pagination,
17+
)
18+
print(f"First result:\n{first_result}")
19+
20+
next_page_key = first_result["pagination"]["nextKey"]
21+
22+
for i in range(5):
23+
if next_page_key == "":
24+
break
25+
26+
next_request_pagination = PaginationOption(
27+
limit=pagination.limit,
28+
count_total=pagination.count_total,
29+
encoded_page_key=next_page_key,
30+
)
31+
32+
next_result = await client.fetch_total_supply(
33+
pagination=next_request_pagination,
34+
)
35+
print(f"Page {i+2} result:\n{next_result}")
36+
37+
next_page_key = next_result["pagination"]["nextKey"]
38+
39+
40+
if __name__ == "__main__":
41+
asyncio.get_event_loop().run_until_complete(main())

poetry.lock

Lines changed: 473 additions & 478 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyinjective/async_client.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import asyncio
2-
import base64
32
import time
43
from copy import deepcopy
54
from decimal import Decimal
@@ -3064,11 +3063,10 @@ async def initialize_tokens_from_chain_denoms(self):
30643063
next_key = query_result.get("pagination", {}).get("nextKey", "")
30653064

30663065
while next_key != "":
3067-
query_result = await self.fetch_denoms_metadata(pagination=PaginationOption(key=next_key))
3066+
query_result = await self.fetch_denoms_metadata(pagination=PaginationOption(encoded_page_key=next_key))
30683067

30693068
all_denoms_metadata.extend(query_result.get("metadatas", []))
3070-
result_next_key = query_result.get("pagination", {}).get("nextKey", "")
3071-
next_key = base64.b64decode(result_next_key).decode()
3069+
next_key = query_result.get("pagination", {}).get("nextKey", "")
30723070

30733071
for token_metadata in all_denoms_metadata:
30743072
symbol = token_metadata["symbol"]

pyinjective/client/model/pagination.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import base64
12
from typing import Optional
23

34
from pyinjective.proto.cosmos.base.query.v1beta1 import pagination_pb2 as pagination_pb
@@ -6,7 +7,7 @@
67
class PaginationOption:
78
def __init__(
89
self,
9-
key: Optional[str] = None,
10+
encoded_page_key: Optional[str] = None,
1011
skip: Optional[int] = None,
1112
limit: Optional[int] = None,
1213
start_time: Optional[int] = None,
@@ -17,7 +18,7 @@ def __init__(
1718
to_number: Optional[int] = None,
1819
):
1920
super().__init__()
20-
self.key = key
21+
self.encoded_page_key = encoded_page_key
2122
self.skip = skip
2223
self.limit = limit
2324
self.start_time = start_time
@@ -30,8 +31,9 @@ def __init__(
3031
def create_pagination_request(self) -> pagination_pb.PageRequest:
3132
page_request = pagination_pb.PageRequest()
3233

33-
if self.key is not None:
34-
page_request.key = self.key.encode()
34+
if self.encoded_page_key is not None and self.encoded_page_key != "":
35+
page_key = base64.b64decode(self.encoded_page_key)
36+
page_request.key = page_key
3537
if self.skip is not None:
3638
page_request.offset = self.skip
3739
if self.limit is not None:

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "injective-py"
3-
version = "1.5.2"
3+
version = "1.5.3"
44
description = "Injective Python SDK, with Exchange API Client"
55
authors = ["Injective Labs <contact@injectivelabs.org>"]
66
license = "Apache-2.0"

tests/client/chain/grpc/test_chain_grpc_auth_api.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ async def test_fetch_accounts(
145145
api._stub = auth_servicer
146146

147147
pagination_option = PaginationOption(
148-
key="011ab4075a94245dff7338e3042db5b7cc3f42e1",
148+
encoded_page_key="011ab4075a94245dff7338e3042db5b7cc3f42e1",
149149
skip=10,
150150
limit=30,
151151
reverse=False,

tests/client/model/__init__.py

Whitespace-only changes.

tests/client/model/test_pagination.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import base64
2+
3+
from pyinjective.client.model.pagination import PaginationOption
4+
5+
6+
class TestPaginationOption:
7+
def test_create_pagination_request(self):
8+
next_page_key = b"next page key"
9+
encoded_next_page_key = base64.b64encode(next_page_key).decode()
10+
pagination_option = PaginationOption(
11+
encoded_page_key=encoded_next_page_key,
12+
skip=5,
13+
limit=10,
14+
start_time=3,
15+
end_time=4,
16+
reverse=False,
17+
count_total=True,
18+
from_number=105,
19+
to_number=135,
20+
)
21+
22+
page_request = pagination_option.create_pagination_request()
23+
assert page_request.key == next_page_key
24+
assert page_request.offset == pagination_option.skip
25+
assert page_request.limit == pagination_option.limit
26+
assert not page_request.reverse
27+
assert page_request.count_total
28+
29+
def test_next_key_is_none_for_empty_encoded_page_key(self):
30+
pagination_option = PaginationOption(
31+
encoded_page_key="",
32+
)
33+
page_request = pagination_option.create_pagination_request()
34+
35+
assert page_request.key == b""

0 commit comments

Comments
 (0)