Skip to content

Commit 8261a67

Browse files
committed
feat: adds get_lowest_stateless_rate function
1 parent 1ca7de2 commit 8261a67

File tree

5 files changed

+158
-16
lines changed

5 files changed

+158
-16
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
## Next Release
44

55
- Adds `retrieve_stateless_rates` function to pull stateless rates when shipment data is provided
6+
- Adds `get_lowest_stateless_rate` function to filter the lowest stateless rate
67

78
## v7.9.0 (2023-01-18)
89

easypost/beta/rate.py

+29-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
from typing import (
22
Any,
33
Dict,
4+
List,
45
Optional,
56
)
67

78
from easypost.easypost_object import convert_to_easypost_object
9+
from easypost.error import Error
810
from easypost.requestor import (
911
RequestMethod,
1012
Requestor,
@@ -23,4 +25,30 @@ def retrieve_stateless_rates(cls, api_key: Optional[str] = None, **params) -> Di
2325
}
2426
response, api_key = requestor.request(method=RequestMethod.POST, url=url, params=wrapped_params, beta=True)
2527

26-
return convert_to_easypost_object(response=response, api_key=api_key)
28+
return convert_to_easypost_object(response=response.get("rates", None), api_key=api_key)
29+
30+
@classmethod
31+
def get_lowest_stateless_rate(
32+
cls, stateless_rates: List[Dict[str, Any]], carriers: List[str] = None, services: List[str] = None
33+
) -> Dict[str, Any]:
34+
"""Get the lowest stateless rate."""
35+
carriers = carriers or []
36+
services = services or []
37+
lowest_rate = None
38+
39+
carriers = [carrier.lower() for carrier in carriers]
40+
services = [service.lower() for service in services]
41+
42+
for rate in stateless_rates:
43+
if (carriers and rate["carrier"].lower() not in carriers) or (
44+
services and rate["service"].lower() not in services
45+
):
46+
continue
47+
48+
if lowest_rate is None or float(rate.rate) < float(lowest_rate.rate):
49+
lowest_rate = rate
50+
51+
if lowest_rate is None:
52+
raise Error(message="No rates found.")
53+
54+
return lowest_rate

tests/cassettes/test_beta_get_lowest_stateless_rate.yaml

+105
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/cassettes/test_retrieve_stateless_rates.yaml renamed to tests/cassettes/test_beta_retrieve_stateless_rates.yaml

+10-11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/test_beta_rate.py

+13-4
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,18 @@
44

55

66
@pytest.mark.vcr()
7-
def test_retrieve_stateless_rates(basic_shipment):
8-
response = easypost.beta.Rate.retrieve_stateless_rates(**basic_shipment)
9-
10-
stateless_rates = response["rates"]
7+
def test_beta_retrieve_stateless_rates(basic_shipment):
8+
"""Tests that we can retrieve stateless rates when basic shipment data."""
9+
stateless_rates = easypost.beta.Rate.retrieve_stateless_rates(**basic_shipment)
1110

1211
assert all(rate["object"] == "Rate" for rate in stateless_rates)
12+
13+
14+
@pytest.mark.vcr()
15+
def test_beta_get_lowest_stateless_rate(basic_shipment):
16+
"""Tests that we can return the lowest stateless rate from a list of stateless rates."""
17+
stateless_rates = easypost.beta.Rate.retrieve_stateless_rates(**basic_shipment)
18+
19+
lowest_stateless_rate = easypost.beta.Rate.get_lowest_stateless_rate(stateless_rates)
20+
21+
assert lowest_stateless_rate["service"] == "First"

0 commit comments

Comments
 (0)