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

25 statements  

« prev     ^ index     » next       coverage.py v7.4.1, created at 2024-01-30 14:24 +0000

1import logging 

2from typing import List, Optional 

3 

4from bs4 import Tag 

5 

6from amazonorders import constants 

7from amazonorders.constants import ITEM_ENTITY_SELECTOR 

8from amazonorders.entity.item import Item 

9from amazonorders.entity.parsable import Parsable 

10 

11__author__ = "Alex Laird" 

12__copyright__ = "Copyright 2024, Alex Laird" 

13__version__ = "1.0.7" 

14 

15logger = logging.getLogger(__name__) 

16 

17 

18class Shipment(Parsable): 

19 """ 

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

21 """ 

22 

23 def __init__(self, 

24 parsed: Tag) -> None: 

25 super().__init__(parsed) 

26 

27 #: The Shipment Items. 

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

29 #: The Shipment delivery status. 

30 self.delivery_status: Optional[str] = self.safe_simple_parse( 

31 selector=constants.FIELD_SHIPMENT_DELIVERY_STATUS_SELECTOR) 

32 #: The Shipment tracking link. 

33 self.tracking_link: Optional[str] = self.safe_simple_parse( 

34 selector=constants.FIELD_SHIPMENT_TRACKING_LINK_SELECTOR, 

35 link=True) 

36 

37 def __repr__(self) -> str: 

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

39 

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

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

42 

43 def __lt__(self, other): 

44 if self.delivery_status: 

45 return self.delivery_status < str(other.delivery_status if other.delivery_status else "") 

46 else: 

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

48 

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

50 items = [Item(x) for x in self.parsed.select(ITEM_ENTITY_SELECTOR)] 

51 items.sort() 

52 return items