Coverage for amazonorders/entity/shipment.py: 100.00%
30 statements
« prev ^ index » next coverage.py v7.4.0, created at 2024-01-24 18:41 +0000
« prev ^ index » next coverage.py v7.4.0, created at 2024-01-24 18:41 +0000
1import logging
2from typing import List, Optional
4from bs4 import Tag
6from amazonorders.entity.item import Item
7from amazonorders.entity.parsable import Parsable
8from amazonorders.session import BASE_URL
10__author__ = "Alex Laird"
11__copyright__ = "Copyright 2024, Alex Laird"
12__version__ = "1.0.0"
14logger = logging.getLogger(__name__)
17class Shipment(Parsable):
18 """
19 An Amazon Shipment, which should contain one or more :class:`~amazonorders.entity.item.Item`'s.
20 """
22 def __init__(self,
23 parsed: Tag) -> None:
24 super().__init__(parsed)
26 #: The Shipment Items.
27 self.items: List[Item] = self._parse_items()
28 #: The Shipment delivery status.
29 self.delivery_status: Optional[str] = self.safe_parse(self._parse_delivery_status)
30 #: The Shipment tracking link.
31 self.tracking_link: Optional[str] = self.safe_parse(self._parse_tracking_link)
33 def __repr__(self) -> str:
34 return "<Shipment: \"{}\">".format(self.items)
36 def __str__(self) -> str: # pragma: no cover
37 return "Shipment: {}".format(self.items)
39 def _parse_items(self) -> List[Item]:
40 return [Item(x) for x in self.parsed.find_all("div", {"class": "yohtmlc-item"})]
42 def _parse_delivery_status(self) -> Optional[str]:
43 tag = self.parsed.find("div", {"class": "js-shipment-info-container"})
44 if tag:
45 tag = tag.find("div", {"class": "a-row"})
46 return tag.text.strip()
47 else:
48 return None
50 def _parse_tracking_link(self) -> Optional[str]:
51 tag = self.parsed.find("span", {"class": "track-package-button"})
52 if tag:
53 link_tag = tag.find("a")
54 return "{}{}".format(BASE_URL, link_tag.attrs["href"])
55 else:
56 return None