Coverage for amazonorders/entity/item.py: 80.33%

61 statements  

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

1import logging 

2from datetime import datetime 

3 

4from amazonorders.entity.seller import Seller 

5from amazonorders.session import BASE_URL 

6 

7__author__ = "Alex Laird" 

8__copyright__ = "Copyright 2024, Alex Laird" 

9__version__ = "0.0.4" 

10 

11logger = logging.getLogger(__name__) 

12 

13 

14class Item: 

15 def __init__(self, 

16 parsed) -> None: 

17 self.parsed = parsed 

18 

19 self.title = self._parse_title() 

20 self.link = self._parse_link() 

21 self.price = self._parse_price() 

22 self.seller = self._parse_seller() 

23 self.condition = self._parse_condition() 

24 self.return_eligible_date = self._parse_return_eligible_date() 

25 

26 def __repr__(self) -> str: 

27 return "<Item: \"{}\">".format(self.title) 

28 

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

30 return "Item: \"{}\"".format(self.title) 

31 

32 def _parse_title(self): 

33 try: 

34 tag = self.parsed.find("a") 

35 return tag.text.strip() 

36 except AttributeError: 

37 logger.warning("When building Item, `title` could not be parsed.", exc_info=True) 

38 

39 def _parse_link(self): 

40 try: 

41 tag = self.parsed.find("a") 

42 return "{}{}".format(BASE_URL, tag.attrs["href"]) 

43 except AttributeError: 

44 logger.warning("When building Item, `link` could not be parsed.", exc_info=True) 

45 

46 def _parse_price(self): 

47 try: 

48 for tag in self.parsed.find_all("div"): 

49 if tag.text.strip().startswith("$"): 

50 return tag.text.strip().replace("$", "") 

51 except (AttributeError, IndexError): 

52 logger.warning("When building Item, `price` could not be parsed.", exc_info=True) 

53 

54 def _parse_seller(self): 

55 try: 

56 for tag in self.parsed.find_all("div"): 

57 if "Sold by:" in tag.text: 

58 return Seller(tag, order=self) 

59 except (AttributeError, IndexError): 

60 logger.warning("When building Item, `seller` could not be parsed.", exc_info=True) 

61 

62 def _parse_condition(self): 

63 try: 

64 for tag in self.parsed.find_all("div"): 

65 if "Condition:" in tag.text: 

66 return tag.text.split("Condition:")[1].strip() 

67 except (AttributeError, IndexError): 

68 logger.warning("When building Item, `condition` could not be parsed.", exc_info=True) 

69 

70 def _parse_return_eligible_date(self): 

71 try: 

72 for tag in self.parsed.find_all("div"): 

73 if "Return" in tag.text: 

74 split_str = "through " 

75 if "closed on " in tag.text: 

76 split_str = "closed on " 

77 date_str = tag.text.strip().split(split_str)[1] 

78 return datetime.strptime(date_str, "%b %d, %Y").date() 

79 except (AttributeError, IndexError): 

80 logger.warning("When building Item, `return_eligible_date` could not be parsed.", exc_info=True)