Skip to content

Commit a19e507

Browse files
authored
Merge pull request #286 from EasyPost/carrier_metadata_ga
feat: carrier metadata GA
2 parents a53610a + 3aa99bb commit a19e507

File tree

8 files changed

+2017
-0
lines changed

8 files changed

+2017
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
- References to `Scanform` are now `ScanForm` and `scan_form`
1616
- `primary_or_secondary` paramater name for billing functions is now called `priority` to match the API and docs
1717
- The `update_email` function of the `referral_customer` service had the parameter order switched so `id` (previously called `user_id`) is first which matches the rest of the library
18+
- Retrieving carrier metadata is now in GA
1819
- Dropped Python 3.6 support
1920
- Bumps all dependencies
2021

easypost/easypost_client.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
BetaReferralCustomerService,
1414
BillingService,
1515
CarrierAccountService,
16+
CarrierMetadataService,
1617
CustomsInfoService,
1718
CustomsItemService,
1819
EndShipperService,
@@ -55,6 +56,7 @@ def __init__(
5556
self.beta_referral_customer = BetaReferralCustomerService(self)
5657
self.billing = BillingService(self)
5758
self.carrier_account = CarrierAccountService(self)
59+
self.carrier_metadata = CarrierMetadataService(self)
5860
self.customs_info = CustomsInfoService(self)
5961
self.customs_item = CustomsItemService(self)
6062
self.end_shipper = EndShipperService(self)

easypost/services/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from easypost.services.beta_referral_customer_service import BetaReferralCustomerService
77
from easypost.services.billing_service import BillingService
88
from easypost.services.carrier_account_service import CarrierAccountService
9+
from easypost.services.carrier_metadata_service import CarrierMetadataService
910
from easypost.services.customs_info_service import CustomsInfoService
1011
from easypost.services.customs_item_service import CustomsItemService
1112
from easypost.services.end_shipper_service import EndShipperService

easypost/services/beta_carrier_metadata_service.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
List,
55
Optional,
66
)
7+
from warnings import warn
78

89
from easypost.easypost_object import convert_to_easypost_object
910
from easypost.requestor import (
@@ -23,6 +24,12 @@ def retrieve_carrier_metadata(
2324
types: Optional[List[str]] = None,
2425
) -> List[Dict[str, Any]]:
2526
"""Get metadata for all carriers on the EasyPost platform."""
27+
warn(
28+
'This method is deprecated, use the "retrieve" function of "carrier_metadata" on the client instead.',
29+
DeprecationWarning,
30+
stacklevel=2,
31+
)
32+
2633
params = {
2734
"carriers": ",".join(carriers) if carriers else None,
2835
"types": ",".join(types) if types else None,
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
from typing import (
2+
Any,
3+
Dict,
4+
List,
5+
Optional,
6+
)
7+
8+
from easypost.easypost_object import convert_to_easypost_object
9+
from easypost.requestor import (
10+
RequestMethod,
11+
Requestor,
12+
)
13+
from easypost.services.base_service import BaseService
14+
15+
16+
class CarrierMetadataService(BaseService):
17+
def __init__(self, client):
18+
self._client = client
19+
20+
def retrieve(
21+
self,
22+
carriers: Optional[List[str]] = None,
23+
types: Optional[List[str]] = None,
24+
) -> List[Dict[str, Any]]:
25+
"""Get metadata for all carriers on the EasyPost platform or specify optional filters."""
26+
params = {
27+
"carriers": ",".join(carriers) if carriers else None,
28+
"types": ",".join(types) if types else None,
29+
}
30+
31+
response = Requestor(self._client).request(
32+
method=RequestMethod.GET,
33+
url="/metadata/carriers",
34+
params=params,
35+
)
36+
37+
return convert_to_easypost_object(response=response.get("carriers", []))

tests/cassettes/test_retrieve_carrier_metadata.yaml

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

tests/cassettes/test_retrieve_carrier_metadata_with_filters.yaml

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

tests/test_carrier_metadata.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import pytest
2+
3+
4+
@pytest.mark.vcr()
5+
def test_retrieve_carrier_metadata(test_client):
6+
"""Tests that we can retrieve all carriers and all metadata from the API when no params are provided."""
7+
carrier_metadata = test_client.carrier_metadata.retrieve()
8+
9+
# Assert we get multiple carriers
10+
assert any(carrier.name == "usps" for carrier in carrier_metadata)
11+
assert any(carrier.name == "fedex" for carrier in carrier_metadata)
12+
13+
14+
@pytest.mark.vcr()
15+
def test_retrieve_carrier_metadata_with_filters(test_client):
16+
"""Tests that we can retrieve metadata based on the filters provided."""
17+
carrier_metadata = test_client.carrier_metadata.retrieve(
18+
carriers=["usps"],
19+
types=["service_levels", "predefined_packages"],
20+
)
21+
22+
# Assert we get the single carrier we asked for and only the types we asked for
23+
assert all(carrier.name == "usps" for carrier in carrier_metadata)
24+
assert len(carrier_metadata) == 1
25+
assert carrier_metadata[0]["service_levels"]
26+
assert carrier_metadata[0]["predefined_packages"]
27+
assert not carrier_metadata[0].get("supported_features")

0 commit comments

Comments
 (0)