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

30 statements  

« prev     ^ index     » next       coverage.py v7.4.0, created at 2024-01-16 23:55 +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__ = "0.0.7" 

13 

14logger = logging.getLogger(__name__) 

15 

16 

17class Shipment(Parsable): 

18 def __init__(self, 

19 parsed: Tag) -> None: 

20 super().__init__(parsed) 

21 

22 self.items: List[Item] = self._parse_items() 

23 self.delivery_status: Optional[str] = self.safe_parse(self._parse_delivery_status) 

24 self.tracking_link: Optional[str] = self.safe_parse(self._parse_tracking_link) 

25 

26 def __repr__(self) -> str: 

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

28 

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

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

31 

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

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

34 

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

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

37 if tag: 

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

39 return tag.text.strip() 

40 else: 

41 return None 

42 

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

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

45 if tag: 

46 link_tag = tag.find("a") 

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

48 else: 

49 return None