Coverage for amazonorders/entity/shipment.py: 100.00%

30 statements  

« prev     ^ index     » next       coverage.py v7.4.0, created at 2024-01-18 14:34 +0000

1import logging 

2from typing import List, Optional 

3 

4from bs4 import Tag 

5 

6from amazonorders.entity.item import Item 

7from amazonorders.entity.parsable import Parsable 

8from amazonorders.session import BASE_URL 

9 

10__author__ = "Alex Laird" 

11__copyright__ = "Copyright 2024, Alex Laird" 

12__version__ = "1.0.0" 

13 

14logger = logging.getLogger(__name__) 

15 

16 

17class Shipment(Parsable): 

18 """ 

19 An Amazon Shipment, which should contain one or more :class:`~amazonorders.entity.item.Item`'s. 

20 """ 

21 

22 def __init__(self, 

23 parsed: Tag) -> None: 

24 super().__init__(parsed) 

25 

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) 

32 

33 def __repr__(self) -> str: 

34 return "<Shipment: \"{}\">".format(self.items) 

35 

36 def __str__(self) -> str: # pragma: no cover 

37 return "Shipment: \"{}\"".format(self.items) 

38 

39 def _parse_items(self) -> List[Item]: 

40 return [Item(x) for x in self.parsed.find_all("div", {"class": "yohtmlc-item"})] 

41 

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 

49 

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