From e6a70365f3e139d7ef62cca3dc3806942004c648 Mon Sep 17 00:00:00 2001 From: Christoph Urlacher Date: Sun, 10 Mar 2024 18:50:24 +0100 Subject: [PATCH] Add OpenF1 model classes --- formula10/openf1/__init__.py | 0 formula10/openf1/model/__init__.py | 0 formula10/openf1/model/api_driver.py | 45 ++++++++++++++++++++++++ formula10/openf1/model/api_position.py | 30 ++++++++++++++++ formula10/openf1/model/api_session.py | 48 ++++++++++++++++++++++++++ 5 files changed, 123 insertions(+) create mode 100644 formula10/openf1/__init__.py create mode 100644 formula10/openf1/model/__init__.py create mode 100644 formula10/openf1/model/api_driver.py create mode 100644 formula10/openf1/model/api_position.py create mode 100644 formula10/openf1/model/api_session.py diff --git a/formula10/openf1/__init__.py b/formula10/openf1/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/formula10/openf1/model/__init__.py b/formula10/openf1/model/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/formula10/openf1/model/api_driver.py b/formula10/openf1/model/api_driver.py new file mode 100644 index 0000000..8a9450b --- /dev/null +++ b/formula10/openf1/model/api_driver.py @@ -0,0 +1,45 @@ +from typing import Any, Callable, Dict + + +class ApiDriver(): + __type_conversion_map__: Dict[str, Callable[[Any], Any]] = { + "session_key": int, + "meeting_key": int, + "full_name": str, + "first_name": str, + "last_name": str, + "name_acronym": str, + "broadcast_name": str, + "country_code": str, + "headshot_url": str, + "driver_number": int, + "team_colour": str, + "team_name": str + } + + def __init__(self, response: dict[str, str]): + for key in response: + if not hasattr(self, key): + raise Exception(f"Mismatch between response data and {type(self).__name__} (key={key})") + + if not key in self.__type_conversion_map__: + raise Exception(f"Mismatch between response data and {type(self).__name__}.__type_map__ (key={key})") + + setattr(self, key, self.__type_conversion_map__[key](response[key])) + + print("ApiDriver:", self.__dict__) + + # Set all members to None so hasattr works above + + session_key: int = None # type: ignore + meeting_key: int = None # type: ignore + full_name: str = None # type: ignore + first_name: str = None # type: ignore + last_name: str = None # type: ignore + name_acronym: str = None # type: ignore + broadcast_name: str = None # type: ignore + country_code: str = None # type: ignore + headshot_url: str = None # type: ignore + driver_number: int = None # type: ignore + team_colour: str = None # type: ignore + team_name: str = None # type: ignore \ No newline at end of file diff --git a/formula10/openf1/model/api_position.py b/formula10/openf1/model/api_position.py new file mode 100644 index 0000000..775956b --- /dev/null +++ b/formula10/openf1/model/api_position.py @@ -0,0 +1,30 @@ +from datetime import datetime +from typing import Any, Callable, Dict + + +class ApiPosition(): + __type_conversion_map__: Dict[str, Callable[[Any], Any]] = { + "session_key": int, + "meeting_key": int, + "driver_number": int, + "date": lambda date: datetime.strptime(date, "%Y-%m-%dT%H:%M:%S.%f"), + "position": int + } + + def __init__(self, response: dict[str, str]): + for key in response: + if not hasattr(self, key): + raise Exception(f"Mismatch between response data and {type(self).__name__} (key={key})") + + if not key in self.__type_conversion_map__: + raise Exception(f"Mismatch between response data and {type(self).__name__}.__type_map__ (key={key})") + + setattr(self, key, self.__type_conversion_map__[key](response[key])) + + print("ApiPosition:", self.__dict__) + + session_key: int = None # type: ignore + meeting_key: int = None # type: ignore + driver_number: int = None # type: ignore + date: datetime = None # type: ignore + position: int = None # type: ignore \ No newline at end of file diff --git a/formula10/openf1/model/api_session.py b/formula10/openf1/model/api_session.py new file mode 100644 index 0000000..369bf84 --- /dev/null +++ b/formula10/openf1/model/api_session.py @@ -0,0 +1,48 @@ +from datetime import datetime, time +from typing import Any, Callable, Dict + + +class ApiSession(): + __type_conversion_map__: Dict[str, Callable[[Any], Any]] = { + "location": str, + "country_key": int, + "country_code": str, + "country_name": str, + "circuit_key": int, + "circuit_short_name": str, + "session_type": str, + "session_name": str, + "date_start": lambda date: datetime.strptime(date, "%Y-%m-%dT%H:%M:%S"), + "date_end": lambda date: datetime.strptime(date, "%Y-%m-%dT%H:%M:%S"), + "gmt_offset": lambda time: datetime.strptime(time, "%H:%M:%S").time(), + "session_key": int, + "meeting_key": int, + "year": int + } + + def __init__(self, response: dict[str, str]): + for key in response: + if not hasattr(self, key): + raise Exception(f"Mismatch between response data and {type(self).__name__} (key={key})") + + if not key in self.__type_conversion_map__: + raise Exception(f"Mismatch between response data and {type(self).__name__}.__type_map__ (key={key})") + + setattr(self, key, self.__type_conversion_map__[key](response[key])) + + print("ApiSession:", self.__dict__) + + location: str = None # type: ignore + country_key: int = None # type: ignore + country_code: str = None # type: ignore + country_name: str = None # type: ignore + circuit_key: int = None # type: ignore + circuit_short_name: str = None # type: ignore + session_type: str = None # type: ignore + session_name: str = None # type: ignore + date_start: datetime = None # type: ignore + date_end: datetime = None # type: ignore + gmt_offset: time = None # type: ignore + session_key: int = None # type: ignore + meeting_key: int = None # type: ignore + year: int = None # type: ignore \ No newline at end of file