Skip to content

Commit

Permalink
Merge pull request #85 from PurplShip/purplship-2020.11
Browse files Browse the repository at this point in the history
Purplship 2020.11
  • Loading branch information
danh91 committed Nov 27, 2020
2 parents e3a4784 + 5f052f4 commit 86124d7
Show file tree
Hide file tree
Showing 200 changed files with 5,009 additions and 4,267 deletions.
8 changes: 5 additions & 3 deletions .coveragerc
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
# .coveragerc to control coverage.py
[run]
branch = True
omit =
*/purplship/extensions/boxknight/*
*/purplship/extensions/dicom/*
*/purplship/extensions/usps/*

[report]
include =
*/purplship/carriers/*
*/purplship/core/*
*/purplship/package/*
*/purplship/freight/*
*/purplship/extensions/*
6 changes: 5 additions & 1 deletion .github/workflows/pythonpackage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,11 @@ jobs:
- name: Install and Run tests
run: |
source ./script.sh
init &&
create_env &&
mkdir "${ROOT:?}/wheels" &&
wheels="${ROOT:?}/wheels" PIP_FIND_LINKS=file://"${ROOT:?}/wheels" build
pip install -r "${ROOT:?}/requirements.txt" &&
install_submodules &&
typecheck &&
test &&
coverage report -m &&
Expand Down
361 changes: 176 additions & 185 deletions README.md

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions extensions/boxknight/purplship/mappers/boxknight/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from purplship.mappers.boxknight.mapper import Mapper
from purplship.mappers.boxknight.proxy import Proxy
from purplship.mappers.boxknight.settings import Settings
99 changes: 99 additions & 0 deletions extensions/boxknight/purplship/mappers/boxknight/mapper.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
from typing import List, Tuple
from purplship.core.utils.serializable import Serializable, Deserializable
from purplship.api.mapper import Mapper as BaseMapper
from purplship.core.models import (
ShipmentCancelRequest,
PickupUpdateRequest,
PickupCancelRequest,
ShipmentRequest,
RateRequest,

ConfirmationDetails,
ShipmentDetails,
PickupRequest,
PickupDetails,
RateDetails,
Message,
)
from purplship.providers.boxknight import (
parse_shipment_cancel_response,
parse_pickup_update_response,
parse_pickup_cancel_response,
parse_shipment_response,
parse_pickup_response,
parse_rate_response,

shipment_cancel_request,
pickup_update_request,
pickup_cancel_request,
shipment_request,
pickup_request,
rate_request,
)
from purplship.mappers.boxknight.settings import Settings


class Mapper(BaseMapper):
settings: Settings

"""Request Mappers"""

def create_rate_request(
self, payload: RateRequest
) -> Serializable:
return rate_request(payload, self.settings)

def create_shipment_request(
self, payload: ShipmentRequest
) -> Serializable:
return shipment_request(payload, self.settings)

def create_pickup_request(
self, payload: PickupRequest
) -> Serializable:
return pickup_request(payload, self.settings)

def create_pickup_update_request(
self, payload: PickupUpdateRequest
) -> Serializable:
return pickup_update_request(payload, self.settings)

def create_cancel_pickup_request(
self, payload: PickupCancelRequest
) -> Serializable:
return pickup_cancel_request(payload, self.settings)

def create_cancel_shipment_request(self, payload: ShipmentCancelRequest) -> Serializable[str]:
return shipment_cancel_request(payload, self.settings)

"""Response Parsers"""

def parse_cancel_pickup_response(
self, response: Deserializable[str]
) -> Tuple[ConfirmationDetails, List[Message]]:
return parse_pickup_cancel_response(response.deserialize(), self.settings)

def parse_cancel_shipment_response(
self, response: Deserializable
) -> Tuple[ConfirmationDetails, List[Message]]:
return parse_shipment_cancel_response(response.deserialize(), self.settings)

def parse_pickup_response(
self, response: Deserializable[str]
) -> Tuple[PickupDetails, List[Message]]:
return parse_pickup_response(response.deserialize(), self.settings)

def parse_pickup_update_response(
self, response: Deserializable[str]
) -> Tuple[PickupDetails, List[Message]]:
return parse_pickup_update_response(response.deserialize(), self.settings)

def parse_rate_response(
self, response: Deserializable[str]
) -> Tuple[List[RateDetails], List[Message]]:
return parse_rate_response(response.deserialize(), self.settings)

def parse_shipment_response(
self, response: Deserializable[str]
) -> Tuple[ShipmentDetails, List[Message]]:
return parse_shipment_response(response.deserialize(), self.settings)
8 changes: 8 additions & 0 deletions extensions/boxknight/purplship/mappers/boxknight/proxy.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from typing import List
from purplship.core.utils.serializable import Serializable, Deserializable
from purplship.mappers.boxknight.settings import Settings
from purplship.api.proxy import Proxy as BaseProxy


class Proxy(BaseProxy):
settings: Settings
15 changes: 15 additions & 0 deletions extensions/boxknight/purplship/mappers/boxknight/settings.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
"""Purplship BoxKnight client settings."""

import attr
from purplship.providers.boxknight.utils import Settings as BaseSettings


@attr.s(auto_attribs=True)
class Settings(BaseSettings):
"""BoxKnight connection settings."""

username: str
password: str
id: str = None
test: bool = False
carrier_id: str = "boxknight"
16 changes: 16 additions & 0 deletions extensions/boxknight/purplship/providers/boxknight/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from purplship.providers.boxknight.utils import Settings
from purplship.providers.boxknight.rate import parse_rate_response, rate_request
from purplship.providers.boxknight.shipment import (
parse_shipment_cancel_response,
parse_shipment_response,
shipment_cancel_request,
shipment_request,
)
from purplship.providers.boxknight.pickup import (
parse_pickup_cancel_response,
parse_pickup_update_response,
parse_pickup_response,
pickup_update_request,
pickup_cancel_request,
pickup_request,
)
5 changes: 5 additions & 0 deletions extensions/boxknight/purplship/providers/boxknight/error.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from purplship.providers.dicom.utils import Settings


def parse_error_response(response: dict, settings: Settings):
return []
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from purplship.providers.boxknight.pickup.create import parse_pickup_response, pickup_request
from purplship.providers.boxknight.pickup.update import parse_pickup_update_response, pickup_update_request
from purplship.providers.boxknight.pickup.cancel import parse_pickup_cancel_response, pickup_cancel_request
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from typing import Tuple, List
from purplship.core.utils import Serializable
from purplship.core.models import (
PickupCancelRequest,
ConfirmationDetails,
Message
)

from purplship.providers.boxknight.error import parse_error_response
from purplship.providers.boxknight.utils import Settings


def parse_pickup_cancel_response(response: dict, settings: Settings) -> Tuple[ConfirmationDetails, List[Message]]:
errors = parse_error_response(response, settings)
details = None

return details, errors


def pickup_cancel_request(payload: PickupCancelRequest, _) -> Serializable:

request = payload.confirmation_number

return Serializable(request)
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
from typing import Tuple, List
from pyboxknight.pickups import (
PickupRequest as BoxKnightPickupRequest,
PickupRequestRecipientAddress,
Recipient,
)
from purplship.core.utils import Serializable, concat_str, to_date
from purplship.core.models import (
ShipmentDetails,
PickupRequest,
PickupDetails,
Message,
)

from purplship.providers.boxknight.error import parse_error_response
from purplship.providers.boxknight.utils import Settings


def parse_pickup_response(response: dict, settings: Settings) -> Tuple[PickupDetails, List[Message]]:
errors = parse_error_response(response, settings)
details = None

return details, errors


def pickup_request(payload: PickupRequest, _) -> Serializable:
shipments: List[ShipmentDetails] = payload.options.get('shipments', [])
after = to_date(f"{payload.pickup_date} {payload.ready_time}", current_format="%Y-%m-%d %H:%M")
before = to_date(f"{payload.pickup_date} {payload.ready_time}", current_format="%Y-%m-%d %H:%M")

request = BoxKnightPickupRequest(
packageCount=len(payload.parcels),
recipient=Recipient(
name=payload.address.person_name,
phone=payload.address.phone_number,
notes=None,
email=payload.address.email,
),
recipientAddress=PickupRequestRecipientAddress(
street=concat_str(payload.address.address_line1, payload.address.address_line2, join=True),
city=payload.address.city,
province=payload.address.state_code,
country=payload.address.country_code,
postalCode=payload.address.postal_code,
unit=None
),
notes=payload.instruction,
completeAfter=int(after.timestamp() * 1000.0),
completeBefore=int(before.timestamp() * 1000.0),
orderIds=[shipment.shipment_identifier for shipment in shipments],
)

return Serializable(request)
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from typing import Tuple, List
from pyboxknight.pickups import PickupUpdateRequest as BoxKnightPickupUpdateRequest
from purplship.core.utils import Serializable
from purplship.core.models import (
ShipmentDetails,
PickupUpdateRequest,
PickupDetails,
Message
)

from purplship.providers.boxknight.error import parse_error_response
from purplship.providers.boxknight.utils import Settings


def parse_pickup_update_response(response: dict, settings: Settings) -> Tuple[PickupDetails, List[Message]]:
errors = parse_error_response(response, settings)
details = None

return details, errors


def pickup_update_request(payload: PickupUpdateRequest, _) -> Serializable:
shipments: List[ShipmentDetails] = payload.options.get('shipments', [])

request = BoxKnightPickupUpdateRequest(
orderIds=[shipment.shipment_identifier for shipment in shipments]
)

return Serializable(request)
30 changes: 30 additions & 0 deletions extensions/boxknight/purplship/providers/boxknight/rate.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
from typing import Tuple, List
from pyboxknight.rates import (
RateRequest as BoxKnightRateRequest,
)
from purplship.core.utils import Serializable
from purplship.core.models import (
RateRequest,
RateDetails,
Message
)

from purplship.providers.boxknight.error import parse_error_response
from purplship.providers.boxknight.utils import Settings


def parse_rate_response(response: dict, settings: Settings) -> Tuple[List[RateDetails], List[Message]]:
errors = parse_error_response(response, settings)
details: List[RateDetails] = []

return details, errors


def rate_request(payload: RateRequest, _) -> Serializable:

request = BoxKnightRateRequest(
postalCode=payload.recipient.postal_code,
originPostalCode=payload.shipper.postal_code
)

return Serializable(request)
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from purplship.providers.boxknight.shipment.create import parse_shipment_response, shipment_request
from purplship.providers.boxknight.shipment.cancel import parse_shipment_cancel_response, shipment_cancel_request
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
from typing import Tuple, List
from purplship.core.utils import Serializable
from purplship.core.models import (
ShipmentCancelRequest,
ConfirmationDetails,
Message
)

from purplship.providers.boxknight.error import parse_error_response
from purplship.providers.boxknight.utils import Settings


def parse_shipment_cancel_response(response: dict, settings: Settings) -> Tuple[ConfirmationDetails, List[Message]]:
errors = parse_error_response(response, settings)
details = None

return details, errors


def shipment_cancel_request(payload: ShipmentCancelRequest, _) -> Serializable:
request = payload.shipment_identifier

return Serializable(request)
Loading

0 comments on commit 86124d7

Please sign in to comment.