Skip to content

Commit 0a135ef

Browse files
authored
Functionality to get the next page of a paginated collection (#261)
1 parent 275dad4 commit 0a135ef

35 files changed

+1620
-53
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# CHANGELOG
22

3+
## Next release
4+
5+
- Add `get_next_page` function that retrieves the next page of results for a paginated collection
6+
37
## v7.10.0 (2023-02-17)
48

59
- Adds beta `retrieve_stateless_rates` function

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ clean:
2727

2828
## coverage - Test the project and generate an HTML coverage report
2929
coverage:
30-
$(VIRTUAL_BIN)/pytest --cov=$(PROJECT_NAME) --cov-branch --cov-report=html --cov-report=term-missing --cov-fail-under=88
30+
$(VIRTUAL_BIN)/pytest --cov=$(PROJECT_NAME) --cov-branch --cov-report=html --cov-report=term-missing --cov-fail-under=87
3131

3232
## docs - Generates docs for the library
3333
docs:

easypost/address.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,13 @@
1010
RequestMethod,
1111
Requestor,
1212
)
13-
from easypost.resource import AllResource
13+
from easypost.resource import (
14+
AllResource,
15+
NextPageResource,
16+
)
1417

1518

16-
class Address(AllResource):
19+
class Address(AllResource, NextPageResource):
1720
@classmethod
1821
def create(
1922
cls,

easypost/event.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,13 @@
1010
RequestMethod,
1111
Requestor,
1212
)
13-
from easypost.resource import AllResource
13+
from easypost.resource import (
14+
AllResource,
15+
NextPageResource,
16+
)
1417

1518

16-
class Event(AllResource):
19+
class Event(AllResource, NextPageResource):
1720
@classmethod
1821
def receive(cls, values: str) -> "Event":
1922
return convert_to_easypost_object(response=json.loads(s=values), api_key=easypost.api_key)

easypost/insurance.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
from easypost.resource import (
22
AllResource,
33
CreateResource,
4+
NextPageResource,
45
)
56

67

7-
class Insurance(AllResource, CreateResource):
8+
class Insurance(AllResource, CreateResource, NextPageResource):
89
pass

easypost/pickup.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,12 @@
77
from easypost.resource import (
88
AllResource,
99
CreateResource,
10+
NextPageResource,
1011
)
1112
from easypost.util import get_lowest_object_rate
1213

1314

14-
class Pickup(CreateResource, AllResource):
15+
class Pickup(CreateResource, AllResource, NextPageResource):
1516
def buy(self, **params) -> "Pickup":
1617
"""Buy a pickup."""
1718
requestor = Requestor(local_api_key=self._api_key)

easypost/referral.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,32 @@ def all(
7878
)
7979
return convert_to_easypost_object(response=response, api_key=api_key)
8080

81+
@classmethod
82+
def get_next_page(
83+
cls,
84+
referrals: Dict[str, Any],
85+
page_size: int,
86+
api_key: Optional[str] = None,
87+
) -> List["Referral"]:
88+
"""Retrieve next page of a referral customers."""
89+
requestor = Requestor(local_api_key=api_key)
90+
url = "/referral_customers"
91+
referral_array = referrals["referral_customers"]
92+
93+
if referral_array is None or len(referral_array) == 0 or not referrals.get("has_more"):
94+
raise Error(message="There are no more pages to retrieve.")
95+
96+
params = {
97+
"before_id": referral_array[-1].id,
98+
"page_size": page_size,
99+
}
100+
101+
response, api_key = requestor.request(method=RequestMethod.GET, url=url, params=params)
102+
if response is None or len(response["referral_customers"]) == 0 or not response["has_more"]:
103+
raise Error(message="There are no more pages to retrieve.")
104+
105+
return convert_to_easypost_object(response=response, api_key=api_key)
106+
81107
@staticmethod
82108
def add_credit_card(
83109
referral_api_key: str,

easypost/refund.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
from easypost.resource import (
22
AllResource,
33
CreateResource,
4+
NextPageResource,
45
)
56

67

7-
class Refund(CreateResource, AllResource):
8+
class Refund(CreateResource, AllResource, NextPageResource):
89
pass

easypost/report.py

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
from typing import Optional
1+
from typing import (
2+
Any,
3+
Dict,
4+
List,
5+
Optional,
6+
)
27

38
from easypost.easypost_object import convert_to_easypost_object
49
from easypost.requestor import (
@@ -10,17 +15,37 @@
1015

1116
class Report(Resource):
1217
@classmethod
13-
def create(cls, api_key: Optional[str] = None, **params):
18+
def create(cls, api_key: Optional[str] = None, **params) -> "Report":
1419
"""Create a report."""
1520
requestor = Requestor(local_api_key=api_key)
1621
url = f"{cls.class_url()}/{params.get('type')}"
1722
response, api_key = requestor.request(method=RequestMethod.POST, url=url, params=params)
1823
return convert_to_easypost_object(response=response, api_key=api_key)
1924

2025
@classmethod
21-
def all(cls, api_key: Optional[str] = None, **params):
26+
def all(cls, api_key: Optional[str] = None, **params) -> List["Report"]:
2227
"""Retrieve all reports."""
2328
requestor = Requestor(local_api_key=api_key)
24-
url = f"{cls.class_url()}/{params.get('type')}"
29+
type = params.pop("type")
30+
url = f"{cls.class_url()}/{type}"
31+
response, api_key = requestor.request(method=RequestMethod.GET, url=url, params=params)
32+
response["type"] = type
33+
return convert_to_easypost_object(response=response, api_key=api_key)
34+
35+
@classmethod
36+
def get_next_page(
37+
cls,
38+
reports: Dict[str, Any],
39+
page_size: int = None,
40+
api_key: Optional[str] = None,
41+
) -> List["Report"]:
42+
"""Get next page of Report collection"""
43+
requestor = Requestor(local_api_key=api_key)
44+
type = reports.get("type")
45+
url = f"{cls.class_url()}/{type}"
46+
params = {
47+
"before_id": reports["reports"][-1].id,
48+
"page_size": page_size,
49+
}
2550
response, api_key = requestor.request(method=RequestMethod.GET, url=url, params=params)
2651
return convert_to_easypost_object(response=response, api_key=api_key)

easypost/requestor.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ def request(
8484
params: Optional[Dict[str, Any]] = None,
8585
api_key_required: bool = True,
8686
beta: bool = False,
87-
) -> Tuple[dict, Optional[str]]:
87+
) -> Tuple[Dict[str, Any], Optional[str]]:
8888
"""Make a request to the EasyPost API."""
8989
if params is None:
9090
params = {}

0 commit comments

Comments
 (0)