Skip to content

Commit d198283

Browse files
committed
Add Round deserialiser
1 parent e29bf4e commit d198283

File tree

3 files changed

+61
-3
lines changed

3 files changed

+61
-3
lines changed

jolpica/formula_one/importer/deserialisers.py

+4
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ class ModelLookupCache[M: models.Model]:
5353
"driver__reference": "driver_reference",
5454
"team__reference": "team_reference",
5555
},
56+
f1.Round: {"season__year": "year", "number": "round"},
5657
f1.RoundEntry: {
5758
"round__season__year": "year",
5859
"round__number": "round",
@@ -102,6 +103,8 @@ def add_to_cache(self, model: M, foreign_keys: json_models.F1ForeignKeysSchema)
102103
cache_key = (model.reference,) # type: ignore[attr-defined]
103104
elif isinstance(model, f1.Lap):
104105
cache_key = (model.session_entry_id, model.number) # type: ignore[attr-defined]
106+
elif isinstance(model, f1.Round) and isinstance(foreign_keys, json_models.HasSeasonForeignKey):
107+
cache_key = (foreign_keys.year, model.number)
105108
else:
106109
cache_key = tuple(getattr(foreign_keys, val) for val in self.MODEL_CACHE_FIELD_MAP[model_class].values())
107110
cache[cache_key] = model
@@ -259,6 +262,7 @@ class DeserialiserFactory:
259262
"Team": (f1.Team, json_models.TeamImport, ("reference",)),
260263
"Driver": (f1.Driver, json_models.DriverImport, ("reference",)),
261264
"TeamDriver": (f1.TeamDriver, json_models.TeamDriverImport, ("season", "team", "driver")),
265+
"Round": (f1.Round, json_models.RoundImport, ("season", "number")),
262266
"SessionEntry": (f1.SessionEntry, json_models.SessionEntryImport, ("session", "round_entry")),
263267
"classification": (f1.SessionEntry, json_models.SessionEntryImport, ("session", "round_entry")),
264268
"session_entry": (f1.SessionEntry, json_models.SessionEntryImport, ("session", "round_entry")),

jolpica/formula_one/importer/json_models.py

+47-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from __future__ import annotations
22

3+
import datetime
34
from collections.abc import Sequence
45
from datetime import date, timedelta
56
from typing import Annotated, Any, Literal
@@ -151,6 +152,25 @@ class TeamDriverImport(F1ImportSchema):
151152
objects: list[TeamDriverObject] = Field(min_length=1)
152153

153154

155+
class RoundForeignKeys(HasSeasonForeignKey):
156+
pass
157+
158+
159+
class RoundObject(F1ObjectSchema):
160+
number: PositiveInt | None = None
161+
name: str | None = None
162+
date: datetime.date | None = None
163+
race_number: PositiveInt | None = None
164+
wikipedia: HttpUrl | None = None
165+
is_cancelled: bool | None = None
166+
167+
168+
class RoundImport(F1ImportSchema):
169+
object_type: Literal["Round"]
170+
foreign_keys: RoundForeignKeys
171+
objects: list[RoundObject] = Field(min_length=1)
172+
173+
154174
class RoundEntryForeignKeys(HasRoundForeignKey, HasTeamDriverForeignKey):
155175
pass
156176

@@ -224,10 +244,34 @@ class PitStopImport(F1ImportSchema):
224244

225245

226246
type F1Import = Annotated[
227-
DriverImport | RoundEntryImport | SessionEntryImport | LapImport | PitStopImport, Field(discriminator="object_type")
247+
RoundImport
248+
| TeamDriverImport
249+
| TeamImport
250+
| DriverImport
251+
| RoundEntryImport
252+
| SessionEntryImport
253+
| LapImport
254+
| PitStopImport,
255+
Field(discriminator="object_type"),
228256
]
229257

230-
type F1Object = DriverObject | RoundEntryObject | SessionEntryObject | LapObject | PitStopObject
258+
type F1Object = (
259+
RoundObject
260+
| TeamDriverObject
261+
| TeamObject
262+
| DriverObject
263+
| RoundEntryObject
264+
| SessionEntryObject
265+
| LapObject
266+
| PitStopObject
267+
)
231268
type F1ForeignKeys = (
232-
DriverForeignKeys | RoundEntryForeignKeys | SessionEntryForeignKeys | LapForeignKeys | PitStopForeignKeys
269+
RoundForeignKeys
270+
| TeamDriverForeignKeys
271+
| TeamForeignKeys
272+
| DriverForeignKeys
273+
| RoundEntryForeignKeys
274+
| SessionEntryForeignKeys
275+
| LapForeignKeys
276+
| PitStopForeignKeys
233277
)

jolpica/formula_one/tests/imports/test_deserialisers.py

+10
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,16 @@
1313
@pytest.mark.parametrize(
1414
["entry_data"],
1515
[
16+
pytest.param(
17+
{
18+
"object_type": "Round",
19+
"foreign_keys": {
20+
"year": 2023,
21+
},
22+
"objects": [{"number": 22, "is_cancelled": False, "wikipedia": "https://test"}],
23+
},
24+
id="Round",
25+
),
1626
pytest.param(
1727
{
1828
"object_type": "RoundEntry",

0 commit comments

Comments
 (0)