Skip to content

Commit 4e08ad5

Browse files
authored
Merge pull request #90 from PurplShip/purplship-2021.0-doc-friendly
Purplship 2021.0 doc friendly
2 parents 2be64c2 + aa58f0e commit 4e08ad5

File tree

99 files changed

+5114
-2015
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

99 files changed

+5114
-2015
lines changed

.gitignore

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,5 +101,3 @@ ENV/
101101
.mypy_cache/
102102

103103
.idea/
104-
105-
VERSION
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from purplship.core.metadata import Metadata
2+
3+
from purplship.mappers.carrier.mapper import Mapper
4+
from purplship.mappers.carrier.proxy import Proxy
5+
from purplship.mappers.carrier.settings import Settings
6+
import purplship.providers.carrier.units as units
7+
8+
9+
METADATA = Metadata(
10+
label="[carrier label]",
11+
12+
# Integrations
13+
Mapper=Mapper,
14+
Proxy=Proxy,
15+
Settings=Settings,
16+
17+
# Data Units
18+
# options=units.OptionCode,
19+
# package_presets=units.PackagePresets,
20+
# packaging_types=units.PackagingType,
21+
# services=units.Serives,
22+
)
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
from typing import List, Tuple
2+
from purplship.core.utils.serializable import Serializable, Deserializable
3+
from purplship.api.mapper import Mapper as BaseMapper
4+
from purplship.core.models import (
5+
# AddressValidationRequest,
6+
# ShipmentCancelRequest,
7+
# PickupUpdateRequest,
8+
# PickupCancelRequest,
9+
# ShipmentRequest,
10+
# TrackingRequest,
11+
# PickupRequest,
12+
RateRequest,
13+
14+
# AddressValidationDetails,
15+
# ConfirmationDetails,
16+
# TrackingDetails,
17+
# ShipmentDetails,
18+
# PickupDetails,
19+
RateDetails,
20+
Message,
21+
)
22+
from purplship.providers.carrier import (
23+
# parse_address_validation_response,
24+
# parse_shipment_cancel_response,
25+
# parse_pickup_update_response,
26+
# parse_pickup_cancel_response,
27+
# parse_shipment_response,
28+
# parse_tracking_response,
29+
# parse_pickup_response,
30+
parse_rate_response,
31+
32+
# address_validation_request,
33+
# shipment_cancel_request,
34+
# pickup_update_request,
35+
# pickup_cancel_request,
36+
# tracking_request,
37+
# shipment_request,
38+
# pickup_request,
39+
rate_request,
40+
)
41+
from purplship.mappers.carrier.settings import Settings
42+
43+
44+
class Mapper(BaseMapper):
45+
settings: Settings
46+
47+
"""Request Mappers"""
48+
49+
# def create_address_validation_request(self, payload: AddressValidationRequest) -> Serializable:
50+
# return address_validation_request(payload, self.settings)
51+
#
52+
# def create_pickup_request(
53+
# self, payload: PickupRequest
54+
# ) -> Serializable:
55+
# return pickup_request(payload, self.settings)
56+
#
57+
# def create_pickup_update_request(
58+
# self, payload: PickupUpdateRequest
59+
# ) -> Serializable:
60+
# return pickup_update_request(payload, self.settings)
61+
#
62+
# def create_cancel_pickup_request(
63+
# self, payload: PickupCancelRequest
64+
# ) -> Serializable:
65+
# return pickup_cancel_request(payload, self.settings)
66+
67+
def create_rate_request(
68+
self, payload: RateRequest
69+
) -> Serializable:
70+
return rate_request(payload, self.settings)
71+
72+
# def create_shipment_request(
73+
# self, payload: ShipmentRequest
74+
# ) -> Serializable:
75+
# return shipment_request(payload, self.settings)
76+
#
77+
# def create_cancel_shipment_request(self, payload: ShipmentCancelRequest) -> Serializable:
78+
# return shipment_cancel_request(payload, self.settings)
79+
#
80+
# def create_tracking_request(
81+
# self, payload: TrackingRequest
82+
# ) -> Serializable:
83+
# return tracking_request(payload, self.settings)
84+
85+
"""Response Parsers"""
86+
87+
# def parse_address_validation_response(
88+
# self, response: Deserializable
89+
# ) -> Tuple[AddressValidationDetails, List[Message]]:
90+
# return parse_address_validation_response(response.deserialize(), self.settings)
91+
#
92+
# def parse_cancel_pickup_response(
93+
# self, response: Deserializable[str]
94+
# ) -> Tuple[ConfirmationDetails, List[Message]]:
95+
# return parse_pickup_cancel_response(response.deserialize(), self.settings)
96+
#
97+
# def parse_pickup_response(
98+
# self, response: Deserializable[str]
99+
# ) -> Tuple[PickupDetails, List[Message]]:
100+
# return parse_pickup_response(response.deserialize(), self.settings)
101+
#
102+
# def parse_pickup_update_response(
103+
# self, response: Deserializable[str]
104+
# ) -> Tuple[PickupDetails, List[Message]]:
105+
# return parse_pickup_update_response(response.deserialize(), self.settings)
106+
107+
def parse_rate_response(
108+
self, response: Deserializable[str]
109+
) -> Tuple[List[RateDetails], List[Message]]:
110+
return parse_rate_response(response.deserialize(), self.settings)
111+
112+
# def parse_shipment_response(
113+
# self, response: Deserializable[str]
114+
# ) -> Tuple[ShipmentDetails, List[Message]]:
115+
# return parse_shipment_response(response.deserialize(), self.settings)
116+
#
117+
# def parse_cancel_shipment_response(
118+
# self, response: Deserializable
119+
# ) -> Tuple[ConfirmationDetails, List[Message]]:
120+
# return parse_shipment_cancel_response(response.deserialize(), self.settings)
121+
#
122+
# def parse_tracking_response(
123+
# self, response: Deserializable[str]
124+
# ) -> Tuple[List[TrackingDetails], List[Message]]:
125+
# return parse_tracking_response(response.deserialize(), self.settings)
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
from typing import Any
2+
from purplship.core.utils import XP, request as http, Serializable, Deserializable
3+
from purplship.api.proxy import Proxy as BaseProxy
4+
from purplship.mappers.carrier.settings import Settings
5+
6+
7+
class Proxy(BaseProxy):
8+
settings: Settings
9+
10+
""" Proxy Methods """
11+
12+
# def validate_address(self, request: Serializable) -> Deserializable[str]:
13+
# response = self._send_request(request)
14+
#
15+
# return Deserializable(response, XP.to_xml)
16+
17+
def get_rates(self, request: Serializable) -> Deserializable[str]:
18+
response = self._send_request(request)
19+
20+
return Deserializable(response, XP.to_xml)
21+
22+
# def get_tracking(
23+
# self, request: Serializable
24+
# ) -> Deserializable[str]:
25+
# response = self._send_request(request)
26+
#
27+
# return Deserializable(response, XP.to_xml)
28+
#
29+
# def create_shipment(
30+
# self, request: Serializable
31+
# ) -> Deserializable[str]:
32+
# response = self._send_request(request)
33+
#
34+
# return Deserializable(response, XP.to_xml)
35+
#
36+
# def schedule_pickup(
37+
# self, request: Serializable
38+
# ) -> Deserializable[str]:
39+
# response = self._send_request(request)
40+
#
41+
# return Deserializable(response, XP.to_xml)
42+
#
43+
# def modify_pickup(
44+
# self, request: Serializable
45+
# ) -> Deserializable[str]:
46+
# response = self._send_request(request)
47+
#
48+
# return Deserializable(response, XP.to_xml)
49+
#
50+
# def cancel_pickup(
51+
# self, request: Serializable
52+
# ) -> Deserializable[str]:
53+
# response = self._send_request(request)
54+
#
55+
# return Deserializable(response, XP.to_xml)
56+
57+
""" Private Methods """
58+
59+
def _send_request(self, request: Serializable[Any]) -> str:
60+
return http(
61+
url=self.settings.server_url,
62+
data=bytearray(request.serialize(), "utf-8"),
63+
headers={"Content-Type": "application/xml"},
64+
method="POST",
65+
)
66+
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
"""Purplship [carrier] settings."""
2+
3+
import attr
4+
from purplship.providers.carrier.utils import Settings as BaseSettings
5+
6+
7+
@attr.s(auto_attribs=True)
8+
class Settings(BaseSettings):
9+
"""[carrier] connection settings."""
10+
11+
# Carrier specific properties
12+
# username: str
13+
# password: str
14+
# account_number: str = None
15+
16+
# Base properties
17+
id: str = None
18+
test: bool = False
19+
carrier_id: str = "dhl_express"
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from purplship.providers.carrier.utils import Settings
2+
from purplship.providers.carrier.rate import parse_rate_response, rate_request
3+
# from purplship.providers.carrier.address import (
4+
# parse_address_validation_response,
5+
# address_validation_request
6+
# )
7+
# from purplship.providers.carrier.shipment import (
8+
# parse_shipment_cancel_response,
9+
# parse_shipment_response,
10+
# shipment_cancel_request,
11+
# shipment_request,
12+
# )
13+
# from purplship.providers.carrier.pickup import (
14+
# parse_pickup_cancel_response,
15+
# parse_pickup_update_response,
16+
# parse_pickup_response,
17+
# pickup_update_request,
18+
# pickup_cancel_request,
19+
# pickup_request,
20+
# )
21+
# from purplship.providers.carrier.tracking import (
22+
# parse_tracking_response,
23+
# tracking_request,
24+
# )
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
from typing import Tuple, List
2+
from purplship.core.utils import Serializable
3+
from purplship.core.models import AddressValidationRequest, Message, AddressValidationDetails
4+
from purplship.providers.carrier.utils import Settings
5+
from purplship.providers.carrier.error import parse_error_response
6+
7+
8+
def parse_address_validation_response(response, settings: Settings) -> Tuple[AddressValidationDetails, List[Message]]:
9+
successful = True # retrieve success status from `response`
10+
validation_details = AddressValidationDetails(
11+
carrier_id=settings.carrier_id,
12+
carrier_name=settings.carrier_name,
13+
success=successful
14+
) if successful else None
15+
16+
return validation_details, parse_error_response(response, settings)
17+
18+
19+
def address_validation_request(payload: AddressValidationRequest, settings: Settings) -> Serializable['CarrierAddressValidationRequest']:
20+
21+
# request = CarrierAddressValidationRequest(
22+
# ...
23+
# )
24+
#
25+
# return Serializable(request, _request_serializer)
26+
pass
27+
28+
29+
def _request_serializer(request: 'CarrierAddressValidationRequest') -> str:
30+
pass
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from typing import List
2+
from purplship.providers.carrier import Settings
3+
from purplship.core.models import Message
4+
5+
6+
def parse_error_response(response, settings: Settings) -> List[Message]:
7+
carrier_errors = [] # retrieve carrier errors from `response`
8+
return [_extract_error(node, settings) for node in carrier_errors]
9+
10+
11+
def _extract_error(carrier_error, settings: Settings) -> Message:
12+
return Message(
13+
# context info
14+
carrier_name=settings.carrier_name,
15+
carrier_id=settings.carrier_id,
16+
17+
# carrier error info
18+
code=carrier_error.code,
19+
message=carrier_error.description,
20+
details=carrier_error.details
21+
)
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from purplship.providers.carrier.pickup.create import parse_pickup_response, pickup_request
2+
from purplship.providers.carrier.pickup.update import parse_pickup_update_response, pickup_update_request
3+
from purplship.providers.carrier.pickup.cancel import parse_pickup_cancel_response, pickup_cancel_request
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
from typing import Tuple, List
2+
from purplship.core.utils import Serializable
3+
from purplship.core.models import (
4+
PickupCancelRequest,
5+
Message,
6+
ConfirmationDetails,
7+
)
8+
from purplship.providers.carrier.utils import Settings, reformat_time
9+
from purplship.providers.carrier.error import parse_error_response
10+
11+
12+
def parse_pickup_cancel_response(response, settings) -> Tuple[ConfirmationDetails, List[Message]]:
13+
successful = True # retrieve success status from `response`
14+
cancellation = (
15+
ConfirmationDetails(
16+
carrier_name=settings.carrier_name,
17+
carrier_id=settings.carrier_id,
18+
success=successful,
19+
operation="Cancel Pickup",
20+
)
21+
if successful
22+
else None
23+
)
24+
25+
return cancellation, parse_error_response(response, settings)
26+
27+
28+
def pickup_cancel_request(payload: PickupCancelRequest, settings: Settings) -> Serializable['CarrierPickupCancelRequest']:
29+
30+
# request = CarrierPickupCancelRequest(
31+
# ...
32+
# )
33+
#
34+
# return Serializable(request, _request_serializer)
35+
pass
36+
37+
38+
def _request_serializer(request: 'CarrierPickupCancelRequest') -> str:
39+
pass

0 commit comments

Comments
 (0)