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
« prev ^ index » next coverage.py v7.4.0, created at 2024-01-14 16:09 +0000
1import logging
2from datetime import datetime
4from amazonorders.entity.seller import Seller
5from amazonorders.session import BASE_URL
7__author__ = "Alex Laird"
8__copyright__ = "Copyright 2024, Alex Laird"
9__version__ = "0.0.4"
11logger = logging.getLogger(__name__)
14class Item:
15 def __init__(self,
16 parsed) -> None:
17 self.parsed = parsed
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()
26 def __repr__(self) -> str:
27 return "<Item: \"{}\">".format(self.title)
29 def __str__(self) -> str: # pragma: no cover
30 return "Item: \"{}\"".format(self.title)
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)
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)
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)
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)
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)
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)