diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index b416e91..bb7dda0 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -27,4 +27,4 @@ jobs: run: poetry install --no-root - name: 📊 Run tests - run: poetry run pytest + run: poetry run pytest -rpP diff --git a/README.md b/README.md index a4d7994..d0d843e 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ Table of Contents: - [Interactive Jupyter notebook](#interactive-jupyter-notebook) - [Using Jupyter Lab](#using-jupyter-lab) - [Running the notebook in VS Code](#running-the-notebook-in-vs-code) + - [Running tests](#running-tests) - [Contribution Guidelines](#contribution-guidelines) - [Deployment](#deployment) @@ -84,6 +85,12 @@ poetry install --no-root - Alternatively, you can install the [Jupyer extension](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter) and run the notebook in VS Code. - Ensure to use the poetry python environment as the kernel. +### Running tests + +```sh +poetry run pytest -rpP +``` + ### Contribution Guidelines - _**NEVER MERGE YOUR OWN CODE; ALWAYS RAISE A PR AGAINST `dev`!**_ diff --git a/app/constants.py b/app/constants.py index 8772682..78db61b 100644 --- a/app/constants.py +++ b/app/constants.py @@ -1,3 +1,5 @@ +from datetime import datetime + METADATA_DESCRIPTION = """ Slick Telemetry backend written in python with fastf1. 🏎 @@ -19,3 +21,9 @@ "Session5Date", "Session5DateUtc", ] + +MIN_SUPPORTED_YEAR = 1950 +MAX_SUPPORTED_YEAR = datetime.today().year + +MIN_SUPPORTED_ROUND = 1 +MAX_SUPPORTED_ROUND = 30 diff --git a/app/main.py b/app/main.py index 64713bf..6871abe 100644 --- a/app/main.py +++ b/app/main.py @@ -1,19 +1,28 @@ import json -from datetime import datetime -from typing import Annotated +from typing import Annotated, Literal import fastf1 -from fastapi import FastAPI, Query, status +from fastapi import FastAPI, HTTPException, Query, status from fastapi.middleware.cors import CORSMiddleware - - -from app.constants import EVENT_SCHEDULE_DATETIME_DTYPE_LIST, METADATA_DESCRIPTION -from app.models import HealthCheck, Schedule -from app.utils import get_default_year_for_schedule +from fastf1.ergast import Ergast + +from app.constants import ( + EVENT_SCHEDULE_DATETIME_DTYPE_LIST, + MAX_SUPPORTED_ROUND, + MAX_SUPPORTED_YEAR, + METADATA_DESCRIPTION, + MIN_SUPPORTED_ROUND, + MIN_SUPPORTED_YEAR, +) +from app.models import HealthCheck, Schedule, Standings +from app.utils import get_default_year # fastf1.set_log_level("WARNING") # TODO use for production and staging - +# Cors Middleware +origins = ["http://localhost:3000"] +# Ergast configuration +ergast = Ergast(result_type="raw", auto_cast=True) app = FastAPI( @@ -31,16 +40,14 @@ }, ) -# Cors Middleware -origins = [ - "http://localhost:3000" -] + app.add_middleware( CORSMiddleware, allow_origins=origins, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], + # HTTPSRedirectMiddleware # TODO use for production and staging ) @@ -71,7 +78,8 @@ def get_health() -> HealthCheck: to ensure a robust container orchestration and management is in place. Other services which rely on proper functioning of the API service will not deploy if this endpoint returns any other HTTP status code except 200 (OK). - Returns: + + **Returns**: HealthCheck: Returns a JSON response with the health status """ return HealthCheck(status="OK") @@ -90,23 +98,24 @@ def get_schedule( int | None, Query( title="The year for which to get the schedule", - gt=1949, # Supported years are 1950 to current - le=datetime.today().year, + ge=MIN_SUPPORTED_YEAR, + le=MAX_SUPPORTED_YEAR, ), ] = None ) -> list[Schedule]: """ ## Get events schedule for a Formula 1 calendar year Endpoint to get events schedule for Formula 1 calendar year. - Returns: + + **Returns**: list[Schedule]: Returns a JSON response with the list of event schedule """ if year is None: - year = get_default_year_for_schedule() + year = get_default_year() event_schedule = fastf1.get_event_schedule(year) - # Convert timestamp(z) related columns' data into a string type + # Convert timestamp(z) related columns' data into string type # https://stackoverflow.com/questions/50404559/python-error-typeerror-object-of-type-timestamp-is-not-json-serializable for col in EVENT_SCHEDULE_DATETIME_DTYPE_LIST: event_schedule[col] = event_schedule[col].astype(str) @@ -118,3 +127,84 @@ def get_schedule( event_schedule_as_json_obj = json.loads(event_schedule_as_json) return event_schedule_as_json_obj + + +@app.get( + "/standings", + tags=["standings"], + summary="Get drivers and contructors standings ", + response_description="Return a list of drivers and contructors standings at specific points of a season. If the season hasn't ended you will get the current standings.", + status_code=status.HTTP_200_OK, + response_model=Standings, +) +def get_standings( + year: Annotated[ + int | None, + Query( + title="The year for which to get the driver and contructors standing. If the season hasn't ended you will get the current standings.", + ge=MIN_SUPPORTED_YEAR, + le=MAX_SUPPORTED_YEAR, + ), + ] = None, + round: Annotated[ + int | None, + Query( + title="The round in a year for which to get the driver and contructor standings", + ge=MIN_SUPPORTED_ROUND, + le=MAX_SUPPORTED_ROUND, + ), + ] = None, +) -> Standings: + """ + ## Get driver and contructor standings + Endpoint to get driver and contructor standings at specific points of a season. If the season hasn't ended you will get the current standings. + + **Returns**: + Standings: Returns a JSON response with the driver and constructor standings + """ + + if year is None and round is None: + # neither year nor round are provided; get results for the last round of the default year + year = get_default_year() + elif year is None and round is not None: + # only round is provided; error out + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail='Bad request. Must provide the "year" parameter.', + ) + + # inputs are good; either one of the two remaining cases: + # 1. both year and round are provided + # 2. only year is provided + + driver_standings = ergast.get_driver_standings(season=year, round=round) + constructor_standings = ergast.get_constructor_standings(season=year, round=round) + + driver_standings_available = True if len(driver_standings) > 0 else False + constructor_standings_available = True if len(constructor_standings) > 0 else False + + if driver_standings_available and constructor_standings_available: + # both driver and constructor standings are available + data: Standings = { + "season": driver_standings[0]["season"], + "round": driver_standings[0]["round"], + "DriverStandings": driver_standings[0]["DriverStandings"], + "ConstructorStandings": constructor_standings[0]["ConstructorStandings"], + } + return data + elif not driver_standings_available and not constructor_standings_available: + # neither driver nor constructor standings are available + raise HTTPException( + status_code=404, detail="Driver and constructor standings not found." + ) + elif driver_standings_available: + # only driver standings are available + raise HTTPException(status_code=404, detail="Constructor standings not found.") + elif constructor_standings_available: + # only constructor standings are available + raise HTTPException(status_code=404, detail="Driver standings not found.") + else: + # something went wrong, investigate + raise HTTPException( + status_code=500, detail="Something went wrong. Investigate!" + ) diff --git a/app/models.py b/app/models.py index 56b66ca..3c8bf2a 100644 --- a/app/models.py +++ b/app/models.py @@ -8,7 +8,7 @@ class ReadRoot(BaseModel): class Schedule(BaseModel): - """Model to store schedule data for a Formula 1 calendar year.""" + """Response model for schedule data for a Formula 1 calendar year.""" RoundNumber: int Country: str @@ -39,3 +39,55 @@ class HealthCheck(BaseModel): """Response model to validate and return when performing a health check.""" status: str = "OK" + + +class Driver(BaseModel): + """Model for storing driver data""" + + driverId: str + permanentNumber: str + code: str + url: str + givenName: str + familyName: str + dateOfBirth: str + nationality: str + + +class Contructor(BaseModel): + """Model for storing constructor data""" + + constructorId: str + url: str + name: str + nationality: str + + +class DriverStandings(BaseModel): + """Model for storing driver standings data""" + + position: str + positionText: str + points: str + wins: str + Driver: Driver + Constructors: list[Contructor] + + +class ConstructorStandings(BaseModel): + """Model for storing constructor standings data""" + + position: str + positionText: str + points: str + wins: str + Constructor: Contructor + + +class Standings(BaseModel): + """Response model for driver and contructor standings for a given season and round""" + + season: int + round: int + DriverStandings: list[DriverStandings] + ConstructorStandings: list[ConstructorStandings] diff --git a/app/test_main.py b/app/test_main.py index d5fa1c2..d5bb1d1 100644 --- a/app/test_main.py +++ b/app/test_main.py @@ -2,55 +2,1217 @@ from fastapi.testclient import TestClient +from app.constants import ( + MAX_SUPPORTED_ROUND, + MAX_SUPPORTED_YEAR, + MIN_SUPPORTED_ROUND, + MIN_SUPPORTED_YEAR, +) from app.main import app client = TestClient(app) +# region root + + def test_read_root(): response = client.get("/") assert response.status_code == 200 assert response.json() == {"we_are": "SlickTelemetry"} +# endregion root + + +# region healtcheck + + def test_healthcheck(): response = client.get("/health") assert response.status_code == 200 assert response.json() == {"status": "OK"} +# endregion healtcheck + + +# region schedule + +# region schedule - good inputs + + def test_get_schedule(): response = client.get("/schedule") assert response.status_code == 200 - assert response.json()[0] == { - "RoundNumber": 0, - "Country": "Bahrain", - "Location": "Sakhir", - "OfficialEventName": "FORMULA 1 ARAMCO PRE-SEASON TESTING 2023", - "EventDate": "2023-02-25", - "EventName": "Pre-Season Testing", - "EventFormat": "testing", - "Session1": "Practice 1", - "Session1Date": "2023-02-23 10:00:00+03:00", - "Session1DateUtc": "2023-02-23 07:00:00", - "Session2": "Practice 2", - "Session2Date": "2023-02-24 10:00:00+03:00", - "Session2DateUtc": "2023-02-24 07:00:00", - "Session3": "Practice 3", - "Session3Date": "2023-02-25 10:00:00+03:00", - "Session3DateUtc": "2023-02-25 07:00:00", - "Session4": "None", - "Session4Date": "NaT", - "Session4DateUtc": "NaT", - "Session5": "None", - "Session5Date": "NaT", - "Session5DateUtc": "NaT", - "F1ApiSupport": True, - } + assert response.json() == [ + { + "RoundNumber": 0, + "Country": "Bahrain", + "Location": "Sakhir", + "OfficialEventName": "FORMULA 1 ARAMCO PRE-SEASON TESTING 2023", + "EventDate": "2023-02-25", + "EventName": "Pre-Season Testing", + "EventFormat": "testing", + "Session1": "Practice 1", + "Session1Date": "2023-02-23 10:00:00+03:00", + "Session1DateUtc": "2023-02-23 07:00:00", + "Session2": "Practice 2", + "Session2Date": "2023-02-24 10:00:00+03:00", + "Session2DateUtc": "2023-02-24 07:00:00", + "Session3": "Practice 3", + "Session3Date": "2023-02-25 10:00:00+03:00", + "Session3DateUtc": "2023-02-25 07:00:00", + "Session4": "None", + "Session4Date": "NaT", + "Session4DateUtc": "NaT", + "Session5": "None", + "Session5Date": "NaT", + "Session5DateUtc": "NaT", + "F1ApiSupport": True, + }, + { + "RoundNumber": 1, + "Country": "Bahrain", + "Location": "Sakhir", + "OfficialEventName": "FORMULA 1 GULF AIR BAHRAIN GRAND PRIX 2023", + "EventDate": "2023-03-05", + "EventName": "Bahrain Grand Prix", + "EventFormat": "conventional", + "Session1": "Practice 1", + "Session1Date": "2023-03-03 14:30:00+03:00", + "Session1DateUtc": "2023-03-03 11:30:00", + "Session2": "Practice 2", + "Session2Date": "2023-03-03 18:00:00+03:00", + "Session2DateUtc": "2023-03-03 15:00:00", + "Session3": "Practice 3", + "Session3Date": "2023-03-04 14:30:00+03:00", + "Session3DateUtc": "2023-03-04 11:30:00", + "Session4": "Qualifying", + "Session4Date": "2023-03-04 18:00:00+03:00", + "Session4DateUtc": "2023-03-04 15:00:00", + "Session5": "Race", + "Session5Date": "2023-03-05 18:00:00+03:00", + "Session5DateUtc": "2023-03-05 15:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 2, + "Country": "Saudi Arabia", + "Location": "Jeddah", + "OfficialEventName": "FORMULA 1 STC SAUDI ARABIAN GRAND PRIX 2023", + "EventDate": "2023-03-19", + "EventName": "Saudi Arabian Grand Prix", + "EventFormat": "conventional", + "Session1": "Practice 1", + "Session1Date": "2023-03-17 16:30:00+03:00", + "Session1DateUtc": "2023-03-17 13:30:00", + "Session2": "Practice 2", + "Session2Date": "2023-03-17 20:00:00+03:00", + "Session2DateUtc": "2023-03-17 17:00:00", + "Session3": "Practice 3", + "Session3Date": "2023-03-18 16:30:00+03:00", + "Session3DateUtc": "2023-03-18 13:30:00", + "Session4": "Qualifying", + "Session4Date": "2023-03-18 20:00:00+03:00", + "Session4DateUtc": "2023-03-18 17:00:00", + "Session5": "Race", + "Session5Date": "2023-03-19 20:00:00+03:00", + "Session5DateUtc": "2023-03-19 17:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 3, + "Country": "Australia", + "Location": "Melbourne", + "OfficialEventName": "FORMULA 1 ROLEX AUSTRALIAN GRAND PRIX 2023", + "EventDate": "2023-04-02", + "EventName": "Australian Grand Prix", + "EventFormat": "conventional", + "Session1": "Practice 1", + "Session1Date": "2023-03-31 12:30:00+10:00", + "Session1DateUtc": "2023-03-31 02:30:00", + "Session2": "Practice 2", + "Session2Date": "2023-03-31 16:00:00+10:00", + "Session2DateUtc": "2023-03-31 06:00:00", + "Session3": "Practice 3", + "Session3Date": "2023-04-01 12:30:00+10:00", + "Session3DateUtc": "2023-04-01 02:30:00", + "Session4": "Qualifying", + "Session4Date": "2023-04-01 16:00:00+10:00", + "Session4DateUtc": "2023-04-01 06:00:00", + "Session5": "Race", + "Session5Date": "2023-04-02 15:00:00+10:00", + "Session5DateUtc": "2023-04-02 05:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 4, + "Country": "Azerbaijan", + "Location": "Baku", + "OfficialEventName": "FORMULA 1 AZERBAIJAN GRAND PRIX 2023", + "EventDate": "2023-04-30", + "EventName": "Azerbaijan Grand Prix", + "EventFormat": "sprint_shootout", + "Session1": "Practice 1", + "Session1Date": "2023-04-28 13:30:00+04:00", + "Session1DateUtc": "2023-04-28 09:30:00", + "Session2": "Qualifying", + "Session2Date": "2023-04-28 17:00:00+04:00", + "Session2DateUtc": "2023-04-28 13:00:00", + "Session3": "Sprint Shootout", + "Session3Date": "2023-04-29 12:30:00+04:00", + "Session3DateUtc": "2023-04-29 08:30:00", + "Session4": "Sprint", + "Session4Date": "2023-04-29 17:30:00+04:00", + "Session4DateUtc": "2023-04-29 13:30:00", + "Session5": "Race", + "Session5Date": "2023-04-30 15:00:00+04:00", + "Session5DateUtc": "2023-04-30 11:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 5, + "Country": "United States", + "Location": "Miami", + "OfficialEventName": "FORMULA 1 CRYPTO.COM MIAMI GRAND PRIX 2023", + "EventDate": "2023-05-07", + "EventName": "Miami Grand Prix", + "EventFormat": "conventional", + "Session1": "Practice 1", + "Session1Date": "2023-05-05 14:00:00-04:00", + "Session1DateUtc": "2023-05-05 18:00:00", + "Session2": "Practice 2", + "Session2Date": "2023-05-05 17:30:00-04:00", + "Session2DateUtc": "2023-05-05 21:30:00", + "Session3": "Practice 3", + "Session3Date": "2023-05-06 12:30:00-04:00", + "Session3DateUtc": "2023-05-06 16:30:00", + "Session4": "Qualifying", + "Session4Date": "2023-05-06 16:00:00-04:00", + "Session4DateUtc": "2023-05-06 20:00:00", + "Session5": "Race", + "Session5Date": "2023-05-07 15:30:00-04:00", + "Session5DateUtc": "2023-05-07 19:30:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 6, + "Country": "Monaco", + "Location": "Monaco", + "OfficialEventName": "FORMULA 1 GRAND PRIX DE MONACO 2023", + "EventDate": "2023-05-28", + "EventName": "Monaco Grand Prix", + "EventFormat": "conventional", + "Session1": "Practice 1", + "Session1Date": "2023-05-26 13:30:00+02:00", + "Session1DateUtc": "2023-05-26 11:30:00", + "Session2": "Practice 2", + "Session2Date": "2023-05-26 17:00:00+02:00", + "Session2DateUtc": "2023-05-26 15:00:00", + "Session3": "Practice 3", + "Session3Date": "2023-05-27 12:30:00+02:00", + "Session3DateUtc": "2023-05-27 10:30:00", + "Session4": "Qualifying", + "Session4Date": "2023-05-27 16:00:00+02:00", + "Session4DateUtc": "2023-05-27 14:00:00", + "Session5": "Race", + "Session5Date": "2023-05-28 15:00:00+02:00", + "Session5DateUtc": "2023-05-28 13:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 7, + "Country": "Spain", + "Location": "Barcelona", + "OfficialEventName": "FORMULA 1 AWS GRAN PREMIO DE ESPAÑA 2023", + "EventDate": "2023-06-04", + "EventName": "Spanish Grand Prix", + "EventFormat": "conventional", + "Session1": "Practice 1", + "Session1Date": "2023-06-02 13:30:00+02:00", + "Session1DateUtc": "2023-06-02 11:30:00", + "Session2": "Practice 2", + "Session2Date": "2023-06-02 17:00:00+02:00", + "Session2DateUtc": "2023-06-02 15:00:00", + "Session3": "Practice 3", + "Session3Date": "2023-06-03 12:30:00+02:00", + "Session3DateUtc": "2023-06-03 10:30:00", + "Session4": "Qualifying", + "Session4Date": "2023-06-03 16:00:00+02:00", + "Session4DateUtc": "2023-06-03 14:00:00", + "Session5": "Race", + "Session5Date": "2023-06-04 15:00:00+02:00", + "Session5DateUtc": "2023-06-04 13:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 8, + "Country": "Canada", + "Location": "Montréal", + "OfficialEventName": "FORMULA 1 PIRELLI GRAND PRIX DU CANADA 2023", + "EventDate": "2023-06-18", + "EventName": "Canadian Grand Prix", + "EventFormat": "conventional", + "Session1": "Practice 1", + "Session1Date": "2023-06-16 13:30:00-04:00", + "Session1DateUtc": "2023-06-16 17:30:00", + "Session2": "Practice 2", + "Session2Date": "2023-06-16 16:30:00-04:00", + "Session2DateUtc": "2023-06-16 20:30:00", + "Session3": "Practice 3", + "Session3Date": "2023-06-17 12:30:00-04:00", + "Session3DateUtc": "2023-06-17 16:30:00", + "Session4": "Qualifying", + "Session4Date": "2023-06-17 16:00:00-04:00", + "Session4DateUtc": "2023-06-17 20:00:00", + "Session5": "Race", + "Session5Date": "2023-06-18 14:00:00-04:00", + "Session5DateUtc": "2023-06-18 18:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 9, + "Country": "Austria", + "Location": "Spielberg", + "OfficialEventName": "FORMULA 1 ROLEX GROSSER PREIS VON ÖSTERREICH 2023", + "EventDate": "2023-07-02", + "EventName": "Austrian Grand Prix", + "EventFormat": "sprint_shootout", + "Session1": "Practice 1", + "Session1Date": "2023-06-30 13:30:00+02:00", + "Session1DateUtc": "2023-06-30 11:30:00", + "Session2": "Qualifying", + "Session2Date": "2023-06-30 17:00:00+02:00", + "Session2DateUtc": "2023-06-30 15:00:00", + "Session3": "Sprint Shootout", + "Session3Date": "2023-07-01 12:00:00+02:00", + "Session3DateUtc": "2023-07-01 10:00:00", + "Session4": "Sprint", + "Session4Date": "2023-07-01 16:30:00+02:00", + "Session4DateUtc": "2023-07-01 14:30:00", + "Session5": "Race", + "Session5Date": "2023-07-02 15:00:00+02:00", + "Session5DateUtc": "2023-07-02 13:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 10, + "Country": "Great Britain", + "Location": "Silverstone", + "OfficialEventName": "FORMULA 1 ARAMCO BRITISH GRAND PRIX 2023", + "EventDate": "2023-07-09", + "EventName": "British Grand Prix", + "EventFormat": "conventional", + "Session1": "Practice 1", + "Session1Date": "2023-07-07 12:30:00+01:00", + "Session1DateUtc": "2023-07-07 11:30:00", + "Session2": "Practice 2", + "Session2Date": "2023-07-07 16:00:00+01:00", + "Session2DateUtc": "2023-07-07 15:00:00", + "Session3": "Practice 3", + "Session3Date": "2023-07-08 11:30:00+01:00", + "Session3DateUtc": "2023-07-08 10:30:00", + "Session4": "Qualifying", + "Session4Date": "2023-07-08 15:00:00+01:00", + "Session4DateUtc": "2023-07-08 14:00:00", + "Session5": "Race", + "Session5Date": "2023-07-09 15:00:00+01:00", + "Session5DateUtc": "2023-07-09 14:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 11, + "Country": "Hungary", + "Location": "Budapest", + "OfficialEventName": "FORMULA 1 QATAR AIRWAYS HUNGARIAN GRAND PRIX 2023", + "EventDate": "2023-07-23", + "EventName": "Hungarian Grand Prix", + "EventFormat": "conventional", + "Session1": "Practice 1", + "Session1Date": "2023-07-21 13:30:00+02:00", + "Session1DateUtc": "2023-07-21 11:30:00", + "Session2": "Practice 2", + "Session2Date": "2023-07-21 17:00:00+02:00", + "Session2DateUtc": "2023-07-21 15:00:00", + "Session3": "Practice 3", + "Session3Date": "2023-07-22 12:30:00+02:00", + "Session3DateUtc": "2023-07-22 10:30:00", + "Session4": "Qualifying", + "Session4Date": "2023-07-22 16:00:00+02:00", + "Session4DateUtc": "2023-07-22 14:00:00", + "Session5": "Race", + "Session5Date": "2023-07-23 15:00:00+02:00", + "Session5DateUtc": "2023-07-23 13:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 12, + "Country": "Belgium", + "Location": "Spa-Francorchamps", + "OfficialEventName": "FORMULA 1 MSC CRUISES BELGIAN GRAND PRIX 2023", + "EventDate": "2023-07-30", + "EventName": "Belgian Grand Prix", + "EventFormat": "sprint_shootout", + "Session1": "Practice 1", + "Session1Date": "2023-07-28 13:30:00+02:00", + "Session1DateUtc": "2023-07-28 11:30:00", + "Session2": "Qualifying", + "Session2Date": "2023-07-28 17:00:00+02:00", + "Session2DateUtc": "2023-07-28 15:00:00", + "Session3": "Sprint Shootout", + "Session3Date": "2023-07-29 12:00:00+02:00", + "Session3DateUtc": "2023-07-29 10:00:00", + "Session4": "Sprint", + "Session4Date": "2023-07-29 17:05:00+02:00", + "Session4DateUtc": "2023-07-29 15:05:00", + "Session5": "Race", + "Session5Date": "2023-07-30 15:00:00+02:00", + "Session5DateUtc": "2023-07-30 13:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 13, + "Country": "Netherlands", + "Location": "Zandvoort", + "OfficialEventName": "FORMULA 1 HEINEKEN DUTCH GRAND PRIX 2023", + "EventDate": "2023-08-27", + "EventName": "Dutch Grand Prix", + "EventFormat": "conventional", + "Session1": "Practice 1", + "Session1Date": "2023-08-25 12:30:00+02:00", + "Session1DateUtc": "2023-08-25 10:30:00", + "Session2": "Practice 2", + "Session2Date": "2023-08-25 16:00:00+02:00", + "Session2DateUtc": "2023-08-25 14:00:00", + "Session3": "Practice 3", + "Session3Date": "2023-08-26 11:30:00+02:00", + "Session3DateUtc": "2023-08-26 09:30:00", + "Session4": "Qualifying", + "Session4Date": "2023-08-26 15:00:00+02:00", + "Session4DateUtc": "2023-08-26 13:00:00", + "Session5": "Race", + "Session5Date": "2023-08-27 15:00:00+02:00", + "Session5DateUtc": "2023-08-27 13:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 14, + "Country": "Italy", + "Location": "Monza", + "OfficialEventName": "FORMULA 1 PIRELLI GRAN PREMIO D’ITALIA 2023 ", + "EventDate": "2023-09-03", + "EventName": "Italian Grand Prix", + "EventFormat": "conventional", + "Session1": "Practice 1", + "Session1Date": "2023-09-01 13:30:00+02:00", + "Session1DateUtc": "2023-09-01 11:30:00", + "Session2": "Practice 2", + "Session2Date": "2023-09-01 17:00:00+02:00", + "Session2DateUtc": "2023-09-01 15:00:00", + "Session3": "Practice 3", + "Session3Date": "2023-09-02 12:30:00+02:00", + "Session3DateUtc": "2023-09-02 10:30:00", + "Session4": "Qualifying", + "Session4Date": "2023-09-02 16:00:00+02:00", + "Session4DateUtc": "2023-09-02 14:00:00", + "Session5": "Race", + "Session5Date": "2023-09-03 15:00:00+02:00", + "Session5DateUtc": "2023-09-03 13:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 15, + "Country": "Singapore", + "Location": "Marina Bay", + "OfficialEventName": "FORMULA 1 SINGAPORE AIRLINES SINGAPORE GRAND PRIX 2023 ", + "EventDate": "2023-09-17", + "EventName": "Singapore Grand Prix", + "EventFormat": "conventional", + "Session1": "Practice 1", + "Session1Date": "2023-09-15 17:30:00+08:00", + "Session1DateUtc": "2023-09-15 09:30:00", + "Session2": "Practice 2", + "Session2Date": "2023-09-15 21:00:00+08:00", + "Session2DateUtc": "2023-09-15 13:00:00", + "Session3": "Practice 3", + "Session3Date": "2023-09-16 17:30:00+08:00", + "Session3DateUtc": "2023-09-16 09:30:00", + "Session4": "Qualifying", + "Session4Date": "2023-09-16 21:00:00+08:00", + "Session4DateUtc": "2023-09-16 13:00:00", + "Session5": "Race", + "Session5Date": "2023-09-17 20:00:00+08:00", + "Session5DateUtc": "2023-09-17 12:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 16, + "Country": "Japan", + "Location": "Suzuka", + "OfficialEventName": "FORMULA 1 LENOVO JAPANESE GRAND PRIX 2023 ", + "EventDate": "2023-09-24", + "EventName": "Japanese Grand Prix", + "EventFormat": "conventional", + "Session1": "Practice 1", + "Session1Date": "2023-09-22 11:30:00+09:00", + "Session1DateUtc": "2023-09-22 02:30:00", + "Session2": "Practice 2", + "Session2Date": "2023-09-22 15:00:00+09:00", + "Session2DateUtc": "2023-09-22 06:00:00", + "Session3": "Practice 3", + "Session3Date": "2023-09-23 11:30:00+09:00", + "Session3DateUtc": "2023-09-23 02:30:00", + "Session4": "Qualifying", + "Session4Date": "2023-09-23 15:00:00+09:00", + "Session4DateUtc": "2023-09-23 06:00:00", + "Session5": "Race", + "Session5Date": "2023-09-24 14:00:00+09:00", + "Session5DateUtc": "2023-09-24 05:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 17, + "Country": "Qatar", + "Location": "Lusail", + "OfficialEventName": "FORMULA 1 QATAR AIRWAYS QATAR GRAND PRIX 2023", + "EventDate": "2023-10-08", + "EventName": "Qatar Grand Prix", + "EventFormat": "sprint_shootout", + "Session1": "Practice 1", + "Session1Date": "2023-10-06 16:30:00+03:00", + "Session1DateUtc": "2023-10-06 13:30:00", + "Session2": "Qualifying", + "Session2Date": "2023-10-06 20:00:00+03:00", + "Session2DateUtc": "2023-10-06 17:00:00", + "Session3": "Sprint Shootout", + "Session3Date": "2023-10-07 16:20:00+03:00", + "Session3DateUtc": "2023-10-07 13:20:00", + "Session4": "Sprint", + "Session4Date": "2023-10-07 20:30:00+03:00", + "Session4DateUtc": "2023-10-07 17:30:00", + "Session5": "Race", + "Session5Date": "2023-10-08 20:00:00+03:00", + "Session5DateUtc": "2023-10-08 17:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 18, + "Country": "United States", + "Location": "Austin", + "OfficialEventName": "FORMULA 1 LENOVO UNITED STATES GRAND PRIX 2023", + "EventDate": "2023-10-22", + "EventName": "United States Grand Prix", + "EventFormat": "sprint_shootout", + "Session1": "Practice 1", + "Session1Date": "2023-10-20 12:30:00-05:00", + "Session1DateUtc": "2023-10-20 17:30:00", + "Session2": "Qualifying", + "Session2Date": "2023-10-20 16:00:00-05:00", + "Session2DateUtc": "2023-10-20 21:00:00", + "Session3": "Sprint Shootout", + "Session3Date": "2023-10-21 12:30:00-05:00", + "Session3DateUtc": "2023-10-21 17:30:00", + "Session4": "Sprint", + "Session4Date": "2023-10-21 17:00:00-05:00", + "Session4DateUtc": "2023-10-21 22:00:00", + "Session5": "Race", + "Session5Date": "2023-10-22 14:00:00-05:00", + "Session5DateUtc": "2023-10-22 19:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 19, + "Country": "Mexico", + "Location": "Mexico City", + "OfficialEventName": "FORMULA 1 GRAN PREMIO DE LA CIUDAD DE MÉXICO 2023", + "EventDate": "2023-10-29", + "EventName": "Mexico City Grand Prix", + "EventFormat": "conventional", + "Session1": "Practice 1", + "Session1Date": "2023-10-27 12:30:00-06:00", + "Session1DateUtc": "2023-10-27 18:30:00", + "Session2": "Practice 2", + "Session2Date": "2023-10-27 16:00:00-06:00", + "Session2DateUtc": "2023-10-27 22:00:00", + "Session3": "Practice 3", + "Session3Date": "2023-10-28 11:30:00-06:00", + "Session3DateUtc": "2023-10-28 17:30:00", + "Session4": "Qualifying", + "Session4Date": "2023-10-28 15:00:00-06:00", + "Session4DateUtc": "2023-10-28 21:00:00", + "Session5": "Race", + "Session5Date": "2023-10-29 14:00:00-06:00", + "Session5DateUtc": "2023-10-29 20:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 20, + "Country": "Brazil", + "Location": "São Paulo", + "OfficialEventName": "FORMULA 1 ROLEX GRANDE PRÊMIO DE SÃO PAULO 2023", + "EventDate": "2023-11-05", + "EventName": "São Paulo Grand Prix", + "EventFormat": "sprint_shootout", + "Session1": "Practice 1", + "Session1Date": "2023-11-03 11:30:00-03:00", + "Session1DateUtc": "2023-11-03 14:30:00", + "Session2": "Qualifying", + "Session2Date": "2023-11-03 15:00:00-03:00", + "Session2DateUtc": "2023-11-03 18:00:00", + "Session3": "Sprint Shootout", + "Session3Date": "2023-11-04 11:00:00-03:00", + "Session3DateUtc": "2023-11-04 14:00:00", + "Session4": "Sprint", + "Session4Date": "2023-11-04 15:30:00-03:00", + "Session4DateUtc": "2023-11-04 18:30:00", + "Session5": "Race", + "Session5Date": "2023-11-05 14:00:00-03:00", + "Session5DateUtc": "2023-11-05 17:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 21, + "Country": "United States", + "Location": "Las Vegas", + "OfficialEventName": "FORMULA 1 HEINEKEN SILVER LAS VEGAS GRAND PRIX 2023", + "EventDate": "2023-11-18", + "EventName": "Las Vegas Grand Prix", + "EventFormat": "conventional", + "Session1": "Practice 1", + "Session1Date": "2023-11-16 20:30:00-08:00", + "Session1DateUtc": "2023-11-17 04:30:00", + "Session2": "Practice 2", + "Session2Date": "2023-11-17 02:30:00-08:00", + "Session2DateUtc": "2023-11-17 10:30:00", + "Session3": "Practice 3", + "Session3Date": "2023-11-17 20:30:00-08:00", + "Session3DateUtc": "2023-11-18 04:30:00", + "Session4": "Qualifying", + "Session4Date": "2023-11-18 00:00:00-08:00", + "Session4DateUtc": "2023-11-18 08:00:00", + "Session5": "Race", + "Session5Date": "2023-11-18 22:00:00-08:00", + "Session5DateUtc": "2023-11-19 06:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 22, + "Country": "Abu Dhabi", + "Location": "Yas Island", + "OfficialEventName": "FORMULA 1 ETIHAD AIRWAYS ABU DHABI GRAND PRIX 2023 ", + "EventDate": "2023-11-26", + "EventName": "Abu Dhabi Grand Prix", + "EventFormat": "conventional", + "Session1": "Practice 1", + "Session1Date": "2023-11-24 13:30:00+04:00", + "Session1DateUtc": "2023-11-24 09:30:00", + "Session2": "Practice 2", + "Session2Date": "2023-11-24 17:00:00+04:00", + "Session2DateUtc": "2023-11-24 13:00:00", + "Session3": "Practice 3", + "Session3Date": "2023-11-25 14:30:00+04:00", + "Session3DateUtc": "2023-11-25 10:30:00", + "Session4": "Qualifying", + "Session4Date": "2023-11-25 18:00:00+04:00", + "Session4DateUtc": "2023-11-25 14:00:00", + "Session5": "Race", + "Session5Date": "2023-11-26 17:00:00+04:00", + "Session5DateUtc": "2023-11-26 13:00:00", + "F1ApiSupport": True, + }, + ] + + +def test_get_schedule_good_year(): + response = client.get("/schedule?year=2023") + assert response.status_code == 200 + assert response.json() == [ + { + "RoundNumber": 0, + "Country": "Bahrain", + "Location": "Sakhir", + "OfficialEventName": "FORMULA 1 ARAMCO PRE-SEASON TESTING 2023", + "EventDate": "2023-02-25", + "EventName": "Pre-Season Testing", + "EventFormat": "testing", + "Session1": "Practice 1", + "Session1Date": "2023-02-23 10:00:00+03:00", + "Session1DateUtc": "2023-02-23 07:00:00", + "Session2": "Practice 2", + "Session2Date": "2023-02-24 10:00:00+03:00", + "Session2DateUtc": "2023-02-24 07:00:00", + "Session3": "Practice 3", + "Session3Date": "2023-02-25 10:00:00+03:00", + "Session3DateUtc": "2023-02-25 07:00:00", + "Session4": "None", + "Session4Date": "NaT", + "Session4DateUtc": "NaT", + "Session5": "None", + "Session5Date": "NaT", + "Session5DateUtc": "NaT", + "F1ApiSupport": True, + }, + { + "RoundNumber": 1, + "Country": "Bahrain", + "Location": "Sakhir", + "OfficialEventName": "FORMULA 1 GULF AIR BAHRAIN GRAND PRIX 2023", + "EventDate": "2023-03-05", + "EventName": "Bahrain Grand Prix", + "EventFormat": "conventional", + "Session1": "Practice 1", + "Session1Date": "2023-03-03 14:30:00+03:00", + "Session1DateUtc": "2023-03-03 11:30:00", + "Session2": "Practice 2", + "Session2Date": "2023-03-03 18:00:00+03:00", + "Session2DateUtc": "2023-03-03 15:00:00", + "Session3": "Practice 3", + "Session3Date": "2023-03-04 14:30:00+03:00", + "Session3DateUtc": "2023-03-04 11:30:00", + "Session4": "Qualifying", + "Session4Date": "2023-03-04 18:00:00+03:00", + "Session4DateUtc": "2023-03-04 15:00:00", + "Session5": "Race", + "Session5Date": "2023-03-05 18:00:00+03:00", + "Session5DateUtc": "2023-03-05 15:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 2, + "Country": "Saudi Arabia", + "Location": "Jeddah", + "OfficialEventName": "FORMULA 1 STC SAUDI ARABIAN GRAND PRIX 2023", + "EventDate": "2023-03-19", + "EventName": "Saudi Arabian Grand Prix", + "EventFormat": "conventional", + "Session1": "Practice 1", + "Session1Date": "2023-03-17 16:30:00+03:00", + "Session1DateUtc": "2023-03-17 13:30:00", + "Session2": "Practice 2", + "Session2Date": "2023-03-17 20:00:00+03:00", + "Session2DateUtc": "2023-03-17 17:00:00", + "Session3": "Practice 3", + "Session3Date": "2023-03-18 16:30:00+03:00", + "Session3DateUtc": "2023-03-18 13:30:00", + "Session4": "Qualifying", + "Session4Date": "2023-03-18 20:00:00+03:00", + "Session4DateUtc": "2023-03-18 17:00:00", + "Session5": "Race", + "Session5Date": "2023-03-19 20:00:00+03:00", + "Session5DateUtc": "2023-03-19 17:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 3, + "Country": "Australia", + "Location": "Melbourne", + "OfficialEventName": "FORMULA 1 ROLEX AUSTRALIAN GRAND PRIX 2023", + "EventDate": "2023-04-02", + "EventName": "Australian Grand Prix", + "EventFormat": "conventional", + "Session1": "Practice 1", + "Session1Date": "2023-03-31 12:30:00+10:00", + "Session1DateUtc": "2023-03-31 02:30:00", + "Session2": "Practice 2", + "Session2Date": "2023-03-31 16:00:00+10:00", + "Session2DateUtc": "2023-03-31 06:00:00", + "Session3": "Practice 3", + "Session3Date": "2023-04-01 12:30:00+10:00", + "Session3DateUtc": "2023-04-01 02:30:00", + "Session4": "Qualifying", + "Session4Date": "2023-04-01 16:00:00+10:00", + "Session4DateUtc": "2023-04-01 06:00:00", + "Session5": "Race", + "Session5Date": "2023-04-02 15:00:00+10:00", + "Session5DateUtc": "2023-04-02 05:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 4, + "Country": "Azerbaijan", + "Location": "Baku", + "OfficialEventName": "FORMULA 1 AZERBAIJAN GRAND PRIX 2023", + "EventDate": "2023-04-30", + "EventName": "Azerbaijan Grand Prix", + "EventFormat": "sprint_shootout", + "Session1": "Practice 1", + "Session1Date": "2023-04-28 13:30:00+04:00", + "Session1DateUtc": "2023-04-28 09:30:00", + "Session2": "Qualifying", + "Session2Date": "2023-04-28 17:00:00+04:00", + "Session2DateUtc": "2023-04-28 13:00:00", + "Session3": "Sprint Shootout", + "Session3Date": "2023-04-29 12:30:00+04:00", + "Session3DateUtc": "2023-04-29 08:30:00", + "Session4": "Sprint", + "Session4Date": "2023-04-29 17:30:00+04:00", + "Session4DateUtc": "2023-04-29 13:30:00", + "Session5": "Race", + "Session5Date": "2023-04-30 15:00:00+04:00", + "Session5DateUtc": "2023-04-30 11:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 5, + "Country": "United States", + "Location": "Miami", + "OfficialEventName": "FORMULA 1 CRYPTO.COM MIAMI GRAND PRIX 2023", + "EventDate": "2023-05-07", + "EventName": "Miami Grand Prix", + "EventFormat": "conventional", + "Session1": "Practice 1", + "Session1Date": "2023-05-05 14:00:00-04:00", + "Session1DateUtc": "2023-05-05 18:00:00", + "Session2": "Practice 2", + "Session2Date": "2023-05-05 17:30:00-04:00", + "Session2DateUtc": "2023-05-05 21:30:00", + "Session3": "Practice 3", + "Session3Date": "2023-05-06 12:30:00-04:00", + "Session3DateUtc": "2023-05-06 16:30:00", + "Session4": "Qualifying", + "Session4Date": "2023-05-06 16:00:00-04:00", + "Session4DateUtc": "2023-05-06 20:00:00", + "Session5": "Race", + "Session5Date": "2023-05-07 15:30:00-04:00", + "Session5DateUtc": "2023-05-07 19:30:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 6, + "Country": "Monaco", + "Location": "Monaco", + "OfficialEventName": "FORMULA 1 GRAND PRIX DE MONACO 2023", + "EventDate": "2023-05-28", + "EventName": "Monaco Grand Prix", + "EventFormat": "conventional", + "Session1": "Practice 1", + "Session1Date": "2023-05-26 13:30:00+02:00", + "Session1DateUtc": "2023-05-26 11:30:00", + "Session2": "Practice 2", + "Session2Date": "2023-05-26 17:00:00+02:00", + "Session2DateUtc": "2023-05-26 15:00:00", + "Session3": "Practice 3", + "Session3Date": "2023-05-27 12:30:00+02:00", + "Session3DateUtc": "2023-05-27 10:30:00", + "Session4": "Qualifying", + "Session4Date": "2023-05-27 16:00:00+02:00", + "Session4DateUtc": "2023-05-27 14:00:00", + "Session5": "Race", + "Session5Date": "2023-05-28 15:00:00+02:00", + "Session5DateUtc": "2023-05-28 13:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 7, + "Country": "Spain", + "Location": "Barcelona", + "OfficialEventName": "FORMULA 1 AWS GRAN PREMIO DE ESPAÑA 2023", + "EventDate": "2023-06-04", + "EventName": "Spanish Grand Prix", + "EventFormat": "conventional", + "Session1": "Practice 1", + "Session1Date": "2023-06-02 13:30:00+02:00", + "Session1DateUtc": "2023-06-02 11:30:00", + "Session2": "Practice 2", + "Session2Date": "2023-06-02 17:00:00+02:00", + "Session2DateUtc": "2023-06-02 15:00:00", + "Session3": "Practice 3", + "Session3Date": "2023-06-03 12:30:00+02:00", + "Session3DateUtc": "2023-06-03 10:30:00", + "Session4": "Qualifying", + "Session4Date": "2023-06-03 16:00:00+02:00", + "Session4DateUtc": "2023-06-03 14:00:00", + "Session5": "Race", + "Session5Date": "2023-06-04 15:00:00+02:00", + "Session5DateUtc": "2023-06-04 13:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 8, + "Country": "Canada", + "Location": "Montréal", + "OfficialEventName": "FORMULA 1 PIRELLI GRAND PRIX DU CANADA 2023", + "EventDate": "2023-06-18", + "EventName": "Canadian Grand Prix", + "EventFormat": "conventional", + "Session1": "Practice 1", + "Session1Date": "2023-06-16 13:30:00-04:00", + "Session1DateUtc": "2023-06-16 17:30:00", + "Session2": "Practice 2", + "Session2Date": "2023-06-16 16:30:00-04:00", + "Session2DateUtc": "2023-06-16 20:30:00", + "Session3": "Practice 3", + "Session3Date": "2023-06-17 12:30:00-04:00", + "Session3DateUtc": "2023-06-17 16:30:00", + "Session4": "Qualifying", + "Session4Date": "2023-06-17 16:00:00-04:00", + "Session4DateUtc": "2023-06-17 20:00:00", + "Session5": "Race", + "Session5Date": "2023-06-18 14:00:00-04:00", + "Session5DateUtc": "2023-06-18 18:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 9, + "Country": "Austria", + "Location": "Spielberg", + "OfficialEventName": "FORMULA 1 ROLEX GROSSER PREIS VON ÖSTERREICH 2023", + "EventDate": "2023-07-02", + "EventName": "Austrian Grand Prix", + "EventFormat": "sprint_shootout", + "Session1": "Practice 1", + "Session1Date": "2023-06-30 13:30:00+02:00", + "Session1DateUtc": "2023-06-30 11:30:00", + "Session2": "Qualifying", + "Session2Date": "2023-06-30 17:00:00+02:00", + "Session2DateUtc": "2023-06-30 15:00:00", + "Session3": "Sprint Shootout", + "Session3Date": "2023-07-01 12:00:00+02:00", + "Session3DateUtc": "2023-07-01 10:00:00", + "Session4": "Sprint", + "Session4Date": "2023-07-01 16:30:00+02:00", + "Session4DateUtc": "2023-07-01 14:30:00", + "Session5": "Race", + "Session5Date": "2023-07-02 15:00:00+02:00", + "Session5DateUtc": "2023-07-02 13:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 10, + "Country": "Great Britain", + "Location": "Silverstone", + "OfficialEventName": "FORMULA 1 ARAMCO BRITISH GRAND PRIX 2023", + "EventDate": "2023-07-09", + "EventName": "British Grand Prix", + "EventFormat": "conventional", + "Session1": "Practice 1", + "Session1Date": "2023-07-07 12:30:00+01:00", + "Session1DateUtc": "2023-07-07 11:30:00", + "Session2": "Practice 2", + "Session2Date": "2023-07-07 16:00:00+01:00", + "Session2DateUtc": "2023-07-07 15:00:00", + "Session3": "Practice 3", + "Session3Date": "2023-07-08 11:30:00+01:00", + "Session3DateUtc": "2023-07-08 10:30:00", + "Session4": "Qualifying", + "Session4Date": "2023-07-08 15:00:00+01:00", + "Session4DateUtc": "2023-07-08 14:00:00", + "Session5": "Race", + "Session5Date": "2023-07-09 15:00:00+01:00", + "Session5DateUtc": "2023-07-09 14:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 11, + "Country": "Hungary", + "Location": "Budapest", + "OfficialEventName": "FORMULA 1 QATAR AIRWAYS HUNGARIAN GRAND PRIX 2023", + "EventDate": "2023-07-23", + "EventName": "Hungarian Grand Prix", + "EventFormat": "conventional", + "Session1": "Practice 1", + "Session1Date": "2023-07-21 13:30:00+02:00", + "Session1DateUtc": "2023-07-21 11:30:00", + "Session2": "Practice 2", + "Session2Date": "2023-07-21 17:00:00+02:00", + "Session2DateUtc": "2023-07-21 15:00:00", + "Session3": "Practice 3", + "Session3Date": "2023-07-22 12:30:00+02:00", + "Session3DateUtc": "2023-07-22 10:30:00", + "Session4": "Qualifying", + "Session4Date": "2023-07-22 16:00:00+02:00", + "Session4DateUtc": "2023-07-22 14:00:00", + "Session5": "Race", + "Session5Date": "2023-07-23 15:00:00+02:00", + "Session5DateUtc": "2023-07-23 13:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 12, + "Country": "Belgium", + "Location": "Spa-Francorchamps", + "OfficialEventName": "FORMULA 1 MSC CRUISES BELGIAN GRAND PRIX 2023", + "EventDate": "2023-07-30", + "EventName": "Belgian Grand Prix", + "EventFormat": "sprint_shootout", + "Session1": "Practice 1", + "Session1Date": "2023-07-28 13:30:00+02:00", + "Session1DateUtc": "2023-07-28 11:30:00", + "Session2": "Qualifying", + "Session2Date": "2023-07-28 17:00:00+02:00", + "Session2DateUtc": "2023-07-28 15:00:00", + "Session3": "Sprint Shootout", + "Session3Date": "2023-07-29 12:00:00+02:00", + "Session3DateUtc": "2023-07-29 10:00:00", + "Session4": "Sprint", + "Session4Date": "2023-07-29 17:05:00+02:00", + "Session4DateUtc": "2023-07-29 15:05:00", + "Session5": "Race", + "Session5Date": "2023-07-30 15:00:00+02:00", + "Session5DateUtc": "2023-07-30 13:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 13, + "Country": "Netherlands", + "Location": "Zandvoort", + "OfficialEventName": "FORMULA 1 HEINEKEN DUTCH GRAND PRIX 2023", + "EventDate": "2023-08-27", + "EventName": "Dutch Grand Prix", + "EventFormat": "conventional", + "Session1": "Practice 1", + "Session1Date": "2023-08-25 12:30:00+02:00", + "Session1DateUtc": "2023-08-25 10:30:00", + "Session2": "Practice 2", + "Session2Date": "2023-08-25 16:00:00+02:00", + "Session2DateUtc": "2023-08-25 14:00:00", + "Session3": "Practice 3", + "Session3Date": "2023-08-26 11:30:00+02:00", + "Session3DateUtc": "2023-08-26 09:30:00", + "Session4": "Qualifying", + "Session4Date": "2023-08-26 15:00:00+02:00", + "Session4DateUtc": "2023-08-26 13:00:00", + "Session5": "Race", + "Session5Date": "2023-08-27 15:00:00+02:00", + "Session5DateUtc": "2023-08-27 13:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 14, + "Country": "Italy", + "Location": "Monza", + "OfficialEventName": "FORMULA 1 PIRELLI GRAN PREMIO D’ITALIA 2023 ", + "EventDate": "2023-09-03", + "EventName": "Italian Grand Prix", + "EventFormat": "conventional", + "Session1": "Practice 1", + "Session1Date": "2023-09-01 13:30:00+02:00", + "Session1DateUtc": "2023-09-01 11:30:00", + "Session2": "Practice 2", + "Session2Date": "2023-09-01 17:00:00+02:00", + "Session2DateUtc": "2023-09-01 15:00:00", + "Session3": "Practice 3", + "Session3Date": "2023-09-02 12:30:00+02:00", + "Session3DateUtc": "2023-09-02 10:30:00", + "Session4": "Qualifying", + "Session4Date": "2023-09-02 16:00:00+02:00", + "Session4DateUtc": "2023-09-02 14:00:00", + "Session5": "Race", + "Session5Date": "2023-09-03 15:00:00+02:00", + "Session5DateUtc": "2023-09-03 13:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 15, + "Country": "Singapore", + "Location": "Marina Bay", + "OfficialEventName": "FORMULA 1 SINGAPORE AIRLINES SINGAPORE GRAND PRIX 2023 ", + "EventDate": "2023-09-17", + "EventName": "Singapore Grand Prix", + "EventFormat": "conventional", + "Session1": "Practice 1", + "Session1Date": "2023-09-15 17:30:00+08:00", + "Session1DateUtc": "2023-09-15 09:30:00", + "Session2": "Practice 2", + "Session2Date": "2023-09-15 21:00:00+08:00", + "Session2DateUtc": "2023-09-15 13:00:00", + "Session3": "Practice 3", + "Session3Date": "2023-09-16 17:30:00+08:00", + "Session3DateUtc": "2023-09-16 09:30:00", + "Session4": "Qualifying", + "Session4Date": "2023-09-16 21:00:00+08:00", + "Session4DateUtc": "2023-09-16 13:00:00", + "Session5": "Race", + "Session5Date": "2023-09-17 20:00:00+08:00", + "Session5DateUtc": "2023-09-17 12:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 16, + "Country": "Japan", + "Location": "Suzuka", + "OfficialEventName": "FORMULA 1 LENOVO JAPANESE GRAND PRIX 2023 ", + "EventDate": "2023-09-24", + "EventName": "Japanese Grand Prix", + "EventFormat": "conventional", + "Session1": "Practice 1", + "Session1Date": "2023-09-22 11:30:00+09:00", + "Session1DateUtc": "2023-09-22 02:30:00", + "Session2": "Practice 2", + "Session2Date": "2023-09-22 15:00:00+09:00", + "Session2DateUtc": "2023-09-22 06:00:00", + "Session3": "Practice 3", + "Session3Date": "2023-09-23 11:30:00+09:00", + "Session3DateUtc": "2023-09-23 02:30:00", + "Session4": "Qualifying", + "Session4Date": "2023-09-23 15:00:00+09:00", + "Session4DateUtc": "2023-09-23 06:00:00", + "Session5": "Race", + "Session5Date": "2023-09-24 14:00:00+09:00", + "Session5DateUtc": "2023-09-24 05:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 17, + "Country": "Qatar", + "Location": "Lusail", + "OfficialEventName": "FORMULA 1 QATAR AIRWAYS QATAR GRAND PRIX 2023", + "EventDate": "2023-10-08", + "EventName": "Qatar Grand Prix", + "EventFormat": "sprint_shootout", + "Session1": "Practice 1", + "Session1Date": "2023-10-06 16:30:00+03:00", + "Session1DateUtc": "2023-10-06 13:30:00", + "Session2": "Qualifying", + "Session2Date": "2023-10-06 20:00:00+03:00", + "Session2DateUtc": "2023-10-06 17:00:00", + "Session3": "Sprint Shootout", + "Session3Date": "2023-10-07 16:20:00+03:00", + "Session3DateUtc": "2023-10-07 13:20:00", + "Session4": "Sprint", + "Session4Date": "2023-10-07 20:30:00+03:00", + "Session4DateUtc": "2023-10-07 17:30:00", + "Session5": "Race", + "Session5Date": "2023-10-08 20:00:00+03:00", + "Session5DateUtc": "2023-10-08 17:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 18, + "Country": "United States", + "Location": "Austin", + "OfficialEventName": "FORMULA 1 LENOVO UNITED STATES GRAND PRIX 2023", + "EventDate": "2023-10-22", + "EventName": "United States Grand Prix", + "EventFormat": "sprint_shootout", + "Session1": "Practice 1", + "Session1Date": "2023-10-20 12:30:00-05:00", + "Session1DateUtc": "2023-10-20 17:30:00", + "Session2": "Qualifying", + "Session2Date": "2023-10-20 16:00:00-05:00", + "Session2DateUtc": "2023-10-20 21:00:00", + "Session3": "Sprint Shootout", + "Session3Date": "2023-10-21 12:30:00-05:00", + "Session3DateUtc": "2023-10-21 17:30:00", + "Session4": "Sprint", + "Session4Date": "2023-10-21 17:00:00-05:00", + "Session4DateUtc": "2023-10-21 22:00:00", + "Session5": "Race", + "Session5Date": "2023-10-22 14:00:00-05:00", + "Session5DateUtc": "2023-10-22 19:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 19, + "Country": "Mexico", + "Location": "Mexico City", + "OfficialEventName": "FORMULA 1 GRAN PREMIO DE LA CIUDAD DE MÉXICO 2023", + "EventDate": "2023-10-29", + "EventName": "Mexico City Grand Prix", + "EventFormat": "conventional", + "Session1": "Practice 1", + "Session1Date": "2023-10-27 12:30:00-06:00", + "Session1DateUtc": "2023-10-27 18:30:00", + "Session2": "Practice 2", + "Session2Date": "2023-10-27 16:00:00-06:00", + "Session2DateUtc": "2023-10-27 22:00:00", + "Session3": "Practice 3", + "Session3Date": "2023-10-28 11:30:00-06:00", + "Session3DateUtc": "2023-10-28 17:30:00", + "Session4": "Qualifying", + "Session4Date": "2023-10-28 15:00:00-06:00", + "Session4DateUtc": "2023-10-28 21:00:00", + "Session5": "Race", + "Session5Date": "2023-10-29 14:00:00-06:00", + "Session5DateUtc": "2023-10-29 20:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 20, + "Country": "Brazil", + "Location": "São Paulo", + "OfficialEventName": "FORMULA 1 ROLEX GRANDE PRÊMIO DE SÃO PAULO 2023", + "EventDate": "2023-11-05", + "EventName": "São Paulo Grand Prix", + "EventFormat": "sprint_shootout", + "Session1": "Practice 1", + "Session1Date": "2023-11-03 11:30:00-03:00", + "Session1DateUtc": "2023-11-03 14:30:00", + "Session2": "Qualifying", + "Session2Date": "2023-11-03 15:00:00-03:00", + "Session2DateUtc": "2023-11-03 18:00:00", + "Session3": "Sprint Shootout", + "Session3Date": "2023-11-04 11:00:00-03:00", + "Session3DateUtc": "2023-11-04 14:00:00", + "Session4": "Sprint", + "Session4Date": "2023-11-04 15:30:00-03:00", + "Session4DateUtc": "2023-11-04 18:30:00", + "Session5": "Race", + "Session5Date": "2023-11-05 14:00:00-03:00", + "Session5DateUtc": "2023-11-05 17:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 21, + "Country": "United States", + "Location": "Las Vegas", + "OfficialEventName": "FORMULA 1 HEINEKEN SILVER LAS VEGAS GRAND PRIX 2023", + "EventDate": "2023-11-18", + "EventName": "Las Vegas Grand Prix", + "EventFormat": "conventional", + "Session1": "Practice 1", + "Session1Date": "2023-11-16 20:30:00-08:00", + "Session1DateUtc": "2023-11-17 04:30:00", + "Session2": "Practice 2", + "Session2Date": "2023-11-17 02:30:00-08:00", + "Session2DateUtc": "2023-11-17 10:30:00", + "Session3": "Practice 3", + "Session3Date": "2023-11-17 20:30:00-08:00", + "Session3DateUtc": "2023-11-18 04:30:00", + "Session4": "Qualifying", + "Session4Date": "2023-11-18 00:00:00-08:00", + "Session4DateUtc": "2023-11-18 08:00:00", + "Session5": "Race", + "Session5Date": "2023-11-18 22:00:00-08:00", + "Session5DateUtc": "2023-11-19 06:00:00", + "F1ApiSupport": True, + }, + { + "RoundNumber": 22, + "Country": "Abu Dhabi", + "Location": "Yas Island", + "OfficialEventName": "FORMULA 1 ETIHAD AIRWAYS ABU DHABI GRAND PRIX 2023 ", + "EventDate": "2023-11-26", + "EventName": "Abu Dhabi Grand Prix", + "EventFormat": "conventional", + "Session1": "Practice 1", + "Session1Date": "2023-11-24 13:30:00+04:00", + "Session1DateUtc": "2023-11-24 09:30:00", + "Session2": "Practice 2", + "Session2Date": "2023-11-24 17:00:00+04:00", + "Session2DateUtc": "2023-11-24 13:00:00", + "Session3": "Practice 3", + "Session3Date": "2023-11-25 14:30:00+04:00", + "Session3DateUtc": "2023-11-25 10:30:00", + "Session4": "Qualifying", + "Session4Date": "2023-11-25 18:00:00+04:00", + "Session4DateUtc": "2023-11-25 14:00:00", + "Session5": "Race", + "Session5Date": "2023-11-26 17:00:00+04:00", + "Session5DateUtc": "2023-11-26 13:00:00", + "F1ApiSupport": True, + }, + ] + + +# endregion schedule - good inputs + +# region schedule - no or bad inputs def test_get_schedule_bad_year_no_input(): - response = client.get("/schedule/?year=") + response = client.get("/schedule?year=") assert response.status_code == 422 assert response.json() == { "detail": [ @@ -66,26 +1228,24 @@ def test_get_schedule_bad_year_no_input(): def test_get_schedule_bad_year_lower_limit(): - response = client.get("/schedule/?year=1949") + response = client.get(f"/schedule?year={MIN_SUPPORTED_YEAR - 1}") assert response.status_code == 422 assert response.json() == { "detail": [ { - "type": "greater_than", + "type": "greater_than_equal", "loc": ["query", "year"], - "msg": "Input should be greater than 1949", + "msg": "Input should be greater than or equal to 1950", "input": "1949", - "ctx": {"gt": 1949}, - "url": "https://errors.pydantic.dev/2.5/v/greater_than", + "ctx": {"ge": 1950}, + "url": "https://errors.pydantic.dev/2.5/v/greater_than_equal", } ] } def test_get_schedule_bad_year_upper_limit(): - current_year = datetime.today().year - bad_year = current_year + 1 - response = client.get(f"/schedule/?year={bad_year}") + response = client.get(f"/schedule?year={MAX_SUPPORTED_YEAR + 1}") assert response.status_code == 422 assert response.json() == { "detail": [ @@ -99,3 +1259,2270 @@ def test_get_schedule_bad_year_upper_limit(): } ] } + + +# endregion schedule - no or bad inputs + +# endregion schedule + + +# region standings + +# region standings - good inputs + + +def test_get_standings(): + response = client.get("/standings") + assert response.status_code == 200 + assert response.json() == { + "season": 2023, + "round": 22, + "DriverStandings": [ + { + "position": "1", + "positionText": "1", + "points": "575", + "wins": "19", + "Driver": { + "driverId": "max_verstappen", + "permanentNumber": "33", + "code": "VER", + "url": "http://en.wikipedia.org/wiki/Max_Verstappen", + "givenName": "Max", + "familyName": "Verstappen", + "dateOfBirth": "1997-09-30", + "nationality": "Dutch", + }, + "Constructors": [ + { + "constructorId": "red_bull", + "url": "http://en.wikipedia.org/wiki/Red_Bull_Racing", + "name": "Red Bull", + "nationality": "Austrian", + } + ], + }, + { + "position": "2", + "positionText": "2", + "points": "285", + "wins": "2", + "Driver": { + "driverId": "perez", + "permanentNumber": "11", + "code": "PER", + "url": "http://en.wikipedia.org/wiki/Sergio_P%C3%A9rez", + "givenName": "Sergio", + "familyName": "Pérez", + "dateOfBirth": "1990-01-26", + "nationality": "Mexican", + }, + "Constructors": [ + { + "constructorId": "red_bull", + "url": "http://en.wikipedia.org/wiki/Red_Bull_Racing", + "name": "Red Bull", + "nationality": "Austrian", + } + ], + }, + { + "position": "3", + "positionText": "3", + "points": "234", + "wins": "0", + "Driver": { + "driverId": "hamilton", + "permanentNumber": "44", + "code": "HAM", + "url": "http://en.wikipedia.org/wiki/Lewis_Hamilton", + "givenName": "Lewis", + "familyName": "Hamilton", + "dateOfBirth": "1985-01-07", + "nationality": "British", + }, + "Constructors": [ + { + "constructorId": "mercedes", + "url": "http://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_One", + "name": "Mercedes", + "nationality": "German", + } + ], + }, + { + "position": "4", + "positionText": "4", + "points": "206", + "wins": "0", + "Driver": { + "driverId": "alonso", + "permanentNumber": "14", + "code": "ALO", + "url": "http://en.wikipedia.org/wiki/Fernando_Alonso", + "givenName": "Fernando", + "familyName": "Alonso", + "dateOfBirth": "1981-07-29", + "nationality": "Spanish", + }, + "Constructors": [ + { + "constructorId": "aston_martin", + "url": "http://en.wikipedia.org/wiki/Aston_Martin_in_Formula_One", + "name": "Aston Martin", + "nationality": "British", + } + ], + }, + { + "position": "5", + "positionText": "5", + "points": "206", + "wins": "0", + "Driver": { + "driverId": "leclerc", + "permanentNumber": "16", + "code": "LEC", + "url": "http://en.wikipedia.org/wiki/Charles_Leclerc", + "givenName": "Charles", + "familyName": "Leclerc", + "dateOfBirth": "1997-10-16", + "nationality": "Monegasque", + }, + "Constructors": [ + { + "constructorId": "ferrari", + "url": "http://en.wikipedia.org/wiki/Scuderia_Ferrari", + "name": "Ferrari", + "nationality": "Italian", + } + ], + }, + { + "position": "6", + "positionText": "6", + "points": "205", + "wins": "0", + "Driver": { + "driverId": "norris", + "permanentNumber": "4", + "code": "NOR", + "url": "http://en.wikipedia.org/wiki/Lando_Norris", + "givenName": "Lando", + "familyName": "Norris", + "dateOfBirth": "1999-11-13", + "nationality": "British", + }, + "Constructors": [ + { + "constructorId": "mclaren", + "url": "http://en.wikipedia.org/wiki/McLaren", + "name": "McLaren", + "nationality": "British", + } + ], + }, + { + "position": "7", + "positionText": "7", + "points": "200", + "wins": "1", + "Driver": { + "driverId": "sainz", + "permanentNumber": "55", + "code": "SAI", + "url": "http://en.wikipedia.org/wiki/Carlos_Sainz_Jr.", + "givenName": "Carlos", + "familyName": "Sainz", + "dateOfBirth": "1994-09-01", + "nationality": "Spanish", + }, + "Constructors": [ + { + "constructorId": "ferrari", + "url": "http://en.wikipedia.org/wiki/Scuderia_Ferrari", + "name": "Ferrari", + "nationality": "Italian", + } + ], + }, + { + "position": "8", + "positionText": "8", + "points": "175", + "wins": "0", + "Driver": { + "driverId": "russell", + "permanentNumber": "63", + "code": "RUS", + "url": "http://en.wikipedia.org/wiki/George_Russell_(racing_driver)", + "givenName": "George", + "familyName": "Russell", + "dateOfBirth": "1998-02-15", + "nationality": "British", + }, + "Constructors": [ + { + "constructorId": "mercedes", + "url": "http://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_One", + "name": "Mercedes", + "nationality": "German", + } + ], + }, + { + "position": "9", + "positionText": "9", + "points": "97", + "wins": "0", + "Driver": { + "driverId": "piastri", + "permanentNumber": "81", + "code": "PIA", + "url": "http://en.wikipedia.org/wiki/Oscar_Piastri", + "givenName": "Oscar", + "familyName": "Piastri", + "dateOfBirth": "2001-04-06", + "nationality": "Australian", + }, + "Constructors": [ + { + "constructorId": "mclaren", + "url": "http://en.wikipedia.org/wiki/McLaren", + "name": "McLaren", + "nationality": "British", + } + ], + }, + { + "position": "10", + "positionText": "10", + "points": "74", + "wins": "0", + "Driver": { + "driverId": "stroll", + "permanentNumber": "18", + "code": "STR", + "url": "http://en.wikipedia.org/wiki/Lance_Stroll", + "givenName": "Lance", + "familyName": "Stroll", + "dateOfBirth": "1998-10-29", + "nationality": "Canadian", + }, + "Constructors": [ + { + "constructorId": "aston_martin", + "url": "http://en.wikipedia.org/wiki/Aston_Martin_in_Formula_One", + "name": "Aston Martin", + "nationality": "British", + } + ], + }, + { + "position": "11", + "positionText": "11", + "points": "62", + "wins": "0", + "Driver": { + "driverId": "gasly", + "permanentNumber": "10", + "code": "GAS", + "url": "http://en.wikipedia.org/wiki/Pierre_Gasly", + "givenName": "Pierre", + "familyName": "Gasly", + "dateOfBirth": "1996-02-07", + "nationality": "French", + }, + "Constructors": [ + { + "constructorId": "alpine", + "url": "http://en.wikipedia.org/wiki/Alpine_F1_Team", + "name": "Alpine F1 Team", + "nationality": "French", + } + ], + }, + { + "position": "12", + "positionText": "12", + "points": "58", + "wins": "0", + "Driver": { + "driverId": "ocon", + "permanentNumber": "31", + "code": "OCO", + "url": "http://en.wikipedia.org/wiki/Esteban_Ocon", + "givenName": "Esteban", + "familyName": "Ocon", + "dateOfBirth": "1996-09-17", + "nationality": "French", + }, + "Constructors": [ + { + "constructorId": "alpine", + "url": "http://en.wikipedia.org/wiki/Alpine_F1_Team", + "name": "Alpine F1 Team", + "nationality": "French", + } + ], + }, + { + "position": "13", + "positionText": "13", + "points": "27", + "wins": "0", + "Driver": { + "driverId": "albon", + "permanentNumber": "23", + "code": "ALB", + "url": "http://en.wikipedia.org/wiki/Alexander_Albon", + "givenName": "Alexander", + "familyName": "Albon", + "dateOfBirth": "1996-03-23", + "nationality": "Thai", + }, + "Constructors": [ + { + "constructorId": "williams", + "url": "http://en.wikipedia.org/wiki/Williams_Grand_Prix_Engineering", + "name": "Williams", + "nationality": "British", + } + ], + }, + { + "position": "14", + "positionText": "14", + "points": "17", + "wins": "0", + "Driver": { + "driverId": "tsunoda", + "permanentNumber": "22", + "code": "TSU", + "url": "http://en.wikipedia.org/wiki/Yuki_Tsunoda", + "givenName": "Yuki", + "familyName": "Tsunoda", + "dateOfBirth": "2000-05-11", + "nationality": "Japanese", + }, + "Constructors": [ + { + "constructorId": "alphatauri", + "url": "http://en.wikipedia.org/wiki/Scuderia_AlphaTauri", + "name": "AlphaTauri", + "nationality": "Italian", + } + ], + }, + { + "position": "15", + "positionText": "15", + "points": "10", + "wins": "0", + "Driver": { + "driverId": "bottas", + "permanentNumber": "77", + "code": "BOT", + "url": "http://en.wikipedia.org/wiki/Valtteri_Bottas", + "givenName": "Valtteri", + "familyName": "Bottas", + "dateOfBirth": "1989-08-28", + "nationality": "Finnish", + }, + "Constructors": [ + { + "constructorId": "alfa", + "url": "http://en.wikipedia.org/wiki/Alfa_Romeo_in_Formula_One", + "name": "Alfa Romeo", + "nationality": "Swiss", + } + ], + }, + { + "position": "16", + "positionText": "16", + "points": "9", + "wins": "0", + "Driver": { + "driverId": "hulkenberg", + "permanentNumber": "27", + "code": "HUL", + "url": "http://en.wikipedia.org/wiki/Nico_H%C3%BClkenberg", + "givenName": "Nico", + "familyName": "Hülkenberg", + "dateOfBirth": "1987-08-19", + "nationality": "German", + }, + "Constructors": [ + { + "constructorId": "haas", + "url": "http://en.wikipedia.org/wiki/Haas_F1_Team", + "name": "Haas F1 Team", + "nationality": "American", + } + ], + }, + { + "position": "17", + "positionText": "17", + "points": "6", + "wins": "0", + "Driver": { + "driverId": "ricciardo", + "permanentNumber": "3", + "code": "RIC", + "url": "http://en.wikipedia.org/wiki/Daniel_Ricciardo", + "givenName": "Daniel", + "familyName": "Ricciardo", + "dateOfBirth": "1989-07-01", + "nationality": "Australian", + }, + "Constructors": [ + { + "constructorId": "alphatauri", + "url": "http://en.wikipedia.org/wiki/Scuderia_AlphaTauri", + "name": "AlphaTauri", + "nationality": "Italian", + } + ], + }, + { + "position": "18", + "positionText": "18", + "points": "6", + "wins": "0", + "Driver": { + "driverId": "zhou", + "permanentNumber": "24", + "code": "ZHO", + "url": "http://en.wikipedia.org/wiki/Zhou_Guanyu", + "givenName": "Guanyu", + "familyName": "Zhou", + "dateOfBirth": "1999-05-30", + "nationality": "Chinese", + }, + "Constructors": [ + { + "constructorId": "alfa", + "url": "http://en.wikipedia.org/wiki/Alfa_Romeo_in_Formula_One", + "name": "Alfa Romeo", + "nationality": "Swiss", + } + ], + }, + { + "position": "19", + "positionText": "19", + "points": "3", + "wins": "0", + "Driver": { + "driverId": "kevin_magnussen", + "permanentNumber": "20", + "code": "MAG", + "url": "http://en.wikipedia.org/wiki/Kevin_Magnussen", + "givenName": "Kevin", + "familyName": "Magnussen", + "dateOfBirth": "1992-10-05", + "nationality": "Danish", + }, + "Constructors": [ + { + "constructorId": "haas", + "url": "http://en.wikipedia.org/wiki/Haas_F1_Team", + "name": "Haas F1 Team", + "nationality": "American", + } + ], + }, + { + "position": "20", + "positionText": "20", + "points": "2", + "wins": "0", + "Driver": { + "driverId": "lawson", + "permanentNumber": "40", + "code": "LAW", + "url": "http://en.wikipedia.org/wiki/Liam_Lawson", + "givenName": "Liam", + "familyName": "Lawson", + "dateOfBirth": "2002-02-11", + "nationality": "New Zealander", + }, + "Constructors": [ + { + "constructorId": "alphatauri", + "url": "http://en.wikipedia.org/wiki/Scuderia_AlphaTauri", + "name": "AlphaTauri", + "nationality": "Italian", + } + ], + }, + { + "position": "21", + "positionText": "21", + "points": "1", + "wins": "0", + "Driver": { + "driverId": "sargeant", + "permanentNumber": "2", + "code": "SAR", + "url": "http://en.wikipedia.org/wiki/Logan_Sargeant", + "givenName": "Logan", + "familyName": "Sargeant", + "dateOfBirth": "2000-12-31", + "nationality": "American", + }, + "Constructors": [ + { + "constructorId": "williams", + "url": "http://en.wikipedia.org/wiki/Williams_Grand_Prix_Engineering", + "name": "Williams", + "nationality": "British", + } + ], + }, + { + "position": "22", + "positionText": "22", + "points": "0", + "wins": "0", + "Driver": { + "driverId": "de_vries", + "permanentNumber": "21", + "code": "DEV", + "url": "http://en.wikipedia.org/wiki/Nyck_de_Vries", + "givenName": "Nyck", + "familyName": "de Vries", + "dateOfBirth": "1995-02-06", + "nationality": "Dutch", + }, + "Constructors": [ + { + "constructorId": "alphatauri", + "url": "http://en.wikipedia.org/wiki/Scuderia_AlphaTauri", + "name": "AlphaTauri", + "nationality": "Italian", + } + ], + }, + ], + "ConstructorStandings": [ + { + "position": "1", + "positionText": "1", + "points": "860", + "wins": "21", + "Constructor": { + "constructorId": "red_bull", + "url": "http://en.wikipedia.org/wiki/Red_Bull_Racing", + "name": "Red Bull", + "nationality": "Austrian", + }, + }, + { + "position": "2", + "positionText": "2", + "points": "409", + "wins": "0", + "Constructor": { + "constructorId": "mercedes", + "url": "http://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_One", + "name": "Mercedes", + "nationality": "German", + }, + }, + { + "position": "3", + "positionText": "3", + "points": "406", + "wins": "1", + "Constructor": { + "constructorId": "ferrari", + "url": "http://en.wikipedia.org/wiki/Scuderia_Ferrari", + "name": "Ferrari", + "nationality": "Italian", + }, + }, + { + "position": "4", + "positionText": "4", + "points": "302", + "wins": "0", + "Constructor": { + "constructorId": "mclaren", + "url": "http://en.wikipedia.org/wiki/McLaren", + "name": "McLaren", + "nationality": "British", + }, + }, + { + "position": "5", + "positionText": "5", + "points": "280", + "wins": "0", + "Constructor": { + "constructorId": "aston_martin", + "url": "http://en.wikipedia.org/wiki/Aston_Martin_in_Formula_One", + "name": "Aston Martin", + "nationality": "British", + }, + }, + { + "position": "6", + "positionText": "6", + "points": "120", + "wins": "0", + "Constructor": { + "constructorId": "alpine", + "url": "http://en.wikipedia.org/wiki/Alpine_F1_Team", + "name": "Alpine F1 Team", + "nationality": "French", + }, + }, + { + "position": "7", + "positionText": "7", + "points": "28", + "wins": "0", + "Constructor": { + "constructorId": "williams", + "url": "http://en.wikipedia.org/wiki/Williams_Grand_Prix_Engineering", + "name": "Williams", + "nationality": "British", + }, + }, + { + "position": "8", + "positionText": "8", + "points": "25", + "wins": "0", + "Constructor": { + "constructorId": "alphatauri", + "url": "http://en.wikipedia.org/wiki/Scuderia_AlphaTauri", + "name": "AlphaTauri", + "nationality": "Italian", + }, + }, + { + "position": "9", + "positionText": "9", + "points": "16", + "wins": "0", + "Constructor": { + "constructorId": "alfa", + "url": "http://en.wikipedia.org/wiki/Alfa_Romeo_in_Formula_One", + "name": "Alfa Romeo", + "nationality": "Swiss", + }, + }, + { + "position": "10", + "positionText": "10", + "points": "12", + "wins": "0", + "Constructor": { + "constructorId": "haas", + "url": "http://en.wikipedia.org/wiki/Haas_F1_Team", + "name": "Haas F1 Team", + "nationality": "American", + }, + }, + ], + } + + +def test_get_standings_good_year_only(): + response = client.get("/standings?year=2023") + assert response.status_code == 200 + assert response.json() == { + "season": 2023, + "round": 22, + "DriverStandings": [ + { + "position": "1", + "positionText": "1", + "points": "575", + "wins": "19", + "Driver": { + "driverId": "max_verstappen", + "permanentNumber": "33", + "code": "VER", + "url": "http://en.wikipedia.org/wiki/Max_Verstappen", + "givenName": "Max", + "familyName": "Verstappen", + "dateOfBirth": "1997-09-30", + "nationality": "Dutch", + }, + "Constructors": [ + { + "constructorId": "red_bull", + "url": "http://en.wikipedia.org/wiki/Red_Bull_Racing", + "name": "Red Bull", + "nationality": "Austrian", + } + ], + }, + { + "position": "2", + "positionText": "2", + "points": "285", + "wins": "2", + "Driver": { + "driverId": "perez", + "permanentNumber": "11", + "code": "PER", + "url": "http://en.wikipedia.org/wiki/Sergio_P%C3%A9rez", + "givenName": "Sergio", + "familyName": "Pérez", + "dateOfBirth": "1990-01-26", + "nationality": "Mexican", + }, + "Constructors": [ + { + "constructorId": "red_bull", + "url": "http://en.wikipedia.org/wiki/Red_Bull_Racing", + "name": "Red Bull", + "nationality": "Austrian", + } + ], + }, + { + "position": "3", + "positionText": "3", + "points": "234", + "wins": "0", + "Driver": { + "driverId": "hamilton", + "permanentNumber": "44", + "code": "HAM", + "url": "http://en.wikipedia.org/wiki/Lewis_Hamilton", + "givenName": "Lewis", + "familyName": "Hamilton", + "dateOfBirth": "1985-01-07", + "nationality": "British", + }, + "Constructors": [ + { + "constructorId": "mercedes", + "url": "http://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_One", + "name": "Mercedes", + "nationality": "German", + } + ], + }, + { + "position": "4", + "positionText": "4", + "points": "206", + "wins": "0", + "Driver": { + "driverId": "alonso", + "permanentNumber": "14", + "code": "ALO", + "url": "http://en.wikipedia.org/wiki/Fernando_Alonso", + "givenName": "Fernando", + "familyName": "Alonso", + "dateOfBirth": "1981-07-29", + "nationality": "Spanish", + }, + "Constructors": [ + { + "constructorId": "aston_martin", + "url": "http://en.wikipedia.org/wiki/Aston_Martin_in_Formula_One", + "name": "Aston Martin", + "nationality": "British", + } + ], + }, + { + "position": "5", + "positionText": "5", + "points": "206", + "wins": "0", + "Driver": { + "driverId": "leclerc", + "permanentNumber": "16", + "code": "LEC", + "url": "http://en.wikipedia.org/wiki/Charles_Leclerc", + "givenName": "Charles", + "familyName": "Leclerc", + "dateOfBirth": "1997-10-16", + "nationality": "Monegasque", + }, + "Constructors": [ + { + "constructorId": "ferrari", + "url": "http://en.wikipedia.org/wiki/Scuderia_Ferrari", + "name": "Ferrari", + "nationality": "Italian", + } + ], + }, + { + "position": "6", + "positionText": "6", + "points": "205", + "wins": "0", + "Driver": { + "driverId": "norris", + "permanentNumber": "4", + "code": "NOR", + "url": "http://en.wikipedia.org/wiki/Lando_Norris", + "givenName": "Lando", + "familyName": "Norris", + "dateOfBirth": "1999-11-13", + "nationality": "British", + }, + "Constructors": [ + { + "constructorId": "mclaren", + "url": "http://en.wikipedia.org/wiki/McLaren", + "name": "McLaren", + "nationality": "British", + } + ], + }, + { + "position": "7", + "positionText": "7", + "points": "200", + "wins": "1", + "Driver": { + "driverId": "sainz", + "permanentNumber": "55", + "code": "SAI", + "url": "http://en.wikipedia.org/wiki/Carlos_Sainz_Jr.", + "givenName": "Carlos", + "familyName": "Sainz", + "dateOfBirth": "1994-09-01", + "nationality": "Spanish", + }, + "Constructors": [ + { + "constructorId": "ferrari", + "url": "http://en.wikipedia.org/wiki/Scuderia_Ferrari", + "name": "Ferrari", + "nationality": "Italian", + } + ], + }, + { + "position": "8", + "positionText": "8", + "points": "175", + "wins": "0", + "Driver": { + "driverId": "russell", + "permanentNumber": "63", + "code": "RUS", + "url": "http://en.wikipedia.org/wiki/George_Russell_(racing_driver)", + "givenName": "George", + "familyName": "Russell", + "dateOfBirth": "1998-02-15", + "nationality": "British", + }, + "Constructors": [ + { + "constructorId": "mercedes", + "url": "http://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_One", + "name": "Mercedes", + "nationality": "German", + } + ], + }, + { + "position": "9", + "positionText": "9", + "points": "97", + "wins": "0", + "Driver": { + "driverId": "piastri", + "permanentNumber": "81", + "code": "PIA", + "url": "http://en.wikipedia.org/wiki/Oscar_Piastri", + "givenName": "Oscar", + "familyName": "Piastri", + "dateOfBirth": "2001-04-06", + "nationality": "Australian", + }, + "Constructors": [ + { + "constructorId": "mclaren", + "url": "http://en.wikipedia.org/wiki/McLaren", + "name": "McLaren", + "nationality": "British", + } + ], + }, + { + "position": "10", + "positionText": "10", + "points": "74", + "wins": "0", + "Driver": { + "driverId": "stroll", + "permanentNumber": "18", + "code": "STR", + "url": "http://en.wikipedia.org/wiki/Lance_Stroll", + "givenName": "Lance", + "familyName": "Stroll", + "dateOfBirth": "1998-10-29", + "nationality": "Canadian", + }, + "Constructors": [ + { + "constructorId": "aston_martin", + "url": "http://en.wikipedia.org/wiki/Aston_Martin_in_Formula_One", + "name": "Aston Martin", + "nationality": "British", + } + ], + }, + { + "position": "11", + "positionText": "11", + "points": "62", + "wins": "0", + "Driver": { + "driverId": "gasly", + "permanentNumber": "10", + "code": "GAS", + "url": "http://en.wikipedia.org/wiki/Pierre_Gasly", + "givenName": "Pierre", + "familyName": "Gasly", + "dateOfBirth": "1996-02-07", + "nationality": "French", + }, + "Constructors": [ + { + "constructorId": "alpine", + "url": "http://en.wikipedia.org/wiki/Alpine_F1_Team", + "name": "Alpine F1 Team", + "nationality": "French", + } + ], + }, + { + "position": "12", + "positionText": "12", + "points": "58", + "wins": "0", + "Driver": { + "driverId": "ocon", + "permanentNumber": "31", + "code": "OCO", + "url": "http://en.wikipedia.org/wiki/Esteban_Ocon", + "givenName": "Esteban", + "familyName": "Ocon", + "dateOfBirth": "1996-09-17", + "nationality": "French", + }, + "Constructors": [ + { + "constructorId": "alpine", + "url": "http://en.wikipedia.org/wiki/Alpine_F1_Team", + "name": "Alpine F1 Team", + "nationality": "French", + } + ], + }, + { + "position": "13", + "positionText": "13", + "points": "27", + "wins": "0", + "Driver": { + "driverId": "albon", + "permanentNumber": "23", + "code": "ALB", + "url": "http://en.wikipedia.org/wiki/Alexander_Albon", + "givenName": "Alexander", + "familyName": "Albon", + "dateOfBirth": "1996-03-23", + "nationality": "Thai", + }, + "Constructors": [ + { + "constructorId": "williams", + "url": "http://en.wikipedia.org/wiki/Williams_Grand_Prix_Engineering", + "name": "Williams", + "nationality": "British", + } + ], + }, + { + "position": "14", + "positionText": "14", + "points": "17", + "wins": "0", + "Driver": { + "driverId": "tsunoda", + "permanentNumber": "22", + "code": "TSU", + "url": "http://en.wikipedia.org/wiki/Yuki_Tsunoda", + "givenName": "Yuki", + "familyName": "Tsunoda", + "dateOfBirth": "2000-05-11", + "nationality": "Japanese", + }, + "Constructors": [ + { + "constructorId": "alphatauri", + "url": "http://en.wikipedia.org/wiki/Scuderia_AlphaTauri", + "name": "AlphaTauri", + "nationality": "Italian", + } + ], + }, + { + "position": "15", + "positionText": "15", + "points": "10", + "wins": "0", + "Driver": { + "driverId": "bottas", + "permanentNumber": "77", + "code": "BOT", + "url": "http://en.wikipedia.org/wiki/Valtteri_Bottas", + "givenName": "Valtteri", + "familyName": "Bottas", + "dateOfBirth": "1989-08-28", + "nationality": "Finnish", + }, + "Constructors": [ + { + "constructorId": "alfa", + "url": "http://en.wikipedia.org/wiki/Alfa_Romeo_in_Formula_One", + "name": "Alfa Romeo", + "nationality": "Swiss", + } + ], + }, + { + "position": "16", + "positionText": "16", + "points": "9", + "wins": "0", + "Driver": { + "driverId": "hulkenberg", + "permanentNumber": "27", + "code": "HUL", + "url": "http://en.wikipedia.org/wiki/Nico_H%C3%BClkenberg", + "givenName": "Nico", + "familyName": "Hülkenberg", + "dateOfBirth": "1987-08-19", + "nationality": "German", + }, + "Constructors": [ + { + "constructorId": "haas", + "url": "http://en.wikipedia.org/wiki/Haas_F1_Team", + "name": "Haas F1 Team", + "nationality": "American", + } + ], + }, + { + "position": "17", + "positionText": "17", + "points": "6", + "wins": "0", + "Driver": { + "driverId": "ricciardo", + "permanentNumber": "3", + "code": "RIC", + "url": "http://en.wikipedia.org/wiki/Daniel_Ricciardo", + "givenName": "Daniel", + "familyName": "Ricciardo", + "dateOfBirth": "1989-07-01", + "nationality": "Australian", + }, + "Constructors": [ + { + "constructorId": "alphatauri", + "url": "http://en.wikipedia.org/wiki/Scuderia_AlphaTauri", + "name": "AlphaTauri", + "nationality": "Italian", + } + ], + }, + { + "position": "18", + "positionText": "18", + "points": "6", + "wins": "0", + "Driver": { + "driverId": "zhou", + "permanentNumber": "24", + "code": "ZHO", + "url": "http://en.wikipedia.org/wiki/Zhou_Guanyu", + "givenName": "Guanyu", + "familyName": "Zhou", + "dateOfBirth": "1999-05-30", + "nationality": "Chinese", + }, + "Constructors": [ + { + "constructorId": "alfa", + "url": "http://en.wikipedia.org/wiki/Alfa_Romeo_in_Formula_One", + "name": "Alfa Romeo", + "nationality": "Swiss", + } + ], + }, + { + "position": "19", + "positionText": "19", + "points": "3", + "wins": "0", + "Driver": { + "driverId": "kevin_magnussen", + "permanentNumber": "20", + "code": "MAG", + "url": "http://en.wikipedia.org/wiki/Kevin_Magnussen", + "givenName": "Kevin", + "familyName": "Magnussen", + "dateOfBirth": "1992-10-05", + "nationality": "Danish", + }, + "Constructors": [ + { + "constructorId": "haas", + "url": "http://en.wikipedia.org/wiki/Haas_F1_Team", + "name": "Haas F1 Team", + "nationality": "American", + } + ], + }, + { + "position": "20", + "positionText": "20", + "points": "2", + "wins": "0", + "Driver": { + "driverId": "lawson", + "permanentNumber": "40", + "code": "LAW", + "url": "http://en.wikipedia.org/wiki/Liam_Lawson", + "givenName": "Liam", + "familyName": "Lawson", + "dateOfBirth": "2002-02-11", + "nationality": "New Zealander", + }, + "Constructors": [ + { + "constructorId": "alphatauri", + "url": "http://en.wikipedia.org/wiki/Scuderia_AlphaTauri", + "name": "AlphaTauri", + "nationality": "Italian", + } + ], + }, + { + "position": "21", + "positionText": "21", + "points": "1", + "wins": "0", + "Driver": { + "driverId": "sargeant", + "permanentNumber": "2", + "code": "SAR", + "url": "http://en.wikipedia.org/wiki/Logan_Sargeant", + "givenName": "Logan", + "familyName": "Sargeant", + "dateOfBirth": "2000-12-31", + "nationality": "American", + }, + "Constructors": [ + { + "constructorId": "williams", + "url": "http://en.wikipedia.org/wiki/Williams_Grand_Prix_Engineering", + "name": "Williams", + "nationality": "British", + } + ], + }, + { + "position": "22", + "positionText": "22", + "points": "0", + "wins": "0", + "Driver": { + "driverId": "de_vries", + "permanentNumber": "21", + "code": "DEV", + "url": "http://en.wikipedia.org/wiki/Nyck_de_Vries", + "givenName": "Nyck", + "familyName": "de Vries", + "dateOfBirth": "1995-02-06", + "nationality": "Dutch", + }, + "Constructors": [ + { + "constructorId": "alphatauri", + "url": "http://en.wikipedia.org/wiki/Scuderia_AlphaTauri", + "name": "AlphaTauri", + "nationality": "Italian", + } + ], + }, + ], + "ConstructorStandings": [ + { + "position": "1", + "positionText": "1", + "points": "860", + "wins": "21", + "Constructor": { + "constructorId": "red_bull", + "url": "http://en.wikipedia.org/wiki/Red_Bull_Racing", + "name": "Red Bull", + "nationality": "Austrian", + }, + }, + { + "position": "2", + "positionText": "2", + "points": "409", + "wins": "0", + "Constructor": { + "constructorId": "mercedes", + "url": "http://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_One", + "name": "Mercedes", + "nationality": "German", + }, + }, + { + "position": "3", + "positionText": "3", + "points": "406", + "wins": "1", + "Constructor": { + "constructorId": "ferrari", + "url": "http://en.wikipedia.org/wiki/Scuderia_Ferrari", + "name": "Ferrari", + "nationality": "Italian", + }, + }, + { + "position": "4", + "positionText": "4", + "points": "302", + "wins": "0", + "Constructor": { + "constructorId": "mclaren", + "url": "http://en.wikipedia.org/wiki/McLaren", + "name": "McLaren", + "nationality": "British", + }, + }, + { + "position": "5", + "positionText": "5", + "points": "280", + "wins": "0", + "Constructor": { + "constructorId": "aston_martin", + "url": "http://en.wikipedia.org/wiki/Aston_Martin_in_Formula_One", + "name": "Aston Martin", + "nationality": "British", + }, + }, + { + "position": "6", + "positionText": "6", + "points": "120", + "wins": "0", + "Constructor": { + "constructorId": "alpine", + "url": "http://en.wikipedia.org/wiki/Alpine_F1_Team", + "name": "Alpine F1 Team", + "nationality": "French", + }, + }, + { + "position": "7", + "positionText": "7", + "points": "28", + "wins": "0", + "Constructor": { + "constructorId": "williams", + "url": "http://en.wikipedia.org/wiki/Williams_Grand_Prix_Engineering", + "name": "Williams", + "nationality": "British", + }, + }, + { + "position": "8", + "positionText": "8", + "points": "25", + "wins": "0", + "Constructor": { + "constructorId": "alphatauri", + "url": "http://en.wikipedia.org/wiki/Scuderia_AlphaTauri", + "name": "AlphaTauri", + "nationality": "Italian", + }, + }, + { + "position": "9", + "positionText": "9", + "points": "16", + "wins": "0", + "Constructor": { + "constructorId": "alfa", + "url": "http://en.wikipedia.org/wiki/Alfa_Romeo_in_Formula_One", + "name": "Alfa Romeo", + "nationality": "Swiss", + }, + }, + { + "position": "10", + "positionText": "10", + "points": "12", + "wins": "0", + "Constructor": { + "constructorId": "haas", + "url": "http://en.wikipedia.org/wiki/Haas_F1_Team", + "name": "Haas F1 Team", + "nationality": "American", + }, + }, + ], + } + + +def test_get_standings_good_year_and_round(): + response = client.get("/standings?year=2023&round=5") + assert response.status_code == 200 + assert response.json() == { + "season": 2023, + "round": 5, + "DriverStandings": [ + { + "position": "1", + "positionText": "1", + "points": "119", + "wins": "3", + "Driver": { + "driverId": "max_verstappen", + "permanentNumber": "33", + "code": "VER", + "url": "http://en.wikipedia.org/wiki/Max_Verstappen", + "givenName": "Max", + "familyName": "Verstappen", + "dateOfBirth": "1997-09-30", + "nationality": "Dutch", + }, + "Constructors": [ + { + "constructorId": "red_bull", + "url": "http://en.wikipedia.org/wiki/Red_Bull_Racing", + "name": "Red Bull", + "nationality": "Austrian", + } + ], + }, + { + "position": "2", + "positionText": "2", + "points": "105", + "wins": "2", + "Driver": { + "driverId": "perez", + "permanentNumber": "11", + "code": "PER", + "url": "http://en.wikipedia.org/wiki/Sergio_P%C3%A9rez", + "givenName": "Sergio", + "familyName": "Pérez", + "dateOfBirth": "1990-01-26", + "nationality": "Mexican", + }, + "Constructors": [ + { + "constructorId": "red_bull", + "url": "http://en.wikipedia.org/wiki/Red_Bull_Racing", + "name": "Red Bull", + "nationality": "Austrian", + } + ], + }, + { + "position": "3", + "positionText": "3", + "points": "75", + "wins": "0", + "Driver": { + "driverId": "alonso", + "permanentNumber": "14", + "code": "ALO", + "url": "http://en.wikipedia.org/wiki/Fernando_Alonso", + "givenName": "Fernando", + "familyName": "Alonso", + "dateOfBirth": "1981-07-29", + "nationality": "Spanish", + }, + "Constructors": [ + { + "constructorId": "aston_martin", + "url": "http://en.wikipedia.org/wiki/Aston_Martin_in_Formula_One", + "name": "Aston Martin", + "nationality": "British", + } + ], + }, + { + "position": "4", + "positionText": "4", + "points": "56", + "wins": "0", + "Driver": { + "driverId": "hamilton", + "permanentNumber": "44", + "code": "HAM", + "url": "http://en.wikipedia.org/wiki/Lewis_Hamilton", + "givenName": "Lewis", + "familyName": "Hamilton", + "dateOfBirth": "1985-01-07", + "nationality": "British", + }, + "Constructors": [ + { + "constructorId": "mercedes", + "url": "http://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_One", + "name": "Mercedes", + "nationality": "German", + } + ], + }, + { + "position": "5", + "positionText": "5", + "points": "44", + "wins": "0", + "Driver": { + "driverId": "sainz", + "permanentNumber": "55", + "code": "SAI", + "url": "http://en.wikipedia.org/wiki/Carlos_Sainz_Jr.", + "givenName": "Carlos", + "familyName": "Sainz", + "dateOfBirth": "1994-09-01", + "nationality": "Spanish", + }, + "Constructors": [ + { + "constructorId": "ferrari", + "url": "http://en.wikipedia.org/wiki/Scuderia_Ferrari", + "name": "Ferrari", + "nationality": "Italian", + } + ], + }, + { + "position": "6", + "positionText": "6", + "points": "40", + "wins": "0", + "Driver": { + "driverId": "russell", + "permanentNumber": "63", + "code": "RUS", + "url": "http://en.wikipedia.org/wiki/George_Russell_(racing_driver)", + "givenName": "George", + "familyName": "Russell", + "dateOfBirth": "1998-02-15", + "nationality": "British", + }, + "Constructors": [ + { + "constructorId": "mercedes", + "url": "http://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_One", + "name": "Mercedes", + "nationality": "German", + } + ], + }, + { + "position": "7", + "positionText": "7", + "points": "34", + "wins": "0", + "Driver": { + "driverId": "leclerc", + "permanentNumber": "16", + "code": "LEC", + "url": "http://en.wikipedia.org/wiki/Charles_Leclerc", + "givenName": "Charles", + "familyName": "Leclerc", + "dateOfBirth": "1997-10-16", + "nationality": "Monegasque", + }, + "Constructors": [ + { + "constructorId": "ferrari", + "url": "http://en.wikipedia.org/wiki/Scuderia_Ferrari", + "name": "Ferrari", + "nationality": "Italian", + } + ], + }, + { + "position": "8", + "positionText": "8", + "points": "27", + "wins": "0", + "Driver": { + "driverId": "stroll", + "permanentNumber": "18", + "code": "STR", + "url": "http://en.wikipedia.org/wiki/Lance_Stroll", + "givenName": "Lance", + "familyName": "Stroll", + "dateOfBirth": "1998-10-29", + "nationality": "Canadian", + }, + "Constructors": [ + { + "constructorId": "aston_martin", + "url": "http://en.wikipedia.org/wiki/Aston_Martin_in_Formula_One", + "name": "Aston Martin", + "nationality": "British", + } + ], + }, + { + "position": "9", + "positionText": "9", + "points": "10", + "wins": "0", + "Driver": { + "driverId": "norris", + "permanentNumber": "4", + "code": "NOR", + "url": "http://en.wikipedia.org/wiki/Lando_Norris", + "givenName": "Lando", + "familyName": "Norris", + "dateOfBirth": "1999-11-13", + "nationality": "British", + }, + "Constructors": [ + { + "constructorId": "mclaren", + "url": "http://en.wikipedia.org/wiki/McLaren", + "name": "McLaren", + "nationality": "British", + } + ], + }, + { + "position": "10", + "positionText": "10", + "points": "8", + "wins": "0", + "Driver": { + "driverId": "gasly", + "permanentNumber": "10", + "code": "GAS", + "url": "http://en.wikipedia.org/wiki/Pierre_Gasly", + "givenName": "Pierre", + "familyName": "Gasly", + "dateOfBirth": "1996-02-07", + "nationality": "French", + }, + "Constructors": [ + { + "constructorId": "alpine", + "url": "http://en.wikipedia.org/wiki/Alpine_F1_Team", + "name": "Alpine F1 Team", + "nationality": "French", + } + ], + }, + { + "position": "11", + "positionText": "11", + "points": "6", + "wins": "0", + "Driver": { + "driverId": "hulkenberg", + "permanentNumber": "27", + "code": "HUL", + "url": "http://en.wikipedia.org/wiki/Nico_H%C3%BClkenberg", + "givenName": "Nico", + "familyName": "Hülkenberg", + "dateOfBirth": "1987-08-19", + "nationality": "German", + }, + "Constructors": [ + { + "constructorId": "haas", + "url": "http://en.wikipedia.org/wiki/Haas_F1_Team", + "name": "Haas F1 Team", + "nationality": "American", + } + ], + }, + { + "position": "12", + "positionText": "12", + "points": "6", + "wins": "0", + "Driver": { + "driverId": "ocon", + "permanentNumber": "31", + "code": "OCO", + "url": "http://en.wikipedia.org/wiki/Esteban_Ocon", + "givenName": "Esteban", + "familyName": "Ocon", + "dateOfBirth": "1996-09-17", + "nationality": "French", + }, + "Constructors": [ + { + "constructorId": "alpine", + "url": "http://en.wikipedia.org/wiki/Alpine_F1_Team", + "name": "Alpine F1 Team", + "nationality": "French", + } + ], + }, + { + "position": "13", + "positionText": "13", + "points": "4", + "wins": "0", + "Driver": { + "driverId": "bottas", + "permanentNumber": "77", + "code": "BOT", + "url": "http://en.wikipedia.org/wiki/Valtteri_Bottas", + "givenName": "Valtteri", + "familyName": "Bottas", + "dateOfBirth": "1989-08-28", + "nationality": "Finnish", + }, + "Constructors": [ + { + "constructorId": "alfa", + "url": "http://en.wikipedia.org/wiki/Alfa_Romeo_in_Formula_One", + "name": "Alfa Romeo", + "nationality": "Swiss", + } + ], + }, + { + "position": "14", + "positionText": "14", + "points": "4", + "wins": "0", + "Driver": { + "driverId": "piastri", + "permanentNumber": "81", + "code": "PIA", + "url": "http://en.wikipedia.org/wiki/Oscar_Piastri", + "givenName": "Oscar", + "familyName": "Piastri", + "dateOfBirth": "2001-04-06", + "nationality": "Australian", + }, + "Constructors": [ + { + "constructorId": "mclaren", + "url": "http://en.wikipedia.org/wiki/McLaren", + "name": "McLaren", + "nationality": "British", + } + ], + }, + { + "position": "15", + "positionText": "15", + "points": "2", + "wins": "0", + "Driver": { + "driverId": "zhou", + "permanentNumber": "24", + "code": "ZHO", + "url": "http://en.wikipedia.org/wiki/Zhou_Guanyu", + "givenName": "Guanyu", + "familyName": "Zhou", + "dateOfBirth": "1999-05-30", + "nationality": "Chinese", + }, + "Constructors": [ + { + "constructorId": "alfa", + "url": "http://en.wikipedia.org/wiki/Alfa_Romeo_in_Formula_One", + "name": "Alfa Romeo", + "nationality": "Swiss", + } + ], + }, + { + "position": "16", + "positionText": "16", + "points": "2", + "wins": "0", + "Driver": { + "driverId": "tsunoda", + "permanentNumber": "22", + "code": "TSU", + "url": "http://en.wikipedia.org/wiki/Yuki_Tsunoda", + "givenName": "Yuki", + "familyName": "Tsunoda", + "dateOfBirth": "2000-05-11", + "nationality": "Japanese", + }, + "Constructors": [ + { + "constructorId": "alphatauri", + "url": "http://en.wikipedia.org/wiki/Scuderia_AlphaTauri", + "name": "AlphaTauri", + "nationality": "Italian", + } + ], + }, + { + "position": "17", + "positionText": "17", + "points": "2", + "wins": "0", + "Driver": { + "driverId": "kevin_magnussen", + "permanentNumber": "20", + "code": "MAG", + "url": "http://en.wikipedia.org/wiki/Kevin_Magnussen", + "givenName": "Kevin", + "familyName": "Magnussen", + "dateOfBirth": "1992-10-05", + "nationality": "Danish", + }, + "Constructors": [ + { + "constructorId": "haas", + "url": "http://en.wikipedia.org/wiki/Haas_F1_Team", + "name": "Haas F1 Team", + "nationality": "American", + } + ], + }, + { + "position": "18", + "positionText": "18", + "points": "1", + "wins": "0", + "Driver": { + "driverId": "albon", + "permanentNumber": "23", + "code": "ALB", + "url": "http://en.wikipedia.org/wiki/Alexander_Albon", + "givenName": "Alexander", + "familyName": "Albon", + "dateOfBirth": "1996-03-23", + "nationality": "Thai", + }, + "Constructors": [ + { + "constructorId": "williams", + "url": "http://en.wikipedia.org/wiki/Williams_Grand_Prix_Engineering", + "name": "Williams", + "nationality": "British", + } + ], + }, + { + "position": "19", + "positionText": "19", + "points": "0", + "wins": "0", + "Driver": { + "driverId": "sargeant", + "permanentNumber": "2", + "code": "SAR", + "url": "http://en.wikipedia.org/wiki/Logan_Sargeant", + "givenName": "Logan", + "familyName": "Sargeant", + "dateOfBirth": "2000-12-31", + "nationality": "American", + }, + "Constructors": [ + { + "constructorId": "williams", + "url": "http://en.wikipedia.org/wiki/Williams_Grand_Prix_Engineering", + "name": "Williams", + "nationality": "British", + } + ], + }, + { + "position": "20", + "positionText": "20", + "points": "0", + "wins": "0", + "Driver": { + "driverId": "de_vries", + "permanentNumber": "21", + "code": "DEV", + "url": "http://en.wikipedia.org/wiki/Nyck_de_Vries", + "givenName": "Nyck", + "familyName": "de Vries", + "dateOfBirth": "1995-02-06", + "nationality": "Dutch", + }, + "Constructors": [ + { + "constructorId": "alphatauri", + "url": "http://en.wikipedia.org/wiki/Scuderia_AlphaTauri", + "name": "AlphaTauri", + "nationality": "Italian", + } + ], + }, + ], + "ConstructorStandings": [ + { + "position": "1", + "positionText": "1", + "points": "224", + "wins": "5", + "Constructor": { + "constructorId": "red_bull", + "url": "http://en.wikipedia.org/wiki/Red_Bull_Racing", + "name": "Red Bull", + "nationality": "Austrian", + }, + }, + { + "position": "2", + "positionText": "2", + "points": "102", + "wins": "0", + "Constructor": { + "constructorId": "aston_martin", + "url": "http://en.wikipedia.org/wiki/Aston_Martin_in_Formula_One", + "name": "Aston Martin", + "nationality": "British", + }, + }, + { + "position": "3", + "positionText": "3", + "points": "96", + "wins": "0", + "Constructor": { + "constructorId": "mercedes", + "url": "http://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_One", + "name": "Mercedes", + "nationality": "German", + }, + }, + { + "position": "4", + "positionText": "4", + "points": "78", + "wins": "0", + "Constructor": { + "constructorId": "ferrari", + "url": "http://en.wikipedia.org/wiki/Scuderia_Ferrari", + "name": "Ferrari", + "nationality": "Italian", + }, + }, + { + "position": "5", + "positionText": "5", + "points": "14", + "wins": "0", + "Constructor": { + "constructorId": "mclaren", + "url": "http://en.wikipedia.org/wiki/McLaren", + "name": "McLaren", + "nationality": "British", + }, + }, + { + "position": "6", + "positionText": "6", + "points": "14", + "wins": "0", + "Constructor": { + "constructorId": "alpine", + "url": "http://en.wikipedia.org/wiki/Alpine_F1_Team", + "name": "Alpine F1 Team", + "nationality": "French", + }, + }, + { + "position": "7", + "positionText": "7", + "points": "8", + "wins": "0", + "Constructor": { + "constructorId": "haas", + "url": "http://en.wikipedia.org/wiki/Haas_F1_Team", + "name": "Haas F1 Team", + "nationality": "American", + }, + }, + { + "position": "8", + "positionText": "8", + "points": "6", + "wins": "0", + "Constructor": { + "constructorId": "alfa", + "url": "http://en.wikipedia.org/wiki/Alfa_Romeo_in_Formula_One", + "name": "Alfa Romeo", + "nationality": "Swiss", + }, + }, + { + "position": "9", + "positionText": "9", + "points": "2", + "wins": "0", + "Constructor": { + "constructorId": "alphatauri", + "url": "http://en.wikipedia.org/wiki/Scuderia_AlphaTauri", + "name": "AlphaTauri", + "nationality": "Italian", + }, + }, + { + "position": "10", + "positionText": "10", + "points": "1", + "wins": "0", + "Constructor": { + "constructorId": "williams", + "url": "http://en.wikipedia.org/wiki/Williams_Grand_Prix_Engineering", + "name": "Williams", + "nationality": "British", + }, + }, + ], + } + + +# endregion standings - good inputs + +# region standings - no inputs + + +def test_get_standings_bad_year_only_no_input(): + response = client.get("/standings?year=") + assert response.status_code == 422 + assert response.json() == { + "detail": [ + { + "type": "int_parsing", + "loc": ["query", "year"], + "msg": "Input should be a valid integer, unable to parse string as an integer", + "input": "", + "url": "https://errors.pydantic.dev/2.5/v/int_parsing", + } + ] + } + + +def test_get_standings_bad_round_only_no_input(): + response = client.get("/standings?round=") + assert response.status_code == 422 + assert response.json() == { + "detail": [ + { + "type": "int_parsing", + "loc": ["query", "round"], + "msg": "Input should be a valid integer, unable to parse string as an integer", + "input": "", + "url": "https://errors.pydantic.dev/2.5/v/int_parsing", + } + ] + } + + +def test_get_standings_good_round_bad_year_no_input(): + response = client.get("/standings?round=3") + assert response.status_code == 400 + assert response.json() == { + "detail": 'Bad request. Must provide the "year" parameter.' + } + + +def test_get_standings_bad_year_and_round_no_input(): + response = client.get("/standings?year=&round=") + assert response.status_code == 422 + assert response.json() == { + "detail": [ + { + "type": "int_parsing", + "loc": ["query", "year"], + "msg": "Input should be a valid integer, unable to parse string as an integer", + "input": "", + "url": "https://errors.pydantic.dev/2.5/v/int_parsing", + }, + { + "type": "int_parsing", + "loc": ["query", "round"], + "msg": "Input should be a valid integer, unable to parse string as an integer", + "input": "", + "url": "https://errors.pydantic.dev/2.5/v/int_parsing", + }, + ] + } + + +# endregion standings - no inputs + +# region standings - bad inputs + + +def test_get_standings_bad_year_only_lower_limit(): + response = client.get(f"/standings?year={MIN_SUPPORTED_YEAR - 1}") + assert response.status_code == 422 + assert response.json() == { + "detail": [ + { + "type": "greater_than_equal", + "loc": ["query", "year"], + "msg": "Input should be greater than or equal to 1950", + "input": "1949", + "ctx": {"ge": 1950}, + "url": "https://errors.pydantic.dev/2.5/v/greater_than_equal", + } + ] + } + + +def test_get_standings_bad_year_only_upper_limit(): + response = client.get(f"/standings?year={MAX_SUPPORTED_YEAR + 1}") + assert response.status_code == 422 + assert response.json() == { + "detail": [ + { + "type": "less_than_equal", + "loc": ["query", "year"], + "msg": "Input should be less than or equal to 2024", + "input": "2025", + "ctx": {"le": 2024}, + "url": "https://errors.pydantic.dev/2.5/v/less_than_equal", + } + ] + } + + +def test_get_standings_bad_round_only_lower_limit(): + response = client.get(f"/standings?round={MIN_SUPPORTED_ROUND - 1}") + assert response.status_code == 422 + assert response.json() == { + "detail": [ + { + "type": "greater_than_equal", + "loc": ["query", "round"], + "msg": "Input should be greater than or equal to 1", + "input": "0", + "ctx": {"ge": 1}, + "url": "https://errors.pydantic.dev/2.5/v/greater_than_equal", + } + ] + } + + +def test_get_standings_bad_round_only_upper_limit(): + response = client.get(f"/standings?round={MAX_SUPPORTED_ROUND + 1}") + assert response.status_code == 422 + assert response.json() == { + "detail": [ + { + "type": "less_than_equal", + "loc": ["query", "round"], + "msg": "Input should be less than or equal to 30", + "input": "31", + "ctx": {"le": 30}, + "url": "https://errors.pydantic.dev/2.5/v/less_than_equal", + } + ] + } + + +def test_get_standings_good_year_bad_round_lower_limit(): + response = client.get(f"/standings?year=2023&round={MIN_SUPPORTED_ROUND - 1}") + assert response.status_code == 422 + assert response.json() == { + "detail": [ + { + "type": "greater_than_equal", + "loc": ["query", "round"], + "msg": "Input should be greater than or equal to 1", + "input": "0", + "ctx": {"ge": 1}, + "url": "https://errors.pydantic.dev/2.5/v/greater_than_equal", + } + ] + } + + +def test_get_standings_good_year_bad_round_upper_limit(): + response = client.get(f"/standings?year=2023&round={MAX_SUPPORTED_ROUND + 1}") + assert response.status_code == 422 + assert response.json() == { + "detail": [ + { + "type": "less_than_equal", + "loc": ["query", "round"], + "msg": "Input should be less than or equal to 30", + "input": "31", + "ctx": {"le": 30}, + "url": "https://errors.pydantic.dev/2.5/v/less_than_equal", + } + ] + } + + +def test_get_standings_good_round_bad_year_lower_limit(): + response = client.get(f"/standings?year={MIN_SUPPORTED_YEAR - 1}&round=2") + assert response.status_code == 422 + assert response.json() == { + "detail": [ + { + "type": "greater_than_equal", + "loc": ["query", "year"], + "msg": "Input should be greater than or equal to 1950", + "input": "1949", + "ctx": {"ge": 1950}, + "url": "https://errors.pydantic.dev/2.5/v/greater_than_equal", + } + ] + } + + +def test_get_standings_good_round_bad_year_upper_limit(): + response = client.get(f"/standings?year={MAX_SUPPORTED_YEAR + 1}&round=2") + assert response.status_code == 422 + assert response.json() == { + "detail": [ + { + "type": "less_than_equal", + "loc": ["query", "year"], + "msg": "Input should be less than or equal to 2024", + "input": "2025", + "ctx": {"le": 2024}, + "url": "https://errors.pydantic.dev/2.5/v/less_than_equal", + } + ] + } + + +def test_get_standings_bad_year_and_round_lower_limit(): + response = client.get( + f"/standings?year={MIN_SUPPORTED_YEAR - 1}&round={MIN_SUPPORTED_ROUND - 1}" + ) + assert response.status_code == 422 + assert response.json() == { + "detail": [ + { + "type": "greater_than_equal", + "loc": ["query", "year"], + "msg": "Input should be greater than or equal to 1950", + "input": "1949", + "ctx": {"ge": 1950}, + "url": "https://errors.pydantic.dev/2.5/v/greater_than_equal", + }, + { + "type": "greater_than_equal", + "loc": ["query", "round"], + "msg": "Input should be greater than or equal to 1", + "input": "0", + "ctx": {"ge": 1}, + "url": "https://errors.pydantic.dev/2.5/v/greater_than_equal", + }, + ] + } + + +def test_get_standings_bad_year_and_round_upper_limit(): + response = client.get( + f"/standings?year={MAX_SUPPORTED_YEAR + 1}&round={MAX_SUPPORTED_ROUND + 1}" + ) + assert response.status_code == 422 + assert response.json() == { + "detail": [ + { + "type": "less_than_equal", + "loc": ["query", "year"], + "msg": "Input should be less than or equal to 2024", + "input": "2025", + "ctx": {"le": 2024}, + "url": "https://errors.pydantic.dev/2.5/v/less_than_equal", + }, + { + "type": "less_than_equal", + "loc": ["query", "round"], + "msg": "Input should be less than or equal to 30", + "input": "31", + "ctx": {"le": 30}, + "url": "https://errors.pydantic.dev/2.5/v/less_than_equal", + }, + ] + } + + +def test_get_standings_bad_year_lower_limit_round_upper_limit(): + response = client.get( + f"/standings?year={MIN_SUPPORTED_YEAR - 1}&round={MAX_SUPPORTED_ROUND + 1}" + ) + assert response.status_code == 422 + assert response.json() == { + "detail": [ + { + "type": "greater_than_equal", + "loc": ["query", "year"], + "msg": "Input should be greater than or equal to 1950", + "input": "1949", + "ctx": {"ge": 1950}, + "url": "https://errors.pydantic.dev/2.5/v/greater_than_equal", + }, + { + "type": "less_than_equal", + "loc": ["query", "round"], + "msg": "Input should be less than or equal to 30", + "input": "31", + "ctx": {"le": 30}, + "url": "https://errors.pydantic.dev/2.5/v/less_than_equal", + }, + ] + } + + +def test_get_standings_bad_year_upper_limit_round_lower_limit(): + response = client.get( + f"/standings?year={MAX_SUPPORTED_YEAR + 1}&round={MIN_SUPPORTED_ROUND - 1}" + ) + assert response.status_code == 422 + assert response.json() == { + "detail": [ + { + "type": "less_than_equal", + "loc": ["query", "year"], + "msg": "Input should be less than or equal to 2024", + "input": "2025", + "ctx": {"le": 2024}, + "url": "https://errors.pydantic.dev/2.5/v/less_than_equal", + }, + { + "type": "greater_than_equal", + "loc": ["query", "round"], + "msg": "Input should be greater than or equal to 1", + "input": "0", + "ctx": {"ge": 1}, + "url": "https://errors.pydantic.dev/2.5/v/greater_than_equal", + }, + ] + } + + +# endregion standings - bad inputs + +# endregion standings diff --git a/app/utils.py b/app/utils.py index 282994d..c73591c 100644 --- a/app/utils.py +++ b/app/utils.py @@ -3,7 +3,7 @@ import fastf1 -def get_default_year_for_schedule() -> int: +def get_default_year() -> int: # default year is defined as the year which has data for atleast 1 race session current_year = datetime.today().year diff --git a/notebooks/playground.ipynb b/notebooks/pratik-playground.ipynb similarity index 70% rename from notebooks/playground.ipynb rename to notebooks/pratik-playground.ipynb index 58d9417..e86589c 100644 --- a/notebooks/playground.ipynb +++ b/notebooks/pratik-playground.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 11, "id": "f4e32ad5-e506-434c-8ec8-d8a1c10547af", "metadata": {}, "outputs": [], @@ -16,28 +16,17 @@ "pd.set_option(\"display.max_colwidth\", None)\n", "\n", "# Ergast options\n", - "ergast = Ergast(result_type=\"pandas\", auto_cast=True)" + "ergast = Ergast(result_type=\"raw\", auto_cast=True)" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 12, "id": "15a9f59c-11c3-4461-b887-fe8eeacb2a35", "metadata": { "scrolled": true }, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "req WARNING \t\n", - "\n", - "DEFAULT CACHE ENABLED!\n", - "\tCache directory: /Users/pratik/Library/Caches/fastf1.\n", - "\tSize: 104.31 MB\n" - ] - }, { "data": { "text/html": [ @@ -889,7 +878,7 @@ "22 2023-11-26 17:00:00+04:00 2023-11-26 13:00:00 True " ] }, - "execution_count": 2, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -901,7 +890,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 13, "id": "02f26061-c4b8-4b33-a240-14f4ee0411d4", "metadata": {}, "outputs": [ @@ -909,7 +898,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "core INFO \tLoading data for Bahrain Grand Prix - Qualifying [v3.1.6]\n", + "core INFO \tLoading data for Bahrain Grand Prix - Qualifying [v3.2.0]\n", "req INFO \tUsing cached data for session_info\n", "req INFO \tUsing cached data for driver_info\n", "req INFO \tUsing cached data for session_status_data\n", @@ -978,7 +967,7 @@ " Verstappen\n", " Max Verstappen\n", " https://www.formula1.com/content/dam/fom-website/drivers/M/MAXVER01_Max_Verstappen/maxver01.png.transform/1col/image.png\n", - " \n", + " NED\n", " 1.0\n", " \n", " NaN\n", @@ -1002,7 +991,7 @@ " Perez\n", " Sergio Perez\n", " https://www.formula1.com/content/dam/fom-website/drivers/S/SERPER01_Sergio_Perez/serper01.png.transform/1col/image.png\n", - " \n", + " MEX\n", " 2.0\n", " \n", " NaN\n", @@ -1026,7 +1015,7 @@ " Leclerc\n", " Charles Leclerc\n", " https://www.formula1.com/content/dam/fom-website/drivers/C/CHALEC01_Charles_Leclerc/chalec01.png.transform/1col/image.png\n", - " \n", + " MON\n", " 3.0\n", " \n", " NaN\n", @@ -1050,7 +1039,7 @@ " Sainz\n", " Carlos Sainz\n", " https://www.formula1.com/content/dam/fom-website/drivers/C/CARSAI01_Carlos_Sainz/carsai01.png.transform/1col/image.png\n", - " \n", + " ESP\n", " 4.0\n", " \n", " NaN\n", @@ -1074,7 +1063,7 @@ " Alonso\n", " Fernando Alonso\n", " https://www.formula1.com/content/dam/fom-website/drivers/F/FERALO01_Fernando_Alonso/feralo01.png.transform/1col/image.png\n", - " \n", + " ESP\n", " 5.0\n", " \n", " NaN\n", @@ -1098,7 +1087,7 @@ " Russell\n", " George Russell\n", " https://www.formula1.com/content/dam/fom-website/drivers/G/GEORUS01_George_Russell/georus01.png.transform/1col/image.png\n", - " \n", + " GBR\n", " 6.0\n", " \n", " NaN\n", @@ -1122,7 +1111,7 @@ " Hamilton\n", " Lewis Hamilton\n", " https://www.formula1.com/content/dam/fom-website/drivers/L/LEWHAM01_Lewis_Hamilton/lewham01.png.transform/1col/image.png\n", - " \n", + " GBR\n", " 7.0\n", " \n", " NaN\n", @@ -1146,7 +1135,7 @@ " Stroll\n", " Lance Stroll\n", " https://www.formula1.com/content/dam/fom-website/drivers/L/LANSTR01_Lance_Stroll/lanstr01.png.transform/1col/image.png\n", - " \n", + " CAN\n", " 8.0\n", " \n", " NaN\n", @@ -1170,7 +1159,7 @@ " Ocon\n", " Esteban Ocon\n", " https://www.formula1.com/content/dam/fom-website/drivers/E/ESTOCO01_Esteban_Ocon/estoco01.png.transform/1col/image.png\n", - " \n", + " FRA\n", " 9.0\n", " \n", " NaN\n", @@ -1194,7 +1183,7 @@ " Hulkenberg\n", " Nico Hulkenberg\n", " https://www.formula1.com/content/dam/fom-website/drivers/N/NICHUL01_Nico_Hulkenberg/nichul01.png.transform/1col/image.png\n", - " \n", + " GER\n", " 10.0\n", " \n", " NaN\n", @@ -1218,7 +1207,7 @@ " Norris\n", " Lando Norris\n", " https://www.formula1.com/content/dam/fom-website/drivers/L/LANNOR01_Lando_Norris/lannor01.png.transform/1col/image.png\n", - " \n", + " GBR\n", " 11.0\n", " \n", " NaN\n", @@ -1242,7 +1231,7 @@ " Bottas\n", " Valtteri Bottas\n", " https://www.formula1.com/content/dam/fom-website/drivers/V/VALBOT01_Valtteri_Bottas/valbot01.png.transform/1col/image.png\n", - " \n", + " FIN\n", " 12.0\n", " \n", " NaN\n", @@ -1266,7 +1255,7 @@ " Zhou\n", " Guanyu Zhou\n", " https://www.formula1.com/content/dam/fom-website/drivers/G/GUAZHO01_Guanyu_Zhou/guazho01.png.transform/1col/image.png\n", - " \n", + " CHN\n", " 13.0\n", " \n", " NaN\n", @@ -1290,7 +1279,7 @@ " Tsunoda\n", " Yuki Tsunoda\n", " https://www.formula1.com/content/dam/fom-website/drivers/Y/YUKTSU01_Yuki_Tsunoda/yuktsu01.png.transform/1col/image.png\n", - " \n", + " JPN\n", " 14.0\n", " \n", " NaN\n", @@ -1314,7 +1303,7 @@ " Albon\n", " Alexander Albon\n", " https://www.formula1.com/content/dam/fom-website/drivers/A/ALEALB01_Alexander_Albon/alealb01.png.transform/1col/image.png\n", - " \n", + " THA\n", " 15.0\n", " \n", " NaN\n", @@ -1338,7 +1327,7 @@ " Sargeant\n", " Logan Sargeant\n", " https://www.formula1.com/content/dam/fom-website/drivers/L/LOGSAR01_Logan_Sargeant/logsar01.png.transform/1col/image.png\n", - " \n", + " USA\n", " 16.0\n", " \n", " NaN\n", @@ -1362,7 +1351,7 @@ " Magnussen\n", " Kevin Magnussen\n", " https://www.formula1.com/content/dam/fom-website/drivers/K/KEVMAG01_Kevin_Magnussen/kevmag01.png.transform/1col/image.png\n", - " \n", + " DEN\n", " 17.0\n", " \n", " NaN\n", @@ -1386,7 +1375,7 @@ " Piastri\n", " Oscar Piastri\n", " https://www.formula1.com/content/dam/fom-website/drivers/O/OSCPIA01_Oscar_Piastri/oscpia01.png.transform/1col/image.png\n", - " \n", + " AUS\n", " 18.0\n", " \n", " NaN\n", @@ -1410,7 +1399,7 @@ " De Vries\n", " Nyck De Vries\n", " https://www.formula1.com/content/dam/fom-website/drivers/N/NYCDEV01_Nyck_De%20Vries/nycdev01.png.transform/1col/image.png\n", - " \n", + " NED\n", " 19.0\n", " \n", " NaN\n", @@ -1434,7 +1423,7 @@ " Gasly\n", " Pierre Gasly\n", " https://www.formula1.com/content/dam/fom-website/drivers/P/PIEGAS01_Pierre_Gasly/piegas01.png.transform/1col/image.png\n", - " \n", + " FRA\n", " 20.0\n", " \n", " NaN\n", @@ -1517,26 +1506,26 @@ "10 https://www.formula1.com/content/dam/fom-website/drivers/P/PIEGAS01_Pierre_Gasly/piegas01.png.transform/1col/image.png \n", "\n", " CountryCode Position ClassifiedPosition GridPosition \\\n", - "1 1.0 NaN \n", - "11 2.0 NaN \n", - "16 3.0 NaN \n", - "55 4.0 NaN \n", - "14 5.0 NaN \n", - "63 6.0 NaN \n", - "44 7.0 NaN \n", - "18 8.0 NaN \n", - "31 9.0 NaN \n", - "27 10.0 NaN \n", - "4 11.0 NaN \n", - "77 12.0 NaN \n", - "24 13.0 NaN \n", - "22 14.0 NaN \n", - "23 15.0 NaN \n", - "2 16.0 NaN \n", - "20 17.0 NaN \n", - "81 18.0 NaN \n", - "21 19.0 NaN \n", - "10 20.0 NaN \n", + "1 NED 1.0 NaN \n", + "11 MEX 2.0 NaN \n", + "16 MON 3.0 NaN \n", + "55 ESP 4.0 NaN \n", + "14 ESP 5.0 NaN \n", + "63 GBR 6.0 NaN \n", + "44 GBR 7.0 NaN \n", + "18 CAN 8.0 NaN \n", + "31 FRA 9.0 NaN \n", + "27 GER 10.0 NaN \n", + "4 GBR 11.0 NaN \n", + "77 FIN 12.0 NaN \n", + "24 CHN 13.0 NaN \n", + "22 JPN 14.0 NaN \n", + "23 THA 15.0 NaN \n", + "2 USA 16.0 NaN \n", + "20 DEN 17.0 NaN \n", + "81 AUS 18.0 NaN \n", + "21 NED 19.0 NaN \n", + "10 FRA 20.0 NaN \n", "\n", " Q1 Q2 Q3 Time \\\n", "1 0 days 00:01:31.295000 0 days 00:01:30.503000 0 days 00:01:29.708000 NaT \n", @@ -1583,7 +1572,7 @@ "10 NaN " ] }, - "execution_count": 3, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -1603,7 +1592,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 14, "id": "ea9e656e-5f0b-450c-a45d-83ecd55597af", "metadata": {}, "outputs": [ @@ -1611,7 +1600,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "core INFO \tLoading data for Bahrain Grand Prix - Race [v3.1.6]\n", + "core INFO \tLoading data for Bahrain Grand Prix - Race [v3.2.0]\n", "req INFO \tUsing cached data for session_info\n", "req INFO \tUsing cached data for driver_info\n", "req INFO \tUsing cached data for session_status_data\n", @@ -1685,7 +1674,7 @@ " Verstappen\n", " Max Verstappen\n", " https://www.formula1.com/content/dam/fom-website/drivers/M/MAXVER01_Max_Verstappen/maxver01.png.transform/1col/image.png\n", - " \n", + " NED\n", " 1.0\n", " 1\n", " 1.0\n", @@ -1709,7 +1698,7 @@ " Perez\n", " Sergio Perez\n", " https://www.formula1.com/content/dam/fom-website/drivers/S/SERPER01_Sergio_Perez/serper01.png.transform/1col/image.png\n", - " \n", + " MEX\n", " 2.0\n", " 2\n", " 2.0\n", @@ -1733,7 +1722,7 @@ " Alonso\n", " Fernando Alonso\n", " https://www.formula1.com/content/dam/fom-website/drivers/F/FERALO01_Fernando_Alonso/feralo01.png.transform/1col/image.png\n", - " \n", + " ESP\n", " 3.0\n", " 3\n", " 5.0\n", @@ -1757,7 +1746,7 @@ " Sainz\n", " Carlos Sainz\n", " https://www.formula1.com/content/dam/fom-website/drivers/C/CARSAI01_Carlos_Sainz/carsai01.png.transform/1col/image.png\n", - " \n", + " ESP\n", " 4.0\n", " 4\n", " 4.0\n", @@ -1781,7 +1770,7 @@ " Hamilton\n", " Lewis Hamilton\n", " https://www.formula1.com/content/dam/fom-website/drivers/L/LEWHAM01_Lewis_Hamilton/lewham01.png.transform/1col/image.png\n", - " \n", + " GBR\n", " 5.0\n", " 5\n", " 7.0\n", @@ -1805,7 +1794,7 @@ " Stroll\n", " Lance Stroll\n", " https://www.formula1.com/content/dam/fom-website/drivers/L/LANSTR01_Lance_Stroll/lanstr01.png.transform/1col/image.png\n", - " \n", + " CAN\n", " 6.0\n", " 6\n", " 8.0\n", @@ -1829,7 +1818,7 @@ " Russell\n", " George Russell\n", " https://www.formula1.com/content/dam/fom-website/drivers/G/GEORUS01_George_Russell/georus01.png.transform/1col/image.png\n", - " \n", + " GBR\n", " 7.0\n", " 7\n", " 6.0\n", @@ -1853,7 +1842,7 @@ " Bottas\n", " Valtteri Bottas\n", " https://www.formula1.com/content/dam/fom-website/drivers/V/VALBOT01_Valtteri_Bottas/valbot01.png.transform/1col/image.png\n", - " \n", + " FIN\n", " 8.0\n", " 8\n", " 12.0\n", @@ -1877,7 +1866,7 @@ " Gasly\n", " Pierre Gasly\n", " https://www.formula1.com/content/dam/fom-website/drivers/P/PIEGAS01_Pierre_Gasly/piegas01.png.transform/1col/image.png\n", - " \n", + " FRA\n", " 9.0\n", " 9\n", " 20.0\n", @@ -1901,7 +1890,7 @@ " Albon\n", " Alexander Albon\n", " https://www.formula1.com/content/dam/fom-website/drivers/A/ALEALB01_Alexander_Albon/alealb01.png.transform/1col/image.png\n", - " \n", + " THA\n", " 10.0\n", " 10\n", " 15.0\n", @@ -1925,7 +1914,7 @@ " Tsunoda\n", " Yuki Tsunoda\n", " https://www.formula1.com/content/dam/fom-website/drivers/Y/YUKTSU01_Yuki_Tsunoda/yuktsu01.png.transform/1col/image.png\n", - " \n", + " JPN\n", " 11.0\n", " 11\n", " 14.0\n", @@ -1949,7 +1938,7 @@ " Sargeant\n", " Logan Sargeant\n", " https://www.formula1.com/content/dam/fom-website/drivers/L/LOGSAR01_Logan_Sargeant/logsar01.png.transform/1col/image.png\n", - " \n", + " USA\n", " 12.0\n", " 12\n", " 16.0\n", @@ -1973,7 +1962,7 @@ " Magnussen\n", " Kevin Magnussen\n", " https://www.formula1.com/content/dam/fom-website/drivers/K/KEVMAG01_Kevin_Magnussen/kevmag01.png.transform/1col/image.png\n", - " \n", + " DEN\n", " 13.0\n", " 13\n", " 17.0\n", @@ -1997,7 +1986,7 @@ " De Vries\n", " Nyck De Vries\n", " https://www.formula1.com/content/dam/fom-website/drivers/N/NYCDEV01_Nyck_De%20Vries/nycdev01.png.transform/1col/image.png\n", - " \n", + " NED\n", " 14.0\n", " 14\n", " 19.0\n", @@ -2021,7 +2010,7 @@ " Hulkenberg\n", " Nico Hulkenberg\n", " https://www.formula1.com/content/dam/fom-website/drivers/N/NICHUL01_Nico_Hulkenberg/nichul01.png.transform/1col/image.png\n", - " \n", + " GER\n", " 15.0\n", " 15\n", " 10.0\n", @@ -2045,7 +2034,7 @@ " Zhou\n", " Guanyu Zhou\n", " https://www.formula1.com/content/dam/fom-website/drivers/G/GUAZHO01_Guanyu_Zhou/guazho01.png.transform/1col/image.png\n", - " \n", + " CHN\n", " 16.0\n", " 16\n", " 13.0\n", @@ -2069,7 +2058,7 @@ " Norris\n", " Lando Norris\n", " https://www.formula1.com/content/dam/fom-website/drivers/L/LANNOR01_Lando_Norris/lannor01.png.transform/1col/image.png\n", - " \n", + " GBR\n", " 17.0\n", " 17\n", " 11.0\n", @@ -2093,7 +2082,7 @@ " Ocon\n", " Esteban Ocon\n", " https://www.formula1.com/content/dam/fom-website/drivers/E/ESTOCO01_Esteban_Ocon/estoco01.png.transform/1col/image.png\n", - " \n", + " FRA\n", " 18.0\n", " R\n", " 9.0\n", @@ -2117,7 +2106,7 @@ " Leclerc\n", " Charles Leclerc\n", " https://www.formula1.com/content/dam/fom-website/drivers/C/CHALEC01_Charles_Leclerc/chalec01.png.transform/1col/image.png\n", - " \n", + " MON\n", " 19.0\n", " R\n", " 3.0\n", @@ -2141,7 +2130,7 @@ " Piastri\n", " Oscar Piastri\n", " https://www.formula1.com/content/dam/fom-website/drivers/O/OSCPIA01_Oscar_Piastri/oscpia01.png.transform/1col/image.png\n", - " \n", + " AUS\n", " 20.0\n", " R\n", " 18.0\n", @@ -2224,26 +2213,26 @@ "81 https://www.formula1.com/content/dam/fom-website/drivers/O/OSCPIA01_Oscar_Piastri/oscpia01.png.transform/1col/image.png \n", "\n", " CountryCode Position ClassifiedPosition GridPosition Q1 Q2 Q3 \\\n", - "1 1.0 1 1.0 NaT NaT NaT \n", - "11 2.0 2 2.0 NaT NaT NaT \n", - "14 3.0 3 5.0 NaT NaT NaT \n", - "55 4.0 4 4.0 NaT NaT NaT \n", - "44 5.0 5 7.0 NaT NaT NaT \n", - "18 6.0 6 8.0 NaT NaT NaT \n", - "63 7.0 7 6.0 NaT NaT NaT \n", - "77 8.0 8 12.0 NaT NaT NaT \n", - "10 9.0 9 20.0 NaT NaT NaT \n", - "23 10.0 10 15.0 NaT NaT NaT \n", - "22 11.0 11 14.0 NaT NaT NaT \n", - "2 12.0 12 16.0 NaT NaT NaT \n", - "20 13.0 13 17.0 NaT NaT NaT \n", - "21 14.0 14 19.0 NaT NaT NaT \n", - "27 15.0 15 10.0 NaT NaT NaT \n", - "24 16.0 16 13.0 NaT NaT NaT \n", - "4 17.0 17 11.0 NaT NaT NaT \n", - "31 18.0 R 9.0 NaT NaT NaT \n", - "16 19.0 R 3.0 NaT NaT NaT \n", - "81 20.0 R 18.0 NaT NaT NaT \n", + "1 NED 1.0 1 1.0 NaT NaT NaT \n", + "11 MEX 2.0 2 2.0 NaT NaT NaT \n", + "14 ESP 3.0 3 5.0 NaT NaT NaT \n", + "55 ESP 4.0 4 4.0 NaT NaT NaT \n", + "44 GBR 5.0 5 7.0 NaT NaT NaT \n", + "18 CAN 6.0 6 8.0 NaT NaT NaT \n", + "63 GBR 7.0 7 6.0 NaT NaT NaT \n", + "77 FIN 8.0 8 12.0 NaT NaT NaT \n", + "10 FRA 9.0 9 20.0 NaT NaT NaT \n", + "23 THA 10.0 10 15.0 NaT NaT NaT \n", + "22 JPN 11.0 11 14.0 NaT NaT NaT \n", + "2 USA 12.0 12 16.0 NaT NaT NaT \n", + "20 DEN 13.0 13 17.0 NaT NaT NaT \n", + "21 NED 14.0 14 19.0 NaT NaT NaT \n", + "27 GER 15.0 15 10.0 NaT NaT NaT \n", + "24 CHN 16.0 16 13.0 NaT NaT NaT \n", + "4 GBR 17.0 17 11.0 NaT NaT NaT \n", + "31 FRA 18.0 R 9.0 NaT NaT NaT \n", + "16 MON 19.0 R 3.0 NaT NaT NaT \n", + "81 AUS 20.0 R 18.0 NaT NaT NaT \n", "\n", " Time Status Points \n", "1 0 days 01:33:56.736000 Finished 25.0 \n", @@ -2268,7 +2257,7 @@ "81 NaT Electrical 0.0 " ] }, - "execution_count": 4, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -2286,7 +2275,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 15, "id": "130a094d-3133-4d45-b0cf-b20f2ed9277d", "metadata": { "editable": true, @@ -2838,7 +2827,7 @@ "[1056 rows x 31 columns]" ] }, - "execution_count": 5, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -2849,8 +2838,42 @@ }, { "cell_type": "code", - "execution_count": 6, - "id": "79307aca-102e-4702-b5aa-6f59de44ec63", + "execution_count": null, + "id": "398816a5-113c-4126-b1de-405e2e9db390", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'Meeting': {'Key': 1141,\n", + " 'Name': 'Bahrain Grand Prix',\n", + " 'OfficialName': 'FORMULA 1 GULF AIR BAHRAIN GRAND PRIX 2023',\n", + " 'Location': 'Sakhir',\n", + " 'Country': {'Key': 36, 'Code': 'BRN', 'Name': 'Bahrain'},\n", + " 'Circuit': {'Key': 63, 'ShortName': 'Sakhir'}},\n", + " 'ArchiveStatus': {'Status': 'Generating'},\n", + " 'Key': 7953,\n", + " 'Type': 'Race',\n", + " 'Name': 'Race',\n", + " 'StartDate': datetime.datetime(2023, 3, 5, 18, 0),\n", + " 'EndDate': datetime.datetime(2023, 3, 5, 20, 0),\n", + " 'GmtOffset': datetime.timedelta(seconds=10800),\n", + " 'Path': '2023/2023-03-05_Bahrain_Grand_Prix/2023-03-05_Race/'}" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "race_event.session_info" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cdc295cb-37a3-493c-acec-557aee7dc8e5", "metadata": {}, "outputs": [ { @@ -2874,1463 +2897,77 @@ " \n", " \n", " \n", - " position\n", - " positionText\n", - " points\n", - " wins\n", - " driverId\n", - " driverNumber\n", - " driverCode\n", - " driverUrl\n", - " givenName\n", - " familyName\n", - " dateOfBirth\n", - " driverNationality\n", - " constructorIds\n", - " constructorUrls\n", - " constructorNames\n", - " constructorNationalities\n", + " Time\n", + " Status\n", + " Message\n", " \n", " \n", " \n", " \n", " 0\n", + " 0 days 00:05:28.637000\n", " 1\n", - " 1\n", - " 119.0\n", - " 3\n", - " max_verstappen\n", - " 33\n", - " VER\n", - " http://en.wikipedia.org/wiki/Max_Verstappen\n", - " Max\n", - " Verstappen\n", - " 1997-09-30\n", - " Dutch\n", - " [red_bull]\n", - " [http://en.wikipedia.org/wiki/Red_Bull_Racing]\n", - " [Red Bull]\n", - " [Austrian]\n", + " AllClear\n", " \n", " \n", " 1\n", + " 0 days 00:21:59.040000\n", " 2\n", - " 2\n", - " 105.0\n", - " 2\n", - " perez\n", - " 11\n", - " PER\n", - " http://en.wikipedia.org/wiki/Sergio_P%C3%A9rez\n", - " Sergio\n", - " Pérez\n", - " 1990-01-26\n", - " Mexican\n", - " [red_bull]\n", - " [http://en.wikipedia.org/wiki/Red_Bull_Racing]\n", - " [Red Bull]\n", - " [Austrian]\n", + " Yellow\n", " \n", " \n", " 2\n", - " 3\n", - " 3\n", - " 75.0\n", - " 0\n", - " alonso\n", - " 14\n", - " ALO\n", - " http://en.wikipedia.org/wiki/Fernando_Alonso\n", - " Fernando\n", - " Alonso\n", - " 1981-07-29\n", - " Spanish\n", - " [aston_martin]\n", - " [http://en.wikipedia.org/wiki/Aston_Martin_in_Formula_One]\n", - " [Aston Martin]\n", - " [British]\n", + " 0 days 00:22:03.165000\n", + " 1\n", + " AllClear\n", " \n", " \n", " 3\n", - " 4\n", - " 4\n", - " 56.0\n", - " 0\n", - " hamilton\n", - " 44\n", - " HAM\n", - " http://en.wikipedia.org/wiki/Lewis_Hamilton\n", - " Lewis\n", - " Hamilton\n", - " 1985-01-07\n", - " British\n", - " [mercedes]\n", - " [http://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_One]\n", - " [Mercedes]\n", - " [German]\n", + " 0 days 01:03:07.651000\n", + " 2\n", + " Yellow\n", " \n", " \n", " 4\n", - " 5\n", - " 5\n", - " 44.0\n", - " 0\n", - " sainz\n", - " 55\n", - " SAI\n", - " http://en.wikipedia.org/wiki/Carlos_Sainz_Jr.\n", - " Carlos\n", - " Sainz\n", - " 1994-09-01\n", - " Spanish\n", - " [ferrari]\n", - " [http://en.wikipedia.org/wiki/Scuderia_Ferrari]\n", - " [Ferrari]\n", - " [Italian]\n", + " 0 days 01:03:08.151000\n", + " 1\n", + " AllClear\n", " \n", " \n", " 5\n", - " 6\n", - " 6\n", - " 40.0\n", - " 0\n", - " russell\n", - " 63\n", - " RUS\n", - " http://en.wikipedia.org/wiki/George_Russell_(racing_driver)\n", - " George\n", - " Russell\n", - " 1998-02-15\n", - " British\n", - " [mercedes]\n", - " [http://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_One]\n", - " [Mercedes]\n", - " [German]\n", + " 0 days 01:04:15.978000\n", + " 2\n", + " Yellow\n", " \n", " \n", " 6\n", - " 7\n", - " 7\n", - " 34.0\n", - " 0\n", - " leclerc\n", - " 16\n", - " LEC\n", - " http://en.wikipedia.org/wiki/Charles_Leclerc\n", - " Charles\n", - " Leclerc\n", - " 1997-10-16\n", - " Monegasque\n", - " [ferrari]\n", - " [http://en.wikipedia.org/wiki/Scuderia_Ferrari]\n", - " [Ferrari]\n", - " [Italian]\n", + " 0 days 01:04:51.243000\n", + " 1\n", + " AllClear\n", " \n", " \n", " 7\n", - " 8\n", - " 8\n", - " 27.0\n", - " 0\n", - " stroll\n", - " 18\n", - " STR\n", - " http://en.wikipedia.org/wiki/Lance_Stroll\n", - " Lance\n", - " Stroll\n", - " 1998-10-29\n", - " Canadian\n", - " [aston_martin]\n", - " [http://en.wikipedia.org/wiki/Aston_Martin_in_Formula_One]\n", - " [Aston Martin]\n", - " [British]\n", + " 0 days 02:08:59.830000\n", + " 2\n", + " Yellow\n", " \n", " \n", " 8\n", - " 9\n", - " 9\n", - " 10.0\n", - " 0\n", - " norris\n", - " 4\n", - " NOR\n", - " http://en.wikipedia.org/wiki/Lando_Norris\n", - " Lando\n", - " Norris\n", - " 1999-11-13\n", - " British\n", - " [mclaren]\n", - " [http://en.wikipedia.org/wiki/McLaren]\n", - " [McLaren]\n", - " [British]\n", + " 0 days 02:09:18.298000\n", + " 6\n", + " VSCDeployed\n", " \n", " \n", " 9\n", - " 10\n", - " 10\n", - " 8.0\n", - " 0\n", - " gasly\n", - " 10\n", - " GAS\n", - " http://en.wikipedia.org/wiki/Pierre_Gasly\n", - " Pierre\n", - " Gasly\n", - " 1996-02-07\n", - " French\n", - " [alpine]\n", - " [http://en.wikipedia.org/wiki/Alpine_F1_Team]\n", - " [Alpine F1 Team]\n", - " [French]\n", + " 0 days 02:10:53.875000\n", + " 7\n", + " VSCEnding\n", " \n", " \n", " 10\n", - " 11\n", - " 11\n", - " 6.0\n", - " 0\n", - " hulkenberg\n", - " 27\n", - " HUL\n", - " http://en.wikipedia.org/wiki/Nico_H%C3%BClkenberg\n", - " Nico\n", - " Hülkenberg\n", - " 1987-08-19\n", - " German\n", - " [haas]\n", - " [http://en.wikipedia.org/wiki/Haas_F1_Team]\n", - " [Haas F1 Team]\n", - " [American]\n", - " \n", - " \n", - " 11\n", - " 12\n", - " 12\n", - " 6.0\n", - " 0\n", - " ocon\n", - " 31\n", - " OCO\n", - " http://en.wikipedia.org/wiki/Esteban_Ocon\n", - " Esteban\n", - " Ocon\n", - " 1996-09-17\n", - " French\n", - " [alpine]\n", - " [http://en.wikipedia.org/wiki/Alpine_F1_Team]\n", - " [Alpine F1 Team]\n", - " [French]\n", - " \n", - " \n", - " 12\n", - " 13\n", - " 13\n", - " 4.0\n", - " 0\n", - " bottas\n", - " 77\n", - " BOT\n", - " http://en.wikipedia.org/wiki/Valtteri_Bottas\n", - " Valtteri\n", - " Bottas\n", - " 1989-08-28\n", - " Finnish\n", - " [alfa]\n", - " [http://en.wikipedia.org/wiki/Alfa_Romeo_in_Formula_One]\n", - " [Alfa Romeo]\n", - " [Swiss]\n", - " \n", - " \n", - " 13\n", - " 14\n", - " 14\n", - " 4.0\n", - " 0\n", - " piastri\n", - " 81\n", - " PIA\n", - " http://en.wikipedia.org/wiki/Oscar_Piastri\n", - " Oscar\n", - " Piastri\n", - " 2001-04-06\n", - " Australian\n", - " [mclaren]\n", - " [http://en.wikipedia.org/wiki/McLaren]\n", - " [McLaren]\n", - " [British]\n", - " \n", - " \n", - " 14\n", - " 15\n", - " 15\n", - " 2.0\n", - " 0\n", - " zhou\n", - " 24\n", - " ZHO\n", - " http://en.wikipedia.org/wiki/Zhou_Guanyu\n", - " Guanyu\n", - " Zhou\n", - " 1999-05-30\n", - " Chinese\n", - " [alfa]\n", - " [http://en.wikipedia.org/wiki/Alfa_Romeo_in_Formula_One]\n", - " [Alfa Romeo]\n", - " [Swiss]\n", - " \n", - " \n", - " 15\n", - " 16\n", - " 16\n", - " 2.0\n", - " 0\n", - " tsunoda\n", - " 22\n", - " TSU\n", - " http://en.wikipedia.org/wiki/Yuki_Tsunoda\n", - " Yuki\n", - " Tsunoda\n", - " 2000-05-11\n", - " Japanese\n", - " [alphatauri]\n", - " [http://en.wikipedia.org/wiki/Scuderia_AlphaTauri]\n", - " [AlphaTauri]\n", - " [Italian]\n", - " \n", - " \n", - " 16\n", - " 17\n", - " 17\n", - " 2.0\n", - " 0\n", - " kevin_magnussen\n", - " 20\n", - " MAG\n", - " http://en.wikipedia.org/wiki/Kevin_Magnussen\n", - " Kevin\n", - " Magnussen\n", - " 1992-10-05\n", - " Danish\n", - " [haas]\n", - " [http://en.wikipedia.org/wiki/Haas_F1_Team]\n", - " [Haas F1 Team]\n", - " [American]\n", - " \n", - " \n", - " 17\n", - " 18\n", - " 18\n", - " 1.0\n", - " 0\n", - " albon\n", - " 23\n", - " ALB\n", - " http://en.wikipedia.org/wiki/Alexander_Albon\n", - " Alexander\n", - " Albon\n", - " 1996-03-23\n", - " Thai\n", - " [williams]\n", - " [http://en.wikipedia.org/wiki/Williams_Grand_Prix_Engineering]\n", - " [Williams]\n", - " [British]\n", - " \n", - " \n", - " 18\n", - " 19\n", - " 19\n", - " 0.0\n", - " 0\n", - " sargeant\n", - " 2\n", - " SAR\n", - " http://en.wikipedia.org/wiki/Logan_Sargeant\n", - " Logan\n", - " Sargeant\n", - " 2000-12-31\n", - " American\n", - " [williams]\n", - " [http://en.wikipedia.org/wiki/Williams_Grand_Prix_Engineering]\n", - " [Williams]\n", - " [British]\n", - " \n", - " \n", - " 19\n", - " 20\n", - " 20\n", - " 0.0\n", - " 0\n", - " de_vries\n", - " 21\n", - " DEV\n", - " http://en.wikipedia.org/wiki/Nyck_de_Vries\n", - " Nyck\n", - " de Vries\n", - " 1995-02-06\n", - " Dutch\n", - " [alphatauri]\n", - " [http://en.wikipedia.org/wiki/Scuderia_AlphaTauri]\n", - " [AlphaTauri]\n", - " [Italian]\n", - " \n", - " \n", - "\n", - "" - ], - "text/plain": [ - " position positionText points wins driverId driverNumber \\\n", - "0 1 1 119.0 3 max_verstappen 33 \n", - "1 2 2 105.0 2 perez 11 \n", - "2 3 3 75.0 0 alonso 14 \n", - "3 4 4 56.0 0 hamilton 44 \n", - "4 5 5 44.0 0 sainz 55 \n", - "5 6 6 40.0 0 russell 63 \n", - "6 7 7 34.0 0 leclerc 16 \n", - "7 8 8 27.0 0 stroll 18 \n", - "8 9 9 10.0 0 norris 4 \n", - "9 10 10 8.0 0 gasly 10 \n", - "10 11 11 6.0 0 hulkenberg 27 \n", - "11 12 12 6.0 0 ocon 31 \n", - "12 13 13 4.0 0 bottas 77 \n", - "13 14 14 4.0 0 piastri 81 \n", - "14 15 15 2.0 0 zhou 24 \n", - "15 16 16 2.0 0 tsunoda 22 \n", - "16 17 17 2.0 0 kevin_magnussen 20 \n", - "17 18 18 1.0 0 albon 23 \n", - "18 19 19 0.0 0 sargeant 2 \n", - "19 20 20 0.0 0 de_vries 21 \n", - "\n", - " driverCode driverUrl \\\n", - "0 VER http://en.wikipedia.org/wiki/Max_Verstappen \n", - "1 PER http://en.wikipedia.org/wiki/Sergio_P%C3%A9rez \n", - "2 ALO http://en.wikipedia.org/wiki/Fernando_Alonso \n", - "3 HAM http://en.wikipedia.org/wiki/Lewis_Hamilton \n", - "4 SAI http://en.wikipedia.org/wiki/Carlos_Sainz_Jr. \n", - "5 RUS http://en.wikipedia.org/wiki/George_Russell_(racing_driver) \n", - "6 LEC http://en.wikipedia.org/wiki/Charles_Leclerc \n", - "7 STR http://en.wikipedia.org/wiki/Lance_Stroll \n", - "8 NOR http://en.wikipedia.org/wiki/Lando_Norris \n", - "9 GAS http://en.wikipedia.org/wiki/Pierre_Gasly \n", - "10 HUL http://en.wikipedia.org/wiki/Nico_H%C3%BClkenberg \n", - "11 OCO http://en.wikipedia.org/wiki/Esteban_Ocon \n", - "12 BOT http://en.wikipedia.org/wiki/Valtteri_Bottas \n", - "13 PIA http://en.wikipedia.org/wiki/Oscar_Piastri \n", - "14 ZHO http://en.wikipedia.org/wiki/Zhou_Guanyu \n", - "15 TSU http://en.wikipedia.org/wiki/Yuki_Tsunoda \n", - "16 MAG http://en.wikipedia.org/wiki/Kevin_Magnussen \n", - "17 ALB http://en.wikipedia.org/wiki/Alexander_Albon \n", - "18 SAR http://en.wikipedia.org/wiki/Logan_Sargeant \n", - "19 DEV http://en.wikipedia.org/wiki/Nyck_de_Vries \n", - "\n", - " givenName familyName dateOfBirth driverNationality constructorIds \\\n", - "0 Max Verstappen 1997-09-30 Dutch [red_bull] \n", - "1 Sergio Pérez 1990-01-26 Mexican [red_bull] \n", - "2 Fernando Alonso 1981-07-29 Spanish [aston_martin] \n", - "3 Lewis Hamilton 1985-01-07 British [mercedes] \n", - "4 Carlos Sainz 1994-09-01 Spanish [ferrari] \n", - "5 George Russell 1998-02-15 British [mercedes] \n", - "6 Charles Leclerc 1997-10-16 Monegasque [ferrari] \n", - "7 Lance Stroll 1998-10-29 Canadian [aston_martin] \n", - "8 Lando Norris 1999-11-13 British [mclaren] \n", - "9 Pierre Gasly 1996-02-07 French [alpine] \n", - "10 Nico Hülkenberg 1987-08-19 German [haas] \n", - "11 Esteban Ocon 1996-09-17 French [alpine] \n", - "12 Valtteri Bottas 1989-08-28 Finnish [alfa] \n", - "13 Oscar Piastri 2001-04-06 Australian [mclaren] \n", - "14 Guanyu Zhou 1999-05-30 Chinese [alfa] \n", - "15 Yuki Tsunoda 2000-05-11 Japanese [alphatauri] \n", - "16 Kevin Magnussen 1992-10-05 Danish [haas] \n", - "17 Alexander Albon 1996-03-23 Thai [williams] \n", - "18 Logan Sargeant 2000-12-31 American [williams] \n", - "19 Nyck de Vries 1995-02-06 Dutch [alphatauri] \n", - "\n", - " constructorUrls \\\n", - "0 [http://en.wikipedia.org/wiki/Red_Bull_Racing] \n", - "1 [http://en.wikipedia.org/wiki/Red_Bull_Racing] \n", - "2 [http://en.wikipedia.org/wiki/Aston_Martin_in_Formula_One] \n", - "3 [http://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_One] \n", - "4 [http://en.wikipedia.org/wiki/Scuderia_Ferrari] \n", - "5 [http://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_One] \n", - "6 [http://en.wikipedia.org/wiki/Scuderia_Ferrari] \n", - "7 [http://en.wikipedia.org/wiki/Aston_Martin_in_Formula_One] \n", - "8 [http://en.wikipedia.org/wiki/McLaren] \n", - "9 [http://en.wikipedia.org/wiki/Alpine_F1_Team] \n", - "10 [http://en.wikipedia.org/wiki/Haas_F1_Team] \n", - "11 [http://en.wikipedia.org/wiki/Alpine_F1_Team] \n", - "12 [http://en.wikipedia.org/wiki/Alfa_Romeo_in_Formula_One] \n", - "13 [http://en.wikipedia.org/wiki/McLaren] \n", - "14 [http://en.wikipedia.org/wiki/Alfa_Romeo_in_Formula_One] \n", - "15 [http://en.wikipedia.org/wiki/Scuderia_AlphaTauri] \n", - "16 [http://en.wikipedia.org/wiki/Haas_F1_Team] \n", - "17 [http://en.wikipedia.org/wiki/Williams_Grand_Prix_Engineering] \n", - "18 [http://en.wikipedia.org/wiki/Williams_Grand_Prix_Engineering] \n", - "19 [http://en.wikipedia.org/wiki/Scuderia_AlphaTauri] \n", - "\n", - " constructorNames constructorNationalities \n", - "0 [Red Bull] [Austrian] \n", - "1 [Red Bull] [Austrian] \n", - "2 [Aston Martin] [British] \n", - "3 [Mercedes] [German] \n", - "4 [Ferrari] [Italian] \n", - "5 [Mercedes] [German] \n", - "6 [Ferrari] [Italian] \n", - "7 [Aston Martin] [British] \n", - "8 [McLaren] [British] \n", - "9 [Alpine F1 Team] [French] \n", - "10 [Haas F1 Team] [American] \n", - "11 [Alpine F1 Team] [French] \n", - "12 [Alfa Romeo] [Swiss] \n", - "13 [McLaren] [British] \n", - "14 [Alfa Romeo] [Swiss] \n", - "15 [AlphaTauri] [Italian] \n", - "16 [Haas F1 Team] [American] \n", - "17 [Williams] [British] \n", - "18 [Williams] [British] \n", - "19 [AlphaTauri] [Italian] " - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "driver_standings_2023_miami = ergast.get_driver_standings(season=2023, round=5)\n", - "driver_standings_2023_miami.content[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "096a3800-c715-4a2a-ac40-983dad569237", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
positionpositionTextpointswinsdriverIddriverNumberdriverCodedriverUrlgivenNamefamilyNamedateOfBirthdriverNationalityconstructorIdsconstructorUrlsconstructorNamesconstructorNationalities
011575.019max_verstappen33VERhttp://en.wikipedia.org/wiki/Max_VerstappenMaxVerstappen1997-09-30Dutch[red_bull][http://en.wikipedia.org/wiki/Red_Bull_Racing][Red Bull][Austrian]
122285.02perez11PERhttp://en.wikipedia.org/wiki/Sergio_P%C3%A9rezSergioPérez1990-01-26Mexican[red_bull][http://en.wikipedia.org/wiki/Red_Bull_Racing][Red Bull][Austrian]
233234.00hamilton44HAMhttp://en.wikipedia.org/wiki/Lewis_HamiltonLewisHamilton1985-01-07British[mercedes][http://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_One][Mercedes][German]
344206.00alonso14ALOhttp://en.wikipedia.org/wiki/Fernando_AlonsoFernandoAlonso1981-07-29Spanish[aston_martin][http://en.wikipedia.org/wiki/Aston_Martin_in_Formula_One][Aston Martin][British]
455206.00leclerc16LEChttp://en.wikipedia.org/wiki/Charles_LeclercCharlesLeclerc1997-10-16Monegasque[ferrari][http://en.wikipedia.org/wiki/Scuderia_Ferrari][Ferrari][Italian]
566205.00norris4NORhttp://en.wikipedia.org/wiki/Lando_NorrisLandoNorris1999-11-13British[mclaren][http://en.wikipedia.org/wiki/McLaren][McLaren][British]
677200.01sainz55SAIhttp://en.wikipedia.org/wiki/Carlos_Sainz_Jr.CarlosSainz1994-09-01Spanish[ferrari][http://en.wikipedia.org/wiki/Scuderia_Ferrari][Ferrari][Italian]
788175.00russell63RUShttp://en.wikipedia.org/wiki/George_Russell_(racing_driver)GeorgeRussell1998-02-15British[mercedes][http://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_One][Mercedes][German]
89997.00piastri81PIAhttp://en.wikipedia.org/wiki/Oscar_PiastriOscarPiastri2001-04-06Australian[mclaren][http://en.wikipedia.org/wiki/McLaren][McLaren][British]
9101074.00stroll18STRhttp://en.wikipedia.org/wiki/Lance_StrollLanceStroll1998-10-29Canadian[aston_martin][http://en.wikipedia.org/wiki/Aston_Martin_in_Formula_One][Aston Martin][British]
10111162.00gasly10GAShttp://en.wikipedia.org/wiki/Pierre_GaslyPierreGasly1996-02-07French[alpine][http://en.wikipedia.org/wiki/Alpine_F1_Team][Alpine F1 Team][French]
11121258.00ocon31OCOhttp://en.wikipedia.org/wiki/Esteban_OconEstebanOcon1996-09-17French[alpine][http://en.wikipedia.org/wiki/Alpine_F1_Team][Alpine F1 Team][French]
12131327.00albon23ALBhttp://en.wikipedia.org/wiki/Alexander_AlbonAlexanderAlbon1996-03-23Thai[williams][http://en.wikipedia.org/wiki/Williams_Grand_Prix_Engineering][Williams][British]
13141417.00tsunoda22TSUhttp://en.wikipedia.org/wiki/Yuki_TsunodaYukiTsunoda2000-05-11Japanese[alphatauri][http://en.wikipedia.org/wiki/Scuderia_AlphaTauri][AlphaTauri][Italian]
14151510.00bottas77BOThttp://en.wikipedia.org/wiki/Valtteri_BottasValtteriBottas1989-08-28Finnish[alfa][http://en.wikipedia.org/wiki/Alfa_Romeo_in_Formula_One][Alfa Romeo][Swiss]
1516169.00hulkenberg27HULhttp://en.wikipedia.org/wiki/Nico_H%C3%BClkenbergNicoHülkenberg1987-08-19German[haas][http://en.wikipedia.org/wiki/Haas_F1_Team][Haas F1 Team][American]
1617176.00ricciardo3RIChttp://en.wikipedia.org/wiki/Daniel_RicciardoDanielRicciardo1989-07-01Australian[alphatauri][http://en.wikipedia.org/wiki/Scuderia_AlphaTauri][AlphaTauri][Italian]
1718186.00zhou24ZHOhttp://en.wikipedia.org/wiki/Zhou_GuanyuGuanyuZhou1999-05-30Chinese[alfa][http://en.wikipedia.org/wiki/Alfa_Romeo_in_Formula_One][Alfa Romeo][Swiss]
1819193.00kevin_magnussen20MAGhttp://en.wikipedia.org/wiki/Kevin_MagnussenKevinMagnussen1992-10-05Danish[haas][http://en.wikipedia.org/wiki/Haas_F1_Team][Haas F1 Team][American]
1920202.00lawson40LAWhttp://en.wikipedia.org/wiki/Liam_LawsonLiamLawson2002-02-11New Zealander[alphatauri][http://en.wikipedia.org/wiki/Scuderia_AlphaTauri][AlphaTauri][Italian]
2021211.00sargeant2SARhttp://en.wikipedia.org/wiki/Logan_SargeantLoganSargeant2000-12-31American[williams][http://en.wikipedia.org/wiki/Williams_Grand_Prix_Engineering][Williams][British]
2122220.00de_vries21DEVhttp://en.wikipedia.org/wiki/Nyck_de_VriesNyckde Vries1995-02-06Dutch[alphatauri][http://en.wikipedia.org/wiki/Scuderia_AlphaTauri][AlphaTauri][Italian]
\n", - "
" - ], - "text/plain": [ - " position positionText points wins driverId driverNumber \\\n", - "0 1 1 575.0 19 max_verstappen 33 \n", - "1 2 2 285.0 2 perez 11 \n", - "2 3 3 234.0 0 hamilton 44 \n", - "3 4 4 206.0 0 alonso 14 \n", - "4 5 5 206.0 0 leclerc 16 \n", - "5 6 6 205.0 0 norris 4 \n", - "6 7 7 200.0 1 sainz 55 \n", - "7 8 8 175.0 0 russell 63 \n", - "8 9 9 97.0 0 piastri 81 \n", - "9 10 10 74.0 0 stroll 18 \n", - "10 11 11 62.0 0 gasly 10 \n", - "11 12 12 58.0 0 ocon 31 \n", - "12 13 13 27.0 0 albon 23 \n", - "13 14 14 17.0 0 tsunoda 22 \n", - "14 15 15 10.0 0 bottas 77 \n", - "15 16 16 9.0 0 hulkenberg 27 \n", - "16 17 17 6.0 0 ricciardo 3 \n", - "17 18 18 6.0 0 zhou 24 \n", - "18 19 19 3.0 0 kevin_magnussen 20 \n", - "19 20 20 2.0 0 lawson 40 \n", - "20 21 21 1.0 0 sargeant 2 \n", - "21 22 22 0.0 0 de_vries 21 \n", - "\n", - " driverCode driverUrl \\\n", - "0 VER http://en.wikipedia.org/wiki/Max_Verstappen \n", - "1 PER http://en.wikipedia.org/wiki/Sergio_P%C3%A9rez \n", - "2 HAM http://en.wikipedia.org/wiki/Lewis_Hamilton \n", - "3 ALO http://en.wikipedia.org/wiki/Fernando_Alonso \n", - "4 LEC http://en.wikipedia.org/wiki/Charles_Leclerc \n", - "5 NOR http://en.wikipedia.org/wiki/Lando_Norris \n", - "6 SAI http://en.wikipedia.org/wiki/Carlos_Sainz_Jr. \n", - "7 RUS http://en.wikipedia.org/wiki/George_Russell_(racing_driver) \n", - "8 PIA http://en.wikipedia.org/wiki/Oscar_Piastri \n", - "9 STR http://en.wikipedia.org/wiki/Lance_Stroll \n", - "10 GAS http://en.wikipedia.org/wiki/Pierre_Gasly \n", - "11 OCO http://en.wikipedia.org/wiki/Esteban_Ocon \n", - "12 ALB http://en.wikipedia.org/wiki/Alexander_Albon \n", - "13 TSU http://en.wikipedia.org/wiki/Yuki_Tsunoda \n", - "14 BOT http://en.wikipedia.org/wiki/Valtteri_Bottas \n", - "15 HUL http://en.wikipedia.org/wiki/Nico_H%C3%BClkenberg \n", - "16 RIC http://en.wikipedia.org/wiki/Daniel_Ricciardo \n", - "17 ZHO http://en.wikipedia.org/wiki/Zhou_Guanyu \n", - "18 MAG http://en.wikipedia.org/wiki/Kevin_Magnussen \n", - "19 LAW http://en.wikipedia.org/wiki/Liam_Lawson \n", - "20 SAR http://en.wikipedia.org/wiki/Logan_Sargeant \n", - "21 DEV http://en.wikipedia.org/wiki/Nyck_de_Vries \n", - "\n", - " givenName familyName dateOfBirth driverNationality constructorIds \\\n", - "0 Max Verstappen 1997-09-30 Dutch [red_bull] \n", - "1 Sergio Pérez 1990-01-26 Mexican [red_bull] \n", - "2 Lewis Hamilton 1985-01-07 British [mercedes] \n", - "3 Fernando Alonso 1981-07-29 Spanish [aston_martin] \n", - "4 Charles Leclerc 1997-10-16 Monegasque [ferrari] \n", - "5 Lando Norris 1999-11-13 British [mclaren] \n", - "6 Carlos Sainz 1994-09-01 Spanish [ferrari] \n", - "7 George Russell 1998-02-15 British [mercedes] \n", - "8 Oscar Piastri 2001-04-06 Australian [mclaren] \n", - "9 Lance Stroll 1998-10-29 Canadian [aston_martin] \n", - "10 Pierre Gasly 1996-02-07 French [alpine] \n", - "11 Esteban Ocon 1996-09-17 French [alpine] \n", - "12 Alexander Albon 1996-03-23 Thai [williams] \n", - "13 Yuki Tsunoda 2000-05-11 Japanese [alphatauri] \n", - "14 Valtteri Bottas 1989-08-28 Finnish [alfa] \n", - "15 Nico Hülkenberg 1987-08-19 German [haas] \n", - "16 Daniel Ricciardo 1989-07-01 Australian [alphatauri] \n", - "17 Guanyu Zhou 1999-05-30 Chinese [alfa] \n", - "18 Kevin Magnussen 1992-10-05 Danish [haas] \n", - "19 Liam Lawson 2002-02-11 New Zealander [alphatauri] \n", - "20 Logan Sargeant 2000-12-31 American [williams] \n", - "21 Nyck de Vries 1995-02-06 Dutch [alphatauri] \n", - "\n", - " constructorUrls \\\n", - "0 [http://en.wikipedia.org/wiki/Red_Bull_Racing] \n", - "1 [http://en.wikipedia.org/wiki/Red_Bull_Racing] \n", - "2 [http://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_One] \n", - "3 [http://en.wikipedia.org/wiki/Aston_Martin_in_Formula_One] \n", - "4 [http://en.wikipedia.org/wiki/Scuderia_Ferrari] \n", - "5 [http://en.wikipedia.org/wiki/McLaren] \n", - "6 [http://en.wikipedia.org/wiki/Scuderia_Ferrari] \n", - "7 [http://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_One] \n", - "8 [http://en.wikipedia.org/wiki/McLaren] \n", - "9 [http://en.wikipedia.org/wiki/Aston_Martin_in_Formula_One] \n", - "10 [http://en.wikipedia.org/wiki/Alpine_F1_Team] \n", - "11 [http://en.wikipedia.org/wiki/Alpine_F1_Team] \n", - "12 [http://en.wikipedia.org/wiki/Williams_Grand_Prix_Engineering] \n", - "13 [http://en.wikipedia.org/wiki/Scuderia_AlphaTauri] \n", - "14 [http://en.wikipedia.org/wiki/Alfa_Romeo_in_Formula_One] \n", - "15 [http://en.wikipedia.org/wiki/Haas_F1_Team] \n", - "16 [http://en.wikipedia.org/wiki/Scuderia_AlphaTauri] \n", - "17 [http://en.wikipedia.org/wiki/Alfa_Romeo_in_Formula_One] \n", - "18 [http://en.wikipedia.org/wiki/Haas_F1_Team] \n", - "19 [http://en.wikipedia.org/wiki/Scuderia_AlphaTauri] \n", - "20 [http://en.wikipedia.org/wiki/Williams_Grand_Prix_Engineering] \n", - "21 [http://en.wikipedia.org/wiki/Scuderia_AlphaTauri] \n", - "\n", - " constructorNames constructorNationalities \n", - "0 [Red Bull] [Austrian] \n", - "1 [Red Bull] [Austrian] \n", - "2 [Mercedes] [German] \n", - "3 [Aston Martin] [British] \n", - "4 [Ferrari] [Italian] \n", - "5 [McLaren] [British] \n", - "6 [Ferrari] [Italian] \n", - "7 [Mercedes] [German] \n", - "8 [McLaren] [British] \n", - "9 [Aston Martin] [British] \n", - "10 [Alpine F1 Team] [French] \n", - "11 [Alpine F1 Team] [French] \n", - "12 [Williams] [British] \n", - "13 [AlphaTauri] [Italian] \n", - "14 [Alfa Romeo] [Swiss] \n", - "15 [Haas F1 Team] [American] \n", - "16 [AlphaTauri] [Italian] \n", - "17 [Alfa Romeo] [Swiss] \n", - "18 [Haas F1 Team] [American] \n", - "19 [AlphaTauri] [Italian] \n", - "20 [Williams] [British] \n", - "21 [AlphaTauri] [Italian] " - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "driver_standings_2023 = ergast.get_driver_standings(season=2023)\n", - "driver_standings_2023.content[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "dda2adbc-1a1f-43c9-a015-9dd9efa81149", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
positionpositionTextpointswinsconstructorIdconstructorUrlconstructorNameconstructorNationality
011860.021red_bullhttp://en.wikipedia.org/wiki/Red_Bull_RacingRed BullAustrian
122409.00mercedeshttp://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_OneMercedesGerman
233406.01ferrarihttp://en.wikipedia.org/wiki/Scuderia_FerrariFerrariItalian
344302.00mclarenhttp://en.wikipedia.org/wiki/McLarenMcLarenBritish
455280.00aston_martinhttp://en.wikipedia.org/wiki/Aston_Martin_in_Formula_OneAston MartinBritish
566120.00alpinehttp://en.wikipedia.org/wiki/Alpine_F1_TeamAlpine F1 TeamFrench
67728.00williamshttp://en.wikipedia.org/wiki/Williams_Grand_Prix_EngineeringWilliamsBritish
78825.00alphataurihttp://en.wikipedia.org/wiki/Scuderia_AlphaTauriAlphaTauriItalian
89916.00alfahttp://en.wikipedia.org/wiki/Alfa_Romeo_in_Formula_OneAlfa RomeoSwiss
9101012.00haashttp://en.wikipedia.org/wiki/Haas_F1_TeamHaas F1 TeamAmerican
\n", - "
" - ], - "text/plain": [ - " position positionText points wins constructorId \\\n", - "0 1 1 860.0 21 red_bull \n", - "1 2 2 409.0 0 mercedes \n", - "2 3 3 406.0 1 ferrari \n", - "3 4 4 302.0 0 mclaren \n", - "4 5 5 280.0 0 aston_martin \n", - "5 6 6 120.0 0 alpine \n", - "6 7 7 28.0 0 williams \n", - "7 8 8 25.0 0 alphatauri \n", - "8 9 9 16.0 0 alfa \n", - "9 10 10 12.0 0 haas \n", - "\n", - " constructorUrl \\\n", - "0 http://en.wikipedia.org/wiki/Red_Bull_Racing \n", - "1 http://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_One \n", - "2 http://en.wikipedia.org/wiki/Scuderia_Ferrari \n", - "3 http://en.wikipedia.org/wiki/McLaren \n", - "4 http://en.wikipedia.org/wiki/Aston_Martin_in_Formula_One \n", - "5 http://en.wikipedia.org/wiki/Alpine_F1_Team \n", - "6 http://en.wikipedia.org/wiki/Williams_Grand_Prix_Engineering \n", - "7 http://en.wikipedia.org/wiki/Scuderia_AlphaTauri \n", - "8 http://en.wikipedia.org/wiki/Alfa_Romeo_in_Formula_One \n", - "9 http://en.wikipedia.org/wiki/Haas_F1_Team \n", - "\n", - " constructorName constructorNationality \n", - "0 Red Bull Austrian \n", - "1 Mercedes German \n", - "2 Ferrari Italian \n", - "3 McLaren British \n", - "4 Aston Martin British \n", - "5 Alpine F1 Team French \n", - "6 Williams British \n", - "7 AlphaTauri Italian \n", - "8 Alfa Romeo Swiss \n", - "9 Haas F1 Team American " - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "constructor_standings_2023 = ergast.get_constructor_standings(season=2023)\n", - "constructor_standings_2023.content[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "398816a5-113c-4126-b1de-405e2e9db390", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'Meeting': {'Key': 1141,\n", - " 'Name': 'Bahrain Grand Prix',\n", - " 'OfficialName': 'FORMULA 1 GULF AIR BAHRAIN GRAND PRIX 2023',\n", - " 'Location': 'Sakhir',\n", - " 'Country': {'Key': 36, 'Code': 'BRN', 'Name': 'Bahrain'},\n", - " 'Circuit': {'Key': 63, 'ShortName': 'Sakhir'}},\n", - " 'ArchiveStatus': {'Status': 'Generating'},\n", - " 'Key': 7953,\n", - " 'Type': 'Race',\n", - " 'Name': 'Race',\n", - " 'StartDate': datetime.datetime(2023, 3, 5, 18, 0),\n", - " 'EndDate': datetime.datetime(2023, 3, 5, 20, 0),\n", - " 'GmtOffset': datetime.timedelta(seconds=10800),\n", - " 'Path': '2023/2023-03-05_Bahrain_Grand_Prix/2023-03-05_Race/'}" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "race_event.session_info" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "cdc295cb-37a3-493c-acec-557aee7dc8e5", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", "
TimeStatusMessage
00 days 00:05:28.6370001AllClear
10 days 00:21:59.0400002Yellow
20 days 00:22:03.1650001AllClear
30 days 01:03:07.6510002Yellow
40 days 01:03:08.1510001AllClear
50 days 01:04:15.9780002Yellow
60 days 01:04:51.2430001AllClear
70 days 02:08:59.8300002Yellow
80 days 02:09:18.2980006VSCDeployed
90 days 02:10:53.8750007VSCEnding
100 days 02:11:06.4370001AllClear0 days 02:11:06.4370001AllClear
\n", @@ -4362,7 +2999,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "a63f3ab0-d8d0-4328-bd51-d6feee44ba26", "metadata": {}, "outputs": [ @@ -4578,7 +3215,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "402643c3-e960-471d-adc7-a4a491900065", "metadata": {}, "outputs": [ @@ -4781,7 +3418,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "id": "b0c6ab4f-3b89-4810-bae4-a42adb63b65c", "metadata": {}, "outputs": [ @@ -4802,7 +3439,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "id": "5c77f746-5b9b-4302-9ae8-db1869c9bf74", "metadata": {}, "outputs": [ @@ -4820,6 +3457,482 @@ "source": [ "race_event.session_start_time" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f23653a0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[{'position': '1',\n", + " 'positionText': '1',\n", + " 'points': '860',\n", + " 'wins': '21',\n", + " 'Constructor': {'constructorId': 'red_bull',\n", + " 'url': 'http://en.wikipedia.org/wiki/Red_Bull_Racing',\n", + " 'name': 'Red Bull',\n", + " 'nationality': 'Austrian'}},\n", + " {'position': '2',\n", + " 'positionText': '2',\n", + " 'points': '409',\n", + " 'wins': '0',\n", + " 'Constructor': {'constructorId': 'mercedes',\n", + " 'url': 'http://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_One',\n", + " 'name': 'Mercedes',\n", + " 'nationality': 'German'}},\n", + " {'position': '3',\n", + " 'positionText': '3',\n", + " 'points': '406',\n", + " 'wins': '1',\n", + " 'Constructor': {'constructorId': 'ferrari',\n", + " 'url': 'http://en.wikipedia.org/wiki/Scuderia_Ferrari',\n", + " 'name': 'Ferrari',\n", + " 'nationality': 'Italian'}},\n", + " {'position': '4',\n", + " 'positionText': '4',\n", + " 'points': '302',\n", + " 'wins': '0',\n", + " 'Constructor': {'constructorId': 'mclaren',\n", + " 'url': 'http://en.wikipedia.org/wiki/McLaren',\n", + " 'name': 'McLaren',\n", + " 'nationality': 'British'}},\n", + " {'position': '5',\n", + " 'positionText': '5',\n", + " 'points': '280',\n", + " 'wins': '0',\n", + " 'Constructor': {'constructorId': 'aston_martin',\n", + " 'url': 'http://en.wikipedia.org/wiki/Aston_Martin_in_Formula_One',\n", + " 'name': 'Aston Martin',\n", + " 'nationality': 'British'}},\n", + " {'position': '6',\n", + " 'positionText': '6',\n", + " 'points': '120',\n", + " 'wins': '0',\n", + " 'Constructor': {'constructorId': 'alpine',\n", + " 'url': 'http://en.wikipedia.org/wiki/Alpine_F1_Team',\n", + " 'name': 'Alpine F1 Team',\n", + " 'nationality': 'French'}},\n", + " {'position': '7',\n", + " 'positionText': '7',\n", + " 'points': '28',\n", + " 'wins': '0',\n", + " 'Constructor': {'constructorId': 'williams',\n", + " 'url': 'http://en.wikipedia.org/wiki/Williams_Grand_Prix_Engineering',\n", + " 'name': 'Williams',\n", + " 'nationality': 'British'}},\n", + " {'position': '8',\n", + " 'positionText': '8',\n", + " 'points': '25',\n", + " 'wins': '0',\n", + " 'Constructor': {'constructorId': 'alphatauri',\n", + " 'url': 'http://en.wikipedia.org/wiki/Scuderia_AlphaTauri',\n", + " 'name': 'AlphaTauri',\n", + " 'nationality': 'Italian'}},\n", + " {'position': '9',\n", + " 'positionText': '9',\n", + " 'points': '16',\n", + " 'wins': '0',\n", + " 'Constructor': {'constructorId': 'alfa',\n", + " 'url': 'http://en.wikipedia.org/wiki/Alfa_Romeo_in_Formula_One',\n", + " 'name': 'Alfa Romeo',\n", + " 'nationality': 'Swiss'}},\n", + " {'position': '10',\n", + " 'positionText': '10',\n", + " 'points': '12',\n", + " 'wins': '0',\n", + " 'Constructor': {'constructorId': 'haas',\n", + " 'url': 'http://en.wikipedia.org/wiki/Haas_F1_Team',\n", + " 'name': 'Haas F1 Team',\n", + " 'nationality': 'American'}}]" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "constructor_standings_2023 = ergast.get_constructor_standings(season=2023)\n", + "constructor_standings_2023[0][\"ConstructorStandings\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2717d227", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[{'season': 2023,\n", + " 'round': 22,\n", + " 'DriverStandings': [{'position': '1',\n", + " 'positionText': '1',\n", + " 'points': '575',\n", + " 'wins': '19',\n", + " 'Driver': {'driverId': 'max_verstappen',\n", + " 'permanentNumber': '33',\n", + " 'code': 'VER',\n", + " 'url': 'http://en.wikipedia.org/wiki/Max_Verstappen',\n", + " 'givenName': 'Max',\n", + " 'familyName': 'Verstappen',\n", + " 'dateOfBirth': '1997-09-30',\n", + " 'nationality': 'Dutch'},\n", + " 'Constructors': [{'constructorId': 'red_bull',\n", + " 'url': 'http://en.wikipedia.org/wiki/Red_Bull_Racing',\n", + " 'name': 'Red Bull',\n", + " 'nationality': 'Austrian'}]},\n", + " {'position': '2',\n", + " 'positionText': '2',\n", + " 'points': '285',\n", + " 'wins': '2',\n", + " 'Driver': {'driverId': 'perez',\n", + " 'permanentNumber': '11',\n", + " 'code': 'PER',\n", + " 'url': 'http://en.wikipedia.org/wiki/Sergio_P%C3%A9rez',\n", + " 'givenName': 'Sergio',\n", + " 'familyName': 'Pérez',\n", + " 'dateOfBirth': '1990-01-26',\n", + " 'nationality': 'Mexican'},\n", + " 'Constructors': [{'constructorId': 'red_bull',\n", + " 'url': 'http://en.wikipedia.org/wiki/Red_Bull_Racing',\n", + " 'name': 'Red Bull',\n", + " 'nationality': 'Austrian'}]},\n", + " {'position': '3',\n", + " 'positionText': '3',\n", + " 'points': '234',\n", + " 'wins': '0',\n", + " 'Driver': {'driverId': 'hamilton',\n", + " 'permanentNumber': '44',\n", + " 'code': 'HAM',\n", + " 'url': 'http://en.wikipedia.org/wiki/Lewis_Hamilton',\n", + " 'givenName': 'Lewis',\n", + " 'familyName': 'Hamilton',\n", + " 'dateOfBirth': '1985-01-07',\n", + " 'nationality': 'British'},\n", + " 'Constructors': [{'constructorId': 'mercedes',\n", + " 'url': 'http://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_One',\n", + " 'name': 'Mercedes',\n", + " 'nationality': 'German'}]},\n", + " {'position': '4',\n", + " 'positionText': '4',\n", + " 'points': '206',\n", + " 'wins': '0',\n", + " 'Driver': {'driverId': 'alonso',\n", + " 'permanentNumber': '14',\n", + " 'code': 'ALO',\n", + " 'url': 'http://en.wikipedia.org/wiki/Fernando_Alonso',\n", + " 'givenName': 'Fernando',\n", + " 'familyName': 'Alonso',\n", + " 'dateOfBirth': '1981-07-29',\n", + " 'nationality': 'Spanish'},\n", + " 'Constructors': [{'constructorId': 'aston_martin',\n", + " 'url': 'http://en.wikipedia.org/wiki/Aston_Martin_in_Formula_One',\n", + " 'name': 'Aston Martin',\n", + " 'nationality': 'British'}]},\n", + " {'position': '5',\n", + " 'positionText': '5',\n", + " 'points': '206',\n", + " 'wins': '0',\n", + " 'Driver': {'driverId': 'leclerc',\n", + " 'permanentNumber': '16',\n", + " 'code': 'LEC',\n", + " 'url': 'http://en.wikipedia.org/wiki/Charles_Leclerc',\n", + " 'givenName': 'Charles',\n", + " 'familyName': 'Leclerc',\n", + " 'dateOfBirth': '1997-10-16',\n", + " 'nationality': 'Monegasque'},\n", + " 'Constructors': [{'constructorId': 'ferrari',\n", + " 'url': 'http://en.wikipedia.org/wiki/Scuderia_Ferrari',\n", + " 'name': 'Ferrari',\n", + " 'nationality': 'Italian'}]},\n", + " {'position': '6',\n", + " 'positionText': '6',\n", + " 'points': '205',\n", + " 'wins': '0',\n", + " 'Driver': {'driverId': 'norris',\n", + " 'permanentNumber': '4',\n", + " 'code': 'NOR',\n", + " 'url': 'http://en.wikipedia.org/wiki/Lando_Norris',\n", + " 'givenName': 'Lando',\n", + " 'familyName': 'Norris',\n", + " 'dateOfBirth': '1999-11-13',\n", + " 'nationality': 'British'},\n", + " 'Constructors': [{'constructorId': 'mclaren',\n", + " 'url': 'http://en.wikipedia.org/wiki/McLaren',\n", + " 'name': 'McLaren',\n", + " 'nationality': 'British'}]},\n", + " {'position': '7',\n", + " 'positionText': '7',\n", + " 'points': '200',\n", + " 'wins': '1',\n", + " 'Driver': {'driverId': 'sainz',\n", + " 'permanentNumber': '55',\n", + " 'code': 'SAI',\n", + " 'url': 'http://en.wikipedia.org/wiki/Carlos_Sainz_Jr.',\n", + " 'givenName': 'Carlos',\n", + " 'familyName': 'Sainz',\n", + " 'dateOfBirth': '1994-09-01',\n", + " 'nationality': 'Spanish'},\n", + " 'Constructors': [{'constructorId': 'ferrari',\n", + " 'url': 'http://en.wikipedia.org/wiki/Scuderia_Ferrari',\n", + " 'name': 'Ferrari',\n", + " 'nationality': 'Italian'}]},\n", + " {'position': '8',\n", + " 'positionText': '8',\n", + " 'points': '175',\n", + " 'wins': '0',\n", + " 'Driver': {'driverId': 'russell',\n", + " 'permanentNumber': '63',\n", + " 'code': 'RUS',\n", + " 'url': 'http://en.wikipedia.org/wiki/George_Russell_(racing_driver)',\n", + " 'givenName': 'George',\n", + " 'familyName': 'Russell',\n", + " 'dateOfBirth': '1998-02-15',\n", + " 'nationality': 'British'},\n", + " 'Constructors': [{'constructorId': 'mercedes',\n", + " 'url': 'http://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_One',\n", + " 'name': 'Mercedes',\n", + " 'nationality': 'German'}]},\n", + " {'position': '9',\n", + " 'positionText': '9',\n", + " 'points': '97',\n", + " 'wins': '0',\n", + " 'Driver': {'driverId': 'piastri',\n", + " 'permanentNumber': '81',\n", + " 'code': 'PIA',\n", + " 'url': 'http://en.wikipedia.org/wiki/Oscar_Piastri',\n", + " 'givenName': 'Oscar',\n", + " 'familyName': 'Piastri',\n", + " 'dateOfBirth': '2001-04-06',\n", + " 'nationality': 'Australian'},\n", + " 'Constructors': [{'constructorId': 'mclaren',\n", + " 'url': 'http://en.wikipedia.org/wiki/McLaren',\n", + " 'name': 'McLaren',\n", + " 'nationality': 'British'}]},\n", + " {'position': '10',\n", + " 'positionText': '10',\n", + " 'points': '74',\n", + " 'wins': '0',\n", + " 'Driver': {'driverId': 'stroll',\n", + " 'permanentNumber': '18',\n", + " 'code': 'STR',\n", + " 'url': 'http://en.wikipedia.org/wiki/Lance_Stroll',\n", + " 'givenName': 'Lance',\n", + " 'familyName': 'Stroll',\n", + " 'dateOfBirth': '1998-10-29',\n", + " 'nationality': 'Canadian'},\n", + " 'Constructors': [{'constructorId': 'aston_martin',\n", + " 'url': 'http://en.wikipedia.org/wiki/Aston_Martin_in_Formula_One',\n", + " 'name': 'Aston Martin',\n", + " 'nationality': 'British'}]},\n", + " {'position': '11',\n", + " 'positionText': '11',\n", + " 'points': '62',\n", + " 'wins': '0',\n", + " 'Driver': {'driverId': 'gasly',\n", + " 'permanentNumber': '10',\n", + " 'code': 'GAS',\n", + " 'url': 'http://en.wikipedia.org/wiki/Pierre_Gasly',\n", + " 'givenName': 'Pierre',\n", + " 'familyName': 'Gasly',\n", + " 'dateOfBirth': '1996-02-07',\n", + " 'nationality': 'French'},\n", + " 'Constructors': [{'constructorId': 'alpine',\n", + " 'url': 'http://en.wikipedia.org/wiki/Alpine_F1_Team',\n", + " 'name': 'Alpine F1 Team',\n", + " 'nationality': 'French'}]},\n", + " {'position': '12',\n", + " 'positionText': '12',\n", + " 'points': '58',\n", + " 'wins': '0',\n", + " 'Driver': {'driverId': 'ocon',\n", + " 'permanentNumber': '31',\n", + " 'code': 'OCO',\n", + " 'url': 'http://en.wikipedia.org/wiki/Esteban_Ocon',\n", + " 'givenName': 'Esteban',\n", + " 'familyName': 'Ocon',\n", + " 'dateOfBirth': '1996-09-17',\n", + " 'nationality': 'French'},\n", + " 'Constructors': [{'constructorId': 'alpine',\n", + " 'url': 'http://en.wikipedia.org/wiki/Alpine_F1_Team',\n", + " 'name': 'Alpine F1 Team',\n", + " 'nationality': 'French'}]},\n", + " {'position': '13',\n", + " 'positionText': '13',\n", + " 'points': '27',\n", + " 'wins': '0',\n", + " 'Driver': {'driverId': 'albon',\n", + " 'permanentNumber': '23',\n", + " 'code': 'ALB',\n", + " 'url': 'http://en.wikipedia.org/wiki/Alexander_Albon',\n", + " 'givenName': 'Alexander',\n", + " 'familyName': 'Albon',\n", + " 'dateOfBirth': '1996-03-23',\n", + " 'nationality': 'Thai'},\n", + " 'Constructors': [{'constructorId': 'williams',\n", + " 'url': 'http://en.wikipedia.org/wiki/Williams_Grand_Prix_Engineering',\n", + " 'name': 'Williams',\n", + " 'nationality': 'British'}]},\n", + " {'position': '14',\n", + " 'positionText': '14',\n", + " 'points': '17',\n", + " 'wins': '0',\n", + " 'Driver': {'driverId': 'tsunoda',\n", + " 'permanentNumber': '22',\n", + " 'code': 'TSU',\n", + " 'url': 'http://en.wikipedia.org/wiki/Yuki_Tsunoda',\n", + " 'givenName': 'Yuki',\n", + " 'familyName': 'Tsunoda',\n", + " 'dateOfBirth': '2000-05-11',\n", + " 'nationality': 'Japanese'},\n", + " 'Constructors': [{'constructorId': 'alphatauri',\n", + " 'url': 'http://en.wikipedia.org/wiki/Scuderia_AlphaTauri',\n", + " 'name': 'AlphaTauri',\n", + " 'nationality': 'Italian'}]},\n", + " {'position': '15',\n", + " 'positionText': '15',\n", + " 'points': '10',\n", + " 'wins': '0',\n", + " 'Driver': {'driverId': 'bottas',\n", + " 'permanentNumber': '77',\n", + " 'code': 'BOT',\n", + " 'url': 'http://en.wikipedia.org/wiki/Valtteri_Bottas',\n", + " 'givenName': 'Valtteri',\n", + " 'familyName': 'Bottas',\n", + " 'dateOfBirth': '1989-08-28',\n", + " 'nationality': 'Finnish'},\n", + " 'Constructors': [{'constructorId': 'alfa',\n", + " 'url': 'http://en.wikipedia.org/wiki/Alfa_Romeo_in_Formula_One',\n", + " 'name': 'Alfa Romeo',\n", + " 'nationality': 'Swiss'}]},\n", + " {'position': '16',\n", + " 'positionText': '16',\n", + " 'points': '9',\n", + " 'wins': '0',\n", + " 'Driver': {'driverId': 'hulkenberg',\n", + " 'permanentNumber': '27',\n", + " 'code': 'HUL',\n", + " 'url': 'http://en.wikipedia.org/wiki/Nico_H%C3%BClkenberg',\n", + " 'givenName': 'Nico',\n", + " 'familyName': 'Hülkenberg',\n", + " 'dateOfBirth': '1987-08-19',\n", + " 'nationality': 'German'},\n", + " 'Constructors': [{'constructorId': 'haas',\n", + " 'url': 'http://en.wikipedia.org/wiki/Haas_F1_Team',\n", + " 'name': 'Haas F1 Team',\n", + " 'nationality': 'American'}]},\n", + " {'position': '17',\n", + " 'positionText': '17',\n", + " 'points': '6',\n", + " 'wins': '0',\n", + " 'Driver': {'driverId': 'ricciardo',\n", + " 'permanentNumber': '3',\n", + " 'code': 'RIC',\n", + " 'url': 'http://en.wikipedia.org/wiki/Daniel_Ricciardo',\n", + " 'givenName': 'Daniel',\n", + " 'familyName': 'Ricciardo',\n", + " 'dateOfBirth': '1989-07-01',\n", + " 'nationality': 'Australian'},\n", + " 'Constructors': [{'constructorId': 'alphatauri',\n", + " 'url': 'http://en.wikipedia.org/wiki/Scuderia_AlphaTauri',\n", + " 'name': 'AlphaTauri',\n", + " 'nationality': 'Italian'}]},\n", + " {'position': '18',\n", + " 'positionText': '18',\n", + " 'points': '6',\n", + " 'wins': '0',\n", + " 'Driver': {'driverId': 'zhou',\n", + " 'permanentNumber': '24',\n", + " 'code': 'ZHO',\n", + " 'url': 'http://en.wikipedia.org/wiki/Zhou_Guanyu',\n", + " 'givenName': 'Guanyu',\n", + " 'familyName': 'Zhou',\n", + " 'dateOfBirth': '1999-05-30',\n", + " 'nationality': 'Chinese'},\n", + " 'Constructors': [{'constructorId': 'alfa',\n", + " 'url': 'http://en.wikipedia.org/wiki/Alfa_Romeo_in_Formula_One',\n", + " 'name': 'Alfa Romeo',\n", + " 'nationality': 'Swiss'}]},\n", + " {'position': '19',\n", + " 'positionText': '19',\n", + " 'points': '3',\n", + " 'wins': '0',\n", + " 'Driver': {'driverId': 'kevin_magnussen',\n", + " 'permanentNumber': '20',\n", + " 'code': 'MAG',\n", + " 'url': 'http://en.wikipedia.org/wiki/Kevin_Magnussen',\n", + " 'givenName': 'Kevin',\n", + " 'familyName': 'Magnussen',\n", + " 'dateOfBirth': '1992-10-05',\n", + " 'nationality': 'Danish'},\n", + " 'Constructors': [{'constructorId': 'haas',\n", + " 'url': 'http://en.wikipedia.org/wiki/Haas_F1_Team',\n", + " 'name': 'Haas F1 Team',\n", + " 'nationality': 'American'}]},\n", + " {'position': '20',\n", + " 'positionText': '20',\n", + " 'points': '2',\n", + " 'wins': '0',\n", + " 'Driver': {'driverId': 'lawson',\n", + " 'permanentNumber': '40',\n", + " 'code': 'LAW',\n", + " 'url': 'http://en.wikipedia.org/wiki/Liam_Lawson',\n", + " 'givenName': 'Liam',\n", + " 'familyName': 'Lawson',\n", + " 'dateOfBirth': '2002-02-11',\n", + " 'nationality': 'New Zealander'},\n", + " 'Constructors': [{'constructorId': 'alphatauri',\n", + " 'url': 'http://en.wikipedia.org/wiki/Scuderia_AlphaTauri',\n", + " 'name': 'AlphaTauri',\n", + " 'nationality': 'Italian'}]},\n", + " {'position': '21',\n", + " 'positionText': '21',\n", + " 'points': '1',\n", + " 'wins': '0',\n", + " 'Driver': {'driverId': 'sargeant',\n", + " 'permanentNumber': '2',\n", + " 'code': 'SAR',\n", + " 'url': 'http://en.wikipedia.org/wiki/Logan_Sargeant',\n", + " 'givenName': 'Logan',\n", + " 'familyName': 'Sargeant',\n", + " 'dateOfBirth': '2000-12-31',\n", + " 'nationality': 'American'},\n", + " 'Constructors': [{'constructorId': 'williams',\n", + " 'url': 'http://en.wikipedia.org/wiki/Williams_Grand_Prix_Engineering',\n", + " 'name': 'Williams',\n", + " 'nationality': 'British'}]},\n", + " {'position': '22',\n", + " 'positionText': '22',\n", + " 'points': '0',\n", + " 'wins': '0',\n", + " 'Driver': {'driverId': 'de_vries',\n", + " 'permanentNumber': '21',\n", + " 'code': 'DEV',\n", + " 'url': 'http://en.wikipedia.org/wiki/Nyck_de_Vries',\n", + " 'givenName': 'Nyck',\n", + " 'familyName': 'de Vries',\n", + " 'dateOfBirth': '1995-02-06',\n", + " 'nationality': 'Dutch'},\n", + " 'Constructors': [{'constructorId': 'alphatauri',\n", + " 'url': 'http://en.wikipedia.org/wiki/Scuderia_AlphaTauri',\n", + " 'name': 'AlphaTauri',\n", + " 'nationality': 'Italian'}]}]}]" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "driver_standings_2023 = ergast.get_driver_standings(season=2023)\n", + "driver_standings_2023" + ] } ], "metadata": { diff --git a/poetry.lock b/poetry.lock index 8bd9273..30587c3 100644 --- a/poetry.lock +++ b/poetry.lock @@ -182,19 +182,22 @@ dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] [[package]] name = "beautifulsoup4" -version = "4.12.2" +version = "4.12.3" description = "Screen-scraping library" optional = false python-versions = ">=3.6.0" files = [ - {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, - {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, + {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, + {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, ] [package.dependencies] soupsieve = ">1.2" [package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] html5lib = ["html5lib"] lxml = ["lxml"] @@ -900,13 +903,13 @@ files = [ [[package]] name = "ipykernel" -version = "6.28.0" +version = "6.29.0" description = "IPython Kernel for Jupyter" optional = false python-versions = ">=3.8" files = [ - {file = "ipykernel-6.28.0-py3-none-any.whl", hash = "sha256:c6e9a9c63a7f4095c0a22a79f765f079f9ec7be4f2430a898ddea889e8665661"}, - {file = "ipykernel-6.28.0.tar.gz", hash = "sha256:69c11403d26de69df02225916f916b37ea4b9af417da0a8c827f84328d88e5f3"}, + {file = "ipykernel-6.29.0-py3-none-any.whl", hash = "sha256:076663ca68492576f051e4af7720d33f34383e655f2be0d544c8b1c9de915b2f"}, + {file = "ipykernel-6.29.0.tar.gz", hash = "sha256:b5dd3013cab7b330df712891c96cd1ab868c27a7159e606f762015e9bf8ceb3f"}, ] [package.dependencies] @@ -929,7 +932,7 @@ cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] pyqt5 = ["pyqt5"] pyside6 = ["pyside6"] -test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov", "pytest-timeout"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (==0.23.2)", "pytest-cov", "pytest-timeout"] [[package]] name = "ipython" @@ -1057,13 +1060,13 @@ files = [ [[package]] name = "jsonschema" -version = "4.20.0" +version = "4.21.1" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema-4.20.0-py3-none-any.whl", hash = "sha256:ed6231f0429ecf966f5bc8dfef245998220549cbbcf140f913b7464c52c3b6b3"}, - {file = "jsonschema-4.20.0.tar.gz", hash = "sha256:4f614fd46d8d61258610998997743ec5492a648b33cf478c1ddc23ed4598a5fa"}, + {file = "jsonschema-4.21.1-py3-none-any.whl", hash = "sha256:7996507afae316306f9e2290407761157c6f78002dcf7419acb99822143d1c6f"}, + {file = "jsonschema-4.21.1.tar.gz", hash = "sha256:85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5"}, ] [package.dependencies] @@ -1167,13 +1170,13 @@ test = ["click", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "p [[package]] name = "jupyter-lsp" -version = "2.2.1" +version = "2.2.2" description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter-lsp-2.2.1.tar.gz", hash = "sha256:b17fab6d70fe83c8896b0cff59237640038247c196056b43684a0902b6a9e0fb"}, - {file = "jupyter_lsp-2.2.1-py3-none-any.whl", hash = "sha256:17a689910c5e4ae5e7d334b02f31d08ffbe98108f6f658fb05e4304b4345368b"}, + {file = "jupyter-lsp-2.2.2.tar.gz", hash = "sha256:256d24620542ae4bba04a50fc1f6ffe208093a07d8e697fea0a8d1b8ca1b7e5b"}, + {file = "jupyter_lsp-2.2.2-py3-none-any.whl", hash = "sha256:3b95229e4168355a8c91928057c1621ac3510ba98b2a925e82ebd77f078b1aa5"}, ] [package.dependencies] @@ -1181,13 +1184,13 @@ jupyter-server = ">=1.1.2" [[package]] name = "jupyter-server" -version = "2.12.4" +version = "2.12.5" description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_server-2.12.4-py3-none-any.whl", hash = "sha256:a125ae18a60de568f78f55c84dd58759901a18ef279abf0418ac220653ca1320"}, - {file = "jupyter_server-2.12.4.tar.gz", hash = "sha256:41f4a1e6b912cc24a7c6c694851b37d3d8412b180f43d72315fe422cb2b85cc2"}, + {file = "jupyter_server-2.12.5-py3-none-any.whl", hash = "sha256:184a0f82809a8522777cfb6b760ab6f4b1bb398664c5860a27cec696cb884923"}, + {file = "jupyter_server-2.12.5.tar.gz", hash = "sha256:0edb626c94baa22809be1323f9770cf1c00a952b17097592e40d03e6a3951689"}, ] [package.dependencies] @@ -1236,13 +1239,13 @@ test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (> [[package]] name = "jupyterlab" -version = "4.0.10" +version = "4.0.11" description = "JupyterLab computational environment" optional = false python-versions = ">=3.8" files = [ - {file = "jupyterlab-4.0.10-py3-none-any.whl", hash = "sha256:fe010ad9e37017488b468632ef2ead255fc7c671c5b64d9ca13e1f7b7e665c37"}, - {file = "jupyterlab-4.0.10.tar.gz", hash = "sha256:46177eb8ede70dc73be922ac99f8ef943bdc2dfbc6a31b353c4bde848a35dee1"}, + {file = "jupyterlab-4.0.11-py3-none-any.whl", hash = "sha256:536bf0e78723153a5016ca7efb88ed0ecd7070d3f1555d5b0e2770658f900a3c"}, + {file = "jupyterlab-4.0.11.tar.gz", hash = "sha256:d1aec24712566bc25a36229788242778e498ca4088028e2f9aa156b8b7fdc8fc"}, ] [package.dependencies] @@ -1434,71 +1437,71 @@ files = [ [[package]] name = "markupsafe" -version = "2.1.3" +version = "2.1.4" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, - {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0b838c37ba596fcbfca71651a104a611543077156cb0a26fe0c475e1f152ee8"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbad3d346df8f9d72622ac71b69565e621ada2ce6572f37c2eae8dacd60385d"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5291d98cd3ad9a562883468c690a2a238c4a6388ab3bd155b0c75dd55ece858"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a7cc49ef48a3c7a0005a949f3c04f8baa5409d3f663a1b36f0eba9bfe2a0396e"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b83041cda633871572f0d3c41dddd5582ad7d22f65a72eacd8d3d6d00291df26"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-win32.whl", hash = "sha256:0c26f67b3fe27302d3a412b85ef696792c4a2386293c53ba683a89562f9399b0"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-win_amd64.whl", hash = "sha256:a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9e9e3c4020aa2dc62d5dd6743a69e399ce3de58320522948af6140ac959ab863"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0042d6a9880b38e1dd9ff83146cc3c9c18a059b9360ceae207805567aacccc69"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d03fea4c4e9fd0ad75dc2e7e2b6757b80c152c032ea1d1de487461d8140efc"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ab3a886a237f6e9c9f4f7d272067e712cdb4efa774bef494dccad08f39d8ae6"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abf5ebbec056817057bfafc0445916bb688a255a5146f900445d081db08cbabb"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e1a0d1924a5013d4f294087e00024ad25668234569289650929ab871231668e7"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e7902211afd0af05fbadcc9a312e4cf10f27b779cf1323e78d52377ae4b72bea"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c669391319973e49a7c6230c218a1e3044710bc1ce4c8e6eb71f7e6d43a2c131"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-win32.whl", hash = "sha256:31f57d64c336b8ccb1966d156932f3daa4fee74176b0fdc48ef580be774aae74"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:54a7e1380dfece8847c71bf7e33da5d084e9b889c75eca19100ef98027bd9f56"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a76cd37d229fc385738bd1ce4cba2a121cf26b53864c1772694ad0ad348e509e"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:987d13fe1d23e12a66ca2073b8d2e2a75cec2ecb8eab43ff5624ba0ad42764bc"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5244324676254697fe5c181fc762284e2c5fceeb1c4e3e7f6aca2b6f107e60dc"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78bc995e004681246e85e28e068111a4c3f35f34e6c62da1471e844ee1446250"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4d176cfdfde84f732c4a53109b293d05883e952bbba68b857ae446fa3119b4f"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f9917691f410a2e0897d1ef99619fd3f7dd503647c8ff2475bf90c3cf222ad74"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f06e5a9e99b7df44640767842f414ed5d7bedaaa78cd817ce04bbd6fd86e2dd6"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:396549cea79e8ca4ba65525470d534e8a41070e6b3500ce2414921099cb73e8d"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-win32.whl", hash = "sha256:f6be2d708a9d0e9b0054856f07ac7070fbe1754be40ca8525d5adccdbda8f475"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:5045e892cfdaecc5b4c01822f353cf2c8feb88a6ec1c0adef2a2e705eef0f656"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7a07f40ef8f0fbc5ef1000d0c78771f4d5ca03b4953fc162749772916b298fc4"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d18b66fe626ac412d96c2ab536306c736c66cf2a31c243a45025156cc190dc8a"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:698e84142f3f884114ea8cf83e7a67ca8f4ace8454e78fe960646c6c91c63bfa"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a3b78a5af63ec10d8604180380c13dcd870aba7928c1fe04e881d5c792dc4e"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:15866d7f2dc60cfdde12ebb4e75e41be862348b4728300c36cdf405e258415ec"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6aa5e2e7fc9bc042ae82d8b79d795b9a62bd8f15ba1e7594e3db243f158b5565"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:54635102ba3cf5da26eb6f96c4b8c53af8a9c0d97b64bdcb592596a6255d8518"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-win32.whl", hash = "sha256:3583a3a3ab7958e354dc1d25be74aee6228938312ee875a22330c4dc2e41beb0"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-win_amd64.whl", hash = "sha256:d6e427c7378c7f1b2bef6a344c925b8b63623d3321c09a237b7cc0e77dd98ceb"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bf1196dcc239e608605b716e7b166eb5faf4bc192f8a44b81e85251e62584bd2"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4df98d4a9cd6a88d6a585852f56f2155c9cdb6aec78361a19f938810aa020954"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b835aba863195269ea358cecc21b400276747cc977492319fd7682b8cd2c253d"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23984d1bdae01bee794267424af55eef4dfc038dc5d1272860669b2aa025c9e3"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c98c33ffe20e9a489145d97070a435ea0679fddaabcafe19982fe9c971987d5"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9896fca4a8eb246defc8b2a7ac77ef7553b638e04fbf170bff78a40fa8a91474"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b0fe73bac2fed83839dbdbe6da84ae2a31c11cfc1c777a40dbd8ac8a6ed1560f"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c7556bafeaa0a50e2fe7dc86e0382dea349ebcad8f010d5a7dc6ba568eaaa789"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-win32.whl", hash = "sha256:fc1a75aa8f11b87910ffd98de62b29d6520b6d6e8a3de69a70ca34dea85d2a8a"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-win_amd64.whl", hash = "sha256:3a66c36a3864df95e4f62f9167c734b3b1192cb0851b43d7cc08040c074c6279"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5c31fe855c77cad679b302aabc42d724ed87c043b1432d457f4976add1c2c3e"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47bb5f0142b8b64ed1399b6b60f700a580335c8e1c57f2f15587bd072012decc"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:fe8512ed897d5daf089e5bd010c3dc03bb1bdae00b35588c49b98268d4a01e00"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:36d7626a8cca4d34216875aee5a1d3d654bb3dac201c1c003d182283e3205949"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b6f14a9cd50c3cb100eb94b3273131c80d102e19bb20253ac7bd7336118a673a"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-win32.whl", hash = "sha256:c8f253a84dbd2c63c19590fa86a032ef3d8cc18923b8049d91bcdeeb2581fbf6"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-win_amd64.whl", hash = "sha256:8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959"}, + {file = "MarkupSafe-2.1.4.tar.gz", hash = "sha256:3aae9af4cac263007fd6309c64c6ab4506dd2b79382d9d19a1994f9240b8db4f"}, ] [[package]] @@ -1609,13 +1612,13 @@ test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>= [[package]] name = "nbconvert" -version = "7.14.1" +version = "7.14.2" description = "Converting Jupyter Notebooks" optional = false python-versions = ">=3.8" files = [ - {file = "nbconvert-7.14.1-py3-none-any.whl", hash = "sha256:aa83e3dd27ea38d0c1d908e3ce9518d15fa908dd30521b6d5040bd23f33fffb0"}, - {file = "nbconvert-7.14.1.tar.gz", hash = "sha256:20cba10e0448dc76b3bebfe1adf923663e3b98338daf77b97b42511ef5a88618"}, + {file = "nbconvert-7.14.2-py3-none-any.whl", hash = "sha256:db28590cef90f7faf2ebbc71acd402cbecf13d29176df728c0a9025a49345ea1"}, + {file = "nbconvert-7.14.2.tar.gz", hash = "sha256:a7f8808fd4e082431673ac538400218dd45efd076fbeb07cc6e5aa5a3a4e949e"}, ] [package.dependencies] @@ -1667,13 +1670,13 @@ test = ["pep440", "pre-commit", "pytest", "testpath"] [[package]] name = "nest-asyncio" -version = "1.5.8" +version = "1.5.9" description = "Patch asyncio to allow nested event loops" optional = false python-versions = ">=3.5" files = [ - {file = "nest_asyncio-1.5.8-py3-none-any.whl", hash = "sha256:accda7a339a70599cb08f9dd09a67e0c2ef8d8d6f4c07f96ab203f2ae254e48d"}, - {file = "nest_asyncio-1.5.8.tar.gz", hash = "sha256:25aa2ca0d2a5b5531956b9e273b45cf664cae2b145101d73b86b199978d48fdb"}, + {file = "nest_asyncio-1.5.9-py3-none-any.whl", hash = "sha256:61ec07ef052e72e3de22045b81b2cc7d71fceb04c568ba0b2e4b2f9f5231bec2"}, + {file = "nest_asyncio-1.5.9.tar.gz", hash = "sha256:d1e1144e9c6e3e6392e0fcf5211cb1c8374b5648a98f1ebe48e5336006b41907"}, ] [[package]] @@ -1762,77 +1765,81 @@ files = [ [[package]] name = "pandas" -version = "2.1.4" +version = "2.2.0" description = "Powerful data structures for data analysis, time series, and statistics" optional = false python-versions = ">=3.9" files = [ - {file = "pandas-2.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bdec823dc6ec53f7a6339a0e34c68b144a7a1fd28d80c260534c39c62c5bf8c9"}, - {file = "pandas-2.1.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:294d96cfaf28d688f30c918a765ea2ae2e0e71d3536754f4b6de0ea4a496d034"}, - {file = "pandas-2.1.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b728fb8deba8905b319f96447a27033969f3ea1fea09d07d296c9030ab2ed1d"}, - {file = "pandas-2.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00028e6737c594feac3c2df15636d73ace46b8314d236100b57ed7e4b9ebe8d9"}, - {file = "pandas-2.1.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:426dc0f1b187523c4db06f96fb5c8d1a845e259c99bda74f7de97bd8a3bb3139"}, - {file = "pandas-2.1.4-cp310-cp310-win_amd64.whl", hash = "sha256:f237e6ca6421265643608813ce9793610ad09b40154a3344a088159590469e46"}, - {file = "pandas-2.1.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b7d852d16c270e4331f6f59b3e9aa23f935f5c4b0ed2d0bc77637a8890a5d092"}, - {file = "pandas-2.1.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7d5f2f54f78164b3d7a40f33bf79a74cdee72c31affec86bfcabe7e0789821"}, - {file = "pandas-2.1.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0aa6e92e639da0d6e2017d9ccff563222f4eb31e4b2c3cf32a2a392fc3103c0d"}, - {file = "pandas-2.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d797591b6846b9db79e65dc2d0d48e61f7db8d10b2a9480b4e3faaddc421a171"}, - {file = "pandas-2.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d2d3e7b00f703aea3945995ee63375c61b2e6aa5aa7871c5d622870e5e137623"}, - {file = "pandas-2.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:dc9bf7ade01143cddc0074aa6995edd05323974e6e40d9dbde081021ded8510e"}, - {file = "pandas-2.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:482d5076e1791777e1571f2e2d789e940dedd927325cc3cb6d0800c6304082f6"}, - {file = "pandas-2.1.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8a706cfe7955c4ca59af8c7a0517370eafbd98593155b48f10f9811da440248b"}, - {file = "pandas-2.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0513a132a15977b4a5b89aabd304647919bc2169eac4c8536afb29c07c23540"}, - {file = "pandas-2.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9f17f2b6fc076b2a0078862547595d66244db0f41bf79fc5f64a5c4d635bead"}, - {file = "pandas-2.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:45d63d2a9b1b37fa6c84a68ba2422dc9ed018bdaa668c7f47566a01188ceeec1"}, - {file = "pandas-2.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:f69b0c9bb174a2342818d3e2778584e18c740d56857fc5cdb944ec8bbe4082cf"}, - {file = "pandas-2.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3f06bda01a143020bad20f7a85dd5f4a1600112145f126bc9e3e42077c24ef34"}, - {file = "pandas-2.1.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab5796839eb1fd62a39eec2916d3e979ec3130509930fea17fe6f81e18108f6a"}, - {file = "pandas-2.1.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edbaf9e8d3a63a9276d707b4d25930a262341bca9874fcb22eff5e3da5394732"}, - {file = "pandas-2.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ebfd771110b50055712b3b711b51bee5d50135429364d0498e1213a7adc2be8"}, - {file = "pandas-2.1.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8ea107e0be2aba1da619cc6ba3f999b2bfc9669a83554b1904ce3dd9507f0860"}, - {file = "pandas-2.1.4-cp39-cp39-win_amd64.whl", hash = "sha256:d65148b14788b3758daf57bf42725caa536575da2b64df9964c563b015230984"}, - {file = "pandas-2.1.4.tar.gz", hash = "sha256:fcb68203c833cc735321512e13861358079a96c174a61f5116a1de89c58c0ef7"}, + {file = "pandas-2.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8108ee1712bb4fa2c16981fba7e68b3f6ea330277f5ca34fa8d557e986a11670"}, + {file = "pandas-2.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:736da9ad4033aeab51d067fc3bd69a0ba36f5a60f66a527b3d72e2030e63280a"}, + {file = "pandas-2.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38e0b4fc3ddceb56ec8a287313bc22abe17ab0eb184069f08fc6a9352a769b18"}, + {file = "pandas-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20404d2adefe92aed3b38da41d0847a143a09be982a31b85bc7dd565bdba0f4e"}, + {file = "pandas-2.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7ea3ee3f125032bfcade3a4cf85131ed064b4f8dd23e5ce6fa16473e48ebcaf5"}, + {file = "pandas-2.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f9670b3ac00a387620489dfc1bca66db47a787f4e55911f1293063a78b108df1"}, + {file = "pandas-2.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:5a946f210383c7e6d16312d30b238fd508d80d927014f3b33fb5b15c2f895430"}, + {file = "pandas-2.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a1b438fa26b208005c997e78672f1aa8138f67002e833312e6230f3e57fa87d5"}, + {file = "pandas-2.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8ce2fbc8d9bf303ce54a476116165220a1fedf15985b09656b4b4275300e920b"}, + {file = "pandas-2.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2707514a7bec41a4ab81f2ccce8b382961a29fbe9492eab1305bb075b2b1ff4f"}, + {file = "pandas-2.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85793cbdc2d5bc32620dc8ffa715423f0c680dacacf55056ba13454a5be5de88"}, + {file = "pandas-2.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:cfd6c2491dc821b10c716ad6776e7ab311f7df5d16038d0b7458bc0b67dc10f3"}, + {file = "pandas-2.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a146b9dcacc3123aa2b399df1a284de5f46287a4ab4fbfc237eac98a92ebcb71"}, + {file = "pandas-2.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:fbc1b53c0e1fdf16388c33c3cca160f798d38aea2978004dd3f4d3dec56454c9"}, + {file = "pandas-2.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a41d06f308a024981dcaa6c41f2f2be46a6b186b902c94c2674e8cb5c42985bc"}, + {file = "pandas-2.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:159205c99d7a5ce89ecfc37cb08ed179de7783737cea403b295b5eda8e9c56d1"}, + {file = "pandas-2.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1e1f3861ea9132b32f2133788f3b14911b68102d562715d71bd0013bc45440"}, + {file = "pandas-2.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:761cb99b42a69005dec2b08854fb1d4888fdf7b05db23a8c5a099e4b886a2106"}, + {file = "pandas-2.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a20628faaf444da122b2a64b1e5360cde100ee6283ae8effa0d8745153809a2e"}, + {file = "pandas-2.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f5be5d03ea2073627e7111f61b9f1f0d9625dc3c4d8dda72cc827b0c58a1d042"}, + {file = "pandas-2.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:a626795722d893ed6aacb64d2401d017ddc8a2341b49e0384ab9bf7112bdec30"}, + {file = "pandas-2.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9f66419d4a41132eb7e9a73dcec9486cf5019f52d90dd35547af11bc58f8637d"}, + {file = "pandas-2.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:57abcaeda83fb80d447f28ab0cc7b32b13978f6f733875ebd1ed14f8fbc0f4ab"}, + {file = "pandas-2.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e60f1f7dba3c2d5ca159e18c46a34e7ca7247a73b5dd1a22b6d59707ed6b899a"}, + {file = "pandas-2.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb61dc8567b798b969bcc1fc964788f5a68214d333cade8319c7ab33e2b5d88a"}, + {file = "pandas-2.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:52826b5f4ed658fa2b729264d63f6732b8b29949c7fd234510d57c61dbeadfcd"}, + {file = "pandas-2.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bde2bc699dbd80d7bc7f9cab1e23a95c4375de615860ca089f34e7c64f4a8de7"}, + {file = "pandas-2.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:3de918a754bbf2da2381e8a3dcc45eede8cd7775b047b923f9006d5f876802ae"}, + {file = "pandas-2.2.0.tar.gz", hash = "sha256:30b83f7c3eb217fb4d1b494a57a2fda5444f17834f5df2de6b2ffff68dc3c8e2"}, ] [package.dependencies] numpy = {version = ">=1.26.0,<2", markers = "python_version >= \"3.12\""} python-dateutil = ">=2.8.2" pytz = ">=2020.1" -tzdata = ">=2022.1" +tzdata = ">=2022.7" [package.extras] -all = ["PyQt5 (>=5.15.6)", "SQLAlchemy (>=1.4.36)", "beautifulsoup4 (>=4.11.1)", "bottleneck (>=1.3.4)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=0.8.1)", "fsspec (>=2022.05.0)", "gcsfs (>=2022.05.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.8.0)", "matplotlib (>=3.6.1)", "numba (>=0.55.2)", "numexpr (>=2.8.0)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pandas-gbq (>=0.17.5)", "psycopg2 (>=2.9.3)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.5)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "pyxlsb (>=1.0.9)", "qtpy (>=2.2.0)", "s3fs (>=2022.05.0)", "scipy (>=1.8.1)", "tables (>=3.7.0)", "tabulate (>=0.8.10)", "xarray (>=2022.03.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)", "zstandard (>=0.17.0)"] -aws = ["s3fs (>=2022.05.0)"] -clipboard = ["PyQt5 (>=5.15.6)", "qtpy (>=2.2.0)"] -compression = ["zstandard (>=0.17.0)"] -computation = ["scipy (>=1.8.1)", "xarray (>=2022.03.0)"] +all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] +aws = ["s3fs (>=2022.11.0)"] +clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] +compression = ["zstandard (>=0.19.0)"] +computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] consortium-standard = ["dataframe-api-compat (>=0.1.7)"] -excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pyxlsb (>=1.0.9)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)"] -feather = ["pyarrow (>=7.0.0)"] -fss = ["fsspec (>=2022.05.0)"] -gcp = ["gcsfs (>=2022.05.0)", "pandas-gbq (>=0.17.5)"] -hdf5 = ["tables (>=3.7.0)"] -html = ["beautifulsoup4 (>=4.11.1)", "html5lib (>=1.1)", "lxml (>=4.8.0)"] -mysql = ["SQLAlchemy (>=1.4.36)", "pymysql (>=1.0.2)"] -output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.8.10)"] -parquet = ["pyarrow (>=7.0.0)"] -performance = ["bottleneck (>=1.3.4)", "numba (>=0.55.2)", "numexpr (>=2.8.0)"] -plot = ["matplotlib (>=3.6.1)"] -postgresql = ["SQLAlchemy (>=1.4.36)", "psycopg2 (>=2.9.3)"] -spss = ["pyreadstat (>=1.1.5)"] -sql-other = ["SQLAlchemy (>=1.4.36)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] +feather = ["pyarrow (>=10.0.1)"] +fss = ["fsspec (>=2022.11.0)"] +gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] +hdf5 = ["tables (>=3.8.0)"] +html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] +mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] +parquet = ["pyarrow (>=10.0.1)"] +performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] +plot = ["matplotlib (>=3.6.3)"] +postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] +spss = ["pyreadstat (>=1.2.0)"] +sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] -xml = ["lxml (>=4.8.0)"] +xml = ["lxml (>=4.9.2)"] [[package]] name = "pandocfilters" -version = "1.5.0" +version = "1.5.1" description = "Utilities for writing pandoc filters in python" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ - {file = "pandocfilters-1.5.0-py2.py3-none-any.whl", hash = "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f"}, - {file = "pandocfilters-1.5.0.tar.gz", hash = "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38"}, + {file = "pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc"}, + {file = "pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e"}, ] [[package]] @@ -2020,27 +2027,27 @@ wcwidth = "*" [[package]] name = "psutil" -version = "5.9.7" +version = "5.9.8" description = "Cross-platform lib for process and system monitoring in Python." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "psutil-5.9.7-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:0bd41bf2d1463dfa535942b2a8f0e958acf6607ac0be52265ab31f7923bcd5e6"}, - {file = "psutil-5.9.7-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:5794944462509e49d4d458f4dbfb92c47539e7d8d15c796f141f474010084056"}, - {file = "psutil-5.9.7-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:fe361f743cb3389b8efda21980d93eb55c1f1e3898269bc9a2a1d0bb7b1f6508"}, - {file = "psutil-5.9.7-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:e469990e28f1ad738f65a42dcfc17adaed9d0f325d55047593cb9033a0ab63df"}, - {file = "psutil-5.9.7-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:3c4747a3e2ead1589e647e64aad601981f01b68f9398ddf94d01e3dc0d1e57c7"}, - {file = "psutil-5.9.7-cp27-none-win32.whl", hash = "sha256:1d4bc4a0148fdd7fd8f38e0498639ae128e64538faa507df25a20f8f7fb2341c"}, - {file = "psutil-5.9.7-cp27-none-win_amd64.whl", hash = "sha256:4c03362e280d06bbbfcd52f29acd79c733e0af33d707c54255d21029b8b32ba6"}, - {file = "psutil-5.9.7-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ea36cc62e69a13ec52b2f625c27527f6e4479bca2b340b7a452af55b34fcbe2e"}, - {file = "psutil-5.9.7-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1132704b876e58d277168cd729d64750633d5ff0183acf5b3c986b8466cd0284"}, - {file = "psutil-5.9.7-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8b7f07948f1304497ce4f4684881250cd859b16d06a1dc4d7941eeb6233bfe"}, - {file = "psutil-5.9.7-cp36-cp36m-win32.whl", hash = "sha256:b27f8fdb190c8c03914f908a4555159327d7481dac2f01008d483137ef3311a9"}, - {file = "psutil-5.9.7-cp36-cp36m-win_amd64.whl", hash = "sha256:44969859757f4d8f2a9bd5b76eba8c3099a2c8cf3992ff62144061e39ba8568e"}, - {file = "psutil-5.9.7-cp37-abi3-win32.whl", hash = "sha256:c727ca5a9b2dd5193b8644b9f0c883d54f1248310023b5ad3e92036c5e2ada68"}, - {file = "psutil-5.9.7-cp37-abi3-win_amd64.whl", hash = "sha256:f37f87e4d73b79e6c5e749440c3113b81d1ee7d26f21c19c47371ddea834f414"}, - {file = "psutil-5.9.7-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:032f4f2c909818c86cea4fe2cc407f1c0f0cde8e6c6d702b28b8ce0c0d143340"}, - {file = "psutil-5.9.7.tar.gz", hash = "sha256:3f02134e82cfb5d089fddf20bb2e03fd5cd52395321d1c8458a9e58500ff417c"}, + {file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"}, + {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"}, + {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"}, + {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, + {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"}, + {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"}, + {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, + {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, + {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, + {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, ] [package.extras] @@ -2714,110 +2721,110 @@ files = [ [[package]] name = "rpds-py" -version = "0.16.2" +version = "0.17.1" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" files = [ - {file = "rpds_py-0.16.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:509b617ac787cd1149600e731db9274ebbef094503ca25158e6f23edaba1ca8f"}, - {file = "rpds_py-0.16.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:413b9c17388bbd0d87a329d8e30c1a4c6e44e2bb25457f43725a8e6fe4161e9e"}, - {file = "rpds_py-0.16.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2946b120718eba9af2b4dd103affc1164a87b9e9ebff8c3e4c05d7b7a7e274e2"}, - {file = "rpds_py-0.16.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:35ae5ece284cf36464eb160880018cf6088a9ac5ddc72292a6092b6ef3f4da53"}, - {file = "rpds_py-0.16.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc6a7620ba7639a3db6213da61312cb4aa9ac0ca6e00dc1cbbdc21c2aa6eb57"}, - {file = "rpds_py-0.16.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8cb6fe8ecdfffa0e711a75c931fb39f4ba382b4b3ccedeca43f18693864fe850"}, - {file = "rpds_py-0.16.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dace7b26a13353e24613417ce2239491b40a6ad44e5776a18eaff7733488b44"}, - {file = "rpds_py-0.16.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1bdbc5fcb04a7309074de6b67fa9bc4b418ab3fc435fec1f2779a0eced688d04"}, - {file = "rpds_py-0.16.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f42e25c016927e2a6b1ce748112c3ab134261fc2ddc867e92d02006103e1b1b7"}, - {file = "rpds_py-0.16.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:eab36eae3f3e8e24b05748ec9acc66286662f5d25c52ad70cadab544e034536b"}, - {file = "rpds_py-0.16.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0474df4ade9a3b4af96c3d36eb81856cb9462e4c6657d4caecfd840d2a13f3c9"}, - {file = "rpds_py-0.16.2-cp310-none-win32.whl", hash = "sha256:84c5a4d1f9dd7e2d2c44097fb09fffe728629bad31eb56caf97719e55575aa82"}, - {file = "rpds_py-0.16.2-cp310-none-win_amd64.whl", hash = "sha256:2bd82db36cd70b3628c0c57d81d2438e8dd4b7b32a6a9f25f24ab0e657cb6c4e"}, - {file = "rpds_py-0.16.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:adc0c3d6fc6ae35fee3e4917628983f6ce630d513cbaad575b4517d47e81b4bb"}, - {file = "rpds_py-0.16.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ec23fcad480e77ede06cf4127a25fc440f7489922e17fc058f426b5256ee0edb"}, - {file = "rpds_py-0.16.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07aab64e2808c3ebac2a44f67e9dc0543812b715126dfd6fe4264df527556cb6"}, - {file = "rpds_py-0.16.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a4ebb8b20bd09c5ce7884c8f0388801100f5e75e7f733b1b6613c713371feefc"}, - {file = "rpds_py-0.16.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3d7e2ea25d3517c6d7e5a1cc3702cffa6bd18d9ef8d08d9af6717fc1c700eed"}, - {file = "rpds_py-0.16.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f28ac0e8e7242d140f99402a903a2c596ab71550272ae9247ad78f9a932b5698"}, - {file = "rpds_py-0.16.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19f00f57fdd38db4bb5ad09f9ead1b535332dbf624200e9029a45f1f35527ebb"}, - {file = "rpds_py-0.16.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3da5a4c56953bdbf6d04447c3410309616c54433146ccdb4a277b9cb499bc10e"}, - {file = "rpds_py-0.16.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec2e1cf025b2c0f48ec17ff3e642661da7ee332d326f2e6619366ce8e221f018"}, - {file = "rpds_py-0.16.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e0441fb4fdd39a230477b2ca9be90868af64425bfe7b122b57e61e45737a653b"}, - {file = "rpds_py-0.16.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9f0350ef2fba5f34eb0c9000ea328e51b9572b403d2f7f3b19f24085f6f598e8"}, - {file = "rpds_py-0.16.2-cp311-none-win32.whl", hash = "sha256:5a80e2f83391ad0808b4646732af2a7b67550b98f0cae056cb3b40622a83dbb3"}, - {file = "rpds_py-0.16.2-cp311-none-win_amd64.whl", hash = "sha256:e04e56b4ca7a770593633556e8e9e46579d66ec2ada846b401252a2bdcf70a6d"}, - {file = "rpds_py-0.16.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:5e6caa3809e50690bd92fa490f5c38caa86082c8c3315aa438bce43786d5e90d"}, - {file = "rpds_py-0.16.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e53b9b25cac9065328901713a7e9e3b12e4f57ef4280b370fbbf6fef2052eef"}, - {file = "rpds_py-0.16.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:af27423662f32d7501a00c5e7342f7dbd1e4a718aea7a239781357d15d437133"}, - {file = "rpds_py-0.16.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:43d4dd5fb16eb3825742bad8339d454054261ab59fed2fbac84e1d84d5aae7ba"}, - {file = "rpds_py-0.16.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e061de3b745fe611e23cd7318aec2c8b0e4153939c25c9202a5811ca911fd733"}, - {file = "rpds_py-0.16.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b811d182ad17ea294f2ec63c0621e7be92a1141e1012383461872cead87468f"}, - {file = "rpds_py-0.16.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5552f328eaef1a75ff129d4d0c437bf44e43f9436d3996e8eab623ea0f5fcf73"}, - {file = "rpds_py-0.16.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dcbe1f8dd179e4d69b70b1f1d9bb6fd1e7e1bdc9c9aad345cdeb332e29d40748"}, - {file = "rpds_py-0.16.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8aad80645a011abae487d356e0ceb359f4938dfb6f7bcc410027ed7ae4f7bb8b"}, - {file = "rpds_py-0.16.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b6f5549d6ed1da9bfe3631ca9483ae906f21410be2445b73443fa9f017601c6f"}, - {file = "rpds_py-0.16.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d452817e0d9c749c431a1121d56a777bd7099b720b3d1c820f1725cb40928f58"}, - {file = "rpds_py-0.16.2-cp312-none-win32.whl", hash = "sha256:888a97002e986eca10d8546e3c8b97da1d47ad8b69726dcfeb3e56348ebb28a3"}, - {file = "rpds_py-0.16.2-cp312-none-win_amd64.whl", hash = "sha256:d8dda2a806dfa4a9b795950c4f5cc56d6d6159f7d68080aedaff3bdc9b5032f5"}, - {file = "rpds_py-0.16.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:071980663c273bf3d388fe5c794c547e6f35ba3335477072c713a3176bf14a60"}, - {file = "rpds_py-0.16.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:726ac36e8a3bb8daef2fd482534cabc5e17334052447008405daca7ca04a3108"}, - {file = "rpds_py-0.16.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9e557db6a177470316c82f023e5d571811c9a4422b5ea084c85da9aa3c035fc"}, - {file = "rpds_py-0.16.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:90123853fc8b1747f80b0d354be3d122b4365a93e50fc3aacc9fb4c2488845d6"}, - {file = "rpds_py-0.16.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a61f659665a39a4d17d699ab3593d7116d66e1e2e3f03ef3fb8f484e91908808"}, - {file = "rpds_py-0.16.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc97f0640e91d7776530f06e6836c546c1c752a52de158720c4224c9e8053cad"}, - {file = "rpds_py-0.16.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44a54e99a2b9693a37ebf245937fd6e9228b4cbd64b9cc961e1f3391ec6c7391"}, - {file = "rpds_py-0.16.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bd4b677d929cf1f6bac07ad76e0f2d5de367e6373351c01a9c0a39f6b21b4a8b"}, - {file = "rpds_py-0.16.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:5ef00873303d678aaf8b0627e111fd434925ca01c657dbb2641410f1cdaef261"}, - {file = "rpds_py-0.16.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:349cb40897fd529ca15317c22c0eab67f5ac5178b5bd2c6adc86172045210acc"}, - {file = "rpds_py-0.16.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2ddef620e70eaffebed5932ce754d539c0930f676aae6212f8e16cd9743dd365"}, - {file = "rpds_py-0.16.2-cp38-none-win32.whl", hash = "sha256:882ce6e25e585949c3d9f9abd29202367175e0aab3aba0c58c9abbb37d4982ff"}, - {file = "rpds_py-0.16.2-cp38-none-win_amd64.whl", hash = "sha256:f4bd4578e44f26997e9e56c96dedc5f1af43cc9d16c4daa29c771a00b2a26851"}, - {file = "rpds_py-0.16.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:69ac7ea9897ec201ce68b48582f3eb34a3f9924488a5432a93f177bf76a82a7e"}, - {file = "rpds_py-0.16.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a9880b4656efe36ccad41edc66789e191e5ee19a1ea8811e0aed6f69851a82f4"}, - {file = "rpds_py-0.16.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee94cb58c0ba2c62ee108c2b7c9131b2c66a29e82746e8fa3aa1a1effbd3dcf1"}, - {file = "rpds_py-0.16.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:24f7a2eb3866a9e91f4599851e0c8d39878a470044875c49bd528d2b9b88361c"}, - {file = "rpds_py-0.16.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ca57468da2d9a660bcf8961637c85f2fbb2aa64d9bc3f9484e30c3f9f67b1dd7"}, - {file = "rpds_py-0.16.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ccd4e400309e1f34a5095bf9249d371f0fd60f8a3a5c4a791cad7b99ce1fd38d"}, - {file = "rpds_py-0.16.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80443fe2f7b3ea3934c5d75fb0e04a5dbb4a8e943e5ff2de0dec059202b70a8b"}, - {file = "rpds_py-0.16.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4d6a9f052e72d493efd92a77f861e45bab2f6be63e37fa8ecf0c6fd1a58fedb0"}, - {file = "rpds_py-0.16.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:35953f4f2b3216421af86fd236b7c0c65935936a94ea83ddbd4904ba60757773"}, - {file = "rpds_py-0.16.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:981d135c7cdaf6cd8eadae1c950de43b976de8f09d8e800feed307140d3d6d00"}, - {file = "rpds_py-0.16.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d0dd7ed2f16df2e129496e7fbe59a34bc2d7fc8db443a606644d069eb69cbd45"}, - {file = "rpds_py-0.16.2-cp39-none-win32.whl", hash = "sha256:703d95c75a72e902544fda08e965885525e297578317989fd15a6ce58414b41d"}, - {file = "rpds_py-0.16.2-cp39-none-win_amd64.whl", hash = "sha256:e93ec1b300acf89730cf27975ef574396bc04edecc358e9bd116fb387a123239"}, - {file = "rpds_py-0.16.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:44627b6ca7308680a70766454db5249105fa6344853af6762eaad4158a2feebe"}, - {file = "rpds_py-0.16.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:3f91df8e6dbb7360e176d1affd5fb0246d2b88d16aa5ebc7db94fd66b68b61da"}, - {file = "rpds_py-0.16.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d904c5693e08bad240f16d79305edba78276be87061c872a4a15e2c301fa2c0"}, - {file = "rpds_py-0.16.2-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:290a81cfbe4673285cdf140ec5cd1658ffbf63ab359f2b352ebe172e7cfa5bf0"}, - {file = "rpds_py-0.16.2-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b634c5ec0103c5cbebc24ebac4872b045cccb9456fc59efdcf6fe39775365bd2"}, - {file = "rpds_py-0.16.2-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a297a4d08cc67c7466c873c78039d87840fb50d05473db0ec1b7b03d179bf322"}, - {file = "rpds_py-0.16.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2e75e17bd0bb66ee34a707da677e47c14ee51ccef78ed6a263a4cc965a072a1"}, - {file = "rpds_py-0.16.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f1b9d9260e06ea017feb7172976ab261e011c1dc2f8883c7c274f6b2aabfe01a"}, - {file = "rpds_py-0.16.2-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:162d7cd9cd311c1b0ff1c55a024b8f38bd8aad1876b648821da08adc40e95734"}, - {file = "rpds_py-0.16.2-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:9b32f742ce5b57201305f19c2ef7a184b52f6f9ba6871cc042c2a61f0d6b49b8"}, - {file = "rpds_py-0.16.2-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ac08472f41ea77cd6a5dae36ae7d4ed3951d6602833af87532b556c1b4601d63"}, - {file = "rpds_py-0.16.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:495a14b72bbe217f2695dcd9b5ab14d4f8066a00f5d209ed94f0aca307f85f6e"}, - {file = "rpds_py-0.16.2-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:8d6b6937ae9eac6d6c0ca3c42774d89fa311f55adff3970fb364b34abde6ed3d"}, - {file = "rpds_py-0.16.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a61226465bda9283686db8f17d02569a98e4b13c637be5a26d44aa1f1e361c2"}, - {file = "rpds_py-0.16.2-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5cf6af100ffb5c195beec11ffaa8cf8523057f123afa2944e6571d54da84cdc9"}, - {file = "rpds_py-0.16.2-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6df15846ee3fb2e6397fe25d7ca6624af9f89587f3f259d177b556fed6bebe2c"}, - {file = "rpds_py-0.16.2-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1be2f033df1b8be8c3167ba3c29d5dca425592ee31e35eac52050623afba5772"}, - {file = "rpds_py-0.16.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96f957d6ab25a78b9e7fc9749d754b98eac825a112b4e666525ce89afcbd9ed5"}, - {file = "rpds_py-0.16.2-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:088396c7c70e59872f67462fcac3ecbded5233385797021976a09ebd55961dfe"}, - {file = "rpds_py-0.16.2-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4c46ad6356e1561f2a54f08367d1d2e70a0a1bb2db2282d2c1972c1d38eafc3b"}, - {file = "rpds_py-0.16.2-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:47713dc4fce213f5c74ca8a1f6a59b622fc1b90868deb8e8e4d993e421b4b39d"}, - {file = "rpds_py-0.16.2-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:f811771019f063bbd0aa7bb72c8a934bc13ebacb4672d712fc1639cfd314cccc"}, - {file = "rpds_py-0.16.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f19afcfc0dd0dca35694df441e9b0f95bc231b512f51bded3c3d8ca32153ec19"}, - {file = "rpds_py-0.16.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a4b682c5775d6a3d21e314c10124599976809455ee67020e8e72df1769b87bc3"}, - {file = "rpds_py-0.16.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c647ca87fc0ebe808a41de912e9a1bfef9acb85257e5d63691364ac16b81c1f0"}, - {file = "rpds_py-0.16.2-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:302bd4983bbd47063e452c38be66153760112f6d3635c7eeefc094299fa400a9"}, - {file = "rpds_py-0.16.2-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bf721ede3eb7b829e4a9b8142bd55db0bdc82902720548a703f7e601ee13bdc3"}, - {file = "rpds_py-0.16.2-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:358dafc89ce3894c7f486c615ba914609f38277ef67f566abc4c854d23b997fa"}, - {file = "rpds_py-0.16.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cad0f59ee3dc35526039f4bc23642d52d5f6616b5f687d846bfc6d0d6d486db0"}, - {file = "rpds_py-0.16.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cffa76b385dfe1e38527662a302b19ffb0e7f5cf7dd5e89186d2c94a22dd9d0c"}, - {file = "rpds_py-0.16.2-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:83640a5d7cd3bff694747d50436b8b541b5b9b9782b0c8c1688931d6ee1a1f2d"}, - {file = "rpds_py-0.16.2-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:ed99b4f7179d2111702020fd7d156e88acd533f5a7d3971353e568b6051d5c97"}, - {file = "rpds_py-0.16.2-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:4022b9dc620e14f30201a8a73898a873c8e910cb642bcd2f3411123bc527f6ac"}, - {file = "rpds_py-0.16.2.tar.gz", hash = "sha256:781ef8bfc091b19960fc0142a23aedadafa826bc32b433fdfe6fd7f964d7ef44"}, + {file = "rpds_py-0.17.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:4128980a14ed805e1b91a7ed551250282a8ddf8201a4e9f8f5b7e6225f54170d"}, + {file = "rpds_py-0.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ff1dcb8e8bc2261a088821b2595ef031c91d499a0c1b031c152d43fe0a6ecec8"}, + {file = "rpds_py-0.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d65e6b4f1443048eb7e833c2accb4fa7ee67cc7d54f31b4f0555b474758bee55"}, + {file = "rpds_py-0.17.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a71169d505af63bb4d20d23a8fbd4c6ce272e7bce6cc31f617152aa784436f29"}, + {file = "rpds_py-0.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:436474f17733c7dca0fbf096d36ae65277e8645039df12a0fa52445ca494729d"}, + {file = "rpds_py-0.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10162fe3f5f47c37ebf6d8ff5a2368508fe22007e3077bf25b9c7d803454d921"}, + {file = "rpds_py-0.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:720215373a280f78a1814becb1312d4e4d1077b1202a56d2b0815e95ccb99ce9"}, + {file = "rpds_py-0.17.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:70fcc6c2906cfa5c6a552ba7ae2ce64b6c32f437d8f3f8eea49925b278a61453"}, + {file = "rpds_py-0.17.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:91e5a8200e65aaac342a791272c564dffcf1281abd635d304d6c4e6b495f29dc"}, + {file = "rpds_py-0.17.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:99f567dae93e10be2daaa896e07513dd4bf9c2ecf0576e0533ac36ba3b1d5394"}, + {file = "rpds_py-0.17.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:24e4900a6643f87058a27320f81336d527ccfe503984528edde4bb660c8c8d59"}, + {file = "rpds_py-0.17.1-cp310-none-win32.whl", hash = "sha256:0bfb09bf41fe7c51413f563373e5f537eaa653d7adc4830399d4e9bdc199959d"}, + {file = "rpds_py-0.17.1-cp310-none-win_amd64.whl", hash = "sha256:20de7b7179e2031a04042e85dc463a93a82bc177eeba5ddd13ff746325558aa6"}, + {file = "rpds_py-0.17.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:65dcf105c1943cba45d19207ef51b8bc46d232a381e94dd38719d52d3980015b"}, + {file = "rpds_py-0.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:01f58a7306b64e0a4fe042047dd2b7d411ee82e54240284bab63e325762c1147"}, + {file = "rpds_py-0.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:071bc28c589b86bc6351a339114fb7a029f5cddbaca34103aa573eba7b482382"}, + {file = "rpds_py-0.17.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ae35e8e6801c5ab071b992cb2da958eee76340e6926ec693b5ff7d6381441745"}, + {file = "rpds_py-0.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149c5cd24f729e3567b56e1795f74577aa3126c14c11e457bec1b1c90d212e38"}, + {file = "rpds_py-0.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e796051f2070f47230c745d0a77a91088fbee2cc0502e9b796b9c6471983718c"}, + {file = "rpds_py-0.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60e820ee1004327609b28db8307acc27f5f2e9a0b185b2064c5f23e815f248f8"}, + {file = "rpds_py-0.17.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1957a2ab607f9added64478a6982742eb29f109d89d065fa44e01691a20fc20a"}, + {file = "rpds_py-0.17.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8587fd64c2a91c33cdc39d0cebdaf30e79491cc029a37fcd458ba863f8815383"}, + {file = "rpds_py-0.17.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4dc889a9d8a34758d0fcc9ac86adb97bab3fb7f0c4d29794357eb147536483fd"}, + {file = "rpds_py-0.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2953937f83820376b5979318840f3ee47477d94c17b940fe31d9458d79ae7eea"}, + {file = "rpds_py-0.17.1-cp311-none-win32.whl", hash = "sha256:1bfcad3109c1e5ba3cbe2f421614e70439f72897515a96c462ea657261b96518"}, + {file = "rpds_py-0.17.1-cp311-none-win_amd64.whl", hash = "sha256:99da0a4686ada4ed0f778120a0ea8d066de1a0a92ab0d13ae68492a437db78bf"}, + {file = "rpds_py-0.17.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1dc29db3900cb1bb40353772417800f29c3d078dbc8024fd64655a04ee3c4bdf"}, + {file = "rpds_py-0.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82ada4a8ed9e82e443fcef87e22a3eed3654dd3adf6e3b3a0deb70f03e86142a"}, + {file = "rpds_py-0.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d36b2b59e8cc6e576f8f7b671e32f2ff43153f0ad6d0201250a7c07f25d570e"}, + {file = "rpds_py-0.17.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3677fcca7fb728c86a78660c7fb1b07b69b281964673f486ae72860e13f512ad"}, + {file = "rpds_py-0.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:516fb8c77805159e97a689e2f1c80655c7658f5af601c34ffdb916605598cda2"}, + {file = "rpds_py-0.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df3b6f45ba4515632c5064e35ca7f31d51d13d1479673185ba8f9fefbbed58b9"}, + {file = "rpds_py-0.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a967dd6afda7715d911c25a6ba1517975acd8d1092b2f326718725461a3d33f9"}, + {file = "rpds_py-0.17.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dbbb95e6fc91ea3102505d111b327004d1c4ce98d56a4a02e82cd451f9f57140"}, + {file = "rpds_py-0.17.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:02866e060219514940342a1f84303a1ef7a1dad0ac311792fbbe19b521b489d2"}, + {file = "rpds_py-0.17.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2528ff96d09f12e638695f3a2e0c609c7b84c6df7c5ae9bfeb9252b6fa686253"}, + {file = "rpds_py-0.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bd345a13ce06e94c753dab52f8e71e5252aec1e4f8022d24d56decd31e1b9b23"}, + {file = "rpds_py-0.17.1-cp312-none-win32.whl", hash = "sha256:2a792b2e1d3038daa83fa474d559acfd6dc1e3650ee93b2662ddc17dbff20ad1"}, + {file = "rpds_py-0.17.1-cp312-none-win_amd64.whl", hash = "sha256:292f7344a3301802e7c25c53792fae7d1593cb0e50964e7bcdcc5cf533d634e3"}, + {file = "rpds_py-0.17.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:8ffe53e1d8ef2520ebcf0c9fec15bb721da59e8ef283b6ff3079613b1e30513d"}, + {file = "rpds_py-0.17.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4341bd7579611cf50e7b20bb8c2e23512a3dc79de987a1f411cb458ab670eb90"}, + {file = "rpds_py-0.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f4eb548daf4836e3b2c662033bfbfc551db58d30fd8fe660314f86bf8510b93"}, + {file = "rpds_py-0.17.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b686f25377f9c006acbac63f61614416a6317133ab7fafe5de5f7dc8a06d42eb"}, + {file = "rpds_py-0.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4e21b76075c01d65d0f0f34302b5a7457d95721d5e0667aea65e5bb3ab415c25"}, + {file = "rpds_py-0.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b86b21b348f7e5485fae740d845c65a880f5d1eda1e063bc59bef92d1f7d0c55"}, + {file = "rpds_py-0.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f175e95a197f6a4059b50757a3dca33b32b61691bdbd22c29e8a8d21d3914cae"}, + {file = "rpds_py-0.17.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1701fc54460ae2e5efc1dd6350eafd7a760f516df8dbe51d4a1c79d69472fbd4"}, + {file = "rpds_py-0.17.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:9051e3d2af8f55b42061603e29e744724cb5f65b128a491446cc029b3e2ea896"}, + {file = "rpds_py-0.17.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:7450dbd659fed6dd41d1a7d47ed767e893ba402af8ae664c157c255ec6067fde"}, + {file = "rpds_py-0.17.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5a024fa96d541fd7edaa0e9d904601c6445e95a729a2900c5aec6555fe921ed6"}, + {file = "rpds_py-0.17.1-cp38-none-win32.whl", hash = "sha256:da1ead63368c04a9bded7904757dfcae01eba0e0f9bc41d3d7f57ebf1c04015a"}, + {file = "rpds_py-0.17.1-cp38-none-win_amd64.whl", hash = "sha256:841320e1841bb53fada91c9725e766bb25009cfd4144e92298db296fb6c894fb"}, + {file = "rpds_py-0.17.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:f6c43b6f97209e370124baf2bf40bb1e8edc25311a158867eb1c3a5d449ebc7a"}, + {file = "rpds_py-0.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7d63ec01fe7c76c2dbb7e972fece45acbb8836e72682bde138e7e039906e2c"}, + {file = "rpds_py-0.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81038ff87a4e04c22e1d81f947c6ac46f122e0c80460b9006e6517c4d842a6ec"}, + {file = "rpds_py-0.17.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:810685321f4a304b2b55577c915bece4c4a06dfe38f6e62d9cc1d6ca8ee86b99"}, + {file = "rpds_py-0.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:25f071737dae674ca8937a73d0f43f5a52e92c2d178330b4c0bb6ab05586ffa6"}, + {file = "rpds_py-0.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa5bfb13f1e89151ade0eb812f7b0d7a4d643406caaad65ce1cbabe0a66d695f"}, + {file = "rpds_py-0.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfe07308b311a8293a0d5ef4e61411c5c20f682db6b5e73de6c7c8824272c256"}, + {file = "rpds_py-0.17.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a000133a90eea274a6f28adc3084643263b1e7c1a5a66eb0a0a7a36aa757ed74"}, + {file = "rpds_py-0.17.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d0e8a6434a3fbf77d11448c9c25b2f25244226cfbec1a5159947cac5b8c5fa4"}, + {file = "rpds_py-0.17.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:efa767c220d94aa4ac3a6dd3aeb986e9f229eaf5bce92d8b1b3018d06bed3772"}, + {file = "rpds_py-0.17.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:dbc56680ecf585a384fbd93cd42bc82668b77cb525343170a2d86dafaed2a84b"}, + {file = "rpds_py-0.17.1-cp39-none-win32.whl", hash = "sha256:270987bc22e7e5a962b1094953ae901395e8c1e1e83ad016c5cfcfff75a15a3f"}, + {file = "rpds_py-0.17.1-cp39-none-win_amd64.whl", hash = "sha256:2a7b2f2f56a16a6d62e55354dd329d929560442bd92e87397b7a9586a32e3e76"}, + {file = "rpds_py-0.17.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a3264e3e858de4fc601741498215835ff324ff2482fd4e4af61b46512dd7fc83"}, + {file = "rpds_py-0.17.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f2f3b28b40fddcb6c1f1f6c88c6f3769cd933fa493ceb79da45968a21dccc920"}, + {file = "rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9584f8f52010295a4a417221861df9bea4c72d9632562b6e59b3c7b87a1522b7"}, + {file = "rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c64602e8be701c6cfe42064b71c84ce62ce66ddc6422c15463fd8127db3d8066"}, + {file = "rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:060f412230d5f19fc8c8b75f315931b408d8ebf56aec33ef4168d1b9e54200b1"}, + {file = "rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9412abdf0ba70faa6e2ee6c0cc62a8defb772e78860cef419865917d86c7342"}, + {file = "rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9737bdaa0ad33d34c0efc718741abaafce62fadae72c8b251df9b0c823c63b22"}, + {file = "rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9f0e4dc0f17dcea4ab9d13ac5c666b6b5337042b4d8f27e01b70fae41dd65c57"}, + {file = "rpds_py-0.17.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1db228102ab9d1ff4c64148c96320d0be7044fa28bd865a9ce628ce98da5973d"}, + {file = "rpds_py-0.17.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:d8bbd8e56f3ba25a7d0cf980fc42b34028848a53a0e36c9918550e0280b9d0b6"}, + {file = "rpds_py-0.17.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:be22ae34d68544df293152b7e50895ba70d2a833ad9566932d750d3625918b82"}, + {file = "rpds_py-0.17.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bf046179d011e6114daf12a534d874958b039342b347348a78b7cdf0dd9d6041"}, + {file = "rpds_py-0.17.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:1a746a6d49665058a5896000e8d9d2f1a6acba8a03b389c1e4c06e11e0b7f40d"}, + {file = "rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0b8bf5b8db49d8fd40f54772a1dcf262e8be0ad2ab0206b5a2ec109c176c0a4"}, + {file = "rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f7f4cb1f173385e8a39c29510dd11a78bf44e360fb75610594973f5ea141028b"}, + {file = "rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7fbd70cb8b54fe745301921b0816c08b6d917593429dfc437fd024b5ba713c58"}, + {file = "rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bdf1303df671179eaf2cb41e8515a07fc78d9d00f111eadbe3e14262f59c3d0"}, + {file = "rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fad059a4bd14c45776600d223ec194e77db6c20255578bb5bcdd7c18fd169361"}, + {file = "rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3664d126d3388a887db44c2e293f87d500c4184ec43d5d14d2d2babdb4c64cad"}, + {file = "rpds_py-0.17.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:698ea95a60c8b16b58be9d854c9f993c639f5c214cf9ba782eca53a8789d6b19"}, + {file = "rpds_py-0.17.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:c3d2010656999b63e628a3c694f23020322b4178c450dc478558a2b6ef3cb9bb"}, + {file = "rpds_py-0.17.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:938eab7323a736533f015e6069a7d53ef2dcc841e4e533b782c2bfb9fb12d84b"}, + {file = "rpds_py-0.17.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:1e626b365293a2142a62b9a614e1f8e331b28f3ca57b9f05ebbf4cf2a0f0bdc5"}, + {file = "rpds_py-0.17.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:380e0df2e9d5d5d339803cfc6d183a5442ad7ab3c63c2a0982e8c824566c5ccc"}, + {file = "rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b760a56e080a826c2e5af09002c1a037382ed21d03134eb6294812dda268c811"}, + {file = "rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5576ee2f3a309d2bb403ec292d5958ce03953b0e57a11d224c1f134feaf8c40f"}, + {file = "rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3c3461ebb4c4f1bbc70b15d20b565759f97a5aaf13af811fcefc892e9197ba"}, + {file = "rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:637b802f3f069a64436d432117a7e58fab414b4e27a7e81049817ae94de45d8d"}, + {file = "rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffee088ea9b593cc6160518ba9bd319b5475e5f3e578e4552d63818773c6f56a"}, + {file = "rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3ac732390d529d8469b831949c78085b034bff67f584559340008d0f6041a049"}, + {file = "rpds_py-0.17.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:93432e747fb07fa567ad9cc7aaadd6e29710e515aabf939dfbed8046041346c6"}, + {file = "rpds_py-0.17.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:7b7d9ca34542099b4e185b3c2a2b2eda2e318a7dbde0b0d83357a6d4421b5296"}, + {file = "rpds_py-0.17.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:0387ce69ba06e43df54e43968090f3626e231e4bc9150e4c3246947567695f68"}, + {file = "rpds_py-0.17.1.tar.gz", hash = "sha256:0210b2668f24c078307260bf88bdac9d6f1093635df5123789bfee4d8d7fc8e7"}, ] [[package]] @@ -2970,13 +2977,13 @@ typing = ["mypy (>=1.6,<2.0)", "traitlets (>=5.11.1)"] [[package]] name = "thefuzz" -version = "0.20.0" +version = "0.22.1" description = "Fuzzy string matching in python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "thefuzz-0.20.0-py3-none-any.whl", hash = "sha256:bd2b657a12bd8518917d2d71c53125368706233b822fac688fca956730154388"}, - {file = "thefuzz-0.20.0.tar.gz", hash = "sha256:a25e49786b1c4603c7fc6e2d69e6bc660982a2919698b536ff8354e0631cc40d"}, + {file = "thefuzz-0.22.1-py3-none-any.whl", hash = "sha256:59729b33556850b90e1093c4cf9e618af6f2e4c985df193fdf3c5b5cf02ca481"}, + {file = "thefuzz-0.22.1.tar.gz", hash = "sha256:7138039a7ecf540da323792d8592ef9902b1d79eb78c147d4f20664de79f3680"}, ] [package.dependencies] @@ -3129,13 +3136,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "uvicorn" -version = "0.25.0" +version = "0.26.0" description = "The lightning-fast ASGI server." optional = false python-versions = ">=3.8" files = [ - {file = "uvicorn-0.25.0-py3-none-any.whl", hash = "sha256:ce107f5d9bd02b4636001a77a4e74aab5e1e2b146868ebbad565237145af444c"}, - {file = "uvicorn-0.25.0.tar.gz", hash = "sha256:6dddbad1d7ee0f5140aba5ec138ddc9612c5109399903828b4874c9937f009c2"}, + {file = "uvicorn-0.26.0-py3-none-any.whl", hash = "sha256:cdb58ef6b8188c6c174994b2b1ba2150a9a8ae7ea5fb2f1b856b94a815d6071d"}, + {file = "uvicorn-0.26.0.tar.gz", hash = "sha256:48bfd350fce3c5c57af5fb4995fded8fb50da3b4feb543eb18ad7e0d54589602"}, ] [package.dependencies] @@ -3420,4 +3427,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.12" -content-hash = "c6890a407056cf668f1e89fcc549ba44aa640ca5e5b56fba25838913c7da85e5" +content-hash = "833f4a250a7fb0d0284d1028601d0fdfacd751f7181c64b6829a03d86cd9b8a6" diff --git a/pyproject.toml b/pyproject.toml index 69aa455..ffd7da5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,12 +9,12 @@ readme = "README.md" python = "^3.12" fastapi = "^0.109.0" fastf1 = "^3.2.0" -uvicorn = { extras = ["standard"], version = "^0.25.0" } +uvicorn = { extras = ["standard"], version = "^0.26.0" } [tool.poetry.group.dev.dependencies] black = "^23.12.1" isort = "^5.13.2" -jupyterlab = "^4.0.10" +jupyterlab = "^4.0.11" jupyterlab-code-formatter = "^2.2.1" pytest = "^7.4.4" httpx = "^0.26.0" diff --git a/useful_commands.md b/useful_commands.md index f4b5cb6..1f508c9 100644 --- a/useful_commands.md +++ b/useful_commands.md @@ -3,6 +3,7 @@ - [Poetry](#poetry) - [Export python dependencies from poetry to requirements.txt](#export-python-dependencies-from-poetry-to-requirementstxt) - [Show outated packages](#show-outated-packages) + - [Run tests using pytest](#run-tests-using-pytest) - [Jupyter Lab](#jupyter-lab) - [Opening jupyter lab](#opening-jupyter-lab) - [Docker](#docker) @@ -26,6 +27,12 @@ poetry export --without-hashes --format=requirements.txt > requirements.txt poetry show --outdated ``` +### Run tests using pytest + +```sh +poetry run pytest -rpP +``` + ## Jupyter Lab ### Opening jupyter lab @@ -53,7 +60,7 @@ docker build --file Dockerfile.prod --tag backend-prod . ### Starting the containers ```sh -docker run --detach --name backend-dev-container --publish 80:80 backend-dev +docker run --detach --name backend-dev-container --publish 8081:8081 backend-dev docker run --detach --name backend-staging-container --publish 80:80 backend-staging docker run --detach --name backend-prod-container --publish 80:80 backend-prod ```