Repository navigation
Expand file tree
/
Copy pathmodels.py
More file actions
65 lines (51 loc) · 1.94 KB
/
Copy pathmodels.py
File metadata and controls
65 lines (51 loc) · 1.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
"""Data models for AutoUncle scraper."""
from dataclasses import dataclass, field, asdict
from typing import Optional, List
from datetime import datetime
@dataclass
class CarListing:
"""Represents a car listing from AutoUncle."""
title: str
price: Optional[str] = None
price_evaluation: Optional[str] = None
savings: Optional[str] = None
year: Optional[str] = None
mileage: Optional[str] = None
fuel_type: Optional[str] = None
transmission: Optional[str] = None
power: Optional[str] = None
body_type: Optional[str] = None
location: Optional[str] = None
dealer_name: Optional[str] = None
listing_id: Optional[str] = None
detail_url: Optional[str] = None
image_url: Optional[str] = None
scraped_at: str = field(default_factory=lambda: datetime.now().isoformat())
def to_dict(self) -> dict:
"""Convert listing to dictionary."""
return asdict(self)
@dataclass
class ListingCollection:
"""Collection of car listings with deduplication."""
listings: List[CarListing] = field(default_factory=list)
seen_ids: set = field(default_factory=set)
def add(self, listing: CarListing) -> bool:
"""Add listing if not duplicate. Returns True if added."""
if listing.listing_id and listing.listing_id in self.seen_ids:
return False
if listing.listing_id:
self.seen_ids.add(listing.listing_id)
self.listings.append(listing)
return True
def add_many(self, listings: List[CarListing]) -> int:
"""Add multiple listings. Returns count of new listings added."""
added = 0
for listing in listings:
if self.add(listing):
added += 1
return added
def to_dicts(self) -> List[dict]:
"""Convert all listings to dictionaries."""
return [listing.to_dict() for listing in self.listings]
def __len__(self) -> int:
return len(self.listings)