Source code for ai_marketplace_monitor.region
from dataclasses import dataclass, field
from typing import List
from .utils import BaseConfig, Currency, hilight
[docs]
@dataclass
class RegionConfig(BaseConfig):
search_city: List[str] = field(default_factory=list)
full_name: str = ""
radius: List[int] = field(default_factory=list)
city_name: List[str] = field(default_factory=list)
currency: List[str] = field(default_factory=list)
[docs]
def handle_search_city(self: "RegionConfig") -> None:
if isinstance(self.search_city, str):
self.search_city = [self.search_city]
# check if search_city is a list of strings
if not isinstance(self.search_city, list) or not all(
isinstance(x, str) for x in self.search_city
):
raise ValueError(f"Region {self.name} search_city must be a list of strings.")
[docs]
def handle_radius(self: "RegionConfig") -> None:
if isinstance(self.radius, int):
self.radius = [self.radius] * len(self.search_city)
elif not self.radius:
self.radius = [500] * len(self.search_city)
elif len(self.radius) != len(self.search_city):
raise ValueError(
f"Region {self.name} radius {self.radius} must be an integer or a list of integers with the same length as search_city {self.search_city}."
)
else:
for radius in self.radius:
if not isinstance(radius, int):
raise ValueError(
f"Region {self.name} radius must be an integer or a list of integers with the same length as search_city."
)
[docs]
def handle_city_name(self: "RegionConfig") -> None:
if isinstance(self.city_name, str):
self.city_name = [self.city_name]
if not self.city_name:
if not self.search_city:
return
self.city_name = [x.capitalize() for x in self.search_city]
return
# check if city_name is a list of strings
if not isinstance(self.city_name, list) or not all(
isinstance(x, str) for x in self.city_name
):
raise ValueError(f"Region {self.name} city_name must be a list of strings.")
if len(self.city_name) != len(self.search_city):
raise ValueError(
f"Region {self.name} city_name {self.city_name} must be the same length as search_city {self.search_city}."
)
[docs]
def handle_currency(self: "RegionConfig") -> None:
if not self.currency:
return
if self.search_city is None:
raise ValueError(
f"Item {hilight(self.name)} currency must be None if search_city is None."
)
if isinstance(self.currency, str):
self.currency = [self.currency] * len(self.search_city)
if not all(isinstance(x, str) for x in self.currency):
raise ValueError(
f"Item {hilight(self.name)} currency must be one or a list of strings."
)
for currency in self.currency:
try:
Currency(currency)
except ValueError as e:
raise ValueError(
f"Item {hilight(self.name)} currency {currency} is not recognized."
) from e
if len(self.currency) != len(self.search_city):
raise ValueError(
f"Region {self.name} currency ({self.currency}) must be the same length as search_city ({self.search_city})."
)