-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdata_loader.py
More file actions
130 lines (98 loc) · 3.96 KB
/
data_loader.py
File metadata and controls
130 lines (98 loc) · 3.96 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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
import json
from ride import Ride
from rider import Rider
from driver import Driver
from repositories import save_ride, save_rider, save_driver
from validators import validate_ride_record, validate_rider_record, validate_driver_record
from exceptions import DataLoadError, DataFormatError
def load_json(filename):
try:
with open(filename, "r", encoding="utf-8") as f:
data = json.load(f)
except FileNotFoundError as e:
raise DataLoadError(f"File not found: {filename}") from e
except UnicodeDecodeError as e:
raise DataLoadError(f"Encoding error while reading {filename}") from e
except json.JSONDecodeError as e:
raise DataFormatError(
f"Malformed JSON in {filename} (line {e.lineno}, col {e.colno})"
) from e
except PermissionError as e:
raise DataLoadError(f"Permission denied reading: {filename}") from e
if not isinstance(data, list):
raise DataFormatError(
f"Top-level JSON in {filename} must be a list, got {type(data).__name__}"
)
return data
def load_rides_from_json(path="data/rides.json", riders_by_user_id=None, drivers_by_user_id=None):
data = load_json(path)
ride_ids = []
if riders_by_user_id is None:
riders_by_user_id = {}
if drivers_by_user_id is None:
drivers_by_user_id = {}
for r in data:
validate_ride_record(r)
rider_user_id = r["rider_id"]
driver_user_id = r.get("driver_id")
if rider_user_id not in riders_by_user_id:
raise ValueError(f"Unknown rider_id in rides.json: {rider_user_id}")
if driver_user_id is not None and driver_user_id not in drivers_by_user_id:
raise ValueError(f"Unknown driver_id in rides.json: {driver_user_id}")
rider = riders_by_user_id[rider_user_id]
driver = drivers_by_user_id[driver_user_id] if driver_user_id is not None else None
ride = Ride(
rider=rider,
driver=driver,
pickup_location=r["pickup_location_id"],
dropoff_location=r["dropoff_location_id"]
)
ride.status = r.get("status", "requested")
ride.fare = r.get("fare_amount")
ride.requested_at = r.get("requested_at")
rider_db_id = getattr(rider, "db_id", None)
driver_db_id = getattr(driver, "db_id", None) if driver is not None else None
if rider_db_id is None:
raise ValueError(f"Rider {rider.name} is missing db_id. Save riders before loading rides.")
if driver is not None and driver_db_id is None:
raise ValueError(f"Driver {driver.name} is missing db_id. Save drivers before loading rides.")
ride_db_id = save_ride(ride, rider_db_id, driver_db_id)
ride_ids.append(ride_db_id)
print(f"Loaded {len(ride_ids)} rides into DB")
return ride_ids
def load_riders_from_json(path="data/riders.json"):
data = load_json(path)
ids = []
riders_by_user_id = {}
for r in data:
validate_rider_record(r)
rider = Rider(
name=r["name"],
user_id=r["user_id"],
current_location=r.get("current_location_id", 0)
)
rider_db_id = save_rider(rider)
rider.db_id = rider_db_id
ids.append(rider_db_id)
riders_by_user_id[r["user_id"]] = rider
print(f"Loaded {len(ids)} riders into DB")
return ids, riders_by_user_id
def load_drivers_from_json(path="data/drivers.json"):
data = load_json(path)
ids = []
drivers_by_user_id = {}
for d in data:
validate_driver_record(d)
driver = Driver(
name=d["name"],
user_id=d["user_id"],
current_location=d.get("current_location_id", 0),
language=d.get("language", "English")
)
driver.go_online()
driver_db_id = save_driver(driver)
driver.db_id = driver_db_id
ids.append(driver_db_id)
drivers_by_user_id[d["user_id"]] = driver
print(f"Loaded {len(ids)} drivers into DB")
return ids, drivers_by_user_id