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

36 statements  

« prev     ^ index     » next       coverage.py v7.4.0, created at 2024-01-25 22:50 +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.5" 

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 __lt__(self, other): 

40 if self.delivery_status: 

41 return self.delivery_status < other.delivery_status 

42 else: 

43 return str(self.items) < str(other.items) 

44 

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

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

47 items.sort() 

48 return items 

49 

50 def _parse_delivery_status(self) -> Optional[str]: 

51 tag = self.parsed.find("div", {"class": "js-shipment-info-container"}) 

52 if tag: 

53 tag = tag.find("div", {"class": "a-row"}) 

54 return tag.text.strip() 

55 else: 

56 return None 

57 

58 def _parse_tracking_link(self) -> Optional[str]: 

59 tag = self.parsed.find("span", {"class": "track-package-button"}) 

60 if tag: 

61 link_tag = tag.find("a") 

62 return "{}{}".format(BASE_URL, link_tag.attrs["href"]) 

63 else: 

64 return None