Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
# CHANGELOG

## Next Release
## v10.2.0 (2025-11-10)

- Adds `UspsShipAccount` support to the create carrier method
- Adds `tracker.retrieve_batch` function
- Adds `verify_carrier` address param

## v10.1.0 (2025-06-18)

Expand Down
2 changes: 1 addition & 1 deletion easypost/constant.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# flake8: noqa
# Library version
VERSION = "10.1.0"
VERSION = "10.2.0"
VERSION_INFO = [str(number) for number in VERSION.split(".")]

# Client defaults
Expand Down
10 changes: 8 additions & 2 deletions easypost/services/address_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ def create(
self,
verify: Optional[bool] = None,
verify_strict: Optional[bool] = None,
verify_carrier: Optional[str] = None,
**params,
) -> Address:
"""Create an Address."""
Expand All @@ -31,6 +32,8 @@ def create(
wrapped_params["verify"] = verify
if verify_strict:
wrapped_params["verify_strict"] = verify_strict
if verify_carrier:
wrapped_params["verify_carrier"] = verify_carrier

response = Requestor(self._client).request(method=RequestMethod.POST, url=url, params=wrapped_params)

Expand All @@ -48,10 +51,13 @@ def retrieve(self, id) -> Address:
"""Retrieve an Address."""
return self._retrieve_resource(self._model_class, id)

def create_and_verify(self, **params) -> Address:
def create_and_verify(self, verify_carrier: Optional[str] = None, **params) -> Address:
"""Create and verify an Address in one call."""
url = f"{self._class_url('address')}/create_and_verify"
wrapped_params = {self._snakecase_name(self._model_class): params}
wrapped_params = {self._snakecase_name(self._model_class): params} # type: dict[str, Any]

if verify_carrier:
wrapped_params["verify_carrier"] = verify_carrier

response = Requestor(self._client).request(method=RequestMethod.POST, url=url, params=wrapped_params)

Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@

setup(
name="easypost",
version="10.1.0",
version="10.2.0",
description="EasyPost Shipping API Client Library for Python",
author="EasyPost",
author_email="support@easypost.com",
Expand Down
82 changes: 82 additions & 0 deletions tests/cassettes/test_address_create_and_verify_carrier.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

82 changes: 82 additions & 0 deletions tests/cassettes/test_address_create_verify_carrier.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

25 changes: 25 additions & 0 deletions tests/test_address.py
Original file line number Diff line number Diff line change
Expand Up @@ -155,3 +155,28 @@ def test_address_verify_invalid_address(test_client):
test_client.address.verify(address.id)

assert str(error.value) == "Unable to verify address."


@pytest.mark.vcr()
def test_address_create_verify_carrier(incorrect_address, test_client):
"""Test creating an address with the `verify_carrier` param."""
incorrect_address["verify"] = True
incorrect_address["verify_carrier"] = "UPS"
address = test_client.address.create(**incorrect_address)

assert isinstance(address, Address)

assert address.verifications.delivery.errors[0].message == "Address not found"
assert address.verifications.zip4.errors[0].message == "Address not found"


@pytest.mark.vcr()
def test_address_create_and_verify_carrier(incorrect_address, test_client):
"""Test creating and verifying an address with the `verify_carrier` param."""
incorrect_address["verify_carrier"] = "UPS"
address = test_client.address.create_and_verify(**incorrect_address)

assert isinstance(address, Address)

assert address.verifications.delivery.errors[0].message == "Address not found"
assert address.verifications.zip4.errors[0].message == "Address not found"