diff --git a/.github/workflows/check-standard.yaml b/.github/workflows/check-standard.yaml
index 638bf7f8..868c9727 100644
--- a/.github/workflows/check-standard.yaml
+++ b/.github/workflows/check-standard.yaml
@@ -55,19 +55,6 @@ jobs:
extra-packages: any::rcmdcheck
needs: check
- - name: setup r-reticulate venv
- shell: Rscript {0}
- run: |
- python_packages <- c("numpy", "fastf1")
-
- library(reticulate)
- virtualenv_create("r-reticulate", Sys.which("python"))
- virtualenv_install("r-reticulate", python_packages)
-
- path_to_python <- virtualenv_python("r-reticulate")
- writeLines(sprintf("RETICULATE_PYTHON=%s", path_to_python),
- Sys.getenv("GITHUB_ENV"))
-
- uses: r-lib/actions/check-r-package@v2
with:
upload-snapshots: true
@@ -107,58 +94,6 @@ jobs:
with:
upload-snapshots: true
- R-CMD-check-old-ff1:
- runs-on: ${{ matrix.config.os }}
-
- name: ${{ matrix.config.os }} (${{ matrix.config.r }}) old fastf1
-
- strategy:
- fail-fast: false
- matrix:
- config:
- - {os: ubuntu-latest, r: 'release'}
-
- env:
- GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}
- R_KEEP_PKG_SOURCE: yes
-
- steps:
- - uses: actions/checkout@v3
-
- - uses: r-lib/actions/setup-pandoc@v2
-
- - uses: r-lib/actions/setup-r@v2
- with:
- r-version: ${{ matrix.config.r }}
- http-user-agent: ${{ matrix.config.http-user-agent }}
- use-public-rspm: true
-
- - uses: actions/setup-python@v4
- with:
- python-version: "3.x"
-
- - uses: r-lib/actions/setup-r-dependencies@v2
- with:
- extra-packages: any::rcmdcheck
- needs: check
-
- - name: setup r-reticulate venv
- shell: Rscript {0}
- run: |
- python_packages <- c("urllib3", "fastf1==3.3.9")
-
- library(reticulate)
- virtualenv_create("r-reticulate", Sys.which("python"))
- virtualenv_install("r-reticulate", python_packages)
-
- path_to_python <- virtualenv_python("r-reticulate")
- writeLines(sprintf("RETICULATE_PYTHON=%s", path_to_python),
- Sys.getenv("GITHUB_ENV"))
-
- - uses: r-lib/actions/check-r-package@v2
- with:
- upload-snapshots: true
-
R-CMD-check-hard:
# NOTE: This workflow only directly installs "hard" dependencies, i.e. Depends,
# Imports, and LinkingTo dependencies. Notably, Suggests dependencies are never
@@ -201,6 +136,7 @@ jobs:
any::knitr
any::rmarkdown
any::markdown
+ any::vcr
needs: check
- uses: r-lib/actions/check-r-package@v2
@@ -245,19 +181,15 @@ jobs:
- name: setup r-reticulate venv
shell: Rscript {0}
run: |
- python_packages <- c("numpy")
-
- library(reticulate)
- virtualenv_create("r-reticulate", Sys.which("python"))
- virtualenv_install("r-reticulate", python_packages)
- #force dev version install with repl python from reticulate
- repl_python(quiet = TRUE)
- %pip install git+https://github.com/theOehrly/Fast-F1.git
- exit
-
- path_to_python <- virtualenv_python("r-reticulate")
- writeLines(sprintf("RETICULATE_PYTHON=%s", path_to_python),
- Sys.getenv("GITHUB_ENV"))
+ path_to_python <- reticulate::virtualenv_create(
+ envname = "r-reticulate",
+ python = Sys.which("python"),
+ packages = c("numpy")
+ )
+ writeLines(sprintf("RETICULATE_PYTHON=%s", path_to_python),
+ Sys.getenv("GITHUB_ENV"))
+ reticulate::py_require('fastf1@git+https://github.com/theOehrly/Fast-F1.git')
+ reticulate::py_available(TRUE)
- uses: r-lib/actions/check-r-package@v2
with:
diff --git a/.github/workflows/test-coverage.yaml b/.github/workflows/test-coverage.yaml
index 236e9800..d3ff77db 100644
--- a/.github/workflows/test-coverage.yaml
+++ b/.github/workflows/test-coverage.yaml
@@ -35,19 +35,6 @@ jobs:
any::xml2
needs: coverage
- - name: setup r-reticulate venv
- shell: Rscript {0}
- run: |
- python_packages <- c("numpy", "fastf1")
-
- library(reticulate)
- virtualenv_create("r-reticulate", Sys.which("python"))
- virtualenv_install("r-reticulate", python_packages)
-
- path_to_python <- virtualenv_python("r-reticulate")
- writeLines(sprintf("RETICULATE_PYTHON=%s", path_to_python),
- Sys.getenv("GITHUB_ENV"))
-
- name: Test coverage
run: |
cov <- covr::package_coverage(
@@ -81,79 +68,6 @@ jobs:
name: coverage-test-failures
path: ${{ runner.temp }}/package
- test-coverage-oldff1:
- name: Test coverage - old fastf1
-
- runs-on: ubuntu-latest
-
- env:
- GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}
-
- steps:
- - uses: actions/checkout@v4
-
- - uses: r-lib/actions/setup-r@v2
- with:
- use-public-rspm: true
-
- - uses: actions/setup-python@v4
- with:
- python-version: "3.x"
-
- - uses: r-lib/actions/setup-r-dependencies@v2
- with:
- extra-packages: |
- any::covr
- any::devtools
- any::xml2
- needs: coverage
-
- - name: setup r-reticulate venv
- shell: Rscript {0}
- run: |
- python_packages <- c("urllib3", "fastf1==3.3.9")
-
- library(reticulate)
- virtualenv_create("r-reticulate", Sys.which("python"))
- virtualenv_install("r-reticulate", python_packages)
-
- path_to_python <- virtualenv_python("r-reticulate")
- writeLines(sprintf("RETICULATE_PYTHON=%s", path_to_python),
- Sys.getenv("GITHUB_ENV"))
-
- - name: Test coverage
- run: |
- cov <- covr::package_coverage(
- quiet = FALSE,
- clean = FALSE,
- install_path = file.path(normalizePath(Sys.getenv("RUNNER_TEMP"), winslash = "/"), "package")
- )
- covr::to_cobertura(cov)
- shell: Rscript {0}
-
- - uses: codecov/codecov-action@v4
- with:
- # Fail if error if not on PR, or if on PR and token is given
- fail_ci_if_error: ${{ github.event_name != 'pull_request' || secrets.CODECOV_TOKEN }}
- file: ./cobertura.xml
- plugin: noop
- disable_search: true
- token: ${{ secrets.CODECOV_TOKEN }}
-
- - name: Show testthat output
- if: always()
- run: |
- ## --------------------------------------------------------------------
- find ${{ runner.temp }}/package -name 'testthat.Rout*' -exec cat '{}' \; || true
- shell: bash
-
- - name: Upload test results
- if: failure()
- uses: actions/upload-artifact@v4
- with:
- name: coverage-oldff1-test-failures
- path: ${{ runner.temp }}/package
-
test-coverage-hard:
# NOTE: This workflow only directly installs "hard" dependencies, i.e. Depends,
# Imports, and LinkingTo dependencies. Notably, Suggests dependencies are never
@@ -194,6 +108,7 @@ jobs:
any::covr
any::devtools
any::xml2
+ any::vcr
needs: coverage
- name: Test coverage
diff --git a/DESCRIPTION b/DESCRIPTION
index 4fe1efff..e0959a34 100644
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -19,7 +19,7 @@ Roxygen: list(markdown = TRUE)
RoxygenNote: 7.3.2
Depends:
R (>= 3.5.0),
- reticulate (>= 1.14),
+ reticulate (>= 1.41)
Imports:
glue,
magrittr,
@@ -42,6 +42,7 @@ Suggests:
knitr,
rmarkdown,
testthat (>= 3.0.0),
+ vcr
VignetteBuilder: knitr
URL: https://scasanova.github.io/f1dataR/, https://github.com/SCasanova/f1dataR
BugReports: https://github.com/SCasanova/f1dataR/issues
diff --git a/NAMESPACE b/NAMESPACE
index 78e6565d..c0957c71 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -36,7 +36,6 @@ export(load_session_laps)
export(load_sprint)
export(load_standings)
export(plot_fastest)
-export(setup_fastf1)
export(theme_dark_f1)
import(reticulate)
importFrom(magrittr,"%>%")
diff --git a/NEWS.md b/NEWS.md
index 327807be..70669c6d 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -1,5 +1,9 @@
# f1dataR (development version)
+* Updated code to match new `reticulate` interface for package and environment management.
+* Updated tests to use `vcr` package to reduce hits on the Jolpica API
+* Removed support for FastF1 v < 3.0 (now causes errors instead of warnings).
+* Test suite and automated testing changes to reflect the above changes.
* Fixed a data conversion issue in `time_to_sec()` (#290)
# f1dataR 2.0.1
diff --git a/R/load_circuits.R b/R/load_circuits.R
index b7b37584..28f6bb91 100644
--- a/R/load_circuits.R
+++ b/R/load_circuits.R
@@ -11,7 +11,7 @@ load_circuits <- function(season = get_current_season()) {
cli::cli_abort('{.var season} must be between 1950 and {get_current_season()} (or use "current")')
}
- url <- glue::glue("{season}/circuits.json?limit=40",
+ url <- glue::glue("{season}/circuits.json",
season = season
)
diff --git a/R/load_constructors.R b/R/load_constructors.R
index 660473e3..b6c81198 100644
--- a/R/load_constructors.R
+++ b/R/load_constructors.R
@@ -8,8 +8,9 @@
#' @return A tibble with one row per constructor
load_constructors <- function() {
lim <- 100
- url <- glue::glue("constructors.json?limit={lim}", lim = lim)
- data <- get_jolpica_content(url)
+ url <- "constructors.json"
+ parameters <- list(limit = lim)
+ data <- get_jolpica_content(url, parameters)
if (is.null(data)) {
return(NULL)
@@ -24,10 +25,8 @@ load_constructors <- function() {
while (offset + lim <= total) {
offset <- offset + lim
- url <- glue::glue("constructors.json?limit={lim}&offset={offset}",
- lim = lim, offset = offset
- )
- data <- get_jolpica_content(url)
+ parameters <- list(limit = lim, offset = offset)
+ data <- get_jolpica_content(url, parameters)
if (is.null(data)) {
return(NULL)
diff --git a/R/load_driver_telemetry.R b/R/load_driver_telemetry.R
index 68bf7434..53669f8e 100644
--- a/R/load_driver_telemetry.R
+++ b/R/load_driver_telemetry.R
@@ -72,7 +72,7 @@ load_driver_telemetry <- function(season = get_current_season(), round = 1, sess
driver = driver
))
} else if (laps != "all") {
- reticulate::py_run_string(glue::glue("tel = session.laps.pick_drivers('{driver}').pick_lap({laps}).get_telemetry().add_distance().add_driver_ahead()",
+ reticulate::py_run_string(glue::glue("tel = session.laps.pick_drivers('{driver}').pick_laps({laps}).get_telemetry().add_distance().add_driver_ahead()",
driver = driver, laps = laps
))
} else {
diff --git a/R/load_drivers.R b/R/load_drivers.R
index 121c5e5d..54457d8f 100644
--- a/R/load_drivers.R
+++ b/R/load_drivers.R
@@ -14,7 +14,7 @@ load_drivers <- function(season = get_current_season()) {
cli::cli_abort('{.var season} must be between 1950 and {get_current_season()} (or use "current")')
}
- url <- glue::glue("{season}/drivers.json?limit=50",
+ url <- glue::glue("{season}/drivers.json",
season = season
)
data <- get_jolpica_content(url)
diff --git a/R/load_laps.R b/R/load_laps.R
index e228c3a1..3a502565 100644
--- a/R/load_laps.R
+++ b/R/load_laps.R
@@ -25,10 +25,10 @@ load_laps <- function(season = get_current_season(), round = "last", race = life
lim <- 100
# Function Code
- url <- glue::glue("{season}/{round}/laps.json?limit={lim}",
- season = season, round = round, lim = lim
+ url <- glue::glue("{season}/{round}/laps.json",
+ season = season, round = round
)
- data <- get_jolpica_content(url)
+ data <- get_jolpica_content(url, parameters = list("limit" = lim))
if (is.null(data)) {
return(NULL)
@@ -43,10 +43,7 @@ load_laps <- function(season = get_current_season(), round = "last", race = life
while (offset + lim <= total) {
offset <- offset + lim
- url <- glue::glue("{season}/{round}/laps.json?limit={lim}&offset={offset}",
- lim = lim, season = season, round = round, offset = offset
- )
- data <- get_jolpica_content(url)
+ data <- get_jolpica_content(url, parameters = list(limit = lim, offset = offset))
if (is.null(data)) {
return(NULL)
diff --git a/R/load_pitstops.R b/R/load_pitstops.R
index d2e7cd8e..9b56d4a7 100644
--- a/R/load_pitstops.R
+++ b/R/load_pitstops.R
@@ -24,10 +24,10 @@ load_pitstops <- function(season = get_current_season(), round = "last", race =
}
# Function Code
- url <- glue::glue("{season}/{round}/pitstops.json?limit=100",
+ url <- glue::glue("{season}/{round}/pitstops.json",
season = season, round = round
)
- data <- get_jolpica_content(url)
+ data <- get_jolpica_content(url, parameters = list(limit = 100))
if (is.null(data)) {
return(NULL)
diff --git a/R/load_quali.R b/R/load_quali.R
index 45173d67..3d31fde1 100644
--- a/R/load_quali.R
+++ b/R/load_quali.R
@@ -15,7 +15,7 @@ load_quali <- function(season = get_current_season(), round = "last") {
cli::cli_abort('{.var season} must be between 2003 and {get_current_season()} (or use "current")')
}
- url <- glue::glue("{season}/{round}/qualifying.json?limit=40",
+ url <- glue::glue("{season}/{round}/qualifying.json",
season = season, round = round
)
diff --git a/R/load_results.R b/R/load_results.R
index 803864d3..14bcfd31 100644
--- a/R/load_results.R
+++ b/R/load_results.R
@@ -19,7 +19,7 @@ load_results <- function(season = get_current_season(), round = "last") {
}
url <- glue::glue(
- "{season}/{round}/results.json?limit=40",
+ "{season}/{round}/results.json",
season = season,
round = round
)
diff --git a/R/load_schedule.R b/R/load_schedule.R
index c7f53edb..bcd431bd 100644
--- a/R/load_schedule.R
+++ b/R/load_schedule.R
@@ -12,7 +12,7 @@ load_schedule <- function(season = get_current_season()) {
cli::cli_abort('{.var season} must be between 1950 and {get_current_season()} (or use "current")')
}
- url <- glue::glue("{season}.json?limit=30", season = season)
+ url <- glue::glue("{season}.json", season = season)
data <- get_jolpica_content(url)
if (is.null(data)) {
diff --git a/R/load_sprint.R b/R/load_sprint.R
index 6aee7297..9d2ab7aa 100644
--- a/R/load_sprint.R
+++ b/R/load_sprint.R
@@ -16,12 +16,12 @@
load_sprint <- function(season = get_current_season(), round = "last") {
if (season != "current" && (season < 2021 || season > get_current_season())) {
cli::cli_abort(
- '{.var season} must be between 2021 and {get_current_season()} (or use "current")'
+ '{.var season} must be between 2021 and {get_current_season()} (or use "current").'
)
}
url <- glue::glue(
- "{season}/{round}/sprint.json?limit=40",
+ "{season}/{round}/sprint.json",
season = season,
round = round
)
diff --git a/R/load_standings.R b/R/load_standings.R
index d028979d..e0989a76 100644
--- a/R/load_standings.R
+++ b/R/load_standings.R
@@ -21,7 +21,7 @@ load_standings <- function(season = get_current_season(), round = "last", type =
cli::cli_abort('{.var type} must be either "driver" or "constructor"')
}
- url <- glue::glue("{season}/{round}/{type}Standings.json?limit=40",
+ url <- glue::glue("{season}/{round}/{type}Standings.json",
season = season, round = round, type = type
)
diff --git a/R/theme_dark_f1.R b/R/theme_dark_f1.R
index 0b3ec7c7..2b7bcbd1 100644
--- a/R/theme_dark_f1.R
+++ b/R/theme_dark_f1.R
@@ -9,7 +9,6 @@
#' color variable.
#' @export
-
theme_dark_f1 <- function(axis_marks = FALSE) {
if (axis_marks) {
ggplot2::theme_gray() +
@@ -19,7 +18,11 @@ theme_dark_f1 <- function(axis_marks = FALSE) {
axis.text = ggplot2::element_text(colour = "white"),
axis.title = ggplot2::element_text(colour = "white"),
axis.ticks = ggplot2::element_line(colour = "white"),
- plot.title = ggplot2::element_text(face = "bold", size = 17, color = "#cf1b1f"),
+ plot.title = ggplot2::element_text(
+ face = "bold",
+ size = 17,
+ color = "#cf1b1f"
+ ),
plot.subtitle = ggplot2::element_text(face = "bold", size = 14),
plot.background = ggplot2::element_rect(fill = "grey10"),
panel.background = ggplot2::element_blank(),
@@ -36,7 +39,11 @@ theme_dark_f1 <- function(axis_marks = FALSE) {
axis.text = ggplot2::element_blank(),
axis.title = ggplot2::element_blank(),
axis.ticks = ggplot2::element_blank(),
- plot.title = ggplot2::element_text(face = "bold", size = 17, color = "#cf1b1f"),
+ plot.title = ggplot2::element_text(
+ face = "bold",
+ size = 17,
+ color = "#cf1b1f"
+ ),
plot.subtitle = ggplot2::element_text(face = "bold", size = 14),
plot.background = ggplot2::element_rect(fill = "grey10"),
panel.background = ggplot2::element_blank(),
diff --git a/R/utils.R b/R/utils.R
index f3d5f613..a53f9e00 100644
--- a/R/utils.R
+++ b/R/utils.R
@@ -42,10 +42,11 @@ get_ergast_content <- function(url) {
#'
#' @param url the Jolpica URL tail to get from the API (for example,
#' `"{season}/circuits.json?limit=40"` is called from `load_circuits()`).
+#' @param parameters Parameters to add to the url. Typically `"...?limit=40"`.
#' @keywords internal
#' @return the result of `jsonlite::fromJSON` called on Jolpica's return content.
#' Further processing is performed by specific functions
-get_jolpica_content <- function(url) {
+get_jolpica_content <- function(url, parameters = list(limit = 40)) {
# Function Code
# note:
@@ -54,8 +55,19 @@ get_jolpica_content <- function(url) {
# Automatically retries request up to 5 times. Back-off provided in httr2 documentation
# Automatically retries at http if https fails after retries.
+ if (grepl("?", url, fixed = TRUE)) {
+ cli::cli_warn(c(
+ "x" = "Warning: A {.param url} was provided with parameters.",
+ "i" = "Modify your request to pass the parameters as a list"
+ ))
+ }
+ if (!is.list(parameters)) {
+ as.list(parameters)
+ }
+
jolpica_raw <- httr2::request("https://api.jolpi.ca/ergast/f1/") %>%
httr2::req_url_path_append(url) %>%
+ httr2::req_url_query(!!!parameters) %>%
httr2::req_retry(max_tries = 10, backoff = function(x) {
stats::runif(1, 1, 2^x)
}) %>%
@@ -303,6 +315,7 @@ check_ff1_version <- function() {
#' @export
#' @return version as class `package_version`
get_fastf1_version <- function() {
+ reticulate::py_available(initialize = TRUE)
ver <- reticulate::py_list_packages() %>%
dplyr::filter(.data$package == "fastf1") %>%
dplyr::pull("version")
@@ -352,48 +365,8 @@ add_col_if_absent <- function(data, column_name, na_type = NA) {
}
return(dplyr::as_tibble(data))
}
-# nocov start
-
-#' Setup fastf1 connection
-#'
-#' @description Installs or optionally updates `fastf1` Python package in the current active Python
-#' environment/virtualenv/conda env.
-#'
-#' More information on how to manage complex environment needs can be read in the
-#' \href{https://rstudio.github.io/reticulate/articles/python_dependencies.html}{reticulate docs}, and tools for
-#' managing virtual environments are documented in \link[reticulate]{virtualenv-tools} and
-#' \link[reticulate]{conda-tools}
-#' @param ... Additional parameters to pass to \link[reticulate]{py_install}
-#' @param envname Optionally pass an environment name used. Defaults to package default of `f1dataR_env`.
-#' @param new_env Whether or not to completely remove and recreate the environment provided in `envname`. This will fix
-#' any issues experienced by `fastf1` related to package dependencies.
-#' @export
-#' @return No return value, called to install or update `fastf1` Python package.
-#' @examples
-#' \dontrun{
-#' # Install fastf1 into the currently active Python environment
-#' setup_fastf1()
-#'
-#' # Reinstall fastf1 and recreate the environment.
-#' setup_fastf1(envname = "f1dataR_env", new_env = TRUE)
-#' }
-setup_fastf1 <- function(
- ...,
- envname = "f1dataR_env",
- new_env = identical(envname, "f1dataR_env")) {
- if (new_env && virtualenv_exists(envname)) {
- cli::cli_alert_warning(
- "The Python environment {.var {envname}} is being removed and rebuilt for {.pkg FastF1}f"
- )
- virtualenv_remove(envname)
- }
-
- cli::cli_alert_info(
- "Installing {.pkg FastF1} in current Python environment: {.var {envname}}."
- )
- reticulate::py_install("fastf1", envname = envname, ...)
-}
+# nocov start
#' @noRd
dummy <- function() {
diff --git a/R/zzz.R b/R/zzz.R
index 28be0a6b..3990c283 100644
--- a/R/zzz.R
+++ b/R/zzz.R
@@ -1,16 +1,19 @@
# nocov start
.onLoad <- function(libname, pkgname) {
- reticulate::use_virtualenv("f1dataR_env", required = FALSE)
- reticulate::configure_environment(pkgname)
+ reticulate::py_require("fastf1")
+ reticulate::import("fastf1", delay_load = TRUE)
+
# Based on how nflreadr handles caching. Thanks to Tan (github @tanho63) for the suggestions
memoise_option <- getOption("f1dataR.cache", default = "memory")
if (!memoise_option %in% c("memory", "filesystem", "off")) {
if (!dir.exists(normalizePath(memoise_option, mustWork = FALSE))) {
- cli::cli_alert_warning("Option 'f1dataR.cache' was set to {memoise_option}.
+ cli::cli_alert_warning(
+ "Option 'f1dataR.cache' was set to {memoise_option}.
It should be one of c('memory', 'filesystem', 'off') or a valid/existing path.
- Reverting to 'memory'.")
+ Reverting to 'memory'."
+ )
memoise_option <- "memory"
options("f1dataR.cache" = "memory")
}
@@ -34,72 +37,128 @@
# 86400 s is 24h
assign(
x = "load_circuits",
- value = memoise::memoise(load_circuits, ~ memoise::timeout(86400), cache = cache),
+ value = memoise::memoise(
+ load_circuits,
+ ~ memoise::timeout(86400),
+ cache = cache
+ ),
envir = rlang::ns_env("f1dataR")
)
assign(
x = "load_circuit_details",
- value = memoise::memoise(load_circuit_details, ~ memoise::timeout(86400), cache = cache),
+ value = memoise::memoise(
+ load_circuit_details,
+ ~ memoise::timeout(86400),
+ cache = cache
+ ),
envir = rlang::ns_env("f1dataR")
)
assign(
x = "load_constructors",
- value = memoise::memoise(load_constructors, ~ memoise::timeout(86400), cache = cache),
+ value = memoise::memoise(
+ load_constructors,
+ ~ memoise::timeout(86400),
+ cache = cache
+ ),
envir = rlang::ns_env("f1dataR")
)
assign(
x = "load_driver_telemetry",
- value = memoise::memoise(load_driver_telemetry, ~ memoise::timeout(86400), cache = cache),
+ value = memoise::memoise(
+ load_driver_telemetry,
+ ~ memoise::timeout(86400),
+ cache = cache
+ ),
envir = rlang::ns_env("f1dataR")
)
assign(
x = "load_drivers",
- value = memoise::memoise(load_drivers, ~ memoise::timeout(86400), cache = cache),
+ value = memoise::memoise(
+ load_drivers,
+ ~ memoise::timeout(86400),
+ cache = cache
+ ),
envir = rlang::ns_env("f1dataR")
)
assign(
x = "load_laps",
- value = memoise::memoise(load_laps, ~ memoise::timeout(86400), cache = cache),
+ value = memoise::memoise(
+ load_laps,
+ ~ memoise::timeout(86400),
+ cache = cache
+ ),
envir = rlang::ns_env("f1dataR")
)
assign(
x = "load_pitstops",
- value = memoise::memoise(load_pitstops, ~ memoise::timeout(86400), cache = cache),
+ value = memoise::memoise(
+ load_pitstops,
+ ~ memoise::timeout(86400),
+ cache = cache
+ ),
envir = rlang::ns_env("f1dataR")
)
assign(
x = "load_quali",
- value = memoise::memoise(load_quali, ~ memoise::timeout(86400), cache = cache),
+ value = memoise::memoise(
+ load_quali,
+ ~ memoise::timeout(86400),
+ cache = cache
+ ),
envir = rlang::ns_env("f1dataR")
)
assign(
x = "load_results",
- value = memoise::memoise(load_results, ~ memoise::timeout(86400), cache = cache),
+ value = memoise::memoise(
+ load_results,
+ ~ memoise::timeout(86400),
+ cache = cache
+ ),
envir = rlang::ns_env("f1dataR")
)
assign(
x = "load_schedule",
- value = memoise::memoise(load_schedule, ~ memoise::timeout(86400), cache = cache),
+ value = memoise::memoise(
+ load_schedule,
+ ~ memoise::timeout(86400),
+ cache = cache
+ ),
envir = rlang::ns_env("f1dataR")
)
assign(
x = "load_session_laps",
- value = memoise::memoise(load_session_laps, ~ memoise::timeout(86400), cache = cache),
+ value = memoise::memoise(
+ load_session_laps,
+ ~ memoise::timeout(86400),
+ cache = cache
+ ),
envir = rlang::ns_env("f1dataR")
)
assign(
x = "load_sprint",
- value = memoise::memoise(load_sprint, ~ memoise::timeout(86400), cache = cache),
+ value = memoise::memoise(
+ load_sprint,
+ ~ memoise::timeout(86400),
+ cache = cache
+ ),
envir = rlang::ns_env("f1dataR")
)
assign(
x = "load_standings",
- value = memoise::memoise(load_standings, ~ memoise::timeout(86400), cache = cache),
+ value = memoise::memoise(
+ load_standings,
+ ~ memoise::timeout(86400),
+ cache = cache
+ ),
envir = rlang::ns_env("f1dataR")
)
assign(
x = "plot_fastest",
- value = memoise::memoise(plot_fastest, ~ memoise::timeout(86400), cache = cache),
+ value = memoise::memoise(
+ plot_fastest,
+ ~ memoise::timeout(86400),
+ cache = cache
+ ),
envir = rlang::ns_env("f1dataR")
)
}
@@ -115,7 +174,10 @@
options("f1dataR.cache" = "memory")
}
- if (!memoise_option %in% c("memory", "filesystem", "off") && !dir.exists(normalizePath(memoise_option, mustWork = FALSE))) {
+ if (
+ !memoise_option %in% c("memory", "filesystem", "off") &&
+ !dir.exists(normalizePath(memoise_option, mustWork = FALSE))
+ ) {
packageStartupMessage(
"Note: f1dataR.cache is set to '",
memoise_option,
diff --git a/man/get_jolpica_content.Rd b/man/get_jolpica_content.Rd
index e2471a80..843bada4 100644
--- a/man/get_jolpica_content.Rd
+++ b/man/get_jolpica_content.Rd
@@ -4,11 +4,13 @@
\alias{get_jolpica_content}
\title{Get Jolpica Content}
\usage{
-get_jolpica_content(url)
+get_jolpica_content(url, parameters = list(limit = 40))
}
\arguments{
\item{url}{the Jolpica URL tail to get from the API (for example,
\code{"{season}/circuits.json?limit=40"} is called from \code{load_circuits()}).}
+
+\item{parameters}{Parameters to add to the url. Typically \code{"...?limit=40"}.}
}
\value{
the result of \code{jsonlite::fromJSON} called on Jolpica's return content.
diff --git a/man/setup_fastf1.Rd b/man/setup_fastf1.Rd
deleted file mode 100644
index f4e1bcc8..00000000
--- a/man/setup_fastf1.Rd
+++ /dev/null
@@ -1,41 +0,0 @@
-% Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/utils.R
-\name{setup_fastf1}
-\alias{setup_fastf1}
-\title{Setup fastf1 connection}
-\usage{
-setup_fastf1(
- ...,
- envname = "f1dataR_env",
- new_env = identical(envname, "f1dataR_env")
-)
-}
-\arguments{
-\item{...}{Additional parameters to pass to \link[reticulate]{py_install}}
-
-\item{envname}{Optionally pass an environment name used. Defaults to package default of \code{f1dataR_env}.}
-
-\item{new_env}{Whether or not to completely remove and recreate the environment provided in \code{envname}. This will fix
-any issues experienced by \code{fastf1} related to package dependencies.}
-}
-\value{
-No return value, called to install or update \code{fastf1} Python package.
-}
-\description{
-Installs or optionally updates \code{fastf1} Python package in the current active Python
-environment/virtualenv/conda env.
-
-More information on how to manage complex environment needs can be read in the
-\href{https://rstudio.github.io/reticulate/articles/python_dependencies.html}{reticulate docs}, and tools for
-managing virtual environments are documented in \link[reticulate]{virtualenv-tools} and
-\link[reticulate]{conda-tools}
-}
-\examples{
-\dontrun{
-# Install fastf1 into the currently active Python environment
-setup_fastf1()
-
-# Reinstall fastf1 and recreate the environment.
-setup_fastf1(envname = "f1dataR_env", new_env = TRUE)
-}
-}
diff --git a/tests/testthat/_vcr/clear_cache.yml b/tests/testthat/_vcr/clear_cache.yml
new file mode 100644
index 00000000..7576e61a
--- /dev/null
+++ b/tests/testthat/_vcr/clear_cache.yml
@@ -0,0 +1,79 @@
+http_interactions:
+- request:
+ method: GET
+ uri: https://api.jolpi.ca/ergast/f1/2025.json?limit=40
+ response:
+ status: 200
+ headers:
+ Server: nginx/1.28.0
+ Date: Mon, 04 Aug 2025 01:36:26 GMT
+ Content-Type: application/json
+ Transfer-Encoding: chunked
+ Connection: keep-alive
+ Vary: Accept, origin
+ Allow: GET, HEAD, OPTIONS
+ Expires: Mon, 04 Aug 2025 02:36:26 GMT
+ Cache-Control: max-age=3600
+ X-Frame-Options: DENY
+ X-Content-Type-Options: nosniff
+ Referrer-Policy: same-origin
+ Cross-Origin-Opener-Policy: same-origin
+ Content-Encoding: gzip
+ body:
+ string: '{"MRData":{"xmlns":"","series":"f1","url":"https://api.jolpi.ca/ergast/f1/2025.json","limit":"40","offset":"0","total":"24","RaceTable":{"season":"2025","Races":[{"season":"2025","round":"1","url":"https://en.wikipedia.org/wiki/2025_Australian_Grand_Prix","raceName":"Australian
+ Grand Prix","Circuit":{"circuitId":"albert_park","url":"https://en.wikipedia.org/wiki/Albert_Park_Circuit","circuitName":"Albert
+ Park Grand Prix Circuit","Location":{"lat":"-37.8497","long":"144.968","locality":"Melbourne","country":"Australia"}},"date":"2025-03-16","time":"04:00:00Z","FirstPractice":{"date":"2025-03-14","time":"01:30:00Z"},"SecondPractice":{"date":"2025-03-14","time":"05:00:00Z"},"ThirdPractice":{"date":"2025-03-15","time":"01:30:00Z"},"Qualifying":{"date":"2025-03-15","time":"05:00:00Z"}},{"season":"2025","round":"2","url":"https://en.wikipedia.org/wiki/2025_Chinese_Grand_Prix","raceName":"Chinese
+ Grand Prix","Circuit":{"circuitId":"shanghai","url":"https://en.wikipedia.org/wiki/Shanghai_International_Circuit","circuitName":"Shanghai
+ International Circuit","Location":{"lat":"31.3389","long":"121.22","locality":"Shanghai","country":"China"}},"date":"2025-03-23","time":"07:00:00Z","FirstPractice":{"date":"2025-03-21","time":"03:30:00Z"},"Qualifying":{"date":"2025-03-22","time":"07:00:00Z"},"Sprint":{"date":"2025-03-22","time":"03:00:00Z"},"SprintQualifying":{"date":"2025-03-21","time":"07:30:00Z"}},{"season":"2025","round":"3","url":"https://en.wikipedia.org/wiki/2025_Japanese_Grand_Prix","raceName":"Japanese
+ Grand Prix","Circuit":{"circuitId":"suzuka","url":"https://en.wikipedia.org/wiki/Suzuka_International_Racing_Course","circuitName":"Suzuka
+ Circuit","Location":{"lat":"34.8431","long":"136.541","locality":"Suzuka","country":"Japan"}},"date":"2025-04-06","time":"05:00:00Z","FirstPractice":{"date":"2025-04-04","time":"02:30:00Z"},"SecondPractice":{"date":"2025-04-04","time":"06:00:00Z"},"ThirdPractice":{"date":"2025-04-05","time":"02:30:00Z"},"Qualifying":{"date":"2025-04-05","time":"06:00:00Z"}},{"season":"2025","round":"4","url":"https://en.wikipedia.org/wiki/2025_Bahrain_Grand_Prix","raceName":"Bahrain
+ Grand Prix","Circuit":{"circuitId":"bahrain","url":"https://en.wikipedia.org/wiki/Bahrain_International_Circuit","circuitName":"Bahrain
+ International Circuit","Location":{"lat":"26.0325","long":"50.5106","locality":"Sakhir","country":"Bahrain"}},"date":"2025-04-13","time":"15:00:00Z","FirstPractice":{"date":"2025-04-11","time":"11:30:00Z"},"SecondPractice":{"date":"2025-04-11","time":"15:00:00Z"},"ThirdPractice":{"date":"2025-04-12","time":"12:30:00Z"},"Qualifying":{"date":"2025-04-12","time":"16:00:00Z"}},{"season":"2025","round":"5","url":"https://en.wikipedia.org/wiki/2025_Saudi_Arabian_Grand_Prix","raceName":"Saudi
+ Arabian Grand Prix","Circuit":{"circuitId":"jeddah","url":"https://en.wikipedia.org/wiki/Jeddah_Corniche_Circuit","circuitName":"Jeddah
+ Corniche Circuit","Location":{"lat":"21.6319","long":"39.1044","locality":"Jeddah","country":"Saudi
+ Arabia"}},"date":"2025-04-20","time":"17:00:00Z","FirstPractice":{"date":"2025-04-18","time":"13:30:00Z"},"SecondPractice":{"date":"2025-04-18","time":"17:00:00Z"},"ThirdPractice":{"date":"2025-04-19","time":"13:30:00Z"},"Qualifying":{"date":"2025-04-19","time":"17:00:00Z"}},{"season":"2025","round":"6","url":"https://en.wikipedia.org/wiki/2025_Miami_Grand_Prix","raceName":"Miami
+ Grand Prix","Circuit":{"circuitId":"miami","url":"https://en.wikipedia.org/wiki/Miami_International_Autodrome","circuitName":"Miami
+ International Autodrome","Location":{"lat":"25.9581","long":"-80.2389","locality":"Miami","country":"USA"}},"date":"2025-05-04","time":"20:00:00Z","FirstPractice":{"date":"2025-05-02","time":"16:30:00Z"},"Qualifying":{"date":"2025-05-03","time":"20:00:00Z"},"Sprint":{"date":"2025-05-03","time":"16:00:00Z"},"SprintQualifying":{"date":"2025-05-02","time":"20:30:00Z"}},{"season":"2025","round":"7","url":"https://en.wikipedia.org/wiki/2025_Emilia_Romagna_Grand_Prix","raceName":"Emilia
+ Romagna Grand Prix","Circuit":{"circuitId":"imola","url":"https://en.wikipedia.org/wiki/Imola_Circuit","circuitName":"Autodromo
+ Enzo e Dino Ferrari","Location":{"lat":"44.3439","long":"11.7167","locality":"Imola","country":"Italy"}},"date":"2025-05-18","time":"13:00:00Z","FirstPractice":{"date":"2025-05-16","time":"11:30:00Z"},"SecondPractice":{"date":"2025-05-16","time":"15:00:00Z"},"ThirdPractice":{"date":"2025-05-17","time":"10:30:00Z"},"Qualifying":{"date":"2025-05-17","time":"14:00:00Z"}},{"season":"2025","round":"8","url":"https://en.wikipedia.org/wiki/2025_Monaco_Grand_Prix","raceName":"Monaco
+ Grand Prix","Circuit":{"circuitId":"monaco","url":"https://en.wikipedia.org/wiki/Circuit_de_Monaco","circuitName":"Circuit
+ de Monaco","Location":{"lat":"43.7347","long":"7.42056","locality":"Monte-Carlo","country":"Monaco"}},"date":"2025-05-25","time":"13:00:00Z","FirstPractice":{"date":"2025-05-23","time":"11:30:00Z"},"SecondPractice":{"date":"2025-05-23","time":"15:00:00Z"},"ThirdPractice":{"date":"2025-05-24","time":"10:30:00Z"},"Qualifying":{"date":"2025-05-24","time":"14:00:00Z"}},{"season":"2025","round":"9","url":"https://en.wikipedia.org/wiki/2025_Spanish_Grand_Prix","raceName":"Spanish
+ Grand Prix","Circuit":{"circuitId":"catalunya","url":"https://en.wikipedia.org/wiki/Circuit_de_Barcelona-Catalunya","circuitName":"Circuit
+ de Barcelona-Catalunya","Location":{"lat":"41.57","long":"2.26111","locality":"Montmeló","country":"Spain"}},"date":"2025-06-01","time":"13:00:00Z","FirstPractice":{"date":"2025-05-30","time":"11:30:00Z"},"SecondPractice":{"date":"2025-05-30","time":"15:00:00Z"},"ThirdPractice":{"date":"2025-05-31","time":"10:30:00Z"},"Qualifying":{"date":"2025-05-31","time":"14:00:00Z"}},{"season":"2025","round":"10","url":"https://en.wikipedia.org/wiki/2025_Canadian_Grand_Prix","raceName":"Canadian
+ Grand Prix","Circuit":{"circuitId":"villeneuve","url":"https://en.wikipedia.org/wiki/Circuit_Gilles_Villeneuve","circuitName":"Circuit
+ Gilles Villeneuve","Location":{"lat":"45.5","long":"-73.5228","locality":"Montreal","country":"Canada"}},"date":"2025-06-15","time":"18:00:00Z","FirstPractice":{"date":"2025-06-13","time":"17:30:00Z"},"SecondPractice":{"date":"2025-06-13","time":"21:00:00Z"},"ThirdPractice":{"date":"2025-06-14","time":"16:30:00Z"},"Qualifying":{"date":"2025-06-14","time":"20:00:00Z"}},{"season":"2025","round":"11","url":"https://en.wikipedia.org/wiki/2025_Austrian_Grand_Prix","raceName":"Austrian
+ Grand Prix","Circuit":{"circuitId":"red_bull_ring","url":"https://en.wikipedia.org/wiki/Red_Bull_Ring","circuitName":"Red
+ Bull Ring","Location":{"lat":"47.2197","long":"14.7647","locality":"Spielberg","country":"Austria"}},"date":"2025-06-29","time":"13:00:00Z","FirstPractice":{"date":"2025-06-27","time":"11:30:00Z"},"SecondPractice":{"date":"2025-06-27","time":"15:00:00Z"},"ThirdPractice":{"date":"2025-06-28","time":"10:30:00Z"},"Qualifying":{"date":"2025-06-28","time":"14:00:00Z"}},{"season":"2025","round":"12","url":"https://en.wikipedia.org/wiki/2025_British_Grand_Prix","raceName":"British
+ Grand Prix","Circuit":{"circuitId":"silverstone","url":"https://en.wikipedia.org/wiki/Silverstone_Circuit","circuitName":"Silverstone
+ Circuit","Location":{"lat":"52.0786","long":"-1.01694","locality":"Silverstone","country":"UK"}},"date":"2025-07-06","time":"14:00:00Z","FirstPractice":{"date":"2025-07-04","time":"11:30:00Z"},"SecondPractice":{"date":"2025-07-04","time":"15:00:00Z"},"ThirdPractice":{"date":"2025-07-05","time":"10:30:00Z"},"Qualifying":{"date":"2025-07-05","time":"14:00:00Z"}},{"season":"2025","round":"13","url":"https://en.wikipedia.org/wiki/2025_Belgian_Grand_Prix","raceName":"Belgian
+ Grand Prix","Circuit":{"circuitId":"spa","url":"https://en.wikipedia.org/wiki/Circuit_de_Spa-Francorchamps","circuitName":"Circuit
+ de Spa-Francorchamps","Location":{"lat":"50.4372","long":"5.97139","locality":"Spa","country":"Belgium"}},"date":"2025-07-27","time":"13:00:00Z","FirstPractice":{"date":"2025-07-25","time":"10:30:00Z"},"Qualifying":{"date":"2025-07-26","time":"14:00:00Z"},"Sprint":{"date":"2025-07-26","time":"10:00:00Z"},"SprintQualifying":{"date":"2025-07-25","time":"14:30:00Z"}},{"season":"2025","round":"14","url":"https://en.wikipedia.org/wiki/2025_Hungarian_Grand_Prix","raceName":"Hungarian
+ Grand Prix","Circuit":{"circuitId":"hungaroring","url":"https://en.wikipedia.org/wiki/Hungaroring","circuitName":"Hungaroring","Location":{"lat":"47.5789","long":"19.2486","locality":"Budapest","country":"Hungary"}},"date":"2025-08-03","time":"13:00:00Z","FirstPractice":{"date":"2025-08-01","time":"11:30:00Z"},"SecondPractice":{"date":"2025-08-01","time":"15:00:00Z"},"ThirdPractice":{"date":"2025-08-02","time":"10:30:00Z"},"Qualifying":{"date":"2025-08-02","time":"14:00:00Z"}},{"season":"2025","round":"15","url":"https://en.wikipedia.org/wiki/2025_Dutch_Grand_Prix","raceName":"Dutch
+ Grand Prix","Circuit":{"circuitId":"zandvoort","url":"https://en.wikipedia.org/wiki/Circuit_Zandvoort","circuitName":"Circuit
+ Park Zandvoort","Location":{"lat":"52.3888","long":"4.54092","locality":"Zandvoort","country":"Netherlands"}},"date":"2025-08-31","time":"13:00:00Z","FirstPractice":{"date":"2025-08-29","time":"10:30:00Z"},"SecondPractice":{"date":"2025-08-29","time":"14:00:00Z"},"ThirdPractice":{"date":"2025-08-30","time":"09:30:00Z"},"Qualifying":{"date":"2025-08-30","time":"13:00:00Z"}},{"season":"2025","round":"16","url":"https://en.wikipedia.org/wiki/2025_Italian_Grand_Prix","raceName":"Italian
+ Grand Prix","Circuit":{"circuitId":"monza","url":"https://en.wikipedia.org/wiki/Monza_Circuit","circuitName":"Autodromo
+ Nazionale di Monza","Location":{"lat":"45.6156","long":"9.28111","locality":"Monza","country":"Italy"}},"date":"2025-09-07","time":"13:00:00Z","FirstPractice":{"date":"2025-09-05","time":"11:30:00Z"},"SecondPractice":{"date":"2025-09-05","time":"15:00:00Z"},"ThirdPractice":{"date":"2025-09-06","time":"10:30:00Z"},"Qualifying":{"date":"2025-09-06","time":"14:00:00Z"}},{"season":"2025","round":"17","url":"https://en.wikipedia.org/wiki/2025_Azerbaijan_Grand_Prix","raceName":"Azerbaijan
+ Grand Prix","Circuit":{"circuitId":"baku","url":"https://en.wikipedia.org/wiki/Baku_City_Circuit","circuitName":"Baku
+ City Circuit","Location":{"lat":"40.3725","long":"49.8533","locality":"Baku","country":"Azerbaijan"}},"date":"2025-09-21","time":"11:00:00Z","FirstPractice":{"date":"2025-09-19","time":"08:30:00Z"},"SecondPractice":{"date":"2025-09-19","time":"12:00:00Z"},"ThirdPractice":{"date":"2025-09-20","time":"08:30:00Z"},"Qualifying":{"date":"2025-09-20","time":"12:00:00Z"}},{"season":"2025","round":"18","url":"https://en.wikipedia.org/wiki/2025_Singapore_Grand_Prix","raceName":"Singapore
+ Grand Prix","Circuit":{"circuitId":"marina_bay","url":"https://en.wikipedia.org/wiki/Marina_Bay_Street_Circuit","circuitName":"Marina
+ Bay Street Circuit","Location":{"lat":"1.2914","long":"103.864","locality":"Marina
+ Bay","country":"Singapore"}},"date":"2025-10-05","time":"12:00:00Z","FirstPractice":{"date":"2025-10-03","time":"09:30:00Z"},"SecondPractice":{"date":"2025-10-03","time":"13:00:00Z"},"ThirdPractice":{"date":"2025-10-04","time":"09:30:00Z"},"Qualifying":{"date":"2025-10-04","time":"13:00:00Z"}},{"season":"2025","round":"19","url":"https://en.wikipedia.org/wiki/2025_United_States_Grand_Prix","raceName":"United
+ States Grand Prix","Circuit":{"circuitId":"americas","url":"https://en.wikipedia.org/wiki/Circuit_of_the_Americas","circuitName":"Circuit
+ of the Americas","Location":{"lat":"30.1328","long":"-97.6411","locality":"Austin","country":"USA"}},"date":"2025-10-19","time":"19:00:00Z","FirstPractice":{"date":"2025-10-17","time":"17:30:00Z"},"Qualifying":{"date":"2025-10-18","time":"21:00:00Z"},"Sprint":{"date":"2025-10-18","time":"17:00:00Z"},"SprintQualifying":{"date":"2025-10-17","time":"21:30:00Z"}},{"season":"2025","round":"20","url":"https://en.wikipedia.org/wiki/2025_Mexico_City_Grand_Prix","raceName":"Mexico
+ City Grand Prix","Circuit":{"circuitId":"rodriguez","url":"https://en.wikipedia.org/wiki/Aut%C3%B3dromo_Hermanos_Rodr%C3%ADguez","circuitName":"Autódromo
+ Hermanos Rodríguez","Location":{"lat":"19.4042","long":"-99.0907","locality":"Mexico
+ City","country":"Mexico"}},"date":"2025-10-26","time":"20:00:00Z","FirstPractice":{"date":"2025-10-24","time":"18:30:00Z"},"SecondPractice":{"date":"2025-10-24","time":"22:00:00Z"},"ThirdPractice":{"date":"2025-10-25","time":"17:30:00Z"},"Qualifying":{"date":"2025-10-25","time":"21:00:00Z"}},{"season":"2025","round":"21","url":"https://en.wikipedia.org/wiki/2025_S%C3%A3o_Paulo_Grand_Prix","raceName":"São
+ Paulo Grand Prix","Circuit":{"circuitId":"interlagos","url":"https://en.wikipedia.org/wiki/Interlagos_Circuit","circuitName":"Autódromo
+ José Carlos Pace","Location":{"lat":"-23.7036","long":"-46.6997","locality":"São
+ Paulo","country":"Brazil"}},"date":"2025-11-09","time":"17:00:00Z","FirstPractice":{"date":"2025-11-07","time":"14:30:00Z"},"Qualifying":{"date":"2025-11-08","time":"18:00:00Z"},"Sprint":{"date":"2025-11-08","time":"14:00:00Z"},"SprintQualifying":{"date":"2025-11-07","time":"18:30:00Z"}},{"season":"2025","round":"22","url":"https://en.wikipedia.org/wiki/2025_Las_Vegas_Grand_Prix","raceName":"Las
+ Vegas Grand Prix","Circuit":{"circuitId":"vegas","url":"https://en.wikipedia.org/wiki/Las_Vegas_Grand_Prix#Circuit","circuitName":"Las
+ Vegas Strip Street Circuit","Location":{"lat":"36.1147","long":"-115.173","locality":"Las
+ Vegas","country":"USA"}},"date":"2025-11-23","time":"04:00:00Z","FirstPractice":{"date":"2025-11-21","time":"00:30:00Z"},"SecondPractice":{"date":"2025-11-21","time":"04:00:00Z"},"ThirdPractice":{"date":"2025-11-22","time":"00:30:00Z"},"Qualifying":{"date":"2025-11-22","time":"04:00:00Z"}},{"season":"2025","round":"23","url":"https://en.wikipedia.org/wiki/2025_Qatar_Grand_Prix","raceName":"Qatar
+ Grand Prix","Circuit":{"circuitId":"losail","url":"https://en.wikipedia.org/wiki/Lusail_International_Circuit","circuitName":"Losail
+ International Circuit","Location":{"lat":"25.49","long":"51.4542","locality":"Al
+ Daayen","country":"Qatar"}},"date":"2025-11-30","time":"16:00:00Z","FirstPractice":{"date":"2025-11-28","time":"13:30:00Z"},"Qualifying":{"date":"2025-11-29","time":"18:00:00Z"},"Sprint":{"date":"2025-11-29","time":"14:00:00Z"},"SprintQualifying":{"date":"2025-11-28","time":"17:30:00Z"}},{"season":"2025","round":"24","url":"https://en.wikipedia.org/wiki/2025_Abu_Dhabi_Grand_Prix","raceName":"Abu
+ Dhabi Grand Prix","Circuit":{"circuitId":"yas_marina","url":"https://en.wikipedia.org/wiki/Yas_Marina_Circuit","circuitName":"Yas
+ Marina Circuit","Location":{"lat":"24.4672","long":"54.6031","locality":"Abu
+ Dhabi","country":"UAE"}},"date":"2025-12-07","time":"13:00:00Z","FirstPractice":{"date":"2025-12-05","time":"09:30:00Z"},"SecondPractice":{"date":"2025-12-05","time":"13:00:00Z"},"ThirdPractice":{"date":"2025-12-06","time":"10:30:00Z"},"Qualifying":{"date":"2025-12-06","time":"14:00:00Z"}}]}}}'
+ recorded_at: 2025-08-04 01:36:26
+recorded_with: VCR-vcr/2.0.0
diff --git a/tests/testthat/_vcr/load_cache.yml b/tests/testthat/_vcr/load_cache.yml
new file mode 100644
index 00000000..ea296fe8
--- /dev/null
+++ b/tests/testthat/_vcr/load_cache.yml
@@ -0,0 +1,51 @@
+http_interactions:
+- request:
+ method: GET
+ uri: https://api.jolpi.ca/ergast/f1/2021/circuits.json?limit=40
+ response:
+ status: 200
+ headers:
+ Server: nginx/1.28.0
+ Date: Mon, 04 Aug 2025 01:42:47 GMT
+ Content-Type: application/json
+ Transfer-Encoding: chunked
+ Connection: keep-alive
+ Vary: Accept, origin
+ Allow: GET, HEAD, OPTIONS
+ Expires: Mon, 04 Aug 2025 02:36:30 GMT
+ Cache-Control: max-age=3600
+ Age: '377'
+ X-Frame-Options: DENY
+ X-Content-Type-Options: nosniff
+ Referrer-Policy: same-origin
+ Cross-Origin-Opener-Policy: same-origin
+ Content-Encoding: gzip
+ body:
+ string: '{"MRData":{"xmlns":"","series":"f1","url":"https://api.jolpi.ca/ergast/f1/2021/circuits.json","limit":"40","offset":"0","total":"21","CircuitTable":{"season":"2021","Circuits":[{"circuitId":"americas","url":"https://en.wikipedia.org/wiki/Circuit_of_the_Americas","circuitName":"Circuit
+ of the Americas","Location":{"lat":"30.1328","long":"-97.6411","locality":"Austin","country":"USA"}},{"circuitId":"bahrain","url":"https://en.wikipedia.org/wiki/Bahrain_International_Circuit","circuitName":"Bahrain
+ International Circuit","Location":{"lat":"26.0325","long":"50.5106","locality":"Sakhir","country":"Bahrain"}},{"circuitId":"baku","url":"https://en.wikipedia.org/wiki/Baku_City_Circuit","circuitName":"Baku
+ City Circuit","Location":{"lat":"40.3725","long":"49.8533","locality":"Baku","country":"Azerbaijan"}},{"circuitId":"catalunya","url":"https://en.wikipedia.org/wiki/Circuit_de_Barcelona-Catalunya","circuitName":"Circuit
+ de Barcelona-Catalunya","Location":{"lat":"41.57","long":"2.26111","locality":"Montmeló","country":"Spain"}},{"circuitId":"hungaroring","url":"https://en.wikipedia.org/wiki/Hungaroring","circuitName":"Hungaroring","Location":{"lat":"47.5789","long":"19.2486","locality":"Budapest","country":"Hungary"}},{"circuitId":"imola","url":"https://en.wikipedia.org/wiki/Imola_Circuit","circuitName":"Autodromo
+ Enzo e Dino Ferrari","Location":{"lat":"44.3439","long":"11.7167","locality":"Imola","country":"Italy"}},{"circuitId":"interlagos","url":"https://en.wikipedia.org/wiki/Interlagos_Circuit","circuitName":"Autódromo
+ José Carlos Pace","Location":{"lat":"-23.7036","long":"-46.6997","locality":"São
+ Paulo","country":"Brazil"}},{"circuitId":"istanbul","url":"https://en.wikipedia.org/wiki/Istanbul_Park","circuitName":"Istanbul
+ Park","Location":{"lat":"40.9517","long":"29.405","locality":"Istanbul","country":"Turkey"}},{"circuitId":"jeddah","url":"https://en.wikipedia.org/wiki/Jeddah_Corniche_Circuit","circuitName":"Jeddah
+ Corniche Circuit","Location":{"lat":"21.6319","long":"39.1044","locality":"Jeddah","country":"Saudi
+ Arabia"}},{"circuitId":"losail","url":"https://en.wikipedia.org/wiki/Lusail_International_Circuit","circuitName":"Losail
+ International Circuit","Location":{"lat":"25.49","long":"51.4542","locality":"Al
+ Daayen","country":"Qatar"}},{"circuitId":"monaco","url":"https://en.wikipedia.org/wiki/Circuit_de_Monaco","circuitName":"Circuit
+ de Monaco","Location":{"lat":"43.7347","long":"7.42056","locality":"Monte-Carlo","country":"Monaco"}},{"circuitId":"monza","url":"https://en.wikipedia.org/wiki/Monza_Circuit","circuitName":"Autodromo
+ Nazionale di Monza","Location":{"lat":"45.6156","long":"9.28111","locality":"Monza","country":"Italy"}},{"circuitId":"portimao","url":"https://en.wikipedia.org/wiki/Algarve_International_Circuit","circuitName":"Autódromo
+ Internacional do Algarve","Location":{"lat":"37.227","long":"-8.6267","locality":"Portimão","country":"Portugal"}},{"circuitId":"red_bull_ring","url":"https://en.wikipedia.org/wiki/Red_Bull_Ring","circuitName":"Red
+ Bull Ring","Location":{"lat":"47.2197","long":"14.7647","locality":"Spielberg","country":"Austria"}},{"circuitId":"ricard","url":"https://en.wikipedia.org/wiki/Circuit_Paul_Ricard","circuitName":"Circuit
+ Paul Ricard","Location":{"lat":"43.2506","long":"5.79167","locality":"Le Castellet","country":"France"}},{"circuitId":"rodriguez","url":"https://en.wikipedia.org/wiki/Aut%C3%B3dromo_Hermanos_Rodr%C3%ADguez","circuitName":"Autódromo
+ Hermanos Rodríguez","Location":{"lat":"19.4042","long":"-99.0907","locality":"Mexico
+ City","country":"Mexico"}},{"circuitId":"silverstone","url":"https://en.wikipedia.org/wiki/Silverstone_Circuit","circuitName":"Silverstone
+ Circuit","Location":{"lat":"52.0786","long":"-1.01694","locality":"Silverstone","country":"UK"}},{"circuitId":"sochi","url":"https://en.wikipedia.org/wiki/Sochi_Autodrom","circuitName":"Sochi
+ Autodrom","Location":{"lat":"43.4057","long":"39.9578","locality":"Sochi","country":"Russia"}},{"circuitId":"spa","url":"https://en.wikipedia.org/wiki/Circuit_de_Spa-Francorchamps","circuitName":"Circuit
+ de Spa-Francorchamps","Location":{"lat":"50.4372","long":"5.97139","locality":"Spa","country":"Belgium"}},{"circuitId":"yas_marina","url":"https://en.wikipedia.org/wiki/Yas_Marina_Circuit","circuitName":"Yas
+ Marina Circuit","Location":{"lat":"24.4672","long":"54.6031","locality":"Abu
+ Dhabi","country":"UAE"}},{"circuitId":"zandvoort","url":"https://en.wikipedia.org/wiki/Circuit_Zandvoort","circuitName":"Circuit
+ Park Zandvoort","Location":{"lat":"52.3888","long":"4.54092","locality":"Zandvoort","country":"Netherlands"}}]}}}'
+ recorded_at: 2025-08-04 01:42:47
+recorded_with: VCR-vcr/2.0.0
diff --git a/tests/testthat/_vcr/load_cache_off.yml b/tests/testthat/_vcr/load_cache_off.yml
new file mode 100644
index 00000000..56cc8235
--- /dev/null
+++ b/tests/testthat/_vcr/load_cache_off.yml
@@ -0,0 +1,50 @@
+http_interactions:
+- request:
+ method: GET
+ uri: https://api.jolpi.ca/ergast/f1/2021/circuits.json?limit=40
+ response:
+ status: 200
+ headers:
+ Server: nginx/1.28.0
+ Date: Mon, 04 Aug 2025 01:36:30 GMT
+ Content-Type: application/json
+ Transfer-Encoding: chunked
+ Connection: keep-alive
+ Vary: Accept, origin
+ Allow: GET, HEAD, OPTIONS
+ Expires: Mon, 04 Aug 2025 02:36:30 GMT
+ Cache-Control: max-age=3600
+ X-Frame-Options: DENY
+ X-Content-Type-Options: nosniff
+ Referrer-Policy: same-origin
+ Cross-Origin-Opener-Policy: same-origin
+ Content-Encoding: gzip
+ body:
+ string: '{"MRData":{"xmlns":"","series":"f1","url":"https://api.jolpi.ca/ergast/f1/2021/circuits.json","limit":"40","offset":"0","total":"21","CircuitTable":{"season":"2021","Circuits":[{"circuitId":"americas","url":"https://en.wikipedia.org/wiki/Circuit_of_the_Americas","circuitName":"Circuit
+ of the Americas","Location":{"lat":"30.1328","long":"-97.6411","locality":"Austin","country":"USA"}},{"circuitId":"bahrain","url":"https://en.wikipedia.org/wiki/Bahrain_International_Circuit","circuitName":"Bahrain
+ International Circuit","Location":{"lat":"26.0325","long":"50.5106","locality":"Sakhir","country":"Bahrain"}},{"circuitId":"baku","url":"https://en.wikipedia.org/wiki/Baku_City_Circuit","circuitName":"Baku
+ City Circuit","Location":{"lat":"40.3725","long":"49.8533","locality":"Baku","country":"Azerbaijan"}},{"circuitId":"catalunya","url":"https://en.wikipedia.org/wiki/Circuit_de_Barcelona-Catalunya","circuitName":"Circuit
+ de Barcelona-Catalunya","Location":{"lat":"41.57","long":"2.26111","locality":"Montmeló","country":"Spain"}},{"circuitId":"hungaroring","url":"https://en.wikipedia.org/wiki/Hungaroring","circuitName":"Hungaroring","Location":{"lat":"47.5789","long":"19.2486","locality":"Budapest","country":"Hungary"}},{"circuitId":"imola","url":"https://en.wikipedia.org/wiki/Imola_Circuit","circuitName":"Autodromo
+ Enzo e Dino Ferrari","Location":{"lat":"44.3439","long":"11.7167","locality":"Imola","country":"Italy"}},{"circuitId":"interlagos","url":"https://en.wikipedia.org/wiki/Interlagos_Circuit","circuitName":"Autódromo
+ José Carlos Pace","Location":{"lat":"-23.7036","long":"-46.6997","locality":"São
+ Paulo","country":"Brazil"}},{"circuitId":"istanbul","url":"https://en.wikipedia.org/wiki/Istanbul_Park","circuitName":"Istanbul
+ Park","Location":{"lat":"40.9517","long":"29.405","locality":"Istanbul","country":"Turkey"}},{"circuitId":"jeddah","url":"https://en.wikipedia.org/wiki/Jeddah_Corniche_Circuit","circuitName":"Jeddah
+ Corniche Circuit","Location":{"lat":"21.6319","long":"39.1044","locality":"Jeddah","country":"Saudi
+ Arabia"}},{"circuitId":"losail","url":"https://en.wikipedia.org/wiki/Lusail_International_Circuit","circuitName":"Losail
+ International Circuit","Location":{"lat":"25.49","long":"51.4542","locality":"Al
+ Daayen","country":"Qatar"}},{"circuitId":"monaco","url":"https://en.wikipedia.org/wiki/Circuit_de_Monaco","circuitName":"Circuit
+ de Monaco","Location":{"lat":"43.7347","long":"7.42056","locality":"Monte-Carlo","country":"Monaco"}},{"circuitId":"monza","url":"https://en.wikipedia.org/wiki/Monza_Circuit","circuitName":"Autodromo
+ Nazionale di Monza","Location":{"lat":"45.6156","long":"9.28111","locality":"Monza","country":"Italy"}},{"circuitId":"portimao","url":"https://en.wikipedia.org/wiki/Algarve_International_Circuit","circuitName":"Autódromo
+ Internacional do Algarve","Location":{"lat":"37.227","long":"-8.6267","locality":"Portimão","country":"Portugal"}},{"circuitId":"red_bull_ring","url":"https://en.wikipedia.org/wiki/Red_Bull_Ring","circuitName":"Red
+ Bull Ring","Location":{"lat":"47.2197","long":"14.7647","locality":"Spielberg","country":"Austria"}},{"circuitId":"ricard","url":"https://en.wikipedia.org/wiki/Circuit_Paul_Ricard","circuitName":"Circuit
+ Paul Ricard","Location":{"lat":"43.2506","long":"5.79167","locality":"Le Castellet","country":"France"}},{"circuitId":"rodriguez","url":"https://en.wikipedia.org/wiki/Aut%C3%B3dromo_Hermanos_Rodr%C3%ADguez","circuitName":"Autódromo
+ Hermanos Rodríguez","Location":{"lat":"19.4042","long":"-99.0907","locality":"Mexico
+ City","country":"Mexico"}},{"circuitId":"silverstone","url":"https://en.wikipedia.org/wiki/Silverstone_Circuit","circuitName":"Silverstone
+ Circuit","Location":{"lat":"52.0786","long":"-1.01694","locality":"Silverstone","country":"UK"}},{"circuitId":"sochi","url":"https://en.wikipedia.org/wiki/Sochi_Autodrom","circuitName":"Sochi
+ Autodrom","Location":{"lat":"43.4057","long":"39.9578","locality":"Sochi","country":"Russia"}},{"circuitId":"spa","url":"https://en.wikipedia.org/wiki/Circuit_de_Spa-Francorchamps","circuitName":"Circuit
+ de Spa-Francorchamps","Location":{"lat":"50.4372","long":"5.97139","locality":"Spa","country":"Belgium"}},{"circuitId":"yas_marina","url":"https://en.wikipedia.org/wiki/Yas_Marina_Circuit","circuitName":"Yas
+ Marina Circuit","Location":{"lat":"24.4672","long":"54.6031","locality":"Abu
+ Dhabi","country":"UAE"}},{"circuitId":"zandvoort","url":"https://en.wikipedia.org/wiki/Circuit_Zandvoort","circuitName":"Circuit
+ Park Zandvoort","Location":{"lat":"52.3888","long":"4.54092","locality":"Zandvoort","country":"Netherlands"}}]}}}'
+ recorded_at: 2025-08-04 01:36:30
+recorded_with: VCR-vcr/2.0.0
diff --git a/tests/testthat/_vcr/load_drivers.yml b/tests/testthat/_vcr/load_drivers.yml
new file mode 100644
index 00000000..4f598df0
--- /dev/null
+++ b/tests/testthat/_vcr/load_drivers.yml
@@ -0,0 +1,26 @@
+http_interactions:
+- request:
+ method: GET
+ uri: https://api.jolpi.ca/ergast/f1/1999/drivers.json?limit=40
+ response:
+ status: 200
+ headers:
+ Server: nginx/1.28.0
+ Date: Mon, 04 Aug 2025 01:37:23 GMT
+ Content-Type: application/json
+ Transfer-Encoding: chunked
+ Connection: keep-alive
+ Vary: Accept, origin
+ Allow: GET, HEAD, OPTIONS
+ Expires: Mon, 04 Aug 2025 02:37:23 GMT
+ Cache-Control: max-age=3600
+ X-Frame-Options: DENY
+ X-Content-Type-Options: nosniff
+ Referrer-Policy: same-origin
+ Cross-Origin-Opener-Policy: same-origin
+ Content-Encoding: gzip
+ body:
+ string: '{"MRData":{"xmlns":"","series":"f1","url":"https://api.jolpi.ca/ergast/f1/1999/drivers.json","limit":"40","offset":"0","total":"24","DriverTable":{"season":"1999","Drivers":[{"driverId":"alesi","url":"http://en.wikipedia.org/wiki/Jean_Alesi","givenName":"Jean","familyName":"Alesi","dateOfBirth":"1964-06-11","nationality":"French"},{"driverId":"badoer","code":"BAD","url":"http://en.wikipedia.org/wiki/Luca_Badoer","givenName":"Luca","familyName":"Badoer","dateOfBirth":"1971-01-25","nationality":"Italian"},{"driverId":"barrichello","code":"BAR","url":"http://en.wikipedia.org/wiki/Rubens_Barrichello","givenName":"Rubens","familyName":"Barrichello","dateOfBirth":"1972-05-23","nationality":"Brazilian"},{"driverId":"coulthard","code":"COU","url":"http://en.wikipedia.org/wiki/David_Coulthard","givenName":"David","familyName":"Coulthard","dateOfBirth":"1971-03-27","nationality":"British"},{"driverId":"rosa","code":"DLR","url":"http://en.wikipedia.org/wiki/Pedro_de_la_Rosa","givenName":"Pedro","familyName":"de
+ la Rosa","dateOfBirth":"1971-02-24","nationality":"Spanish"},{"driverId":"diniz","url":"http://en.wikipedia.org/wiki/Pedro_Diniz","givenName":"Pedro","familyName":"Diniz","dateOfBirth":"1970-05-22","nationality":"Brazilian"},{"driverId":"fisichella","code":"FIS","url":"http://en.wikipedia.org/wiki/Giancarlo_Fisichella","givenName":"Giancarlo","familyName":"Fisichella","dateOfBirth":"1973-01-14","nationality":"Italian"},{"driverId":"frentzen","url":"http://en.wikipedia.org/wiki/Heinz-Harald_Frentzen","givenName":"Heinz-Harald","familyName":"Frentzen","dateOfBirth":"1967-05-18","nationality":"German"},{"driverId":"gene","url":"http://en.wikipedia.org/wiki/Marc_Gen%C3%A9","givenName":"Marc","familyName":"Gené","dateOfBirth":"1974-03-29","nationality":"Spanish"},{"driverId":"hakkinen","url":"http://en.wikipedia.org/wiki/Mika_H%C3%A4kkinen","givenName":"Mika","familyName":"Häkkinen","dateOfBirth":"1968-09-28","nationality":"Finnish"},{"driverId":"herbert","url":"http://en.wikipedia.org/wiki/Johnny_Herbert","givenName":"Johnny","familyName":"Herbert","dateOfBirth":"1964-06-25","nationality":"British"},{"driverId":"damon_hill","url":"http://en.wikipedia.org/wiki/Damon_Hill","givenName":"Damon","familyName":"Hill","dateOfBirth":"1960-09-17","nationality":"British"},{"driverId":"irvine","url":"http://en.wikipedia.org/wiki/Eddie_Irvine","givenName":"Eddie","familyName":"Irvine","dateOfBirth":"1965-11-10","nationality":"British"},{"driverId":"panis","url":"http://en.wikipedia.org/wiki/Olivier_Panis","givenName":"Olivier","familyName":"Panis","dateOfBirth":"1966-09-02","nationality":"French"},{"driverId":"salo","url":"http://en.wikipedia.org/wiki/Mika_Salo","givenName":"Mika","familyName":"Salo","dateOfBirth":"1966-11-30","nationality":"Finnish"},{"driverId":"sarrazin","url":"http://en.wikipedia.org/wiki/St%C3%A9phane_Sarrazin","givenName":"Stéphane","familyName":"Sarrazin","dateOfBirth":"1975-11-02","nationality":"French"},{"driverId":"michael_schumacher","code":"MSC","url":"http://en.wikipedia.org/wiki/Michael_Schumacher","givenName":"Michael","familyName":"Schumacher","dateOfBirth":"1969-01-03","nationality":"German"},{"driverId":"ralf_schumacher","code":"SCH","url":"http://en.wikipedia.org/wiki/Ralf_Schumacher","givenName":"Ralf","familyName":"Schumacher","dateOfBirth":"1975-06-30","nationality":"German"},{"driverId":"takagi","url":"http://en.wikipedia.org/wiki/Toranosuke_Takagi","givenName":"Toranosuke","familyName":"Takagi","dateOfBirth":"1974-02-12","nationality":"Japanese"},{"driverId":"trulli","code":"TRU","url":"http://en.wikipedia.org/wiki/Jarno_Trulli","givenName":"Jarno","familyName":"Trulli","dateOfBirth":"1974-07-13","nationality":"Italian"},{"driverId":"villeneuve","code":"VIL","url":"http://en.wikipedia.org/wiki/Jacques_Villeneuve","givenName":"Jacques","familyName":"Villeneuve","dateOfBirth":"1971-04-09","nationality":"Canadian"},{"driverId":"wurz","code":"WUR","url":"http://en.wikipedia.org/wiki/Alexander_Wurz","givenName":"Alexander","familyName":"Wurz","dateOfBirth":"1974-02-15","nationality":"Austrian"},{"driverId":"zanardi","url":"http://en.wikipedia.org/wiki/Alex_Zanardi","givenName":"Alessandro","familyName":"Zanardi","dateOfBirth":"1966-10-23","nationality":"Italian"},{"driverId":"zonta","code":"ZON","url":"http://en.wikipedia.org/wiki/Ricardo_Zonta","givenName":"Ricardo","familyName":"Zonta","dateOfBirth":"1976-03-23","nationality":"Brazilian"}]}}}'
+ recorded_at: 2025-08-04 01:37:23
+recorded_with: VCR-vcr/2.0.0
diff --git a/tests/testthat/_vcr/load_laps.yml b/tests/testthat/_vcr/load_laps.yml
new file mode 100644
index 00000000..c6732410
--- /dev/null
+++ b/tests/testthat/_vcr/load_laps.yml
@@ -0,0 +1,402 @@
+http_interactions:
+- request:
+ method: GET
+ uri: https://api.jolpi.ca/ergast/f1/2021/12/laps.json?limit=100
+ response:
+ status: 200
+ headers:
+ Server: nginx/1.28.0
+ Date: Mon, 04 Aug 2025 01:48:58 GMT
+ Content-Type: application/json
+ Transfer-Encoding: chunked
+ Connection: keep-alive
+ Vary: Accept, origin
+ Allow: GET, HEAD, OPTIONS
+ Expires: Mon, 04 Aug 2025 02:48:58 GMT
+ Cache-Control: max-age=3600
+ X-Frame-Options: DENY
+ X-Content-Type-Options: nosniff
+ Referrer-Policy: same-origin
+ Cross-Origin-Opener-Policy: same-origin
+ Content-Encoding: gzip
+ body:
+ string: '{"MRData":{"xmlns":"","series":"f1","url":"https://api.jolpi.ca/ergast/f1/2021/12/laps.json","limit":"100","offset":"0","total":"20","RaceTable":{"season":"2021","round":"12","Races":[{"season":"2021","round":"12","url":"https://en.wikipedia.org/wiki/2021_Belgian_Grand_Prix","raceName":"Belgian
+ Grand Prix","Circuit":{"circuitId":"spa","url":"https://en.wikipedia.org/wiki/Circuit_de_Spa-Francorchamps","circuitName":"Circuit
+ de Spa-Francorchamps","Location":{"lat":"50.4372","long":"5.97139","locality":"Spa","country":"Belgium"}},"date":"2021-08-29","time":"13:00:00Z","Laps":[{"number":"1","Timings":[{"driverId":"max_verstappen","position":"1","time":"3:27.071"},{"driverId":"russell","position":"2","time":"3:29.066"},{"driverId":"hamilton","position":"3","time":"3:29.672"},{"driverId":"ricciardo","position":"4","time":"3:31.567"},{"driverId":"vettel","position":"5","time":"3:34.550"},{"driverId":"gasly","position":"6","time":"3:37.248"},{"driverId":"ocon","position":"7","time":"3:38.650"},{"driverId":"leclerc","position":"8","time":"3:39.679"},{"driverId":"latifi","position":"9","time":"3:42.556"},{"driverId":"sainz","position":"10","time":"3:43.237"},{"driverId":"alonso","position":"11","time":"3:47.661"},{"driverId":"bottas","position":"12","time":"3:49.485"},{"driverId":"giovinazzi","position":"13","time":"3:51.234"},{"driverId":"norris","position":"14","time":"3:54.181"},{"driverId":"tsunoda","position":"15","time":"3:55.400"},{"driverId":"mick_schumacher","position":"16","time":"3:56.578"},{"driverId":"mazepin","position":"17","time":"3:59.064"},{"driverId":"stroll","position":"18","time":"4:01.179"},{"driverId":"raikkonen","position":"19","time":"4:03.125"},{"driverId":"perez","position":"20","time":"4:05.276"}]}]}]}}}'
+ recorded_at: 2025-08-04 01:48:58
+- request:
+ method: GET
+ uri: https://api.jolpi.ca/ergast/f1/2021/5/laps.json?limit=100
+ response:
+ status: 200
+ headers:
+ Server: nginx/1.28.0
+ Date: Mon, 04 Aug 2025 01:48:58 GMT
+ Content-Type: application/json
+ Transfer-Encoding: chunked
+ Connection: keep-alive
+ Vary: Accept, origin
+ Allow: GET, HEAD, OPTIONS
+ Expires: Mon, 04 Aug 2025 02:48:58 GMT
+ Cache-Control: max-age=3600
+ X-Frame-Options: DENY
+ X-Content-Type-Options: nosniff
+ Referrer-Policy: same-origin
+ Cross-Origin-Opener-Policy: same-origin
+ Content-Encoding: gzip
+ body:
+ string: '{"MRData":{"xmlns":"","series":"f1","url":"https://api.jolpi.ca/ergast/f1/2021/5/laps.json","limit":"100","offset":"0","total":"1418","RaceTable":{"season":"2021","round":"5","Races":[{"season":"2021","round":"5","url":"https://en.wikipedia.org/wiki/2021_Monaco_Grand_Prix","raceName":"Monaco
+ Grand Prix","Circuit":{"circuitId":"monaco","url":"https://en.wikipedia.org/wiki/Circuit_de_Monaco","circuitName":"Circuit
+ de Monaco","Location":{"lat":"43.7347","long":"7.42056","locality":"Monte-Carlo","country":"Monaco"}},"date":"2021-05-23","time":"13:00:00Z","Laps":[{"number":"1","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:21.986"},{"driverId":"bottas","position":"2","time":"1:23.015"},{"driverId":"sainz","position":"3","time":"1:24.727"},{"driverId":"norris","position":"4","time":"1:25.729"},{"driverId":"gasly","position":"5","time":"1:26.902"},{"driverId":"hamilton","position":"6","time":"1:27.982"},{"driverId":"vettel","position":"7","time":"1:28.935"},{"driverId":"perez","position":"8","time":"1:29.638"},{"driverId":"giovinazzi","position":"9","time":"1:30.113"},{"driverId":"ocon","position":"10","time":"1:30.963"},{"driverId":"stroll","position":"11","time":"1:31.448"},{"driverId":"raikkonen","position":"12","time":"1:33.051"},{"driverId":"ricciardo","position":"13","time":"1:33.662"},{"driverId":"alonso","position":"14","time":"1:34.069"},{"driverId":"russell","position":"15","time":"1:34.901"},{"driverId":"latifi","position":"16","time":"1:36.040"},{"driverId":"tsunoda","position":"17","time":"1:36.731"},{"driverId":"mick_schumacher","position":"18","time":"1:37.443"},{"driverId":"mazepin","position":"19","time":"1:38.076"}]},{"number":"2","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:17.480"},{"driverId":"bottas","position":"2","time":"1:17.613"},{"driverId":"sainz","position":"3","time":"1:17.929"},{"driverId":"norris","position":"4","time":"1:18.426"},{"driverId":"gasly","position":"5","time":"1:18.737"},{"driverId":"hamilton","position":"6","time":"1:18.742"},{"driverId":"vettel","position":"7","time":"1:19.731"},{"driverId":"perez","position":"8","time":"1:19.594"},{"driverId":"giovinazzi","position":"9","time":"1:19.695"},{"driverId":"ocon","position":"10","time":"1:20.154"},{"driverId":"stroll","position":"11","time":"1:20.334"},{"driverId":"raikkonen","position":"12","time":"1:20.858"},{"driverId":"ricciardo","position":"13","time":"1:21.326"},{"driverId":"alonso","position":"14","time":"1:21.498"},{"driverId":"russell","position":"15","time":"1:21.405"},{"driverId":"latifi","position":"16","time":"1:21.526"},{"driverId":"tsunoda","position":"17","time":"1:21.852"},{"driverId":"mick_schumacher","position":"18","time":"1:22.045"},{"driverId":"mazepin","position":"19","time":"1:21.965"}]},{"number":"3","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:17.298"},{"driverId":"bottas","position":"2","time":"1:17.329"},{"driverId":"sainz","position":"3","time":"1:17.320"},{"driverId":"norris","position":"4","time":"1:17.634"},{"driverId":"gasly","position":"5","time":"1:17.821"},{"driverId":"hamilton","position":"6","time":"1:18.240"},{"driverId":"vettel","position":"7","time":"1:18.778"},{"driverId":"perez","position":"8","time":"1:18.532"},{"driverId":"giovinazzi","position":"9","time":"1:19.070"},{"driverId":"ocon","position":"10","time":"1:19.421"},{"driverId":"stroll","position":"11","time":"1:19.437"},{"driverId":"raikkonen","position":"12","time":"1:19.846"},{"driverId":"ricciardo","position":"13","time":"1:19.874"},{"driverId":"alonso","position":"14","time":"1:20.548"},{"driverId":"russell","position":"15","time":"1:20.458"},{"driverId":"latifi","position":"16","time":"1:20.126"},{"driverId":"tsunoda","position":"17","time":"1:19.829"},{"driverId":"mick_schumacher","position":"18","time":"1:20.586"},{"driverId":"mazepin","position":"19","time":"1:20.730"}]},{"number":"4","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:17.237"},{"driverId":"bottas","position":"2","time":"1:17.154"},{"driverId":"sainz","position":"3","time":"1:18.028"},{"driverId":"norris","position":"4","time":"1:17.772"},{"driverId":"gasly","position":"5","time":"1:18.060"},{"driverId":"hamilton","position":"6","time":"1:17.936"},{"driverId":"vettel","position":"7","time":"1:18.133"},{"driverId":"perez","position":"8","time":"1:18.164"},{"driverId":"giovinazzi","position":"9","time":"1:18.340"},{"driverId":"ocon","position":"10","time":"1:18.494"},{"driverId":"stroll","position":"11","time":"1:18.644"},{"driverId":"raikkonen","position":"12","time":"1:19.102"},{"driverId":"ricciardo","position":"13","time":"1:19.801"},{"driverId":"alonso","position":"14","time":"1:20.121"},{"driverId":"russell","position":"15","time":"1:20.091"},{"driverId":"latifi","position":"16","time":"1:20.175"},{"driverId":"tsunoda","position":"17","time":"1:20.526"},{"driverId":"mick_schumacher","position":"18","time":"1:19.930"},{"driverId":"mazepin","position":"19","time":"1:19.805"}]},{"number":"5","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:16.892"},{"driverId":"bottas","position":"2","time":"1:17.236"},{"driverId":"sainz","position":"3","time":"1:17.304"},{"driverId":"norris","position":"4","time":"1:17.864"},{"driverId":"gasly","position":"5","time":"1:17.909"},{"driverId":"hamilton","position":"6","time":"1:18.221"},{"driverId":"vettel","position":"7","time":"1:17.921"},{"driverId":"perez","position":"8","time":"1:18.945"},{"driverId":"giovinazzi","position":"9","time":"1:18.636"},{"driverId":"ocon","position":"10","time":"1:18.546"},{"driverId":"stroll","position":"11","time":"1:18.626"},{"driverId":"raikkonen","position":"12","time":"1:18.913"},{"driverId":"ricciardo","position":"13","time":"1:19.588"},{"driverId":"alonso","position":"14","time":"1:19.757"},{"driverId":"russell","position":"15","time":"1:19.608"},{"driverId":"latifi","position":"16","time":"1:19.516"},{"driverId":"tsunoda","position":"17","time":"1:19.373"},{"driverId":"mick_schumacher","position":"18","time":"1:19.362"},{"driverId":"mazepin","position":"19","time":"1:19.598"}]},{"number":"6","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:17.147"},{"driverId":"bottas","position":"2","time":"1:16.863"},{"driverId":"sainz","position":"3","time":"1:16.988"},{"driverId":"norris","position":"4","time":"1:17.048"},{"driverId":"gasly","position":"5","time":"1:17.393"}]}]}]}}}'
+ recorded_at: 2025-08-04 01:48:58
+- request:
+ method: GET
+ uri: https://api.jolpi.ca/ergast/f1/2021/5/laps.json?limit=100&offset=100
+ response:
+ status: 200
+ headers:
+ Server: nginx/1.28.0
+ Date: Mon, 04 Aug 2025 01:48:59 GMT
+ Content-Type: application/json
+ Transfer-Encoding: chunked
+ Connection: keep-alive
+ Vary: Accept, origin
+ Allow: GET, HEAD, OPTIONS
+ Expires: Mon, 04 Aug 2025 02:48:59 GMT
+ Cache-Control: max-age=3600
+ X-Frame-Options: DENY
+ X-Content-Type-Options: nosniff
+ Referrer-Policy: same-origin
+ Cross-Origin-Opener-Policy: same-origin
+ Content-Encoding: gzip
+ body:
+ string: '{"MRData":{"xmlns":"","series":"f1","url":"https://api.jolpi.ca/ergast/f1/2021/5/laps.json","limit":"100","offset":"100","total":"1418","RaceTable":{"season":"2021","round":"5","Races":[{"season":"2021","round":"5","url":"https://en.wikipedia.org/wiki/2021_Monaco_Grand_Prix","raceName":"Monaco
+ Grand Prix","Circuit":{"circuitId":"monaco","url":"https://en.wikipedia.org/wiki/Circuit_de_Monaco","circuitName":"Circuit
+ de Monaco","Location":{"lat":"43.7347","long":"7.42056","locality":"Monte-Carlo","country":"Monaco"}},"date":"2021-05-23","time":"13:00:00Z","Laps":[{"number":"6","Timings":[{"driverId":"hamilton","position":"6","time":"1:17.448"},{"driverId":"vettel","position":"7","time":"1:17.992"},{"driverId":"perez","position":"8","time":"1:18.401"},{"driverId":"giovinazzi","position":"9","time":"1:18.640"},{"driverId":"ocon","position":"10","time":"1:18.526"},{"driverId":"stroll","position":"11","time":"1:18.497"},{"driverId":"raikkonen","position":"12","time":"1:18.511"},{"driverId":"ricciardo","position":"13","time":"1:19.103"},{"driverId":"alonso","position":"14","time":"1:18.825"},{"driverId":"russell","position":"15","time":"1:19.391"},{"driverId":"latifi","position":"16","time":"1:19.611"},{"driverId":"tsunoda","position":"17","time":"1:19.498"},{"driverId":"mick_schumacher","position":"18","time":"1:19.782"},{"driverId":"mazepin","position":"19","time":"1:19.839"}]},{"number":"7","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:16.722"},{"driverId":"bottas","position":"2","time":"1:17.082"},{"driverId":"sainz","position":"3","time":"1:16.736"},{"driverId":"norris","position":"4","time":"1:17.195"},{"driverId":"gasly","position":"5","time":"1:17.204"},{"driverId":"hamilton","position":"6","time":"1:17.205"},{"driverId":"vettel","position":"7","time":"1:17.872"},{"driverId":"perez","position":"8","time":"1:18.241"},{"driverId":"giovinazzi","position":"9","time":"1:18.244"},{"driverId":"ocon","position":"10","time":"1:18.572"},{"driverId":"stroll","position":"11","time":"1:18.748"},{"driverId":"raikkonen","position":"12","time":"1:18.927"},{"driverId":"ricciardo","position":"13","time":"1:18.304"},{"driverId":"alonso","position":"14","time":"1:18.738"},{"driverId":"russell","position":"15","time":"1:18.730"},{"driverId":"latifi","position":"16","time":"1:18.950"},{"driverId":"tsunoda","position":"17","time":"1:19.193"},{"driverId":"mick_schumacher","position":"18","time":"1:19.247"},{"driverId":"mazepin","position":"19","time":"1:19.535"}]},{"number":"8","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:17.120"},{"driverId":"bottas","position":"2","time":"1:16.751"},{"driverId":"sainz","position":"3","time":"1:16.687"},{"driverId":"norris","position":"4","time":"1:16.655"},{"driverId":"gasly","position":"5","time":"1:16.838"},{"driverId":"hamilton","position":"6","time":"1:17.009"},{"driverId":"vettel","position":"7","time":"1:17.805"},{"driverId":"perez","position":"8","time":"1:18.337"},{"driverId":"giovinazzi","position":"9","time":"1:17.977"},{"driverId":"ocon","position":"10","time":"1:17.967"},{"driverId":"stroll","position":"11","time":"1:18.398"},{"driverId":"raikkonen","position":"12","time":"1:18.716"},{"driverId":"ricciardo","position":"13","time":"1:18.441"},{"driverId":"alonso","position":"14","time":"1:18.254"},{"driverId":"russell","position":"15","time":"1:18.627"},{"driverId":"latifi","position":"16","time":"1:18.494"},{"driverId":"tsunoda","position":"17","time":"1:18.427"},{"driverId":"mick_schumacher","position":"18","time":"1:19.041"},{"driverId":"mazepin","position":"19","time":"1:19.281"}]},{"number":"9","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:16.910"},{"driverId":"bottas","position":"2","time":"1:16.961"},{"driverId":"sainz","position":"3","time":"1:16.672"},{"driverId":"norris","position":"4","time":"1:17.027"},{"driverId":"gasly","position":"5","time":"1:17.055"},{"driverId":"hamilton","position":"6","time":"1:16.779"},{"driverId":"vettel","position":"7","time":"1:17.825"},{"driverId":"perez","position":"8","time":"1:17.771"},{"driverId":"giovinazzi","position":"9","time":"1:18.402"},{"driverId":"ocon","position":"10","time":"1:18.380"},{"driverId":"stroll","position":"11","time":"1:18.477"},{"driverId":"raikkonen","position":"12","time":"1:18.490"},{"driverId":"ricciardo","position":"13","time":"1:18.385"},{"driverId":"alonso","position":"14","time":"1:18.904"},{"driverId":"russell","position":"15","time":"1:18.977"},{"driverId":"latifi","position":"16","time":"1:18.804"},{"driverId":"tsunoda","position":"17","time":"1:18.590"},{"driverId":"mick_schumacher","position":"18","time":"1:19.004"},{"driverId":"mazepin","position":"19","time":"1:18.932"}]},{"number":"10","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:16.944"},{"driverId":"bottas","position":"2","time":"1:17.012"},{"driverId":"sainz","position":"3","time":"1:16.747"},{"driverId":"norris","position":"4","time":"1:17.190"},{"driverId":"gasly","position":"5","time":"1:17.182"},{"driverId":"hamilton","position":"6","time":"1:16.869"},{"driverId":"vettel","position":"7","time":"1:17.416"},{"driverId":"perez","position":"8","time":"1:17.474"},{"driverId":"giovinazzi","position":"9","time":"1:17.873"},{"driverId":"ocon","position":"10","time":"1:18.298"},{"driverId":"stroll","position":"11","time":"1:18.226"},{"driverId":"raikkonen","position":"12","time":"1:18.262"},{"driverId":"ricciardo","position":"13","time":"1:18.886"},{"driverId":"alonso","position":"14","time":"1:18.147"},{"driverId":"russell","position":"15","time":"1:18.523"},{"driverId":"latifi","position":"16","time":"1:18.717"},{"driverId":"tsunoda","position":"17","time":"1:19.119"},{"driverId":"mick_schumacher","position":"18","time":"1:18.672"},{"driverId":"mazepin","position":"19","time":"1:18.872"}]},{"number":"11","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:16.265"},{"driverId":"bottas","position":"2","time":"1:16.575"},{"driverId":"sainz","position":"3","time":"1:16.748"},{"driverId":"norris","position":"4","time":"1:16.601"},{"driverId":"gasly","position":"5","time":"1:16.798"},{"driverId":"hamilton","position":"6","time":"1:16.698"},{"driverId":"vettel","position":"7","time":"1:17.599"},{"driverId":"perez","position":"8","time":"1:17.102"},{"driverId":"giovinazzi","position":"9","time":"1:17.363"},{"driverId":"ocon","position":"10","time":"1:17.770"}]}]}]}}}'
+ recorded_at: 2025-08-04 01:48:59
+- request:
+ method: GET
+ uri: https://api.jolpi.ca/ergast/f1/2021/5/laps.json?limit=100&offset=200
+ response:
+ status: 200
+ headers:
+ Server: nginx/1.28.0
+ Date: Mon, 04 Aug 2025 01:48:59 GMT
+ Content-Type: application/json
+ Transfer-Encoding: chunked
+ Connection: keep-alive
+ Vary: Accept, origin
+ Allow: GET, HEAD, OPTIONS
+ Expires: Mon, 04 Aug 2025 02:48:59 GMT
+ Cache-Control: max-age=3600
+ X-Frame-Options: DENY
+ X-Content-Type-Options: nosniff
+ Referrer-Policy: same-origin
+ Cross-Origin-Opener-Policy: same-origin
+ Content-Encoding: gzip
+ body:
+ string: '{"MRData":{"xmlns":"","series":"f1","url":"https://api.jolpi.ca/ergast/f1/2021/5/laps.json","limit":"100","offset":"200","total":"1418","RaceTable":{"season":"2021","round":"5","Races":[{"season":"2021","round":"5","url":"https://en.wikipedia.org/wiki/2021_Monaco_Grand_Prix","raceName":"Monaco
+ Grand Prix","Circuit":{"circuitId":"monaco","url":"https://en.wikipedia.org/wiki/Circuit_de_Monaco","circuitName":"Circuit
+ de Monaco","Location":{"lat":"43.7347","long":"7.42056","locality":"Monte-Carlo","country":"Monaco"}},"date":"2021-05-23","time":"13:00:00Z","Laps":[{"number":"11","Timings":[{"driverId":"stroll","position":"11","time":"1:17.902"},{"driverId":"raikkonen","position":"12","time":"1:18.193"},{"driverId":"ricciardo","position":"13","time":"1:18.625"},{"driverId":"alonso","position":"14","time":"1:18.778"},{"driverId":"russell","position":"15","time":"1:18.339"},{"driverId":"latifi","position":"16","time":"1:18.558"},{"driverId":"tsunoda","position":"17","time":"1:18.483"},{"driverId":"mick_schumacher","position":"18","time":"1:18.575"},{"driverId":"mazepin","position":"19","time":"1:19.018"}]},{"number":"12","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:16.339"},{"driverId":"bottas","position":"2","time":"1:16.540"},{"driverId":"sainz","position":"3","time":"1:16.445"},{"driverId":"norris","position":"4","time":"1:16.560"},{"driverId":"gasly","position":"5","time":"1:16.414"},{"driverId":"hamilton","position":"6","time":"1:16.667"},{"driverId":"vettel","position":"7","time":"1:16.702"},{"driverId":"perez","position":"8","time":"1:15.949"},{"driverId":"giovinazzi","position":"9","time":"1:17.088"},{"driverId":"ocon","position":"10","time":"1:17.677"},{"driverId":"stroll","position":"11","time":"1:17.682"},{"driverId":"raikkonen","position":"12","time":"1:18.310"},{"driverId":"ricciardo","position":"13","time":"1:17.959"},{"driverId":"alonso","position":"14","time":"1:18.414"},{"driverId":"russell","position":"15","time":"1:18.469"},{"driverId":"latifi","position":"16","time":"1:18.874"},{"driverId":"tsunoda","position":"17","time":"1:18.848"},{"driverId":"mick_schumacher","position":"18","time":"1:18.674"},{"driverId":"mazepin","position":"19","time":"1:18.904"}]},{"number":"13","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:15.954"},{"driverId":"bottas","position":"2","time":"1:16.040"},{"driverId":"sainz","position":"3","time":"1:16.524"},{"driverId":"norris","position":"4","time":"1:16.500"},{"driverId":"gasly","position":"5","time":"1:16.897"},{"driverId":"hamilton","position":"6","time":"1:17.070"},{"driverId":"vettel","position":"7","time":"1:16.555"},{"driverId":"perez","position":"8","time":"1:15.881"},{"driverId":"giovinazzi","position":"9","time":"1:17.175"},{"driverId":"ocon","position":"10","time":"1:17.253"},{"driverId":"stroll","position":"11","time":"1:17.300"},{"driverId":"raikkonen","position":"12","time":"1:17.445"},{"driverId":"ricciardo","position":"13","time":"1:17.624"},{"driverId":"alonso","position":"14","time":"1:17.807"},{"driverId":"russell","position":"15","time":"1:18.641"},{"driverId":"latifi","position":"16","time":"1:18.998"},{"driverId":"tsunoda","position":"17","time":"1:18.490"},{"driverId":"mick_schumacher","position":"18","time":"1:18.992"},{"driverId":"mazepin","position":"19","time":"1:19.287"}]},{"number":"14","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:16.305"},{"driverId":"bottas","position":"2","time":"1:16.028"},{"driverId":"sainz","position":"3","time":"1:15.926"},{"driverId":"norris","position":"4","time":"1:16.302"},{"driverId":"gasly","position":"5","time":"1:16.331"},{"driverId":"hamilton","position":"6","time":"1:16.555"},{"driverId":"vettel","position":"7","time":"1:16.286"},{"driverId":"perez","position":"8","time":"1:16.420"},{"driverId":"giovinazzi","position":"9","time":"1:16.860"},{"driverId":"ocon","position":"10","time":"1:16.820"},{"driverId":"stroll","position":"11","time":"1:16.833"},{"driverId":"raikkonen","position":"12","time":"1:17.969"},{"driverId":"ricciardo","position":"13","time":"1:17.387"},{"driverId":"alonso","position":"14","time":"1:17.529"},{"driverId":"russell","position":"15","time":"1:18.211"},{"driverId":"latifi","position":"16","time":"1:17.617"},{"driverId":"tsunoda","position":"17","time":"1:18.420"},{"driverId":"mick_schumacher","position":"18","time":"1:18.579"},{"driverId":"mazepin","position":"19","time":"1:19.422"}]},{"number":"15","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:15.818"},{"driverId":"bottas","position":"2","time":"1:15.974"},{"driverId":"sainz","position":"3","time":"1:16.080"},{"driverId":"norris","position":"4","time":"1:16.074"},{"driverId":"gasly","position":"5","time":"1:16.128"},{"driverId":"hamilton","position":"6","time":"1:16.262"},{"driverId":"vettel","position":"7","time":"1:15.885"},{"driverId":"perez","position":"8","time":"1:16.497"},{"driverId":"giovinazzi","position":"9","time":"1:16.974"},{"driverId":"ocon","position":"10","time":"1:16.810"},{"driverId":"stroll","position":"11","time":"1:16.843"},{"driverId":"raikkonen","position":"12","time":"1:17.629"},{"driverId":"ricciardo","position":"13","time":"1:17.227"},{"driverId":"alonso","position":"14","time":"1:17.803"},{"driverId":"russell","position":"15","time":"1:18.540"},{"driverId":"latifi","position":"16","time":"1:18.328"},{"driverId":"tsunoda","position":"17","time":"1:17.681"},{"driverId":"mick_schumacher","position":"18","time":"1:18.294"},{"driverId":"mazepin","position":"19","time":"1:18.949"}]},{"number":"16","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:15.760"},{"driverId":"bottas","position":"2","time":"1:16.275"},{"driverId":"sainz","position":"3","time":"1:15.917"},{"driverId":"norris","position":"4","time":"1:16.094"},{"driverId":"gasly","position":"5","time":"1:16.138"},{"driverId":"hamilton","position":"6","time":"1:16.152"},{"driverId":"vettel","position":"7","time":"1:15.868"},{"driverId":"perez","position":"8","time":"1:16.338"},{"driverId":"giovinazzi","position":"9","time":"1:17.037"},{"driverId":"ocon","position":"10","time":"1:16.876"},{"driverId":"stroll","position":"11","time":"1:16.518"},{"driverId":"raikkonen","position":"12","time":"1:17.283"},{"driverId":"ricciardo","position":"13","time":"1:17.614"},{"driverId":"alonso","position":"14","time":"1:17.840"},{"driverId":"russell","position":"15","time":"1:18.444"}]}]}]}}}'
+ recorded_at: 2025-08-04 01:48:59
+- request:
+ method: GET
+ uri: https://api.jolpi.ca/ergast/f1/2021/5/laps.json?limit=100&offset=300
+ response:
+ status: 200
+ headers:
+ Server: nginx/1.28.0
+ Date: Mon, 04 Aug 2025 01:48:59 GMT
+ Content-Type: application/json
+ Transfer-Encoding: chunked
+ Connection: keep-alive
+ Vary: Accept, origin
+ Allow: GET, HEAD, OPTIONS
+ Expires: Mon, 04 Aug 2025 02:48:59 GMT
+ Cache-Control: max-age=3600
+ X-Frame-Options: DENY
+ X-Content-Type-Options: nosniff
+ Referrer-Policy: same-origin
+ Cross-Origin-Opener-Policy: same-origin
+ Content-Encoding: gzip
+ body:
+ string: '{"MRData":{"xmlns":"","series":"f1","url":"https://api.jolpi.ca/ergast/f1/2021/5/laps.json","limit":"100","offset":"300","total":"1418","RaceTable":{"season":"2021","round":"5","Races":[{"season":"2021","round":"5","url":"https://en.wikipedia.org/wiki/2021_Monaco_Grand_Prix","raceName":"Monaco
+ Grand Prix","Circuit":{"circuitId":"monaco","url":"https://en.wikipedia.org/wiki/Circuit_de_Monaco","circuitName":"Circuit
+ de Monaco","Location":{"lat":"43.7347","long":"7.42056","locality":"Monte-Carlo","country":"Monaco"}},"date":"2021-05-23","time":"13:00:00Z","Laps":[{"number":"16","Timings":[{"driverId":"latifi","position":"16","time":"1:18.433"},{"driverId":"tsunoda","position":"17","time":"1:18.444"},{"driverId":"mick_schumacher","position":"18","time":"1:18.751"},{"driverId":"mazepin","position":"19","time":"1:18.804"}]},{"number":"17","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:15.990"},{"driverId":"bottas","position":"2","time":"1:15.914"},{"driverId":"sainz","position":"3","time":"1:16.021"},{"driverId":"norris","position":"4","time":"1:15.965"},{"driverId":"gasly","position":"5","time":"1:16.058"},{"driverId":"hamilton","position":"6","time":"1:16.033"},{"driverId":"vettel","position":"7","time":"1:16.028"},{"driverId":"perez","position":"8","time":"1:16.118"},{"driverId":"giovinazzi","position":"9","time":"1:16.540"},{"driverId":"ocon","position":"10","time":"1:16.572"},{"driverId":"stroll","position":"11","time":"1:17.166"},{"driverId":"raikkonen","position":"12","time":"1:17.064"},{"driverId":"ricciardo","position":"13","time":"1:17.049"},{"driverId":"alonso","position":"14","time":"1:17.414"},{"driverId":"russell","position":"15","time":"1:18.435"},{"driverId":"latifi","position":"16","time":"1:18.460"},{"driverId":"tsunoda","position":"17","time":"1:18.490"},{"driverId":"mick_schumacher","position":"18","time":"1:18.580"},{"driverId":"mazepin","position":"19","time":"1:19.249"}]},{"number":"18","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:15.917"},{"driverId":"bottas","position":"2","time":"1:15.706"},{"driverId":"sainz","position":"3","time":"1:15.957"},{"driverId":"norris","position":"4","time":"1:16.602"},{"driverId":"gasly","position":"5","time":"1:16.151"},{"driverId":"hamilton","position":"6","time":"1:15.854"},{"driverId":"vettel","position":"7","time":"1:16.072"},{"driverId":"perez","position":"8","time":"1:15.638"},{"driverId":"giovinazzi","position":"9","time":"1:16.727"},{"driverId":"ocon","position":"10","time":"1:16.416"},{"driverId":"stroll","position":"11","time":"1:17.596"},{"driverId":"raikkonen","position":"12","time":"1:17.241"},{"driverId":"ricciardo","position":"13","time":"1:17.092"},{"driverId":"alonso","position":"14","time":"1:17.636"},{"driverId":"russell","position":"15","time":"1:18.162"},{"driverId":"latifi","position":"16","time":"1:18.299"},{"driverId":"tsunoda","position":"17","time":"1:18.829"},{"driverId":"mick_schumacher","position":"18","time":"1:18.621"},{"driverId":"mazepin","position":"19","time":"1:19.163"}]},{"number":"19","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:15.655"},{"driverId":"bottas","position":"2","time":"1:15.908"},{"driverId":"sainz","position":"3","time":"1:15.766"},{"driverId":"norris","position":"4","time":"1:16.135"},{"driverId":"gasly","position":"5","time":"1:17.309"},{"driverId":"hamilton","position":"6","time":"1:16.485"},{"driverId":"vettel","position":"7","time":"1:15.919"},{"driverId":"perez","position":"8","time":"1:16.084"},{"driverId":"giovinazzi","position":"9","time":"1:16.588"},{"driverId":"ocon","position":"10","time":"1:16.754"},{"driverId":"stroll","position":"11","time":"1:17.613"},{"driverId":"raikkonen","position":"12","time":"1:17.221"},{"driverId":"ricciardo","position":"13","time":"1:17.204"},{"driverId":"alonso","position":"14","time":"1:17.810"},{"driverId":"russell","position":"15","time":"1:18.101"},{"driverId":"latifi","position":"16","time":"1:17.966"},{"driverId":"tsunoda","position":"17","time":"1:18.093"},{"driverId":"mick_schumacher","position":"18","time":"1:18.909"},{"driverId":"mazepin","position":"19","time":"1:18.674"}]},{"number":"20","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:16.084"},{"driverId":"bottas","position":"2","time":"1:16.335"},{"driverId":"sainz","position":"3","time":"1:15.925"},{"driverId":"norris","position":"4","time":"1:15.812"},{"driverId":"gasly","position":"5","time":"1:16.087"},{"driverId":"hamilton","position":"6","time":"1:16.800"},{"driverId":"vettel","position":"7","time":"1:16.019"},{"driverId":"perez","position":"8","time":"1:15.827"},{"driverId":"giovinazzi","position":"9","time":"1:16.468"},{"driverId":"ocon","position":"10","time":"1:16.598"},{"driverId":"stroll","position":"11","time":"1:17.259"},{"driverId":"raikkonen","position":"12","time":"1:17.055"},{"driverId":"ricciardo","position":"13","time":"1:17.704"},{"driverId":"alonso","position":"14","time":"1:17.648"},{"driverId":"russell","position":"15","time":"1:18.238"},{"driverId":"latifi","position":"16","time":"1:18.132"},{"driverId":"tsunoda","position":"17","time":"1:17.842"},{"driverId":"mick_schumacher","position":"18","time":"1:18.533"},{"driverId":"mazepin","position":"19","time":"1:18.862"}]},{"number":"21","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:16.184"},{"driverId":"bottas","position":"2","time":"1:16.600"},{"driverId":"sainz","position":"3","time":"1:16.236"},{"driverId":"norris","position":"4","time":"1:15.800"},{"driverId":"gasly","position":"5","time":"1:15.925"},{"driverId":"hamilton","position":"6","time":"1:16.395"},{"driverId":"vettel","position":"7","time":"1:15.997"},{"driverId":"perez","position":"8","time":"1:16.528"},{"driverId":"giovinazzi","position":"9","time":"1:16.718"},{"driverId":"ocon","position":"10","time":"1:16.543"},{"driverId":"stroll","position":"11","time":"1:16.994"},{"driverId":"raikkonen","position":"12","time":"1:17.581"},{"driverId":"ricciardo","position":"13","time":"1:17.945"},{"driverId":"alonso","position":"14","time":"1:17.823"},{"driverId":"russell","position":"15","time":"1:18.060"},{"driverId":"latifi","position":"16","time":"1:18.305"},{"driverId":"tsunoda","position":"17","time":"1:18.325"},{"driverId":"mick_schumacher","position":"18","time":"1:18.533"},{"driverId":"mazepin","position":"19","time":"1:19.110"}]},{"number":"22","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:16.144"}]}]}]}}}'
+ recorded_at: 2025-08-04 01:48:59
+- request:
+ method: GET
+ uri: https://api.jolpi.ca/ergast/f1/2021/5/laps.json?limit=100&offset=400
+ response:
+ status: 200
+ headers:
+ Server: nginx/1.28.0
+ Date: Mon, 04 Aug 2025 01:49:00 GMT
+ Content-Type: application/json
+ Transfer-Encoding: chunked
+ Connection: keep-alive
+ Vary: Accept, origin
+ Allow: GET, HEAD, OPTIONS
+ Expires: Mon, 04 Aug 2025 02:49:00 GMT
+ Cache-Control: max-age=3600
+ X-Frame-Options: DENY
+ X-Content-Type-Options: nosniff
+ Referrer-Policy: same-origin
+ Cross-Origin-Opener-Policy: same-origin
+ Content-Encoding: gzip
+ body:
+ string: '{"MRData":{"xmlns":"","series":"f1","url":"https://api.jolpi.ca/ergast/f1/2021/5/laps.json","limit":"100","offset":"400","total":"1418","RaceTable":{"season":"2021","round":"5","Races":[{"season":"2021","round":"5","url":"https://en.wikipedia.org/wiki/2021_Monaco_Grand_Prix","raceName":"Monaco
+ Grand Prix","Circuit":{"circuitId":"monaco","url":"https://en.wikipedia.org/wiki/Circuit_de_Monaco","circuitName":"Circuit
+ de Monaco","Location":{"lat":"43.7347","long":"7.42056","locality":"Monte-Carlo","country":"Monaco"}},"date":"2021-05-23","time":"13:00:00Z","Laps":[{"number":"22","Timings":[{"driverId":"bottas","position":"2","time":"1:16.471"},{"driverId":"sainz","position":"3","time":"1:16.158"},{"driverId":"norris","position":"4","time":"1:16.284"},{"driverId":"gasly","position":"5","time":"1:16.055"},{"driverId":"hamilton","position":"6","time":"1:16.017"},{"driverId":"vettel","position":"7","time":"1:16.006"},{"driverId":"perez","position":"8","time":"1:15.843"},{"driverId":"giovinazzi","position":"9","time":"1:16.758"},{"driverId":"ocon","position":"10","time":"1:16.670"},{"driverId":"stroll","position":"11","time":"1:16.731"},{"driverId":"raikkonen","position":"12","time":"1:17.306"},{"driverId":"ricciardo","position":"13","time":"1:17.708"},{"driverId":"alonso","position":"14","time":"1:17.805"},{"driverId":"russell","position":"15","time":"1:18.111"},{"driverId":"latifi","position":"16","time":"1:18.373"},{"driverId":"tsunoda","position":"17","time":"1:18.374"},{"driverId":"mick_schumacher","position":"18","time":"1:18.759"},{"driverId":"mazepin","position":"19","time":"1:20.825"}]},{"number":"23","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:16.272"},{"driverId":"bottas","position":"2","time":"1:16.641"},{"driverId":"sainz","position":"3","time":"1:16.751"},{"driverId":"norris","position":"4","time":"1:16.128"},{"driverId":"gasly","position":"5","time":"1:16.355"},{"driverId":"hamilton","position":"6","time":"1:16.096"},{"driverId":"vettel","position":"7","time":"1:16.160"},{"driverId":"perez","position":"8","time":"1:16.190"},{"driverId":"giovinazzi","position":"9","time":"1:16.853"},{"driverId":"ocon","position":"10","time":"1:16.656"},{"driverId":"stroll","position":"11","time":"1:16.630"},{"driverId":"raikkonen","position":"12","time":"1:17.390"},{"driverId":"ricciardo","position":"13","time":"1:17.669"},{"driverId":"alonso","position":"14","time":"1:17.864"},{"driverId":"russell","position":"15","time":"1:18.206"},{"driverId":"latifi","position":"16","time":"1:18.035"},{"driverId":"tsunoda","position":"17","time":"1:18.080"},{"driverId":"mick_schumacher","position":"18","time":"1:18.495"},{"driverId":"mazepin","position":"19","time":"1:22.077"}]},{"number":"24","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:16.244"},{"driverId":"bottas","position":"2","time":"1:17.198"},{"driverId":"sainz","position":"3","time":"1:17.060"},{"driverId":"norris","position":"4","time":"1:16.653"},{"driverId":"gasly","position":"5","time":"1:16.060"},{"driverId":"hamilton","position":"6","time":"1:16.343"},{"driverId":"vettel","position":"7","time":"1:16.143"},{"driverId":"perez","position":"8","time":"1:16.093"},{"driverId":"giovinazzi","position":"9","time":"1:17.263"},{"driverId":"ocon","position":"10","time":"1:17.295"},{"driverId":"stroll","position":"11","time":"1:16.671"},{"driverId":"raikkonen","position":"12","time":"1:16.708"},{"driverId":"ricciardo","position":"13","time":"1:17.260"},{"driverId":"alonso","position":"14","time":"1:17.891"},{"driverId":"russell","position":"15","time":"1:17.866"},{"driverId":"latifi","position":"16","time":"1:18.051"},{"driverId":"tsunoda","position":"17","time":"1:17.989"},{"driverId":"mick_schumacher","position":"18","time":"1:20.781"},{"driverId":"mazepin","position":"19","time":"1:24.946"}]},{"number":"25","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:16.531"},{"driverId":"bottas","position":"2","time":"1:16.543"},{"driverId":"sainz","position":"3","time":"1:16.693"},{"driverId":"norris","position":"4","time":"1:16.965"},{"driverId":"gasly","position":"5","time":"1:17.135"},{"driverId":"hamilton","position":"6","time":"1:16.636"},{"driverId":"vettel","position":"7","time":"1:16.317"},{"driverId":"perez","position":"8","time":"1:15.856"},{"driverId":"giovinazzi","position":"9","time":"1:16.826"},{"driverId":"ocon","position":"10","time":"1:17.343"},{"driverId":"stroll","position":"11","time":"1:16.671"},{"driverId":"raikkonen","position":"12","time":"1:17.425"},{"driverId":"ricciardo","position":"13","time":"1:17.125"},{"driverId":"alonso","position":"14","time":"1:17.244"},{"driverId":"russell","position":"15","time":"1:18.106"},{"driverId":"latifi","position":"16","time":"1:18.140"},{"driverId":"tsunoda","position":"17","time":"1:17.867"},{"driverId":"mick_schumacher","position":"18","time":"1:22.457"},{"driverId":"mazepin","position":"19","time":"1:22.756"}]},{"number":"26","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:16.322"},{"driverId":"bottas","position":"2","time":"1:16.687"},{"driverId":"sainz","position":"3","time":"1:16.889"},{"driverId":"norris","position":"4","time":"1:16.636"},{"driverId":"gasly","position":"5","time":"1:16.576"},{"driverId":"hamilton","position":"6","time":"1:16.497"},{"driverId":"vettel","position":"7","time":"1:16.926"},{"driverId":"perez","position":"8","time":"1:16.715"},{"driverId":"giovinazzi","position":"9","time":"1:17.056"},{"driverId":"ocon","position":"10","time":"1:16.519"},{"driverId":"stroll","position":"11","time":"1:16.452"},{"driverId":"raikkonen","position":"12","time":"1:17.073"},{"driverId":"ricciardo","position":"13","time":"1:17.165"},{"driverId":"alonso","position":"14","time":"1:17.808"},{"driverId":"russell","position":"15","time":"1:18.189"},{"driverId":"latifi","position":"16","time":"1:18.014"},{"driverId":"tsunoda","position":"17","time":"1:18.251"},{"driverId":"mick_schumacher","position":"18","time":"1:23.437"},{"driverId":"mazepin","position":"19","time":"1:19.064"}]},{"number":"27","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:16.000"},{"driverId":"bottas","position":"2","time":"1:16.247"},{"driverId":"sainz","position":"3","time":"1:16.237"},{"driverId":"norris","position":"4","time":"1:17.020"},{"driverId":"gasly","position":"5","time":"1:17.134"},{"driverId":"hamilton","position":"6","time":"1:16.622"}]}]}]}}}'
+ recorded_at: 2025-08-04 01:49:00
+- request:
+ method: GET
+ uri: https://api.jolpi.ca/ergast/f1/2021/5/laps.json?limit=100&offset=500
+ response:
+ status: 200
+ headers:
+ Server: nginx/1.28.0
+ Date: Mon, 04 Aug 2025 01:49:00 GMT
+ Content-Type: application/json
+ Transfer-Encoding: chunked
+ Connection: keep-alive
+ Vary: Accept, origin
+ Allow: GET, HEAD, OPTIONS
+ Expires: Mon, 04 Aug 2025 02:49:00 GMT
+ Cache-Control: max-age=3600
+ X-Frame-Options: DENY
+ X-Content-Type-Options: nosniff
+ Referrer-Policy: same-origin
+ Cross-Origin-Opener-Policy: same-origin
+ Content-Encoding: gzip
+ body:
+ string: '{"MRData":{"xmlns":"","series":"f1","url":"https://api.jolpi.ca/ergast/f1/2021/5/laps.json","limit":"100","offset":"500","total":"1418","RaceTable":{"season":"2021","round":"5","Races":[{"season":"2021","round":"5","url":"https://en.wikipedia.org/wiki/2021_Monaco_Grand_Prix","raceName":"Monaco
+ Grand Prix","Circuit":{"circuitId":"monaco","url":"https://en.wikipedia.org/wiki/Circuit_de_Monaco","circuitName":"Circuit
+ de Monaco","Location":{"lat":"43.7347","long":"7.42056","locality":"Monte-Carlo","country":"Monaco"}},"date":"2021-05-23","time":"13:00:00Z","Laps":[{"number":"27","Timings":[{"driverId":"vettel","position":"7","time":"1:16.330"},{"driverId":"perez","position":"8","time":"1:16.327"},{"driverId":"giovinazzi","position":"9","time":"1:17.136"},{"driverId":"ocon","position":"10","time":"1:16.850"},{"driverId":"stroll","position":"11","time":"1:16.546"},{"driverId":"raikkonen","position":"12","time":"1:16.902"},{"driverId":"ricciardo","position":"13","time":"1:17.436"},{"driverId":"alonso","position":"14","time":"1:17.414"},{"driverId":"russell","position":"15","time":"1:18.226"},{"driverId":"latifi","position":"16","time":"1:17.989"},{"driverId":"tsunoda","position":"17","time":"1:18.051"},{"driverId":"mick_schumacher","position":"18","time":"1:29.167"},{"driverId":"mazepin","position":"19","time":"1:18.695"}]},{"number":"28","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:15.981"},{"driverId":"bottas","position":"2","time":"1:16.034"},{"driverId":"sainz","position":"3","time":"1:16.153"},{"driverId":"norris","position":"4","time":"1:17.635"},{"driverId":"gasly","position":"5","time":"1:16.701"},{"driverId":"hamilton","position":"6","time":"1:17.044"},{"driverId":"vettel","position":"7","time":"1:16.636"},{"driverId":"perez","position":"8","time":"1:16.719"},{"driverId":"giovinazzi","position":"9","time":"1:17.500"},{"driverId":"ocon","position":"10","time":"1:17.158"},{"driverId":"stroll","position":"11","time":"1:16.383"},{"driverId":"raikkonen","position":"12","time":"1:17.098"},{"driverId":"ricciardo","position":"13","time":"1:17.460"},{"driverId":"alonso","position":"14","time":"1:17.189"},{"driverId":"russell","position":"15","time":"1:18.581"},{"driverId":"latifi","position":"16","time":"1:18.447"},{"driverId":"tsunoda","position":"17","time":"1:20.396"},{"driverId":"mazepin","position":"18","time":"1:19.503"},{"driverId":"mick_schumacher","position":"19","time":"1:27.965"}]},{"number":"29","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:16.551"},{"driverId":"bottas","position":"2","time":"1:16.265"},{"driverId":"sainz","position":"3","time":"1:16.220"},{"driverId":"norris","position":"4","time":"1:16.902"},{"driverId":"gasly","position":"5","time":"1:16.723"},{"driverId":"vettel","position":"6","time":"1:16.298"},{"driverId":"perez","position":"7","time":"1:16.289"},{"driverId":"hamilton","position":"8","time":"1:33.051"},{"driverId":"giovinazzi","position":"9","time":"1:18.045"},{"driverId":"ocon","position":"10","time":"1:17.515"},{"driverId":"stroll","position":"11","time":"1:16.538"},{"driverId":"raikkonen","position":"12","time":"1:17.067"},{"driverId":"ricciardo","position":"13","time":"1:17.202"},{"driverId":"alonso","position":"14","time":"1:16.897"},{"driverId":"russell","position":"15","time":"1:21.174"},{"driverId":"latifi","position":"16","time":"1:20.750"},{"driverId":"tsunoda","position":"17","time":"1:18.141"},{"driverId":"mazepin","position":"18","time":"1:19.289"},{"driverId":"mick_schumacher","position":"19","time":"1:31.596"}]},{"number":"30","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:16.582"},{"driverId":"sainz","position":"2","time":"1:16.707"},{"driverId":"vettel","position":"3","time":"1:16.030"},{"driverId":"perez","position":"4","time":"1:15.934"},{"driverId":"norris","position":"5","time":"1:33.286"},{"driverId":"gasly","position":"6","time":"1:33.589"},{"driverId":"hamilton","position":"7","time":"1:18.739"},{"driverId":"giovinazzi","position":"8","time":"1:18.318"},{"driverId":"ocon","position":"9","time":"1:18.393"},{"driverId":"stroll","position":"10","time":"1:18.563"},{"driverId":"raikkonen","position":"11","time":"1:17.806"},{"driverId":"ricciardo","position":"12","time":"1:16.990"},{"driverId":"alonso","position":"13","time":"1:17.425"},{"driverId":"russell","position":"14","time":"1:18.970"},{"driverId":"latifi","position":"15","time":"1:19.026"},{"driverId":"tsunoda","position":"16","time":"1:20.625"},{"driverId":"mazepin","position":"17","time":"1:22.719"},{"driverId":"mick_schumacher","position":"18","time":"1:23.951"}]},{"number":"31","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:15.167"},{"driverId":"sainz","position":"2","time":"1:16.485"},{"driverId":"perez","position":"3","time":"1:16.166"},{"driverId":"norris","position":"4","time":"1:19.617"},{"driverId":"vettel","position":"5","time":"1:32.812"},{"driverId":"gasly","position":"6","time":"1:21.727"},{"driverId":"hamilton","position":"7","time":"1:19.326"},{"driverId":"giovinazzi","position":"8","time":"1:18.689"},{"driverId":"ocon","position":"9","time":"1:18.301"},{"driverId":"stroll","position":"10","time":"1:17.278"},{"driverId":"raikkonen","position":"11","time":"1:17.262"},{"driverId":"ricciardo","position":"12","time":"1:17.699"},{"driverId":"alonso","position":"13","time":"1:17.473"},{"driverId":"latifi","position":"14","time":"1:20.096"},{"driverId":"tsunoda","position":"15","time":"1:18.626"},{"driverId":"russell","position":"16","time":"1:35.152"},{"driverId":"mazepin","position":"17","time":"1:23.783"},{"driverId":"mick_schumacher","position":"18","time":"1:26.779"}]},{"number":"32","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:15.889"},{"driverId":"perez","position":"2","time":"1:14.552"},{"driverId":"sainz","position":"3","time":"1:33.980"},{"driverId":"norris","position":"4","time":"1:14.838"},{"driverId":"vettel","position":"5","time":"1:19.635"},{"driverId":"gasly","position":"6","time":"1:18.950"},{"driverId":"hamilton","position":"7","time":"1:18.966"},{"driverId":"giovinazzi","position":"8","time":"1:18.673"},{"driverId":"ocon","position":"9","time":"1:18.797"},{"driverId":"stroll","position":"10","time":"1:18.417"},{"driverId":"raikkonen","position":"11","time":"1:16.621"},{"driverId":"ricciardo","position":"12","time":"1:17.468"},{"driverId":"alonso","position":"13","time":"1:17.985"}]}]}]}}}'
+ recorded_at: 2025-08-04 01:49:00
+- request:
+ method: GET
+ uri: https://api.jolpi.ca/ergast/f1/2021/5/laps.json?limit=100&offset=600
+ response:
+ status: 200
+ headers:
+ Server: nginx/1.28.0
+ Date: Mon, 04 Aug 2025 01:49:01 GMT
+ Content-Type: application/json
+ Transfer-Encoding: chunked
+ Connection: keep-alive
+ Vary: Accept, origin
+ Allow: GET, HEAD, OPTIONS
+ Expires: Mon, 04 Aug 2025 02:49:01 GMT
+ Cache-Control: max-age=3600
+ X-Frame-Options: DENY
+ X-Content-Type-Options: nosniff
+ Referrer-Policy: same-origin
+ Cross-Origin-Opener-Policy: same-origin
+ Content-Encoding: gzip
+ body:
+ string: '{"MRData":{"xmlns":"","series":"f1","url":"https://api.jolpi.ca/ergast/f1/2021/5/laps.json","limit":"100","offset":"600","total":"1418","RaceTable":{"season":"2021","round":"5","Races":[{"season":"2021","round":"5","url":"https://en.wikipedia.org/wiki/2021_Monaco_Grand_Prix","raceName":"Monaco
+ Grand Prix","Circuit":{"circuitId":"monaco","url":"https://en.wikipedia.org/wiki/Circuit_de_Monaco","circuitName":"Circuit
+ de Monaco","Location":{"lat":"43.7347","long":"7.42056","locality":"Monte-Carlo","country":"Monaco"}},"date":"2021-05-23","time":"13:00:00Z","Laps":[{"number":"32","Timings":[{"driverId":"latifi","position":"14","time":"1:17.363"},{"driverId":"tsunoda","position":"15","time":"1:17.754"},{"driverId":"russell","position":"16","time":"1:22.576"},{"driverId":"mazepin","position":"17","time":"1:19.230"},{"driverId":"mick_schumacher","position":"18","time":"1:20.091"}]},{"number":"33","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:15.827"},{"driverId":"perez","position":"2","time":"1:14.670"},{"driverId":"sainz","position":"3","time":"1:19.941"},{"driverId":"norris","position":"4","time":"1:16.210"},{"driverId":"vettel","position":"5","time":"1:15.316"},{"driverId":"gasly","position":"6","time":"1:16.459"},{"driverId":"hamilton","position":"7","time":"1:17.702"},{"driverId":"ocon","position":"8","time":"1:18.032"},{"driverId":"stroll","position":"9","time":"1:18.351"},{"driverId":"raikkonen","position":"10","time":"1:16.540"},{"driverId":"ricciardo","position":"11","time":"1:17.638"},{"driverId":"giovinazzi","position":"12","time":"1:35.523"},{"driverId":"alonso","position":"13","time":"1:17.090"},{"driverId":"latifi","position":"14","time":"1:16.967"},{"driverId":"tsunoda","position":"15","time":"1:17.034"},{"driverId":"russell","position":"16","time":"1:19.074"},{"driverId":"mazepin","position":"17","time":"1:19.038"},{"driverId":"mick_schumacher","position":"18","time":"1:17.770"}]},{"number":"34","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:32.339"},{"driverId":"perez","position":"2","time":"1:15.062"},{"driverId":"sainz","position":"3","time":"1:14.699"},{"driverId":"norris","position":"4","time":"1:15.030"},{"driverId":"vettel","position":"5","time":"1:15.416"},{"driverId":"gasly","position":"6","time":"1:16.292"},{"driverId":"hamilton","position":"7","time":"1:16.420"},{"driverId":"ocon","position":"8","time":"1:16.427"},{"driverId":"stroll","position":"9","time":"1:17.081"},{"driverId":"raikkonen","position":"10","time":"1:17.282"},{"driverId":"ricciardo","position":"11","time":"1:17.900"},{"driverId":"giovinazzi","position":"12","time":"1:20.718"},{"driverId":"alonso","position":"13","time":"1:18.695"},{"driverId":"latifi","position":"14","time":"1:16.800"},{"driverId":"tsunoda","position":"15","time":"1:17.043"},{"driverId":"russell","position":"16","time":"1:16.392"},{"driverId":"mazepin","position":"17","time":"1:36.881"},{"driverId":"mick_schumacher","position":"18","time":"1:17.438"}]},{"number":"35","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:20.639"},{"driverId":"sainz","position":"2","time":"1:14.621"},{"driverId":"norris","position":"3","time":"1:14.991"},{"driverId":"perez","position":"4","time":"1:32.675"},{"driverId":"vettel","position":"5","time":"1:15.568"},{"driverId":"gasly","position":"6","time":"1:15.894"},{"driverId":"hamilton","position":"7","time":"1:15.929"},{"driverId":"ocon","position":"8","time":"1:16.052"},{"driverId":"stroll","position":"9","time":"1:16.690"},{"driverId":"raikkonen","position":"10","time":"1:18.335"},{"driverId":"ricciardo","position":"11","time":"1:18.265"},{"driverId":"giovinazzi","position":"12","time":"1:15.673"},{"driverId":"alonso","position":"13","time":"1:17.241"},{"driverId":"latifi","position":"14","time":"1:16.692"},{"driverId":"tsunoda","position":"15","time":"1:16.742"},{"driverId":"russell","position":"16","time":"1:15.826"},{"driverId":"mazepin","position":"17","time":"1:22.270"},{"driverId":"mick_schumacher","position":"18","time":"1:19.106"}]},{"number":"36","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:15.494"},{"driverId":"sainz","position":"2","time":"1:15.288"},{"driverId":"norris","position":"3","time":"1:15.195"},{"driverId":"perez","position":"4","time":"1:19.543"},{"driverId":"vettel","position":"5","time":"1:17.038"},{"driverId":"gasly","position":"6","time":"1:16.031"},{"driverId":"hamilton","position":"7","time":"1:16.036"},{"driverId":"ocon","position":"8","time":"1:16.154"},{"driverId":"stroll","position":"9","time":"1:16.429"},{"driverId":"raikkonen","position":"10","time":"1:17.663"},{"driverId":"giovinazzi","position":"11","time":"1:16.866"},{"driverId":"alonso","position":"12","time":"1:17.288"},{"driverId":"ricciardo","position":"13","time":"1:35.412"},{"driverId":"latifi","position":"14","time":"1:17.150"},{"driverId":"tsunoda","position":"15","time":"1:16.820"},{"driverId":"russell","position":"16","time":"1:15.802"},{"driverId":"mazepin","position":"17","time":"1:18.661"},{"driverId":"mick_schumacher","position":"18","time":"1:18.665"}]},{"number":"37","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:15.861"},{"driverId":"sainz","position":"2","time":"1:15.163"},{"driverId":"norris","position":"3","time":"1:15.735"},{"driverId":"perez","position":"4","time":"1:16.381"},{"driverId":"vettel","position":"5","time":"1:17.051"},{"driverId":"gasly","position":"6","time":"1:16.467"},{"driverId":"hamilton","position":"7","time":"1:16.621"},{"driverId":"stroll","position":"8","time":"1:16.252"},{"driverId":"raikkonen","position":"9","time":"1:16.386"},{"driverId":"ocon","position":"10","time":"1:32.516"},{"driverId":"giovinazzi","position":"11","time":"1:16.038"},{"driverId":"alonso","position":"12","time":"1:17.172"},{"driverId":"ricciardo","position":"13","time":"1:21.447"},{"driverId":"latifi","position":"14","time":"1:17.912"},{"driverId":"tsunoda","position":"15","time":"1:17.503"},{"driverId":"russell","position":"16","time":"1:15.895"},{"driverId":"mazepin","position":"17","time":"1:17.773"},{"driverId":"mick_schumacher","position":"18","time":"1:35.956"}]},{"number":"38","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:16.438"},{"driverId":"sainz","position":"2","time":"1:15.158"},{"driverId":"norris","position":"3","time":"1:15.683"},{"driverId":"perez","position":"4","time":"1:15.841"},{"driverId":"vettel","position":"5","time":"1:16.691"}]}]}]}}}'
+ recorded_at: 2025-08-04 01:49:01
+- request:
+ method: GET
+ uri: https://api.jolpi.ca/ergast/f1/2021/5/laps.json?limit=100&offset=700
+ response:
+ status: 200
+ headers:
+ Server: nginx/1.28.0
+ Date: Mon, 04 Aug 2025 01:49:01 GMT
+ Content-Type: application/json
+ Transfer-Encoding: chunked
+ Connection: keep-alive
+ Vary: Accept, origin
+ Allow: GET, HEAD, OPTIONS
+ Expires: Mon, 04 Aug 2025 02:49:01 GMT
+ Cache-Control: max-age=3600
+ X-Frame-Options: DENY
+ X-Content-Type-Options: nosniff
+ Referrer-Policy: same-origin
+ Cross-Origin-Opener-Policy: same-origin
+ Content-Encoding: gzip
+ body:
+ string: '{"MRData":{"xmlns":"","series":"f1","url":"https://api.jolpi.ca/ergast/f1/2021/5/laps.json","limit":"100","offset":"700","total":"1418","RaceTable":{"season":"2021","round":"5","Races":[{"season":"2021","round":"5","url":"https://en.wikipedia.org/wiki/2021_Monaco_Grand_Prix","raceName":"Monaco
+ Grand Prix","Circuit":{"circuitId":"monaco","url":"https://en.wikipedia.org/wiki/Circuit_de_Monaco","circuitName":"Circuit
+ de Monaco","Location":{"lat":"43.7347","long":"7.42056","locality":"Monte-Carlo","country":"Monaco"}},"date":"2021-05-23","time":"13:00:00Z","Laps":[{"number":"38","Timings":[{"driverId":"gasly","position":"6","time":"1:16.874"},{"driverId":"hamilton","position":"7","time":"1:16.209"},{"driverId":"stroll","position":"8","time":"1:16.159"},{"driverId":"raikkonen","position":"9","time":"1:16.951"},{"driverId":"ocon","position":"10","time":"1:20.372"},{"driverId":"giovinazzi","position":"11","time":"1:17.113"},{"driverId":"alonso","position":"12","time":"1:17.286"},{"driverId":"ricciardo","position":"13","time":"1:16.217"},{"driverId":"latifi","position":"14","time":"1:17.978"},{"driverId":"tsunoda","position":"15","time":"1:20.113"},{"driverId":"russell","position":"16","time":"1:15.951"},{"driverId":"mazepin","position":"17","time":"1:17.976"},{"driverId":"mick_schumacher","position":"18","time":"1:26.398"}]},{"number":"39","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:16.535"},{"driverId":"sainz","position":"2","time":"1:15.122"},{"driverId":"norris","position":"3","time":"1:15.625"},{"driverId":"perez","position":"4","time":"1:16.007"},{"driverId":"vettel","position":"5","time":"1:16.402"},{"driverId":"gasly","position":"6","time":"1:16.708"},{"driverId":"hamilton","position":"7","time":"1:16.392"},{"driverId":"stroll","position":"8","time":"1:15.811"},{"driverId":"raikkonen","position":"9","time":"1:16.565"},{"driverId":"ocon","position":"10","time":"1:16.171"},{"driverId":"giovinazzi","position":"11","time":"1:16.448"},{"driverId":"alonso","position":"12","time":"1:17.102"},{"driverId":"ricciardo","position":"13","time":"1:15.205"},{"driverId":"latifi","position":"14","time":"1:19.567"},{"driverId":"tsunoda","position":"15","time":"1:19.247"},{"driverId":"russell","position":"16","time":"1:16.636"},{"driverId":"mazepin","position":"17","time":"1:21.209"},{"driverId":"mick_schumacher","position":"18","time":"1:24.818"}]},{"number":"40","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:15.881"},{"driverId":"sainz","position":"2","time":"1:16.364"},{"driverId":"norris","position":"3","time":"1:15.672"},{"driverId":"perez","position":"4","time":"1:16.150"},{"driverId":"vettel","position":"5","time":"1:16.483"},{"driverId":"gasly","position":"6","time":"1:16.226"},{"driverId":"hamilton","position":"7","time":"1:16.542"},{"driverId":"stroll","position":"8","time":"1:15.756"},{"driverId":"raikkonen","position":"9","time":"1:16.815"},{"driverId":"ocon","position":"10","time":"1:15.550"},{"driverId":"giovinazzi","position":"11","time":"1:16.013"},{"driverId":"alonso","position":"12","time":"1:17.263"},{"driverId":"ricciardo","position":"13","time":"1:15.457"},{"driverId":"latifi","position":"14","time":"1:19.063"},{"driverId":"tsunoda","position":"15","time":"1:17.312"},{"driverId":"russell","position":"16","time":"1:15.667"},{"driverId":"mazepin","position":"17","time":"1:20.120"},{"driverId":"mick_schumacher","position":"18","time":"1:21.030"}]},{"number":"41","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:15.468"},{"driverId":"sainz","position":"2","time":"1:15.565"},{"driverId":"norris","position":"3","time":"1:15.757"},{"driverId":"perez","position":"4","time":"1:14.950"},{"driverId":"vettel","position":"5","time":"1:16.706"},{"driverId":"gasly","position":"6","time":"1:16.713"},{"driverId":"hamilton","position":"7","time":"1:16.349"},{"driverId":"stroll","position":"8","time":"1:15.695"},{"driverId":"raikkonen","position":"9","time":"1:16.901"},{"driverId":"ocon","position":"10","time":"1:15.316"},{"driverId":"giovinazzi","position":"11","time":"1:15.331"},{"driverId":"alonso","position":"12","time":"1:17.267"},{"driverId":"ricciardo","position":"13","time":"1:14.856"},{"driverId":"latifi","position":"14","time":"1:17.323"},{"driverId":"tsunoda","position":"15","time":"1:19.522"},{"driverId":"russell","position":"16","time":"1:15.618"},{"driverId":"mazepin","position":"17","time":"1:20.018"},{"driverId":"mick_schumacher","position":"18","time":"1:17.591"}]},{"number":"42","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:15.581"},{"driverId":"sainz","position":"2","time":"1:15.588"},{"driverId":"norris","position":"3","time":"1:16.281"},{"driverId":"perez","position":"4","time":"1:15.488"},{"driverId":"vettel","position":"5","time":"1:16.074"},{"driverId":"gasly","position":"6","time":"1:16.205"},{"driverId":"hamilton","position":"7","time":"1:16.964"},{"driverId":"stroll","position":"8","time":"1:16.089"},{"driverId":"raikkonen","position":"9","time":"1:16.450"},{"driverId":"ocon","position":"10","time":"1:15.459"},{"driverId":"giovinazzi","position":"11","time":"1:15.402"},{"driverId":"alonso","position":"12","time":"1:17.446"},{"driverId":"ricciardo","position":"13","time":"1:15.164"},{"driverId":"latifi","position":"14","time":"1:19.846"},{"driverId":"tsunoda","position":"15","time":"1:17.556"},{"driverId":"russell","position":"16","time":"1:16.346"},{"driverId":"mazepin","position":"17","time":"1:20.555"},{"driverId":"mick_schumacher","position":"18","time":"1:16.814"}]},{"number":"43","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:15.624"},{"driverId":"sainz","position":"2","time":"1:15.329"},{"driverId":"norris","position":"3","time":"1:15.912"},{"driverId":"perez","position":"4","time":"1:15.600"},{"driverId":"vettel","position":"5","time":"1:16.220"},{"driverId":"gasly","position":"6","time":"1:16.757"},{"driverId":"hamilton","position":"7","time":"1:17.853"},{"driverId":"stroll","position":"8","time":"1:15.983"},{"driverId":"ocon","position":"9","time":"1:15.823"},{"driverId":"giovinazzi","position":"10","time":"1:15.569"},{"driverId":"raikkonen","position":"11","time":"1:33.514"},{"driverId":"alonso","position":"12","time":"1:17.602"},{"driverId":"ricciardo","position":"13","time":"1:14.578"},{"driverId":"tsunoda","position":"14","time":"1:17.717"},{"driverId":"russell","position":"15","time":"1:18.893"}]}]}]}}}'
+ recorded_at: 2025-08-04 01:49:01
+- request:
+ method: GET
+ uri: https://api.jolpi.ca/ergast/f1/2021/5/laps.json?limit=100&offset=800
+ response:
+ status: 200
+ headers:
+ Server: nginx/1.28.0
+ Date: Mon, 04 Aug 2025 01:49:01 GMT
+ Content-Type: application/json
+ Transfer-Encoding: chunked
+ Connection: keep-alive
+ Vary: Accept, origin
+ Allow: GET, HEAD, OPTIONS
+ Expires: Mon, 04 Aug 2025 02:49:01 GMT
+ Cache-Control: max-age=3600
+ X-Frame-Options: DENY
+ X-Content-Type-Options: nosniff
+ Referrer-Policy: same-origin
+ Cross-Origin-Opener-Policy: same-origin
+ Content-Encoding: gzip
+ body:
+ string: '{"MRData":{"xmlns":"","series":"f1","url":"https://api.jolpi.ca/ergast/f1/2021/5/laps.json","limit":"100","offset":"800","total":"1418","RaceTable":{"season":"2021","round":"5","Races":[{"season":"2021","round":"5","url":"https://en.wikipedia.org/wiki/2021_Monaco_Grand_Prix","raceName":"Monaco
+ Grand Prix","Circuit":{"circuitId":"monaco","url":"https://en.wikipedia.org/wiki/Circuit_de_Monaco","circuitName":"Circuit
+ de Monaco","Location":{"lat":"43.7347","long":"7.42056","locality":"Monte-Carlo","country":"Monaco"}},"date":"2021-05-23","time":"13:00:00Z","Laps":[{"number":"43","Timings":[{"driverId":"latifi","position":"16","time":"1:34.200"},{"driverId":"mazepin","position":"17","time":"1:22.757"},{"driverId":"mick_schumacher","position":"18","time":"1:17.825"}]},{"number":"44","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:14.993"},{"driverId":"sainz","position":"2","time":"1:15.056"},{"driverId":"norris","position":"3","time":"1:15.613"},{"driverId":"perez","position":"4","time":"1:15.706"},{"driverId":"vettel","position":"5","time":"1:16.045"},{"driverId":"gasly","position":"6","time":"1:16.104"},{"driverId":"hamilton","position":"7","time":"1:16.793"},{"driverId":"stroll","position":"8","time":"1:16.580"},{"driverId":"ocon","position":"9","time":"1:15.858"},{"driverId":"giovinazzi","position":"10","time":"1:15.707"},{"driverId":"alonso","position":"11","time":"1:18.384"},{"driverId":"raikkonen","position":"12","time":"1:21.460"},{"driverId":"ricciardo","position":"13","time":"1:17.703"},{"driverId":"tsunoda","position":"14","time":"1:15.880"},{"driverId":"russell","position":"15","time":"1:17.165"},{"driverId":"latifi","position":"16","time":"1:21.902"},{"driverId":"mazepin","position":"17","time":"1:21.445"},{"driverId":"mick_schumacher","position":"18","time":"1:17.867"}]},{"number":"45","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:14.930"},{"driverId":"sainz","position":"2","time":"1:14.808"},{"driverId":"norris","position":"3","time":"1:15.180"},{"driverId":"perez","position":"4","time":"1:15.344"},{"driverId":"vettel","position":"5","time":"1:15.903"},{"driverId":"gasly","position":"6","time":"1:16.357"},{"driverId":"hamilton","position":"7","time":"1:15.903"},{"driverId":"stroll","position":"8","time":"1:17.562"},{"driverId":"ocon","position":"9","time":"1:16.012"},{"driverId":"giovinazzi","position":"10","time":"1:15.865"},{"driverId":"raikkonen","position":"11","time":"1:17.657"},{"driverId":"ricciardo","position":"12","time":"1:17.707"},{"driverId":"alonso","position":"13","time":"1:34.415"},{"driverId":"tsunoda","position":"14","time":"1:15.635"},{"driverId":"russell","position":"15","time":"1:16.812"},{"driverId":"latifi","position":"16","time":"1:16.122"},{"driverId":"mazepin","position":"17","time":"1:23.941"},{"driverId":"mick_schumacher","position":"18","time":"1:17.852"}]},{"number":"46","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:15.502"},{"driverId":"sainz","position":"2","time":"1:15.203"},{"driverId":"norris","position":"3","time":"1:15.141"},{"driverId":"perez","position":"4","time":"1:15.595"},{"driverId":"vettel","position":"5","time":"1:16.857"},{"driverId":"gasly","position":"6","time":"1:16.318"},{"driverId":"hamilton","position":"7","time":"1:15.720"},{"driverId":"stroll","position":"8","time":"1:15.828"},{"driverId":"ocon","position":"9","time":"1:16.026"},{"driverId":"giovinazzi","position":"10","time":"1:16.179"},{"driverId":"raikkonen","position":"11","time":"1:21.927"},{"driverId":"ricciardo","position":"12","time":"1:22.040"},{"driverId":"alonso","position":"13","time":"1:20.632"},{"driverId":"tsunoda","position":"14","time":"1:17.634"},{"driverId":"russell","position":"15","time":"1:16.131"},{"driverId":"latifi","position":"16","time":"1:15.889"},{"driverId":"mazepin","position":"17","time":"1:22.519"},{"driverId":"mick_schumacher","position":"18","time":"1:17.289"}]},{"number":"47","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:15.494"},{"driverId":"sainz","position":"2","time":"1:15.626"},{"driverId":"norris","position":"3","time":"1:15.458"},{"driverId":"perez","position":"4","time":"1:15.700"},{"driverId":"vettel","position":"5","time":"1:15.991"},{"driverId":"gasly","position":"6","time":"1:16.320"},{"driverId":"hamilton","position":"7","time":"1:15.277"},{"driverId":"stroll","position":"8","time":"1:15.920"},{"driverId":"ocon","position":"9","time":"1:16.782"},{"driverId":"giovinazzi","position":"10","time":"1:16.444"},{"driverId":"raikkonen","position":"11","time":"1:16.697"},{"driverId":"ricciardo","position":"12","time":"1:17.230"},{"driverId":"alonso","position":"13","time":"1:15.120"},{"driverId":"tsunoda","position":"14","time":"1:17.469"},{"driverId":"russell","position":"15","time":"1:16.185"},{"driverId":"latifi","position":"16","time":"1:16.286"},{"driverId":"mazepin","position":"17","time":"1:17.651"},{"driverId":"mick_schumacher","position":"18","time":"1:17.434"}]},{"number":"48","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:14.851"},{"driverId":"sainz","position":"2","time":"1:14.874"},{"driverId":"norris","position":"3","time":"1:15.524"},{"driverId":"perez","position":"4","time":"1:14.988"},{"driverId":"vettel","position":"5","time":"1:15.797"},{"driverId":"gasly","position":"6","time":"1:16.358"},{"driverId":"hamilton","position":"7","time":"1:16.717"},{"driverId":"stroll","position":"8","time":"1:16.523"},{"driverId":"ocon","position":"9","time":"1:16.975"},{"driverId":"giovinazzi","position":"10","time":"1:16.712"},{"driverId":"raikkonen","position":"11","time":"1:16.045"},{"driverId":"ricciardo","position":"12","time":"1:16.179"},{"driverId":"alonso","position":"13","time":"1:20.318"},{"driverId":"tsunoda","position":"14","time":"1:16.913"},{"driverId":"russell","position":"15","time":"1:16.379"},{"driverId":"latifi","position":"16","time":"1:16.007"},{"driverId":"mazepin","position":"17","time":"1:17.407"},{"driverId":"mick_schumacher","position":"18","time":"1:17.682"}]},{"number":"49","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:15.186"},{"driverId":"sainz","position":"2","time":"1:14.731"},{"driverId":"norris","position":"3","time":"1:15.584"},{"driverId":"perez","position":"4","time":"1:14.810"},{"driverId":"vettel","position":"5","time":"1:15.591"},{"driverId":"gasly","position":"6","time":"1:15.906"},{"driverId":"hamilton","position":"7","time":"1:16.328"}]}]}]}}}'
+ recorded_at: 2025-08-04 01:49:01
+- request:
+ method: GET
+ uri: https://api.jolpi.ca/ergast/f1/2021/5/laps.json?limit=100&offset=900
+ response:
+ status: 200
+ headers:
+ Server: nginx/1.28.0
+ Date: Mon, 04 Aug 2025 01:49:02 GMT
+ Content-Type: application/json
+ Transfer-Encoding: chunked
+ Connection: keep-alive
+ Vary: Accept, origin
+ Allow: GET, HEAD, OPTIONS
+ Expires: Mon, 04 Aug 2025 02:49:01 GMT
+ Cache-Control: max-age=3600
+ X-Frame-Options: DENY
+ X-Content-Type-Options: nosniff
+ Referrer-Policy: same-origin
+ Cross-Origin-Opener-Policy: same-origin
+ Content-Encoding: gzip
+ body:
+ string: '{"MRData":{"xmlns":"","series":"f1","url":"https://api.jolpi.ca/ergast/f1/2021/5/laps.json","limit":"100","offset":"900","total":"1418","RaceTable":{"season":"2021","round":"5","Races":[{"season":"2021","round":"5","url":"https://en.wikipedia.org/wiki/2021_Monaco_Grand_Prix","raceName":"Monaco
+ Grand Prix","Circuit":{"circuitId":"monaco","url":"https://en.wikipedia.org/wiki/Circuit_de_Monaco","circuitName":"Circuit
+ de Monaco","Location":{"lat":"43.7347","long":"7.42056","locality":"Monte-Carlo","country":"Monaco"}},"date":"2021-05-23","time":"13:00:00Z","Laps":[{"number":"49","Timings":[{"driverId":"stroll","position":"8","time":"1:15.989"},{"driverId":"ocon","position":"9","time":"1:16.749"},{"driverId":"giovinazzi","position":"10","time":"1:16.736"},{"driverId":"raikkonen","position":"11","time":"1:16.304"},{"driverId":"ricciardo","position":"12","time":"1:16.284"},{"driverId":"alonso","position":"13","time":"1:16.757"},{"driverId":"tsunoda","position":"14","time":"1:16.880"},{"driverId":"russell","position":"15","time":"1:16.446"},{"driverId":"latifi","position":"16","time":"1:16.355"},{"driverId":"mazepin","position":"17","time":"1:17.221"},{"driverId":"mick_schumacher","position":"18","time":"1:16.940"}]},{"number":"50","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:14.714"},{"driverId":"sainz","position":"2","time":"1:15.049"},{"driverId":"norris","position":"3","time":"1:15.716"},{"driverId":"perez","position":"4","time":"1:15.895"},{"driverId":"vettel","position":"5","time":"1:16.063"},{"driverId":"gasly","position":"6","time":"1:15.809"},{"driverId":"hamilton","position":"7","time":"1:16.216"},{"driverId":"stroll","position":"8","time":"1:15.871"},{"driverId":"ocon","position":"9","time":"1:16.521"},{"driverId":"giovinazzi","position":"10","time":"1:16.577"},{"driverId":"raikkonen","position":"11","time":"1:16.036"},{"driverId":"ricciardo","position":"12","time":"1:16.156"},{"driverId":"alonso","position":"13","time":"1:16.997"},{"driverId":"tsunoda","position":"14","time":"1:17.240"},{"driverId":"russell","position":"15","time":"1:16.659"},{"driverId":"latifi","position":"16","time":"1:15.942"},{"driverId":"mazepin","position":"17","time":"1:16.917"},{"driverId":"mick_schumacher","position":"18","time":"1:16.520"}]},{"number":"51","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:14.950"},{"driverId":"sainz","position":"2","time":"1:15.052"},{"driverId":"norris","position":"3","time":"1:15.531"},{"driverId":"perez","position":"4","time":"1:14.743"},{"driverId":"vettel","position":"5","time":"1:16.059"},{"driverId":"gasly","position":"6","time":"1:16.128"},{"driverId":"hamilton","position":"7","time":"1:16.266"},{"driverId":"stroll","position":"8","time":"1:16.024"},{"driverId":"ocon","position":"9","time":"1:16.430"},{"driverId":"giovinazzi","position":"10","time":"1:16.524"},{"driverId":"raikkonen","position":"11","time":"1:16.163"},{"driverId":"ricciardo","position":"12","time":"1:18.131"},{"driverId":"alonso","position":"13","time":"1:16.727"},{"driverId":"tsunoda","position":"14","time":"1:16.702"},{"driverId":"russell","position":"15","time":"1:17.078"},{"driverId":"latifi","position":"16","time":"1:15.867"},{"driverId":"mazepin","position":"17","time":"1:16.883"},{"driverId":"mick_schumacher","position":"18","time":"1:16.425"}]},{"number":"52","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:14.853"},{"driverId":"sainz","position":"2","time":"1:14.859"},{"driverId":"norris","position":"3","time":"1:15.188"},{"driverId":"perez","position":"4","time":"1:15.143"},{"driverId":"vettel","position":"5","time":"1:16.268"},{"driverId":"gasly","position":"6","time":"1:16.122"},{"driverId":"hamilton","position":"7","time":"1:16.129"},{"driverId":"stroll","position":"8","time":"1:16.156"},{"driverId":"ocon","position":"9","time":"1:16.675"},{"driverId":"giovinazzi","position":"10","time":"1:16.466"},{"driverId":"raikkonen","position":"11","time":"1:15.411"},{"driverId":"ricciardo","position":"12","time":"1:15.382"},{"driverId":"alonso","position":"13","time":"1:16.309"},{"driverId":"tsunoda","position":"14","time":"1:16.589"},{"driverId":"russell","position":"15","time":"1:16.879"},{"driverId":"latifi","position":"16","time":"1:16.080"},{"driverId":"mazepin","position":"17","time":"1:16.919"},{"driverId":"mick_schumacher","position":"18","time":"1:16.805"}]},{"number":"53","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:14.745"},{"driverId":"sainz","position":"2","time":"1:14.792"},{"driverId":"norris","position":"3","time":"1:15.270"},{"driverId":"perez","position":"4","time":"1:14.915"},{"driverId":"vettel","position":"5","time":"1:16.452"},{"driverId":"gasly","position":"6","time":"1:16.126"},{"driverId":"hamilton","position":"7","time":"1:15.641"},{"driverId":"stroll","position":"8","time":"1:15.595"},{"driverId":"ocon","position":"9","time":"1:16.689"},{"driverId":"giovinazzi","position":"10","time":"1:16.688"},{"driverId":"raikkonen","position":"11","time":"1:15.025"},{"driverId":"ricciardo","position":"12","time":"1:15.386"},{"driverId":"alonso","position":"13","time":"1:16.557"},{"driverId":"tsunoda","position":"14","time":"1:16.319"},{"driverId":"russell","position":"15","time":"1:19.146"},{"driverId":"latifi","position":"16","time":"1:16.146"},{"driverId":"mazepin","position":"17","time":"1:16.901"},{"driverId":"mick_schumacher","position":"18","time":"1:16.767"}]},{"number":"54","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:14.967"},{"driverId":"sainz","position":"2","time":"1:14.760"},{"driverId":"norris","position":"3","time":"1:15.252"},{"driverId":"perez","position":"4","time":"1:14.980"},{"driverId":"vettel","position":"5","time":"1:16.613"},{"driverId":"gasly","position":"6","time":"1:16.603"},{"driverId":"hamilton","position":"7","time":"1:15.894"},{"driverId":"stroll","position":"8","time":"1:15.783"},{"driverId":"ocon","position":"9","time":"1:16.447"},{"driverId":"giovinazzi","position":"10","time":"1:16.647"},{"driverId":"raikkonen","position":"11","time":"1:15.165"},{"driverId":"ricciardo","position":"12","time":"1:15.976"},{"driverId":"alonso","position":"13","time":"1:15.783"},{"driverId":"tsunoda","position":"14","time":"1:16.334"},{"driverId":"russell","position":"15","time":"1:17.259"},{"driverId":"latifi","position":"16","time":"1:16.009"},{"driverId":"mazepin","position":"17","time":"1:16.899"}]}]}]}}}'
+ recorded_at: 2025-08-04 01:49:02
+- request:
+ method: GET
+ uri: https://api.jolpi.ca/ergast/f1/2021/5/laps.json?limit=100&offset=1000
+ response:
+ status: 200
+ headers:
+ Server: nginx/1.28.0
+ Date: Mon, 04 Aug 2025 01:49:02 GMT
+ Content-Type: application/json
+ Transfer-Encoding: chunked
+ Connection: keep-alive
+ Vary: Accept, origin
+ Allow: GET, HEAD, OPTIONS
+ Expires: Mon, 04 Aug 2025 02:49:02 GMT
+ Cache-Control: max-age=3600
+ X-Frame-Options: DENY
+ X-Content-Type-Options: nosniff
+ Referrer-Policy: same-origin
+ Cross-Origin-Opener-Policy: same-origin
+ Content-Encoding: gzip
+ body:
+ string: '{"MRData":{"xmlns":"","series":"f1","url":"https://api.jolpi.ca/ergast/f1/2021/5/laps.json","limit":"100","offset":"1000","total":"1418","RaceTable":{"season":"2021","round":"5","Races":[{"season":"2021","round":"5","url":"https://en.wikipedia.org/wiki/2021_Monaco_Grand_Prix","raceName":"Monaco
+ Grand Prix","Circuit":{"circuitId":"monaco","url":"https://en.wikipedia.org/wiki/Circuit_de_Monaco","circuitName":"Circuit
+ de Monaco","Location":{"lat":"43.7347","long":"7.42056","locality":"Monte-Carlo","country":"Monaco"}},"date":"2021-05-23","time":"13:00:00Z","Laps":[{"number":"54","Timings":[{"driverId":"mick_schumacher","position":"18","time":"1:16.564"}]},{"number":"55","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:14.783"},{"driverId":"sainz","position":"2","time":"1:14.646"},{"driverId":"norris","position":"3","time":"1:15.339"},{"driverId":"perez","position":"4","time":"1:15.238"},{"driverId":"vettel","position":"5","time":"1:15.500"},{"driverId":"gasly","position":"6","time":"1:16.398"},{"driverId":"hamilton","position":"7","time":"1:15.953"},{"driverId":"stroll","position":"8","time":"1:15.806"},{"driverId":"ocon","position":"9","time":"1:16.466"},{"driverId":"giovinazzi","position":"10","time":"1:16.394"},{"driverId":"raikkonen","position":"11","time":"1:14.971"},{"driverId":"ricciardo","position":"12","time":"1:15.298"},{"driverId":"alonso","position":"13","time":"1:15.954"},{"driverId":"tsunoda","position":"14","time":"1:15.983"},{"driverId":"russell","position":"15","time":"1:16.727"},{"driverId":"latifi","position":"16","time":"1:15.703"},{"driverId":"mazepin","position":"17","time":"1:17.089"},{"driverId":"mick_schumacher","position":"18","time":"1:16.624"}]},{"number":"56","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:14.799"},{"driverId":"sainz","position":"2","time":"1:14.914"},{"driverId":"norris","position":"3","time":"1:15.515"},{"driverId":"perez","position":"4","time":"1:15.163"},{"driverId":"vettel","position":"5","time":"1:15.761"},{"driverId":"gasly","position":"6","time":"1:16.316"},{"driverId":"hamilton","position":"7","time":"1:16.148"},{"driverId":"stroll","position":"8","time":"1:15.768"},{"driverId":"ocon","position":"9","time":"1:16.438"},{"driverId":"giovinazzi","position":"10","time":"1:16.482"},{"driverId":"raikkonen","position":"11","time":"1:15.288"},{"driverId":"ricciardo","position":"12","time":"1:15.518"},{"driverId":"alonso","position":"13","time":"1:15.982"},{"driverId":"tsunoda","position":"14","time":"1:15.919"},{"driverId":"russell","position":"15","time":"1:23.427"},{"driverId":"latifi","position":"16","time":"1:17.179"},{"driverId":"mazepin","position":"17","time":"1:17.638"},{"driverId":"mick_schumacher","position":"18","time":"1:17.182"}]},{"number":"57","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:14.762"},{"driverId":"sainz","position":"2","time":"1:15.051"},{"driverId":"norris","position":"3","time":"1:15.441"},{"driverId":"perez","position":"4","time":"1:15.736"},{"driverId":"vettel","position":"5","time":"1:15.883"},{"driverId":"gasly","position":"6","time":"1:15.732"},{"driverId":"hamilton","position":"7","time":"1:16.877"},{"driverId":"stroll","position":"8","time":"1:16.725"},{"driverId":"ocon","position":"9","time":"1:16.712"},{"driverId":"giovinazzi","position":"10","time":"1:16.710"},{"driverId":"raikkonen","position":"11","time":"1:15.588"},{"driverId":"ricciardo","position":"12","time":"1:15.268"},{"driverId":"alonso","position":"13","time":"1:16.071"},{"driverId":"tsunoda","position":"14","time":"1:16.108"},{"driverId":"russell","position":"15","time":"1:17.148"},{"driverId":"latifi","position":"16","time":"1:16.863"},{"driverId":"mazepin","position":"17","time":"1:17.517"},{"driverId":"mick_schumacher","position":"18","time":"1:17.915"}]},{"number":"58","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:14.649"},{"driverId":"sainz","position":"2","time":"1:15.347"},{"driverId":"norris","position":"3","time":"1:15.315"},{"driverId":"perez","position":"4","time":"1:14.988"},{"driverId":"vettel","position":"5","time":"1:15.870"},{"driverId":"gasly","position":"6","time":"1:15.896"},{"driverId":"hamilton","position":"7","time":"1:16.241"},{"driverId":"stroll","position":"8","time":"1:32.618"},{"driverId":"ocon","position":"9","time":"1:16.988"},{"driverId":"giovinazzi","position":"10","time":"1:17.878"},{"driverId":"raikkonen","position":"11","time":"1:15.130"},{"driverId":"ricciardo","position":"12","time":"1:15.308"},{"driverId":"alonso","position":"13","time":"1:16.028"},{"driverId":"tsunoda","position":"14","time":"1:15.975"},{"driverId":"russell","position":"15","time":"1:15.964"},{"driverId":"latifi","position":"16","time":"1:16.441"},{"driverId":"mazepin","position":"17","time":"1:17.890"},{"driverId":"mick_schumacher","position":"18","time":"1:19.485"}]},{"number":"59","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:15.092"},{"driverId":"sainz","position":"2","time":"1:15.320"},{"driverId":"norris","position":"3","time":"1:15.630"},{"driverId":"perez","position":"4","time":"1:15.052"},{"driverId":"vettel","position":"5","time":"1:15.900"},{"driverId":"gasly","position":"6","time":"1:15.921"},{"driverId":"hamilton","position":"7","time":"1:16.006"},{"driverId":"stroll","position":"8","time":"1:18.442"},{"driverId":"ocon","position":"9","time":"1:19.864"},{"driverId":"giovinazzi","position":"10","time":"1:18.885"},{"driverId":"raikkonen","position":"11","time":"1:15.311"},{"driverId":"ricciardo","position":"12","time":"1:15.633"},{"driverId":"alonso","position":"13","time":"1:15.890"},{"driverId":"tsunoda","position":"14","time":"1:15.777"},{"driverId":"russell","position":"15","time":"1:15.539"},{"driverId":"latifi","position":"16","time":"1:16.039"},{"driverId":"mazepin","position":"17","time":"1:21.993"},{"driverId":"mick_schumacher","position":"18","time":"1:17.713"}]},{"number":"60","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:15.370"},{"driverId":"sainz","position":"2","time":"1:15.706"},{"driverId":"norris","position":"3","time":"1:15.847"},{"driverId":"perez","position":"4","time":"1:15.125"},{"driverId":"vettel","position":"5","time":"1:15.890"},{"driverId":"gasly","position":"6","time":"1:15.861"},{"driverId":"hamilton","position":"7","time":"1:16.013"},{"driverId":"stroll","position":"8","time":"1:17.151"},{"driverId":"ocon","position":"9","time":"1:20.445"}]}]}]}}}'
+ recorded_at: 2025-08-04 01:49:02
+- request:
+ method: GET
+ uri: https://api.jolpi.ca/ergast/f1/2021/5/laps.json?limit=100&offset=1100
+ response:
+ status: 200
+ headers:
+ Server: nginx/1.28.0
+ Date: Mon, 04 Aug 2025 01:49:02 GMT
+ Content-Type: application/json
+ Transfer-Encoding: chunked
+ Connection: keep-alive
+ Vary: Accept, origin
+ Allow: GET, HEAD, OPTIONS
+ Expires: Mon, 04 Aug 2025 02:49:02 GMT
+ Cache-Control: max-age=3600
+ X-Frame-Options: DENY
+ X-Content-Type-Options: nosniff
+ Referrer-Policy: same-origin
+ Cross-Origin-Opener-Policy: same-origin
+ Content-Encoding: gzip
+ body:
+ string: '{"MRData":{"xmlns":"","series":"f1","url":"https://api.jolpi.ca/ergast/f1/2021/5/laps.json","limit":"100","offset":"1100","total":"1418","RaceTable":{"season":"2021","round":"5","Races":[{"season":"2021","round":"5","url":"https://en.wikipedia.org/wiki/2021_Monaco_Grand_Prix","raceName":"Monaco
+ Grand Prix","Circuit":{"circuitId":"monaco","url":"https://en.wikipedia.org/wiki/Circuit_de_Monaco","circuitName":"Circuit
+ de Monaco","Location":{"lat":"43.7347","long":"7.42056","locality":"Monte-Carlo","country":"Monaco"}},"date":"2021-05-23","time":"13:00:00Z","Laps":[{"number":"60","Timings":[{"driverId":"giovinazzi","position":"10","time":"1:19.997"},{"driverId":"raikkonen","position":"11","time":"1:15.479"},{"driverId":"ricciardo","position":"12","time":"1:16.352"},{"driverId":"alonso","position":"13","time":"1:15.909"},{"driverId":"tsunoda","position":"14","time":"1:15.852"},{"driverId":"russell","position":"15","time":"1:15.929"},{"driverId":"latifi","position":"16","time":"1:16.058"},{"driverId":"mazepin","position":"17","time":"1:17.499"},{"driverId":"mick_schumacher","position":"18","time":"1:19.102"}]},{"number":"61","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:15.557"},{"driverId":"sainz","position":"2","time":"1:16.343"},{"driverId":"norris","position":"3","time":"1:16.048"},{"driverId":"perez","position":"4","time":"1:15.270"},{"driverId":"vettel","position":"5","time":"1:15.762"},{"driverId":"gasly","position":"6","time":"1:15.657"},{"driverId":"hamilton","position":"7","time":"1:15.858"},{"driverId":"stroll","position":"8","time":"1:16.586"},{"driverId":"ocon","position":"9","time":"1:17.675"},{"driverId":"giovinazzi","position":"10","time":"1:17.788"},{"driverId":"raikkonen","position":"11","time":"1:15.691"},{"driverId":"ricciardo","position":"12","time":"1:18.843"},{"driverId":"alonso","position":"13","time":"1:16.007"},{"driverId":"tsunoda","position":"14","time":"1:16.161"},{"driverId":"russell","position":"15","time":"1:15.759"},{"driverId":"latifi","position":"16","time":"1:15.820"},{"driverId":"mazepin","position":"17","time":"1:19.733"},{"driverId":"mick_schumacher","position":"18","time":"1:18.282"}]},{"number":"62","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:15.455"},{"driverId":"sainz","position":"2","time":"1:15.592"},{"driverId":"norris","position":"3","time":"1:15.622"},{"driverId":"perez","position":"4","time":"1:14.759"},{"driverId":"vettel","position":"5","time":"1:15.468"},{"driverId":"gasly","position":"6","time":"1:15.458"},{"driverId":"hamilton","position":"7","time":"1:15.926"},{"driverId":"stroll","position":"8","time":"1:15.878"},{"driverId":"ocon","position":"9","time":"1:17.694"},{"driverId":"giovinazzi","position":"10","time":"1:17.774"},{"driverId":"raikkonen","position":"11","time":"1:15.922"},{"driverId":"ricciardo","position":"12","time":"1:15.432"},{"driverId":"alonso","position":"13","time":"1:15.461"},{"driverId":"tsunoda","position":"14","time":"1:16.180"},{"driverId":"russell","position":"15","time":"1:15.695"},{"driverId":"latifi","position":"16","time":"1:15.652"},{"driverId":"mazepin","position":"17","time":"1:17.422"},{"driverId":"mick_schumacher","position":"18","time":"1:17.745"}]},{"number":"63","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:15.014"},{"driverId":"sainz","position":"2","time":"1:16.394"},{"driverId":"norris","position":"3","time":"1:15.416"},{"driverId":"perez","position":"4","time":"1:14.778"},{"driverId":"vettel","position":"5","time":"1:16.085"},{"driverId":"gasly","position":"6","time":"1:15.687"},{"driverId":"hamilton","position":"7","time":"1:15.404"},{"driverId":"stroll","position":"8","time":"1:15.508"},{"driverId":"ocon","position":"9","time":"1:17.764"},{"driverId":"giovinazzi","position":"10","time":"1:17.748"},{"driverId":"raikkonen","position":"11","time":"1:16.950"},{"driverId":"ricciardo","position":"12","time":"1:15.246"},{"driverId":"alonso","position":"13","time":"1:15.868"},{"driverId":"tsunoda","position":"14","time":"1:15.805"},{"driverId":"russell","position":"15","time":"1:15.705"},{"driverId":"latifi","position":"16","time":"1:15.921"},{"driverId":"mazepin","position":"17","time":"1:16.868"},{"driverId":"mick_schumacher","position":"18","time":"1:17.133"}]},{"number":"64","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:15.473"},{"driverId":"sainz","position":"2","time":"1:15.751"},{"driverId":"norris","position":"3","time":"1:15.874"},{"driverId":"perez","position":"4","time":"1:15.149"},{"driverId":"vettel","position":"5","time":"1:15.809"},{"driverId":"gasly","position":"6","time":"1:15.845"},{"driverId":"hamilton","position":"7","time":"1:16.498"},{"driverId":"stroll","position":"8","time":"1:15.183"},{"driverId":"ocon","position":"9","time":"1:17.485"},{"driverId":"giovinazzi","position":"10","time":"1:17.436"},{"driverId":"raikkonen","position":"11","time":"1:20.815"},{"driverId":"ricciardo","position":"12","time":"1:15.799"},{"driverId":"alonso","position":"13","time":"1:16.157"},{"driverId":"russell","position":"14","time":"1:15.935"},{"driverId":"latifi","position":"15","time":"1:15.968"},{"driverId":"tsunoda","position":"16","time":"1:34.429"},{"driverId":"mazepin","position":"17","time":"1:16.866"},{"driverId":"mick_schumacher","position":"18","time":"1:17.375"}]},{"number":"65","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:15.356"},{"driverId":"sainz","position":"2","time":"1:15.455"},{"driverId":"norris","position":"3","time":"1:16.145"},{"driverId":"perez","position":"4","time":"1:15.883"},{"driverId":"vettel","position":"5","time":"1:16.370"},{"driverId":"gasly","position":"6","time":"1:15.882"},{"driverId":"hamilton","position":"7","time":"1:15.684"},{"driverId":"stroll","position":"8","time":"1:18.419"},{"driverId":"ocon","position":"9","time":"1:17.557"},{"driverId":"giovinazzi","position":"10","time":"1:19.182"},{"driverId":"raikkonen","position":"11","time":"1:16.494"},{"driverId":"ricciardo","position":"12","time":"1:16.018"},{"driverId":"alonso","position":"13","time":"1:15.536"},{"driverId":"russell","position":"14","time":"1:16.012"},{"driverId":"latifi","position":"15","time":"1:16.173"},{"driverId":"tsunoda","position":"16","time":"1:18.804"},{"driverId":"mazepin","position":"17","time":"1:17.046"},{"driverId":"mick_schumacher","position":"18","time":"1:17.779"}]},{"number":"66","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:15.301"}]}]}]}}}'
+ recorded_at: 2025-08-04 01:49:02
+- request:
+ method: GET
+ uri: https://api.jolpi.ca/ergast/f1/2021/5/laps.json?limit=100&offset=1200
+ response:
+ status: 200
+ headers:
+ Server: nginx/1.28.0
+ Date: Mon, 04 Aug 2025 01:49:02 GMT
+ Content-Type: application/json
+ Transfer-Encoding: chunked
+ Connection: keep-alive
+ Vary: Accept, origin
+ Allow: GET, HEAD, OPTIONS
+ Expires: Mon, 04 Aug 2025 02:49:02 GMT
+ Cache-Control: max-age=3600
+ X-Frame-Options: DENY
+ X-Content-Type-Options: nosniff
+ Referrer-Policy: same-origin
+ Cross-Origin-Opener-Policy: same-origin
+ Content-Encoding: gzip
+ body:
+ string: '{"MRData":{"xmlns":"","series":"f1","url":"https://api.jolpi.ca/ergast/f1/2021/5/laps.json","limit":"100","offset":"1200","total":"1418","RaceTable":{"season":"2021","round":"5","Races":[{"season":"2021","round":"5","url":"https://en.wikipedia.org/wiki/2021_Monaco_Grand_Prix","raceName":"Monaco
+ Grand Prix","Circuit":{"circuitId":"monaco","url":"https://en.wikipedia.org/wiki/Circuit_de_Monaco","circuitName":"Circuit
+ de Monaco","Location":{"lat":"43.7347","long":"7.42056","locality":"Monte-Carlo","country":"Monaco"}},"date":"2021-05-23","time":"13:00:00Z","Laps":[{"number":"66","Timings":[{"driverId":"sainz","position":"2","time":"1:15.561"},{"driverId":"norris","position":"3","time":"1:16.038"},{"driverId":"perez","position":"4","time":"1:15.789"},{"driverId":"vettel","position":"5","time":"1:15.744"},{"driverId":"gasly","position":"6","time":"1:15.761"},{"driverId":"hamilton","position":"7","time":"1:15.261"},{"driverId":"stroll","position":"8","time":"1:16.087"},{"driverId":"ocon","position":"9","time":"1:20.526"},{"driverId":"giovinazzi","position":"10","time":"1:19.104"},{"driverId":"raikkonen","position":"11","time":"1:18.290"},{"driverId":"ricciardo","position":"12","time":"1:17.475"},{"driverId":"alonso","position":"13","time":"1:16.195"},{"driverId":"russell","position":"14","time":"1:15.855"},{"driverId":"latifi","position":"15","time":"1:15.573"},{"driverId":"tsunoda","position":"16","time":"1:14.037"},{"driverId":"mazepin","position":"17","time":"1:17.107"},{"driverId":"mick_schumacher","position":"18","time":"1:21.412"}]},{"number":"67","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:15.035"},{"driverId":"sainz","position":"2","time":"1:15.356"},{"driverId":"norris","position":"3","time":"1:15.572"},{"driverId":"perez","position":"4","time":"1:15.982"},{"driverId":"vettel","position":"5","time":"1:15.345"},{"driverId":"gasly","position":"6","time":"1:15.646"},{"driverId":"hamilton","position":"7","time":"1:31.810"},{"driverId":"stroll","position":"8","time":"1:15.373"},{"driverId":"ocon","position":"9","time":"1:17.478"},{"driverId":"giovinazzi","position":"10","time":"1:17.354"},{"driverId":"raikkonen","position":"11","time":"1:17.937"},{"driverId":"ricciardo","position":"12","time":"1:17.762"},{"driverId":"alonso","position":"13","time":"1:15.318"},{"driverId":"russell","position":"14","time":"1:15.861"},{"driverId":"latifi","position":"15","time":"1:15.984"},{"driverId":"tsunoda","position":"16","time":"1:14.077"},{"driverId":"mazepin","position":"17","time":"1:17.105"},{"driverId":"mick_schumacher","position":"18","time":"1:17.582"}]},{"number":"68","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:14.843"},{"driverId":"sainz","position":"2","time":"1:15.397"},{"driverId":"norris","position":"3","time":"1:15.154"},{"driverId":"perez","position":"4","time":"1:15.466"},{"driverId":"vettel","position":"5","time":"1:15.758"},{"driverId":"gasly","position":"6","time":"1:16.034"},{"driverId":"hamilton","position":"7","time":"1:17.137"},{"driverId":"stroll","position":"8","time":"1:15.507"},{"driverId":"ocon","position":"9","time":"1:17.311"},{"driverId":"giovinazzi","position":"10","time":"1:17.200"},{"driverId":"raikkonen","position":"11","time":"1:17.236"},{"driverId":"ricciardo","position":"12","time":"1:17.286"},{"driverId":"alonso","position":"13","time":"1:15.213"},{"driverId":"russell","position":"14","time":"1:16.132"},{"driverId":"latifi","position":"15","time":"1:16.006"},{"driverId":"tsunoda","position":"16","time":"1:15.671"},{"driverId":"mazepin","position":"17","time":"1:20.632"},{"driverId":"mick_schumacher","position":"18","time":"1:16.719"}]},{"number":"69","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:14.836"},{"driverId":"sainz","position":"2","time":"1:15.261"},{"driverId":"norris","position":"3","time":"1:15.381"},{"driverId":"perez","position":"4","time":"1:15.453"},{"driverId":"vettel","position":"5","time":"1:15.954"},{"driverId":"gasly","position":"6","time":"1:15.514"},{"driverId":"hamilton","position":"7","time":"1:12.909"},{"driverId":"stroll","position":"8","time":"1:15.862"},{"driverId":"ocon","position":"9","time":"1:16.944"},{"driverId":"giovinazzi","position":"10","time":"1:17.193"},{"driverId":"raikkonen","position":"11","time":"1:17.242"},{"driverId":"ricciardo","position":"12","time":"1:17.332"},{"driverId":"alonso","position":"13","time":"1:15.667"},{"driverId":"russell","position":"14","time":"1:16.270"},{"driverId":"latifi","position":"15","time":"1:16.048"},{"driverId":"tsunoda","position":"16","time":"1:16.035"},{"driverId":"mazepin","position":"17","time":"1:17.133"},{"driverId":"mick_schumacher","position":"18","time":"1:16.763"}]},{"number":"70","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:15.321"},{"driverId":"sainz","position":"2","time":"1:15.364"},{"driverId":"norris","position":"3","time":"1:15.575"},{"driverId":"perez","position":"4","time":"1:15.412"},{"driverId":"vettel","position":"5","time":"1:15.930"},{"driverId":"gasly","position":"6","time":"1:15.611"},{"driverId":"hamilton","position":"7","time":"1:13.382"},{"driverId":"stroll","position":"8","time":"1:15.850"},{"driverId":"ocon","position":"9","time":"1:16.935"},{"driverId":"giovinazzi","position":"10","time":"1:16.833"},{"driverId":"raikkonen","position":"11","time":"1:16.919"},{"driverId":"ricciardo","position":"12","time":"1:17.170"},{"driverId":"alonso","position":"13","time":"1:15.026"},{"driverId":"russell","position":"14","time":"1:16.158"},{"driverId":"latifi","position":"15","time":"1:15.961"},{"driverId":"tsunoda","position":"16","time":"1:16.821"},{"driverId":"mazepin","position":"17","time":"1:17.303"},{"driverId":"mick_schumacher","position":"18","time":"1:16.847"}]},{"number":"71","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:15.237"},{"driverId":"sainz","position":"2","time":"1:15.269"},{"driverId":"norris","position":"3","time":"1:15.974"},{"driverId":"perez","position":"4","time":"1:15.613"},{"driverId":"vettel","position":"5","time":"1:15.782"},{"driverId":"gasly","position":"6","time":"1:15.412"},{"driverId":"hamilton","position":"7","time":"1:14.433"},{"driverId":"stroll","position":"8","time":"1:15.604"},{"driverId":"ocon","position":"9","time":"1:16.774"},{"driverId":"giovinazzi","position":"10","time":"1:16.751"},{"driverId":"raikkonen","position":"11","time":"1:16.521"}]}]}]}}}'
+ recorded_at: 2025-08-04 01:49:02
+- request:
+ method: GET
+ uri: https://api.jolpi.ca/ergast/f1/2021/5/laps.json?limit=100&offset=1300
+ response:
+ status: 200
+ headers:
+ Server: nginx/1.28.0
+ Date: Mon, 04 Aug 2025 01:49:03 GMT
+ Content-Type: application/json
+ Transfer-Encoding: chunked
+ Connection: keep-alive
+ Vary: Accept, origin
+ Allow: GET, HEAD, OPTIONS
+ Expires: Mon, 04 Aug 2025 02:49:03 GMT
+ Cache-Control: max-age=3600
+ X-Frame-Options: DENY
+ X-Content-Type-Options: nosniff
+ Referrer-Policy: same-origin
+ Cross-Origin-Opener-Policy: same-origin
+ Content-Encoding: gzip
+ body:
+ string: '{"MRData":{"xmlns":"","series":"f1","url":"https://api.jolpi.ca/ergast/f1/2021/5/laps.json","limit":"100","offset":"1300","total":"1418","RaceTable":{"season":"2021","round":"5","Races":[{"season":"2021","round":"5","url":"https://en.wikipedia.org/wiki/2021_Monaco_Grand_Prix","raceName":"Monaco
+ Grand Prix","Circuit":{"circuitId":"monaco","url":"https://en.wikipedia.org/wiki/Circuit_de_Monaco","circuitName":"Circuit
+ de Monaco","Location":{"lat":"43.7347","long":"7.42056","locality":"Monte-Carlo","country":"Monaco"}},"date":"2021-05-23","time":"13:00:00Z","Laps":[{"number":"71","Timings":[{"driverId":"ricciardo","position":"12","time":"1:16.952"},{"driverId":"alonso","position":"13","time":"1:15.226"},{"driverId":"russell","position":"14","time":"1:15.979"},{"driverId":"latifi","position":"15","time":"1:16.211"},{"driverId":"tsunoda","position":"16","time":"1:17.195"},{"driverId":"mazepin","position":"17","time":"1:17.632"},{"driverId":"mick_schumacher","position":"18","time":"1:16.778"}]},{"number":"72","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:14.942"},{"driverId":"sainz","position":"2","time":"1:14.877"},{"driverId":"norris","position":"3","time":"1:14.795"},{"driverId":"perez","position":"4","time":"1:15.074"},{"driverId":"vettel","position":"5","time":"1:16.009"},{"driverId":"gasly","position":"6","time":"1:15.646"},{"driverId":"hamilton","position":"7","time":"1:15.081"},{"driverId":"stroll","position":"8","time":"1:15.294"},{"driverId":"ocon","position":"9","time":"1:16.994"},{"driverId":"giovinazzi","position":"10","time":"1:17.056"},{"driverId":"raikkonen","position":"11","time":"1:16.897"},{"driverId":"ricciardo","position":"12","time":"1:16.364"},{"driverId":"alonso","position":"13","time":"1:15.422"},{"driverId":"russell","position":"14","time":"1:16.342"},{"driverId":"latifi","position":"15","time":"1:18.702"},{"driverId":"tsunoda","position":"16","time":"1:16.787"},{"driverId":"mazepin","position":"17","time":"1:17.276"},{"driverId":"mick_schumacher","position":"18","time":"1:16.837"}]},{"number":"73","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:15.316"},{"driverId":"sainz","position":"2","time":"1:15.141"},{"driverId":"norris","position":"3","time":"1:15.034"},{"driverId":"perez","position":"4","time":"1:15.167"},{"driverId":"vettel","position":"5","time":"1:16.185"},{"driverId":"gasly","position":"6","time":"1:15.974"},{"driverId":"hamilton","position":"7","time":"1:15.080"},{"driverId":"stroll","position":"8","time":"1:15.565"},{"driverId":"ocon","position":"9","time":"1:16.936"},{"driverId":"giovinazzi","position":"10","time":"1:16.951"},{"driverId":"raikkonen","position":"11","time":"1:17.112"},{"driverId":"ricciardo","position":"12","time":"1:16.987"},{"driverId":"alonso","position":"13","time":"1:16.111"},{"driverId":"russell","position":"14","time":"1:18.826"},{"driverId":"latifi","position":"15","time":"1:16.068"},{"driverId":"tsunoda","position":"16","time":"1:16.159"},{"driverId":"mazepin","position":"17","time":"1:17.252"},{"driverId":"mick_schumacher","position":"18","time":"1:17.064"}]},{"number":"74","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:15.515"},{"driverId":"sainz","position":"2","time":"1:15.760"},{"driverId":"norris","position":"3","time":"1:15.141"},{"driverId":"perez","position":"4","time":"1:15.561"},{"driverId":"vettel","position":"5","time":"1:16.093"},{"driverId":"gasly","position":"6","time":"1:15.888"},{"driverId":"hamilton","position":"7","time":"1:15.323"},{"driverId":"stroll","position":"8","time":"1:14.674"},{"driverId":"ocon","position":"9","time":"1:16.846"},{"driverId":"giovinazzi","position":"10","time":"1:16.880"},{"driverId":"raikkonen","position":"11","time":"1:17.510"},{"driverId":"ricciardo","position":"12","time":"1:17.271"},{"driverId":"alonso","position":"13","time":"1:16.095"},{"driverId":"russell","position":"14","time":"1:17.303"},{"driverId":"latifi","position":"15","time":"1:16.758"},{"driverId":"tsunoda","position":"16","time":"1:17.043"},{"driverId":"mazepin","position":"17","time":"1:17.786"},{"driverId":"mick_schumacher","position":"18","time":"1:17.162"}]},{"number":"75","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:14.909"},{"driverId":"sainz","position":"2","time":"1:15.530"},{"driverId":"norris","position":"3","time":"1:15.032"},{"driverId":"perez","position":"4","time":"1:15.175"},{"driverId":"vettel","position":"5","time":"1:15.911"},{"driverId":"gasly","position":"6","time":"1:15.763"},{"driverId":"hamilton","position":"7","time":"1:16.795"},{"driverId":"stroll","position":"8","time":"1:15.670"},{"driverId":"ocon","position":"9","time":"1:16.895"},{"driverId":"giovinazzi","position":"10","time":"1:16.744"},{"driverId":"raikkonen","position":"11","time":"1:16.273"},{"driverId":"ricciardo","position":"12","time":"1:17.126"},{"driverId":"alonso","position":"13","time":"1:16.601"},{"driverId":"russell","position":"14","time":"1:17.063"},{"driverId":"latifi","position":"15","time":"1:16.815"},{"driverId":"tsunoda","position":"16","time":"1:16.538"},{"driverId":"mazepin","position":"17","time":"1:17.153"},{"driverId":"mick_schumacher","position":"18","time":"1:17.633"}]},{"number":"76","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:15.331"},{"driverId":"sainz","position":"2","time":"1:15.605"},{"driverId":"norris","position":"3","time":"1:14.670"},{"driverId":"perez","position":"4","time":"1:14.905"},{"driverId":"vettel","position":"5","time":"1:15.862"},{"driverId":"gasly","position":"6","time":"1:15.691"},{"driverId":"hamilton","position":"7","time":"1:14.539"},{"driverId":"stroll","position":"8","time":"1:16.392"},{"driverId":"ocon","position":"9","time":"1:16.655"},{"driverId":"giovinazzi","position":"10","time":"1:16.829"},{"driverId":"raikkonen","position":"11","time":"1:16.617"},{"driverId":"ricciardo","position":"12","time":"1:16.732"},{"driverId":"alonso","position":"13","time":"1:16.696"},{"driverId":"russell","position":"14","time":"1:16.585"},{"driverId":"latifi","position":"15","time":"1:16.698"},{"driverId":"tsunoda","position":"16","time":"1:16.575"}]},{"number":"77","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:16.533"},{"driverId":"sainz","position":"2","time":"1:16.139"},{"driverId":"norris","position":"3","time":"1:15.091"},{"driverId":"perez","position":"4","time":"1:14.916"},{"driverId":"vettel","position":"5","time":"1:16.234"}]}]}]}}}'
+ recorded_at: 2025-08-04 01:49:03
+- request:
+ method: GET
+ uri: https://api.jolpi.ca/ergast/f1/2021/5/laps.json?limit=100&offset=1400
+ response:
+ status: 200
+ headers:
+ Server: nginx/1.28.0
+ Date: Mon, 04 Aug 2025 01:49:03 GMT
+ Content-Type: application/json
+ Transfer-Encoding: chunked
+ Connection: keep-alive
+ Vary: Accept, origin
+ Allow: GET, HEAD, OPTIONS
+ Expires: Mon, 04 Aug 2025 02:49:03 GMT
+ Cache-Control: max-age=3600
+ X-Frame-Options: DENY
+ X-Content-Type-Options: nosniff
+ Referrer-Policy: same-origin
+ Cross-Origin-Opener-Policy: same-origin
+ Content-Encoding: gzip
+ body:
+ string: '{"MRData":{"xmlns":"","series":"f1","url":"https://api.jolpi.ca/ergast/f1/2021/5/laps.json","limit":"100","offset":"1400","total":"1418","RaceTable":{"season":"2021","round":"5","Races":[{"season":"2021","round":"5","url":"https://en.wikipedia.org/wiki/2021_Monaco_Grand_Prix","raceName":"Monaco
+ Grand Prix","Circuit":{"circuitId":"monaco","url":"https://en.wikipedia.org/wiki/Circuit_de_Monaco","circuitName":"Circuit
+ de Monaco","Location":{"lat":"43.7347","long":"7.42056","locality":"Monte-Carlo","country":"Monaco"}},"date":"2021-05-23","time":"13:00:00Z","Laps":[{"number":"77","Timings":[{"driverId":"gasly","position":"6","time":"1:15.884"},{"driverId":"hamilton","position":"7","time":"1:16.050"},{"driverId":"stroll","position":"8","time":"1:16.487"},{"driverId":"ocon","position":"9","time":"1:17.581"},{"driverId":"giovinazzi","position":"10","time":"1:17.269"},{"driverId":"raikkonen","position":"11","time":"1:16.864"},{"driverId":"ricciardo","position":"12","time":"1:17.357"},{"driverId":"alonso","position":"13","time":"1:17.070"},{"driverId":"russell","position":"14","time":"1:16.660"},{"driverId":"latifi","position":"15","time":"1:16.748"},{"driverId":"tsunoda","position":"16","time":"1:17.092"}]},{"number":"78","Timings":[{"driverId":"max_verstappen","position":"1","time":"1:16.829"},{"driverId":"sainz","position":"2","time":"1:16.345"},{"driverId":"norris","position":"3","time":"1:16.101"},{"driverId":"perez","position":"4","time":"1:15.307"},{"driverId":"vettel","position":"5","time":"1:17.071"},{"driverId":"gasly","position":"6","time":"1:16.120"},{"driverId":"hamilton","position":"7","time":"1:18.003"}]}]}]}}}'
+ recorded_at: 2025-08-04 01:49:03
+recorded_with: VCR-vcr/2.0.0
diff --git a/tests/testthat/_vcr/load_quali.yml b/tests/testthat/_vcr/load_quali.yml
new file mode 100644
index 00000000..6547750e
--- /dev/null
+++ b/tests/testthat/_vcr/load_quali.yml
@@ -0,0 +1,64 @@
+http_interactions:
+- request:
+ method: GET
+ uri: https://api.jolpi.ca/ergast/f1/2004/1/qualifying.json?limit=40
+ response:
+ status: 200
+ headers:
+ Server: nginx/1.28.0
+ Date: Mon, 04 Aug 2025 01:49:05 GMT
+ Content-Type: application/json
+ Transfer-Encoding: chunked
+ Connection: keep-alive
+ Vary: Accept, origin
+ Allow: GET, HEAD, OPTIONS
+ Expires: Mon, 04 Aug 2025 02:49:05 GMT
+ Cache-Control: max-age=3600
+ X-Frame-Options: DENY
+ X-Content-Type-Options: nosniff
+ Referrer-Policy: same-origin
+ Cross-Origin-Opener-Policy: same-origin
+ Content-Encoding: gzip
+ body:
+ string: '{"MRData":{"xmlns":"","series":"f1","url":"https://api.jolpi.ca/ergast/f1/2004/1/qualifying.json","limit":"40","offset":"0","total":"20","RaceTable":{"season":"2004","round":"1","Races":[{"season":"2004","round":"1","url":"https://en.wikipedia.org/wiki/2004_Australian_Grand_Prix","raceName":"Australian
+ Grand Prix","Circuit":{"circuitId":"albert_park","url":"https://en.wikipedia.org/wiki/Albert_Park_Circuit","circuitName":"Albert
+ Park Grand Prix Circuit","Location":{"lat":"-37.8497","long":"144.968","locality":"Melbourne","country":"Australia"}},"date":"2004-03-07","QualifyingResults":[{"number":"1","position":"1","Driver":{"driverId":"michael_schumacher","code":"MSC","url":"http://en.wikipedia.org/wiki/Michael_Schumacher","givenName":"Michael","familyName":"Schumacher","dateOfBirth":"1969-01-03","nationality":"German"},"Constructor":{"constructorId":"ferrari","url":"http://en.wikipedia.org/wiki/Scuderia_Ferrari","name":"Ferrari","nationality":"Italian"},"Q1":"1:24.408"},{"number":"2","position":"2","Driver":{"driverId":"barrichello","code":"BAR","url":"http://en.wikipedia.org/wiki/Rubens_Barrichello","givenName":"Rubens","familyName":"Barrichello","dateOfBirth":"1972-05-23","nationality":"Brazilian"},"Constructor":{"constructorId":"ferrari","url":"http://en.wikipedia.org/wiki/Scuderia_Ferrari","name":"Ferrari","nationality":"Italian"},"Q1":"1:24.482"},{"number":"3","position":"3","Driver":{"driverId":"montoya","code":"MON","url":"http://en.wikipedia.org/wiki/Juan_Pablo_Montoya","givenName":"Juan","familyName":"Pablo
+ Montoya","dateOfBirth":"1975-09-20","nationality":"Colombian"},"Constructor":{"constructorId":"williams","url":"http://en.wikipedia.org/wiki/Williams_Grand_Prix_Engineering","name":"Williams","nationality":"British"},"Q1":"1:24.998"},{"number":"9","position":"4","Driver":{"driverId":"button","permanentNumber":"22","code":"BUT","url":"http://en.wikipedia.org/wiki/Jenson_Button","givenName":"Jenson","familyName":"Button","dateOfBirth":"1980-01-19","nationality":"British"},"Constructor":{"constructorId":"bar","url":"http://en.wikipedia.org/wiki/British_American_Racing","name":"BAR","nationality":"British"},"Q1":"1:24.998"},{"number":"8","position":"5","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"},"Constructor":{"constructorId":"renault","url":"http://en.wikipedia.org/wiki/Renault_in_Formula_One","name":"Renault","nationality":"French"},"Q1":"1:25.699"},{"number":"14","position":"6","Driver":{"driverId":"webber","code":"WEB","url":"http://en.wikipedia.org/wiki/Mark_Webber_(racing_driver)","givenName":"Mark","familyName":"Webber","dateOfBirth":"1976-08-27","nationality":"Australian"},"Constructor":{"constructorId":"jaguar","url":"http://en.wikipedia.org/wiki/Jaguar_Racing","name":"Jaguar","nationality":"British"},"Q1":"1:25.805"},{"number":"10","position":"7","Driver":{"driverId":"sato","code":"SAT","url":"http://en.wikipedia.org/wiki/Takuma_Sato","givenName":"Takuma","familyName":"Sato","dateOfBirth":"1977-01-28","nationality":"Japanese"},"Constructor":{"constructorId":"bar","url":"http://en.wikipedia.org/wiki/British_American_Racing","name":"BAR","nationality":"British"},"Q1":"1:25.851"},{"number":"4","position":"8","Driver":{"driverId":"ralf_schumacher","code":"SCH","url":"http://en.wikipedia.org/wiki/Ralf_Schumacher","givenName":"Ralf","familyName":"Schumacher","dateOfBirth":"1975-06-30","nationality":"German"},"Constructor":{"constructorId":"williams","url":"http://en.wikipedia.org/wiki/Williams_Grand_Prix_Engineering","name":"Williams","nationality":"British"},"Q1":"1:25.925"},{"number":"7","position":"9","Driver":{"driverId":"trulli","code":"TRU","url":"http://en.wikipedia.org/wiki/Jarno_Trulli","givenName":"Jarno","familyName":"Trulli","dateOfBirth":"1974-07-13","nationality":"Italian"},"Constructor":{"constructorId":"renault","url":"http://en.wikipedia.org/wiki/Renault_in_Formula_One","name":"Renault","nationality":"French"},"Q1":"1:26.290"},{"number":"6","position":"10","Driver":{"driverId":"raikkonen","permanentNumber":"7","code":"RAI","url":"http://en.wikipedia.org/wiki/Kimi_R%C3%A4ikk%C3%B6nen","givenName":"Kimi","familyName":"Räikkönen","dateOfBirth":"1979-10-17","nationality":"Finnish"},"Constructor":{"constructorId":"mclaren","url":"http://en.wikipedia.org/wiki/McLaren","name":"McLaren","nationality":"British"},"Q1":"1:26.297"},{"number":"12","position":"11","Driver":{"driverId":"massa","permanentNumber":"19","code":"MAS","url":"http://en.wikipedia.org/wiki/Felipe_Massa","givenName":"Felipe","familyName":"Massa","dateOfBirth":"1981-04-25","nationality":"Brazilian"},"Constructor":{"constructorId":"sauber","url":"http://en.wikipedia.org/wiki/Sauber_Motorsport","name":"Sauber","nationality":"Swiss"},"Q1":"1:27.065"},{"number":"5","position":"12","Driver":{"driverId":"coulthard","code":"COU","url":"http://en.wikipedia.org/wiki/David_Coulthard","givenName":"David","familyName":"Coulthard","dateOfBirth":"1971-03-27","nationality":"British"},"Constructor":{"constructorId":"mclaren","url":"http://en.wikipedia.org/wiki/McLaren","name":"McLaren","nationality":"British"},"Q1":"1:27.294"},{"number":"16","position":"13","Driver":{"driverId":"matta","url":"http://en.wikipedia.org/wiki/Cristiano_da_Matta","givenName":"Cristiano","familyName":"da
+ Matta","dateOfBirth":"1973-09-19","nationality":"Brazilian"},"Constructor":{"constructorId":"toyota","url":"http://en.wikipedia.org/wiki/Toyota_Racing","name":"Toyota","nationality":"Japanese"},"Q1":"1:27.823"},{"number":"11","position":"14","Driver":{"driverId":"fisichella","code":"FIS","url":"http://en.wikipedia.org/wiki/Giancarlo_Fisichella","givenName":"Giancarlo","familyName":"Fisichella","dateOfBirth":"1973-01-14","nationality":"Italian"},"Constructor":{"constructorId":"sauber","url":"http://en.wikipedia.org/wiki/Sauber_Motorsport","name":"Sauber","nationality":"Swiss"},"Q1":"1:27.845"},{"number":"18","position":"15","Driver":{"driverId":"heidfeld","code":"HEI","url":"http://en.wikipedia.org/wiki/Nick_Heidfeld","givenName":"Nick","familyName":"Heidfeld","dateOfBirth":"1977-05-10","nationality":"German"},"Constructor":{"constructorId":"jordan","url":"http://en.wikipedia.org/wiki/Jordan_Grand_Prix","name":"Jordan","nationality":"Irish"},"Q1":"1:28.178"},{"number":"19","position":"16","Driver":{"driverId":"pantano","url":"http://en.wikipedia.org/wiki/Giorgio_Pantano","givenName":"Giorgio","familyName":"Pantano","dateOfBirth":"1979-02-04","nationality":"Italian"},"Constructor":{"constructorId":"jordan","url":"http://en.wikipedia.org/wiki/Jordan_Grand_Prix","name":"Jordan","nationality":"Irish"},"Q1":"1:30.140"},{"number":"21","position":"17","Driver":{"driverId":"baumgartner","url":"http://en.wikipedia.org/wiki/Zsolt_Baumgartner","givenName":"Zsolt","familyName":"Baumgartner","dateOfBirth":"1981-01-01","nationality":"Hungarian"},"Constructor":{"constructorId":"minardi","url":"http://en.wikipedia.org/wiki/Minardi","name":"Minardi","nationality":"Italian"},"Q1":"1:30.681"},{"number":"17","position":"18","Driver":{"driverId":"panis","url":"http://en.wikipedia.org/wiki/Olivier_Panis","givenName":"Olivier","familyName":"Panis","dateOfBirth":"1966-09-02","nationality":"French"},"Constructor":{"constructorId":"toyota","url":"http://en.wikipedia.org/wiki/Toyota_Racing","name":"Toyota","nationality":"Japanese"},"Q1":""},{"number":"15","position":"19","Driver":{"driverId":"klien","code":"KLI","url":"http://en.wikipedia.org/wiki/Christian_Klien","givenName":"Christian","familyName":"Klien","dateOfBirth":"1983-02-07","nationality":"Austrian"},"Constructor":{"constructorId":"jaguar","url":"http://en.wikipedia.org/wiki/Jaguar_Racing","name":"Jaguar","nationality":"British"},"Q1":""},{"number":"20","position":"20","Driver":{"driverId":"bruni","url":"http://en.wikipedia.org/wiki/Gianmaria_Bruni","givenName":"Gianmaria","familyName":"Bruni","dateOfBirth":"1981-05-30","nationality":"Italian"},"Constructor":{"constructorId":"minardi","url":"http://en.wikipedia.org/wiki/Minardi","name":"Minardi","nationality":"Italian"},"Q1":""}]}]}}}'
+ recorded_at: 2025-08-04 01:49:05
+- request:
+ method: GET
+ uri: https://api.jolpi.ca/ergast/f1/2015/16/qualifying.json?limit=40
+ response:
+ status: 200
+ headers:
+ Server: nginx/1.28.0
+ Date: Mon, 04 Aug 2025 01:49:05 GMT
+ Content-Type: application/json
+ Transfer-Encoding: chunked
+ Connection: keep-alive
+ Vary: Accept, origin
+ Allow: GET, HEAD, OPTIONS
+ Expires: Mon, 04 Aug 2025 02:49:05 GMT
+ Cache-Control: max-age=3600
+ X-Frame-Options: DENY
+ X-Content-Type-Options: nosniff
+ Referrer-Policy: same-origin
+ Cross-Origin-Opener-Policy: same-origin
+ Content-Encoding: gzip
+ body:
+ string: '{"MRData":{"xmlns":"","series":"f1","url":"https://api.jolpi.ca/ergast/f1/2015/16/qualifying.json","limit":"40","offset":"0","total":"20","RaceTable":{"season":"2015","round":"16","Races":[{"season":"2015","round":"16","url":"https://en.wikipedia.org/wiki/2015_United_States_Grand_Prix","raceName":"United
+ States Grand Prix","Circuit":{"circuitId":"americas","url":"https://en.wikipedia.org/wiki/Circuit_of_the_Americas","circuitName":"Circuit
+ of the Americas","Location":{"lat":"30.1328","long":"-97.6411","locality":"Austin","country":"USA"}},"date":"2015-10-25","time":"19:00:00Z","QualifyingResults":[{"number":"6","position":"1","Driver":{"driverId":"rosberg","permanentNumber":"6","code":"ROS","url":"http://en.wikipedia.org/wiki/Nico_Rosberg","givenName":"Nico","familyName":"Rosberg","dateOfBirth":"1985-06-27","nationality":"German"},"Constructor":{"constructorId":"mercedes","url":"http://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_One","name":"Mercedes","nationality":"German"},"Q1":"1:56.671","Q2":"1:56.824"},{"number":"44","position":"2","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"},"Constructor":{"constructorId":"mercedes","url":"http://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_One","name":"Mercedes","nationality":"German"},"Q1":"1:56.871","Q2":"1:56.929"},{"number":"3","position":"3","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"},"Constructor":{"constructorId":"red_bull","url":"http://en.wikipedia.org/wiki/Red_Bull_Racing","name":"Red
+ Bull","nationality":"Austrian"},"Q1":"1:56.495","Q2":"1:57.969"},{"number":"26","position":"4","Driver":{"driverId":"kvyat","permanentNumber":"26","code":"KVY","url":"http://en.wikipedia.org/wiki/Daniil_Kvyat","givenName":"Daniil","familyName":"Kvyat","dateOfBirth":"1994-04-26","nationality":"Russian"},"Constructor":{"constructorId":"red_bull","url":"http://en.wikipedia.org/wiki/Red_Bull_Racing","name":"Red
+ Bull","nationality":"Austrian"},"Q1":"1:57.640","Q2":"1:58.434"},{"number":"5","position":"5","Driver":{"driverId":"vettel","permanentNumber":"5","code":"VET","url":"http://en.wikipedia.org/wiki/Sebastian_Vettel","givenName":"Sebastian","familyName":"Vettel","dateOfBirth":"1987-07-03","nationality":"German"},"Constructor":{"constructorId":"ferrari","url":"http://en.wikipedia.org/wiki/Scuderia_Ferrari","name":"Ferrari","nationality":"Italian"},"Q1":"2:00.950","Q2":"1:58.596"},{"number":"11","position":"6","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"},"Constructor":{"constructorId":"force_india","url":"http://en.wikipedia.org/wiki/Racing_Point_Force_India","name":"Force
+ India","nationality":"Indian"},"Q1":"1:59.264","Q2":"1:59.210"},{"number":"27","position":"7","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"},"Constructor":{"constructorId":"force_india","url":"http://en.wikipedia.org/wiki/Racing_Point_Force_India","name":"Force
+ India","nationality":"Indian"},"Q1":"1:58.325","Q2":"1:59.333"},{"number":"7","position":"8","Driver":{"driverId":"raikkonen","permanentNumber":"7","code":"RAI","url":"http://en.wikipedia.org/wiki/Kimi_R%C3%A4ikk%C3%B6nen","givenName":"Kimi","familyName":"Räikkönen","dateOfBirth":"1979-10-17","nationality":"Finnish"},"Constructor":{"constructorId":"ferrari","url":"http://en.wikipedia.org/wiki/Scuderia_Ferrari","name":"Ferrari","nationality":"Italian"},"Q1":"1:58.198","Q2":"1:59.703"},{"number":"19","position":"9","Driver":{"driverId":"massa","permanentNumber":"19","code":"MAS","url":"http://en.wikipedia.org/wiki/Felipe_Massa","givenName":"Felipe","familyName":"Massa","dateOfBirth":"1981-04-25","nationality":"Brazilian"},"Constructor":{"constructorId":"williams","url":"http://en.wikipedia.org/wiki/Williams_Grand_Prix_Engineering","name":"Williams","nationality":"British"},"Q1":"2:00.902","Q2":"1:59.999"},{"number":"33","position":"10","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"},"Constructor":{"constructorId":"toro_rosso","url":"http://en.wikipedia.org/wiki/Scuderia_Toro_Rosso","name":"Toro
+ Rosso","nationality":"Italian"},"Q1":"1:58.689","Q2":"2:00.199"},{"number":"14","position":"11","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"},"Constructor":{"constructorId":"mclaren","url":"http://en.wikipedia.org/wiki/McLaren","name":"McLaren","nationality":"British"},"Q1":"1:59.704","Q2":"2:00.265"},{"number":"77","position":"12","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"},"Constructor":{"constructorId":"williams","url":"http://en.wikipedia.org/wiki/Williams_Grand_Prix_Engineering","name":"Williams","nationality":"British"},"Q1":"1:59.569","Q2":"2:00.334"},{"number":"8","position":"13","Driver":{"driverId":"grosjean","permanentNumber":"8","code":"GRO","url":"http://en.wikipedia.org/wiki/Romain_Grosjean","givenName":"Romain","familyName":"Grosjean","dateOfBirth":"1986-04-17","nationality":"French"},"Constructor":{"constructorId":"lotus_f1","url":"http://en.wikipedia.org/wiki/Lotus_F1","name":"Lotus
+ F1","nationality":"British"},"Q1":"2:00.236","Q2":"2:00.595"},{"number":"22","position":"14","Driver":{"driverId":"button","permanentNumber":"22","code":"BUT","url":"http://en.wikipedia.org/wiki/Jenson_Button","givenName":"Jenson","familyName":"Button","dateOfBirth":"1980-01-19","nationality":"British"},"Constructor":{"constructorId":"mclaren","url":"http://en.wikipedia.org/wiki/McLaren","name":"McLaren","nationality":"British"},"Q1":"2:00.261","Q2":"2:01.193"},{"number":"13","position":"15","Driver":{"driverId":"maldonado","permanentNumber":"13","code":"MAL","url":"http://en.wikipedia.org/wiki/Pastor_Maldonado","givenName":"Pastor","familyName":"Maldonado","dateOfBirth":"1985-03-09","nationality":"Venezuelan"},"Constructor":{"constructorId":"lotus_f1","url":"http://en.wikipedia.org/wiki/Lotus_F1","name":"Lotus
+ F1","nationality":"British"},"Q1":"2:00.844","Q2":"2:01.604"},{"number":"9","position":"16","Driver":{"driverId":"ericsson","permanentNumber":"9","code":"ERI","url":"http://en.wikipedia.org/wiki/Marcus_Ericsson","givenName":"Marcus","familyName":"Ericsson","dateOfBirth":"1990-09-02","nationality":"Swedish"},"Constructor":{"constructorId":"sauber","url":"http://en.wikipedia.org/wiki/Sauber_Motorsport","name":"Sauber","nationality":"Swiss"},"Q1":"2:02.212"},{"number":"12","position":"17","Driver":{"driverId":"nasr","permanentNumber":"12","code":"NAS","url":"http://en.wikipedia.org/wiki/Felipe_Nasr","givenName":"Felipe","familyName":"Nasr","dateOfBirth":"1992-08-21","nationality":"Brazilian"},"Constructor":{"constructorId":"sauber","url":"http://en.wikipedia.org/wiki/Sauber_Motorsport","name":"Sauber","nationality":"Swiss"},"Q1":"2:03.194"},{"number":"53","position":"18","Driver":{"driverId":"rossi","permanentNumber":"53","code":"RSS","url":"http://en.wikipedia.org/wiki/Alexander_Rossi_%28racing_driver%29","givenName":"Alexander","familyName":"Rossi","dateOfBirth":"1991-09-25","nationality":"American"},"Constructor":{"constructorId":"manor","url":"http://en.wikipedia.org/wiki/Manor_Motorsport","name":"Manor
+ Marussia","nationality":"British"},"Q1":"2:04.176"},{"number":"28","position":"19","Driver":{"driverId":"stevens","permanentNumber":"28","code":"STE","url":"http://en.wikipedia.org/wiki/Will_Stevens","givenName":"Will","familyName":"Stevens","dateOfBirth":"1991-06-28","nationality":"British"},"Constructor":{"constructorId":"manor","url":"http://en.wikipedia.org/wiki/Manor_Motorsport","name":"Manor
+ Marussia","nationality":"British"},"Q1":"2:04.526"},{"number":"55","position":"20","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"},"Constructor":{"constructorId":"toro_rosso","url":"http://en.wikipedia.org/wiki/Scuderia_Toro_Rosso","name":"Toro
+ Rosso","nationality":"Italian"},"Q1":"2:07.304"}]}]}}}'
+ recorded_at: 2025-08-04 01:49:05
+recorded_with: VCR-vcr/2.0.0
diff --git a/tests/testthat/_vcr/load_results.yml b/tests/testthat/_vcr/load_results.yml
new file mode 100644
index 00000000..067e6d6d
--- /dev/null
+++ b/tests/testthat/_vcr/load_results.yml
@@ -0,0 +1,104 @@
+http_interactions:
+- request:
+ method: GET
+ uri: https://api.jolpi.ca/ergast/f1/2003/1/results.json?limit=40
+ response:
+ status: 200
+ headers:
+ Server: nginx/1.28.0
+ Date: Mon, 04 Aug 2025 01:38:33 GMT
+ Content-Type: application/json
+ Transfer-Encoding: chunked
+ Connection: keep-alive
+ Vary: Accept, origin
+ Allow: GET, HEAD, OPTIONS
+ Expires: Mon, 04 Aug 2025 02:38:33 GMT
+ Cache-Control: max-age=3600
+ X-Frame-Options: DENY
+ X-Content-Type-Options: nosniff
+ Referrer-Policy: same-origin
+ Cross-Origin-Opener-Policy: same-origin
+ Content-Encoding: gzip
+ body:
+ string: '{"MRData":{"xmlns":"","series":"f1","url":"https://api.jolpi.ca/ergast/f1/2003/1/results.json","limit":"40","offset":"0","total":"20","RaceTable":{"season":"2003","round":"1","Races":[{"season":"2003","round":"1","url":"https://en.wikipedia.org/wiki/2003_Australian_Grand_Prix","raceName":"Australian
+ Grand Prix","Circuit":{"circuitId":"albert_park","url":"https://en.wikipedia.org/wiki/Albert_Park_Circuit","circuitName":"Albert
+ Park Grand Prix Circuit","Location":{"lat":"-37.8497","long":"144.968","locality":"Melbourne","country":"Australia"}},"date":"2003-03-09","Results":[{"number":"5","position":"1","positionText":"1","points":"10","Driver":{"driverId":"coulthard","code":"COU","url":"http://en.wikipedia.org/wiki/David_Coulthard","givenName":"David","familyName":"Coulthard","dateOfBirth":"1971-03-27","nationality":"British"},"Constructor":{"constructorId":"mclaren","url":"http://en.wikipedia.org/wiki/McLaren","name":"McLaren","nationality":"British"},"grid":"11","laps":"58","status":"Finished","Time":{"millis":"5682100","time":"1:34:42.100"}},{"number":"3","position":"2","positionText":"2","points":"8","Driver":{"driverId":"montoya","code":"MON","url":"http://en.wikipedia.org/wiki/Juan_Pablo_Montoya","givenName":"Juan","familyName":"Pablo
+ Montoya","dateOfBirth":"1975-09-20","nationality":"Colombian"},"Constructor":{"constructorId":"williams","url":"http://en.wikipedia.org/wiki/Williams_Grand_Prix_Engineering","name":"Williams","nationality":"British"},"grid":"3","laps":"58","status":"Finished","Time":{"millis":"5690775","time":"+8.675"}},{"number":"6","position":"3","positionText":"3","points":"6","Driver":{"driverId":"raikkonen","permanentNumber":"7","code":"RAI","url":"http://en.wikipedia.org/wiki/Kimi_R%C3%A4ikk%C3%B6nen","givenName":"Kimi","familyName":"Räikkönen","dateOfBirth":"1979-10-17","nationality":"Finnish"},"Constructor":{"constructorId":"mclaren","url":"http://en.wikipedia.org/wiki/McLaren","name":"McLaren","nationality":"British"},"grid":"15","laps":"58","status":"Finished","Time":{"millis":"5691292","time":"+9.192"}},{"number":"1","position":"4","positionText":"4","points":"5","Driver":{"driverId":"michael_schumacher","code":"MSC","url":"http://en.wikipedia.org/wiki/Michael_Schumacher","givenName":"Michael","familyName":"Schumacher","dateOfBirth":"1969-01-03","nationality":"German"},"Constructor":{"constructorId":"ferrari","url":"http://en.wikipedia.org/wiki/Scuderia_Ferrari","name":"Ferrari","nationality":"Italian"},"grid":"1","laps":"58","status":"Finished","Time":{"millis":"5691582","time":"+9.482"}},{"number":"7","position":"5","positionText":"5","points":"4","Driver":{"driverId":"trulli","code":"TRU","url":"http://en.wikipedia.org/wiki/Jarno_Trulli","givenName":"Jarno","familyName":"Trulli","dateOfBirth":"1974-07-13","nationality":"Italian"},"Constructor":{"constructorId":"renault","url":"http://en.wikipedia.org/wiki/Renault_in_Formula_One","name":"Renault","nationality":"French"},"grid":"12","laps":"58","status":"Finished","Time":{"millis":"5720901","time":"+38.801"}},{"number":"10","position":"6","positionText":"6","points":"3","Driver":{"driverId":"frentzen","url":"http://en.wikipedia.org/wiki/Heinz-Harald_Frentzen","givenName":"Heinz-Harald","familyName":"Frentzen","dateOfBirth":"1967-05-18","nationality":"German"},"Constructor":{"constructorId":"sauber","url":"http://en.wikipedia.org/wiki/Sauber_Motorsport","name":"Sauber","nationality":"Swiss"},"grid":"4","laps":"58","status":"Finished","Time":{"millis":"5726028","time":"+43.928"}},{"number":"8","position":"7","positionText":"7","points":"2","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"},"Constructor":{"constructorId":"renault","url":"http://en.wikipedia.org/wiki/Renault_in_Formula_One","name":"Renault","nationality":"French"},"grid":"10","laps":"58","status":"Finished","Time":{"millis":"5727174","time":"+45.074"}},{"number":"4","position":"8","positionText":"8","points":"1","Driver":{"driverId":"ralf_schumacher","code":"SCH","url":"http://en.wikipedia.org/wiki/Ralf_Schumacher","givenName":"Ralf","familyName":"Schumacher","dateOfBirth":"1975-06-30","nationality":"German"},"Constructor":{"constructorId":"williams","url":"http://en.wikipedia.org/wiki/Williams_Grand_Prix_Engineering","name":"Williams","nationality":"British"},"grid":"9","laps":"58","status":"Finished","Time":{"millis":"5727845","time":"+45.745"}},{"number":"16","position":"9","positionText":"9","points":"0","Driver":{"driverId":"villeneuve","code":"VIL","url":"http://en.wikipedia.org/wiki/Jacques_Villeneuve","givenName":"Jacques","familyName":"Villeneuve","dateOfBirth":"1971-04-09","nationality":"Canadian"},"Constructor":{"constructorId":"bar","url":"http://en.wikipedia.org/wiki/British_American_Racing","name":"BAR","nationality":"British"},"grid":"6","laps":"58","status":"Finished","Time":{"millis":"5747636","time":"+1:05.536"}},{"number":"17","position":"10","positionText":"10","points":"0","Driver":{"driverId":"button","permanentNumber":"22","code":"BUT","url":"http://en.wikipedia.org/wiki/Jenson_Button","givenName":"Jenson","familyName":"Button","dateOfBirth":"1980-01-19","nationality":"British"},"Constructor":{"constructorId":"bar","url":"http://en.wikipedia.org/wiki/British_American_Racing","name":"BAR","nationality":"British"},"grid":"8","laps":"58","status":"Finished","Time":{"millis":"5748074","time":"+1:05.974"}},{"number":"19","position":"11","positionText":"11","points":"0","Driver":{"driverId":"verstappen","url":"http://en.wikipedia.org/wiki/Jos_Verstappen","givenName":"Jos","familyName":"Verstappen","dateOfBirth":"1972-03-04","nationality":"Dutch"},"Constructor":{"constructorId":"minardi","url":"http://en.wikipedia.org/wiki/Minardi","name":"Minardi","nationality":"Italian"},"grid":"20","laps":"57","status":"+1
+ Lap"},{"number":"11","position":"12","positionText":"R","points":"0","Driver":{"driverId":"fisichella","code":"FIS","url":"http://en.wikipedia.org/wiki/Giancarlo_Fisichella","givenName":"Giancarlo","familyName":"Fisichella","dateOfBirth":"1973-01-14","nationality":"Italian"},"Constructor":{"constructorId":"jordan","url":"http://en.wikipedia.org/wiki/Jordan_Grand_Prix","name":"Jordan","nationality":"Irish"},"grid":"13","laps":"52","status":"Gearbox"},{"number":"15","position":"13","positionText":"R","points":"0","Driver":{"driverId":"pizzonia","code":"PIZ","url":"http://en.wikipedia.org/wiki/Ant%C3%B4nio_Pizzonia","givenName":"Antônio","familyName":"Pizzonia","dateOfBirth":"1980-09-11","nationality":"Brazilian"},"Constructor":{"constructorId":"jaguar","url":"http://en.wikipedia.org/wiki/Jaguar_Racing","name":"Jaguar","nationality":"British"},"grid":"18","laps":"52","status":"Suspension"},{"number":"20","position":"14","positionText":"R","points":"0","Driver":{"driverId":"panis","url":"http://en.wikipedia.org/wiki/Olivier_Panis","givenName":"Olivier","familyName":"Panis","dateOfBirth":"1966-09-02","nationality":"French"},"Constructor":{"constructorId":"toyota","url":"http://en.wikipedia.org/wiki/Toyota_Racing","name":"Toyota","nationality":"Japanese"},"grid":"5","laps":"31","status":"Fuel
+ pressure"},{"number":"9","position":"15","positionText":"R","points":"0","Driver":{"driverId":"heidfeld","code":"HEI","url":"http://en.wikipedia.org/wiki/Nick_Heidfeld","givenName":"Nick","familyName":"Heidfeld","dateOfBirth":"1977-05-10","nationality":"German"},"Constructor":{"constructorId":"sauber","url":"http://en.wikipedia.org/wiki/Sauber_Motorsport","name":"Sauber","nationality":"Swiss"},"grid":"7","laps":"20","status":"Suspension"},{"number":"18","position":"16","positionText":"R","points":"0","Driver":{"driverId":"wilson","url":"http://en.wikipedia.org/wiki/Justin_Wilson_(racing_driver)","givenName":"Justin","familyName":"Wilson","dateOfBirth":"1978-07-31","nationality":"British"},"Constructor":{"constructorId":"minardi","url":"http://en.wikipedia.org/wiki/Minardi","name":"Minardi","nationality":"Italian"},"grid":"19","laps":"16","status":"Radiator"},{"number":"14","position":"17","positionText":"R","points":"0","Driver":{"driverId":"webber","code":"WEB","url":"http://en.wikipedia.org/wiki/Mark_Webber_(racing_driver)","givenName":"Mark","familyName":"Webber","dateOfBirth":"1976-08-27","nationality":"Australian"},"Constructor":{"constructorId":"jaguar","url":"http://en.wikipedia.org/wiki/Jaguar_Racing","name":"Jaguar","nationality":"British"},"grid":"14","laps":"15","status":"Suspension"},{"number":"21","position":"18","positionText":"R","points":"0","Driver":{"driverId":"matta","url":"http://en.wikipedia.org/wiki/Cristiano_da_Matta","givenName":"Cristiano","familyName":"da
+ Matta","dateOfBirth":"1973-09-19","nationality":"Brazilian"},"Constructor":{"constructorId":"toyota","url":"http://en.wikipedia.org/wiki/Toyota_Racing","name":"Toyota","nationality":"Japanese"},"grid":"16","laps":"7","status":"Spun
+ off"},{"number":"12","position":"19","positionText":"R","points":"0","Driver":{"driverId":"firman","url":"http://en.wikipedia.org/wiki/Ralph_Firman","givenName":"Ralph","familyName":"Firman","dateOfBirth":"1975-05-20","nationality":"Irish"},"Constructor":{"constructorId":"jordan","url":"http://en.wikipedia.org/wiki/Jordan_Grand_Prix","name":"Jordan","nationality":"Irish"},"grid":"17","laps":"6","status":"Accident"},{"number":"2","position":"20","positionText":"R","points":"0","Driver":{"driverId":"barrichello","code":"BAR","url":"http://en.wikipedia.org/wiki/Rubens_Barrichello","givenName":"Rubens","familyName":"Barrichello","dateOfBirth":"1972-05-23","nationality":"Brazilian"},"Constructor":{"constructorId":"ferrari","url":"http://en.wikipedia.org/wiki/Scuderia_Ferrari","name":"Ferrari","nationality":"Italian"},"grid":"2","laps":"5","status":"Accident"}]}]}}}'
+ recorded_at: 2025-08-04 01:38:33
+- request:
+ method: GET
+ uri: https://api.jolpi.ca/ergast/f1/2025/1/results.json?limit=40
+ response:
+ status: 200
+ headers:
+ Server: nginx/1.28.0
+ Date: Mon, 04 Aug 2025 01:38:34 GMT
+ Content-Type: application/json
+ Transfer-Encoding: chunked
+ Connection: keep-alive
+ Vary: Accept, origin
+ Allow: GET, HEAD, OPTIONS
+ Expires: Mon, 04 Aug 2025 02:38:34 GMT
+ Cache-Control: max-age=3600
+ X-Frame-Options: DENY
+ X-Content-Type-Options: nosniff
+ Referrer-Policy: same-origin
+ Cross-Origin-Opener-Policy: same-origin
+ Content-Encoding: gzip
+ body:
+ string: '{"MRData":{"xmlns":"","series":"f1","url":"https://api.jolpi.ca/ergast/f1/2025/1/results.json","limit":"40","offset":"0","total":"20","RaceTable":{"season":"2025","round":"1","Races":[{"season":"2025","round":"1","url":"https://en.wikipedia.org/wiki/2025_Australian_Grand_Prix","raceName":"Australian
+ Grand Prix","Circuit":{"circuitId":"albert_park","url":"https://en.wikipedia.org/wiki/Albert_Park_Circuit","circuitName":"Albert
+ Park Grand Prix Circuit","Location":{"lat":"-37.8497","long":"144.968","locality":"Melbourne","country":"Australia"}},"date":"2025-03-16","time":"04:00:00Z","Results":[{"number":"4","position":"1","positionText":"1","points":"25","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"},"Constructor":{"constructorId":"mclaren","url":"http://en.wikipedia.org/wiki/McLaren","name":"McLaren","nationality":"British"},"grid":"1","laps":"57","status":"Finished","Time":{"millis":"6126304","time":"1:42:06.304"},"FastestLap":{"rank":"1","lap":"43","Time":{"time":"1:22.167"}}},{"number":"1","position":"2","positionText":"2","points":"18","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"},"Constructor":{"constructorId":"red_bull","url":"http://en.wikipedia.org/wiki/Red_Bull_Racing","name":"Red
+ Bull","nationality":"Austrian"},"grid":"3","laps":"57","status":"Finished","Time":{"millis":"6127199","time":"+0.895"},"FastestLap":{"rank":"3","lap":"43","Time":{"time":"1:23.081"}}},{"number":"63","position":"3","positionText":"3","points":"15","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"},"Constructor":{"constructorId":"mercedes","url":"http://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_One","name":"Mercedes","nationality":"German"},"grid":"4","laps":"57","status":"Finished","Time":{"millis":"6134785","time":"+8.481"},"FastestLap":{"rank":"11","lap":"43","Time":{"time":"1:25.065"}}},{"number":"12","position":"4","positionText":"4","points":"12","Driver":{"driverId":"antonelli","permanentNumber":"12","code":"ANT","url":"https://en.wikipedia.org/wiki/Andrea_Kimi_Antonelli","givenName":"Andrea
+ Kimi","familyName":"Antonelli","dateOfBirth":"2006-08-25","nationality":"Italian"},"Constructor":{"constructorId":"mercedes","url":"http://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_One","name":"Mercedes","nationality":"German"},"grid":"16","laps":"57","status":"Finished","Time":{"millis":"6136439","time":"+10.135"},"FastestLap":{"rank":"9","lap":"43","Time":{"time":"1:24.901"}}},{"number":"23","position":"5","positionText":"5","points":"10","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"},"Constructor":{"constructorId":"williams","url":"http://en.wikipedia.org/wiki/Williams_Grand_Prix_Engineering","name":"Williams","nationality":"British"},"grid":"6","laps":"57","status":"Finished","Time":{"millis":"6139077","time":"+12.773"},"FastestLap":{"rank":"8","lap":"43","Time":{"time":"1:24.597"}}},{"number":"18","position":"6","positionText":"6","points":"8","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"},"Constructor":{"constructorId":"aston_martin","url":"http://en.wikipedia.org/wiki/Aston_Martin_in_Formula_One","name":"Aston
+ Martin","nationality":"British"},"grid":"13","laps":"57","status":"Finished","Time":{"millis":"6143717","time":"+17.413"},"FastestLap":{"rank":"14","lap":"43","Time":{"time":"1:25.538"}}},{"number":"27","position":"7","positionText":"7","points":"6","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"},"Constructor":{"constructorId":"sauber","url":"http://en.wikipedia.org/wiki/Sauber_Motorsport","name":"Sauber","nationality":"Swiss"},"grid":"17","laps":"57","status":"Finished","Time":{"millis":"6144727","time":"+18.423"},"FastestLap":{"rank":"12","lap":"43","Time":{"time":"1:25.243"}}},{"number":"16","position":"8","positionText":"8","points":"4","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"},"Constructor":{"constructorId":"ferrari","url":"http://en.wikipedia.org/wiki/Scuderia_Ferrari","name":"Ferrari","nationality":"Italian"},"grid":"7","laps":"57","status":"Finished","Time":{"millis":"6146130","time":"+19.826"},"FastestLap":{"rank":"13","lap":"43","Time":{"time":"1:25.271"}}},{"number":"81","position":"9","positionText":"9","points":"2","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"},"Constructor":{"constructorId":"mclaren","url":"http://en.wikipedia.org/wiki/McLaren","name":"McLaren","nationality":"British"},"grid":"2","laps":"57","status":"Finished","Time":{"millis":"6146752","time":"+20.448"},"FastestLap":{"rank":"4","lap":"43","Time":{"time":"1:23.242"}}},{"number":"44","position":"10","positionText":"10","points":"1","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"},"Constructor":{"constructorId":"ferrari","url":"http://en.wikipedia.org/wiki/Scuderia_Ferrari","name":"Ferrari","nationality":"Italian"},"grid":"8","laps":"57","status":"Finished","Time":{"millis":"6148777","time":"+22.473"},"FastestLap":{"rank":"7","lap":"43","Time":{"time":"1:24.218"}}},{"number":"10","position":"11","positionText":"11","points":"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"},"Constructor":{"constructorId":"alpine","url":"http://en.wikipedia.org/wiki/Alpine_F1_Team","name":"Alpine
+ F1 Team","nationality":"French"},"grid":"9","laps":"57","status":"Finished","Time":{"millis":"6152806","time":"+26.502"},"FastestLap":{"rank":"10","lap":"43","Time":{"time":"1:25.020"}}},{"number":"22","position":"12","positionText":"12","points":"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"},"Constructor":{"constructorId":"rb","url":"http://en.wikipedia.org/wiki/RB_Formula_One_Team","name":"RB
+ F1 Team","nationality":"Italian"},"grid":"5","laps":"57","status":"Finished","Time":{"millis":"6156188","time":"+29.884"},"FastestLap":{"rank":"6","lap":"43","Time":{"time":"1:24.194"}}},{"number":"31","position":"13","positionText":"13","points":"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"},"Constructor":{"constructorId":"haas","url":"http://en.wikipedia.org/wiki/Haas_F1_Team","name":"Haas
+ F1 Team","nationality":"American"},"grid":"19","laps":"57","status":"Finished","Time":{"millis":"6159465","time":"+33.161"},"FastestLap":{"rank":"15","lap":"42","Time":{"time":"1:26.764"}}},{"number":"87","position":"14","positionText":"14","points":"0","Driver":{"driverId":"bearman","permanentNumber":"87","code":"BEA","url":"http://en.wikipedia.org/wiki/Oliver_Bearman","givenName":"Oliver","familyName":"Bearman","dateOfBirth":"2005-05-08","nationality":"British"},"Constructor":{"constructorId":"haas","url":"http://en.wikipedia.org/wiki/Haas_F1_Team","name":"Haas
+ F1 Team","nationality":"American"},"grid":"20","laps":"57","status":"Finished","Time":{"millis":"6166655","time":"+40.351"},"FastestLap":{"rank":"16","lap":"42","Time":{"time":"1:27.603"}}},{"number":"30","position":"15","positionText":"R","points":"0","Driver":{"driverId":"lawson","permanentNumber":"30","code":"LAW","url":"http://en.wikipedia.org/wiki/Liam_Lawson","givenName":"Liam","familyName":"Lawson","dateOfBirth":"2002-02-11","nationality":"New
+ Zealander"},"Constructor":{"constructorId":"red_bull","url":"http://en.wikipedia.org/wiki/Red_Bull_Racing","name":"Red
+ Bull","nationality":"Austrian"},"grid":"18","laps":"46","status":"Retired","FastestLap":{"rank":"2","lap":"43","Time":{"time":"1:22.970"}}},{"number":"5","position":"16","positionText":"R","points":"0","Driver":{"driverId":"bortoleto","permanentNumber":"5","code":"BOR","url":"https://en.wikipedia.org/wiki/Gabriel_Bortoleto","givenName":"Gabriel","familyName":"Bortoleto","dateOfBirth":"2004-10-14","nationality":"Brazilian"},"Constructor":{"constructorId":"sauber","url":"http://en.wikipedia.org/wiki/Sauber_Motorsport","name":"Sauber","nationality":"Swiss"},"grid":"15","laps":"45","status":"Retired","FastestLap":{"rank":"5","lap":"43","Time":{"time":"1:24.192"}}},{"number":"14","position":"17","positionText":"R","points":"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"},"Constructor":{"constructorId":"aston_martin","url":"http://en.wikipedia.org/wiki/Aston_Martin_in_Formula_One","name":"Aston
+ Martin","nationality":"British"},"grid":"12","laps":"32","status":"Retired","FastestLap":{"rank":"17","lap":"32","Time":{"time":"1:28.819"}}},{"number":"55","position":"18","positionText":"R","points":"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"},"Constructor":{"constructorId":"williams","url":"http://en.wikipedia.org/wiki/Williams_Grand_Prix_Engineering","name":"Williams","nationality":"British"},"grid":"10","laps":"0","status":"Retired"},{"number":"7","position":"19","positionText":"R","points":"0","Driver":{"driverId":"doohan","permanentNumber":"7","code":"DOO","url":"http://en.wikipedia.org/wiki/Jack_Doohan","givenName":"Jack","familyName":"Doohan","dateOfBirth":"2003-01-20","nationality":"Australian"},"Constructor":{"constructorId":"alpine","url":"http://en.wikipedia.org/wiki/Alpine_F1_Team","name":"Alpine
+ F1 Team","nationality":"French"},"grid":"14","laps":"0","status":"Retired"},{"number":"6","position":"20","positionText":"R","points":"0","Driver":{"driverId":"hadjar","permanentNumber":"6","code":"HAD","url":"https://en.wikipedia.org/wiki/Isack_Hadjar","givenName":"Isack","familyName":"Hadjar","dateOfBirth":"2004-09-28","nationality":"French"},"Constructor":{"constructorId":"rb","url":"http://en.wikipedia.org/wiki/RB_Formula_One_Team","name":"RB
+ F1 Team","nationality":"Italian"},"grid":"11","laps":"0","status":"Retired"}]}]}}}'
+ recorded_at: 2025-08-04 01:38:34
+- request:
+ method: GET
+ uri: https://api.jolpi.ca/ergast/f1/2021/12/results.json?limit=40
+ response:
+ status: 200
+ headers:
+ Server: nginx/1.28.0
+ Date: Mon, 04 Aug 2025 01:38:34 GMT
+ Content-Type: application/json
+ Transfer-Encoding: chunked
+ Connection: keep-alive
+ Vary: Accept, origin
+ Allow: GET, HEAD, OPTIONS
+ Expires: Mon, 04 Aug 2025 02:38:34 GMT
+ Cache-Control: max-age=3600
+ X-Frame-Options: DENY
+ X-Content-Type-Options: nosniff
+ Referrer-Policy: same-origin
+ Cross-Origin-Opener-Policy: same-origin
+ Content-Encoding: gzip
+ body:
+ string: '{"MRData":{"xmlns":"","series":"f1","url":"https://api.jolpi.ca/ergast/f1/2021/12/results.json","limit":"40","offset":"0","total":"20","RaceTable":{"season":"2021","round":"12","Races":[{"season":"2021","round":"12","url":"https://en.wikipedia.org/wiki/2021_Belgian_Grand_Prix","raceName":"Belgian
+ Grand Prix","Circuit":{"circuitId":"spa","url":"https://en.wikipedia.org/wiki/Circuit_de_Spa-Francorchamps","circuitName":"Circuit
+ de Spa-Francorchamps","Location":{"lat":"50.4372","long":"5.97139","locality":"Spa","country":"Belgium"}},"date":"2021-08-29","time":"13:00:00Z","Results":[{"number":"33","position":"1","positionText":"1","points":"12.5","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"},"Constructor":{"constructorId":"red_bull","url":"http://en.wikipedia.org/wiki/Red_Bull_Racing","name":"Red
+ Bull","nationality":"Austrian"},"grid":"1","laps":"1","status":"Finished","Time":{"millis":"207071","time":"3:27.071"}},{"number":"63","position":"2","positionText":"2","points":"9","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"},"Constructor":{"constructorId":"williams","url":"http://en.wikipedia.org/wiki/Williams_Grand_Prix_Engineering","name":"Williams","nationality":"British"},"grid":"2","laps":"1","status":"Finished","Time":{"millis":"209066","time":"+1.995"}},{"number":"44","position":"3","positionText":"3","points":"7.5","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"},"Constructor":{"constructorId":"mercedes","url":"http://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_One","name":"Mercedes","nationality":"German"},"grid":"3","laps":"1","status":"Finished","Time":{"millis":"209672","time":"+2.601"}},{"number":"3","position":"4","positionText":"4","points":"6","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"},"Constructor":{"constructorId":"mclaren","url":"http://en.wikipedia.org/wiki/McLaren","name":"McLaren","nationality":"British"},"grid":"4","laps":"1","status":"Finished","Time":{"millis":"211567","time":"+4.496"}},{"number":"5","position":"5","positionText":"5","points":"5","Driver":{"driverId":"vettel","permanentNumber":"5","code":"VET","url":"http://en.wikipedia.org/wiki/Sebastian_Vettel","givenName":"Sebastian","familyName":"Vettel","dateOfBirth":"1987-07-03","nationality":"German"},"Constructor":{"constructorId":"aston_martin","url":"http://en.wikipedia.org/wiki/Aston_Martin_in_Formula_One","name":"Aston
+ Martin","nationality":"British"},"grid":"5","laps":"1","status":"Finished","Time":{"millis":"214550","time":"+7.479"}},{"number":"10","position":"6","positionText":"6","points":"4","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"},"Constructor":{"constructorId":"alphatauri","url":"http://en.wikipedia.org/wiki/Scuderia_AlphaTauri","name":"AlphaTauri","nationality":"Italian"},"grid":"6","laps":"1","status":"Finished","Time":{"millis":"217248","time":"+10.177"}},{"number":"31","position":"7","positionText":"7","points":"3","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"},"Constructor":{"constructorId":"alpine","url":"http://en.wikipedia.org/wiki/Alpine_F1_Team","name":"Alpine
+ F1 Team","nationality":"French"},"grid":"8","laps":"1","status":"Finished","Time":{"millis":"218650","time":"+11.579"}},{"number":"16","position":"8","positionText":"8","points":"2","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"},"Constructor":{"constructorId":"ferrari","url":"http://en.wikipedia.org/wiki/Scuderia_Ferrari","name":"Ferrari","nationality":"Italian"},"grid":"9","laps":"1","status":"Finished","Time":{"millis":"219679","time":"+12.608"}},{"number":"6","position":"9","positionText":"9","points":"1","Driver":{"driverId":"latifi","permanentNumber":"6","code":"LAT","url":"http://en.wikipedia.org/wiki/Nicholas_Latifi","givenName":"Nicholas","familyName":"Latifi","dateOfBirth":"1995-06-29","nationality":"Canadian"},"Constructor":{"constructorId":"williams","url":"http://en.wikipedia.org/wiki/Williams_Grand_Prix_Engineering","name":"Williams","nationality":"British"},"grid":"10","laps":"1","status":"Finished","Time":{"millis":"222556","time":"+15.485"}},{"number":"55","position":"10","positionText":"10","points":"0.5","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"},"Constructor":{"constructorId":"ferrari","url":"http://en.wikipedia.org/wiki/Scuderia_Ferrari","name":"Ferrari","nationality":"Italian"},"grid":"11","laps":"1","status":"Finished","Time":{"millis":"223237","time":"+16.166"}},{"number":"14","position":"11","positionText":"11","points":"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"},"Constructor":{"constructorId":"alpine","url":"http://en.wikipedia.org/wiki/Alpine_F1_Team","name":"Alpine
+ F1 Team","nationality":"French"},"grid":"12","laps":"1","status":"Finished","Time":{"millis":"227661","time":"+20.590"}},{"number":"77","position":"12","positionText":"12","points":"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"},"Constructor":{"constructorId":"mercedes","url":"http://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_One","name":"Mercedes","nationality":"German"},"grid":"13","laps":"1","status":"Finished","Time":{"millis":"229485","time":"+22.414"}},{"number":"99","position":"13","positionText":"13","points":"0","Driver":{"driverId":"giovinazzi","permanentNumber":"99","code":"GIO","url":"http://en.wikipedia.org/wiki/Antonio_Giovinazzi","givenName":"Antonio","familyName":"Giovinazzi","dateOfBirth":"1993-12-14","nationality":"Italian"},"Constructor":{"constructorId":"alfa","url":"http://en.wikipedia.org/wiki/Alfa_Romeo_in_Formula_One","name":"Alfa
+ Romeo","nationality":"Swiss"},"grid":"14","laps":"1","status":"Finished","Time":{"millis":"231234","time":"+24.163"}},{"number":"4","position":"14","positionText":"14","points":"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"},"Constructor":{"constructorId":"mclaren","url":"http://en.wikipedia.org/wiki/McLaren","name":"McLaren","nationality":"British"},"grid":"15","laps":"1","status":"Finished","Time":{"millis":"234181","time":"+27.110"}},{"number":"22","position":"15","positionText":"15","points":"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"},"Constructor":{"constructorId":"alphatauri","url":"http://en.wikipedia.org/wiki/Scuderia_AlphaTauri","name":"AlphaTauri","nationality":"Italian"},"grid":"16","laps":"1","status":"Finished","Time":{"millis":"235400","time":"+28.329"}},{"number":"47","position":"16","positionText":"16","points":"0","Driver":{"driverId":"mick_schumacher","permanentNumber":"47","code":"MSC","url":"http://en.wikipedia.org/wiki/Mick_Schumacher","givenName":"Mick","familyName":"Schumacher","dateOfBirth":"1999-03-22","nationality":"German"},"Constructor":{"constructorId":"haas","url":"http://en.wikipedia.org/wiki/Haas_F1_Team","name":"Haas
+ F1 Team","nationality":"American"},"grid":"17","laps":"1","status":"Finished","Time":{"millis":"236578","time":"+29.507"}},{"number":"9","position":"17","positionText":"17","points":"0","Driver":{"driverId":"mazepin","permanentNumber":"9","code":"MAZ","url":"http://en.wikipedia.org/wiki/Nikita_Mazepin","givenName":"Nikita","familyName":"Mazepin","dateOfBirth":"1999-03-02","nationality":"Russian"},"Constructor":{"constructorId":"haas","url":"http://en.wikipedia.org/wiki/Haas_F1_Team","name":"Haas
+ F1 Team","nationality":"American"},"grid":"18","laps":"1","status":"Finished","Time":{"millis":"239064","time":"+31.993"}},{"number":"7","position":"18","positionText":"18","points":"0","Driver":{"driverId":"raikkonen","permanentNumber":"7","code":"RAI","url":"http://en.wikipedia.org/wiki/Kimi_R%C3%A4ikk%C3%B6nen","givenName":"Kimi","familyName":"Räikkönen","dateOfBirth":"1979-10-17","nationality":"Finnish"},"Constructor":{"constructorId":"alfa","url":"http://en.wikipedia.org/wiki/Alfa_Romeo_in_Formula_One","name":"Alfa
+ Romeo","nationality":"Swiss"},"grid":"0","laps":"1","status":"Finished","Time":{"millis":"243125","time":"+36.054"}},{"number":"11","position":"19","positionText":"19","points":"0","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"},"Constructor":{"constructorId":"red_bull","url":"http://en.wikipedia.org/wiki/Red_Bull_Racing","name":"Red
+ Bull","nationality":"Austrian"},"grid":"0","laps":"1","status":"Finished","Time":{"millis":"245276","time":"+38.205"}},{"number":"18","position":"20","positionText":"20","points":"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"},"Constructor":{"constructorId":"aston_martin","url":"http://en.wikipedia.org/wiki/Aston_Martin_in_Formula_One","name":"Aston
+ Martin","nationality":"British"},"grid":"19","laps":"1","status":"Finished","Time":{"millis":"251179","time":"+44.108"}}]}]}}}'
+ recorded_at: 2025-08-04 01:38:34
+recorded_with: VCR-vcr/2.0.0
diff --git a/tests/testthat/_vcr/load_schedule.yml b/tests/testthat/_vcr/load_schedule.yml
new file mode 100644
index 00000000..6278cd4f
--- /dev/null
+++ b/tests/testthat/_vcr/load_schedule.yml
@@ -0,0 +1,124 @@
+http_interactions:
+- request:
+ method: GET
+ uri: https://api.jolpi.ca/ergast/f1/1999.json?limit=40
+ response:
+ status: 200
+ headers:
+ Server: nginx/1.28.0
+ Date: Mon, 04 Aug 2025 01:38:35 GMT
+ Content-Type: application/json
+ Transfer-Encoding: chunked
+ Connection: keep-alive
+ Vary: Accept, origin
+ Allow: GET, HEAD, OPTIONS
+ Expires: Mon, 04 Aug 2025 02:38:35 GMT
+ Cache-Control: max-age=3600
+ X-Frame-Options: DENY
+ X-Content-Type-Options: nosniff
+ Referrer-Policy: same-origin
+ Cross-Origin-Opener-Policy: same-origin
+ Content-Encoding: gzip
+ body:
+ string: '{"MRData":{"xmlns":"","series":"f1","url":"https://api.jolpi.ca/ergast/f1/1999.json","limit":"40","offset":"0","total":"16","RaceTable":{"season":"1999","Races":[{"season":"1999","round":"1","url":"https://en.wikipedia.org/wiki/1999_Australian_Grand_Prix","raceName":"Australian
+ Grand Prix","Circuit":{"circuitId":"albert_park","url":"https://en.wikipedia.org/wiki/Albert_Park_Circuit","circuitName":"Albert
+ Park Grand Prix Circuit","Location":{"lat":"-37.8497","long":"144.968","locality":"Melbourne","country":"Australia"}},"date":"1999-03-07"},{"season":"1999","round":"2","url":"https://en.wikipedia.org/wiki/1999_Brazilian_Grand_Prix","raceName":"Brazilian
+ Grand Prix","Circuit":{"circuitId":"interlagos","url":"https://en.wikipedia.org/wiki/Interlagos_Circuit","circuitName":"Autódromo
+ José Carlos Pace","Location":{"lat":"-23.7036","long":"-46.6997","locality":"São
+ Paulo","country":"Brazil"}},"date":"1999-04-11"},{"season":"1999","round":"3","url":"https://en.wikipedia.org/wiki/1999_San_Marino_Grand_Prix","raceName":"San
+ Marino Grand Prix","Circuit":{"circuitId":"imola","url":"https://en.wikipedia.org/wiki/Imola_Circuit","circuitName":"Autodromo
+ Enzo e Dino Ferrari","Location":{"lat":"44.3439","long":"11.7167","locality":"Imola","country":"Italy"}},"date":"1999-05-02"},{"season":"1999","round":"4","url":"https://en.wikipedia.org/wiki/1999_Monaco_Grand_Prix","raceName":"Monaco
+ Grand Prix","Circuit":{"circuitId":"monaco","url":"https://en.wikipedia.org/wiki/Circuit_de_Monaco","circuitName":"Circuit
+ de Monaco","Location":{"lat":"43.7347","long":"7.42056","locality":"Monte-Carlo","country":"Monaco"}},"date":"1999-05-16"},{"season":"1999","round":"5","url":"https://en.wikipedia.org/wiki/1999_Spanish_Grand_Prix","raceName":"Spanish
+ Grand Prix","Circuit":{"circuitId":"catalunya","url":"https://en.wikipedia.org/wiki/Circuit_de_Barcelona-Catalunya","circuitName":"Circuit
+ de Barcelona-Catalunya","Location":{"lat":"41.57","long":"2.26111","locality":"Montmeló","country":"Spain"}},"date":"1999-05-30"},{"season":"1999","round":"6","url":"https://en.wikipedia.org/wiki/1999_Canadian_Grand_Prix","raceName":"Canadian
+ Grand Prix","Circuit":{"circuitId":"villeneuve","url":"https://en.wikipedia.org/wiki/Circuit_Gilles_Villeneuve","circuitName":"Circuit
+ Gilles Villeneuve","Location":{"lat":"45.5","long":"-73.5228","locality":"Montreal","country":"Canada"}},"date":"1999-06-13"},{"season":"1999","round":"7","url":"https://en.wikipedia.org/wiki/1999_French_Grand_Prix","raceName":"French
+ Grand Prix","Circuit":{"circuitId":"magny_cours","url":"https://en.wikipedia.org/wiki/Circuit_de_Nevers_Magny-Cours","circuitName":"Circuit
+ de Nevers Magny-Cours","Location":{"lat":"46.8642","long":"3.16361","locality":"Magny
+ Cours","country":"France"}},"date":"1999-06-27"},{"season":"1999","round":"8","url":"https://en.wikipedia.org/wiki/1999_British_Grand_Prix","raceName":"British
+ Grand Prix","Circuit":{"circuitId":"silverstone","url":"https://en.wikipedia.org/wiki/Silverstone_Circuit","circuitName":"Silverstone
+ Circuit","Location":{"lat":"52.0786","long":"-1.01694","locality":"Silverstone","country":"UK"}},"date":"1999-07-11"},{"season":"1999","round":"9","url":"https://en.wikipedia.org/wiki/1999_Austrian_Grand_Prix","raceName":"Austrian
+ Grand Prix","Circuit":{"circuitId":"red_bull_ring","url":"https://en.wikipedia.org/wiki/Red_Bull_Ring","circuitName":"Red
+ Bull Ring","Location":{"lat":"47.2197","long":"14.7647","locality":"Spielberg","country":"Austria"}},"date":"1999-07-25"},{"season":"1999","round":"10","url":"https://en.wikipedia.org/wiki/1999_German_Grand_Prix","raceName":"German
+ Grand Prix","Circuit":{"circuitId":"hockenheimring","url":"https://en.wikipedia.org/wiki/Hockenheimring","circuitName":"Hockenheimring","Location":{"lat":"49.3278","long":"8.56583","locality":"Hockenheim","country":"Germany"}},"date":"1999-08-01"},{"season":"1999","round":"11","url":"https://en.wikipedia.org/wiki/1999_Hungarian_Grand_Prix","raceName":"Hungarian
+ Grand Prix","Circuit":{"circuitId":"hungaroring","url":"https://en.wikipedia.org/wiki/Hungaroring","circuitName":"Hungaroring","Location":{"lat":"47.5789","long":"19.2486","locality":"Budapest","country":"Hungary"}},"date":"1999-08-15"},{"season":"1999","round":"12","url":"https://en.wikipedia.org/wiki/1999_Belgian_Grand_Prix","raceName":"Belgian
+ Grand Prix","Circuit":{"circuitId":"spa","url":"https://en.wikipedia.org/wiki/Circuit_de_Spa-Francorchamps","circuitName":"Circuit
+ de Spa-Francorchamps","Location":{"lat":"50.4372","long":"5.97139","locality":"Spa","country":"Belgium"}},"date":"1999-08-29"},{"season":"1999","round":"13","url":"https://en.wikipedia.org/wiki/1999_Italian_Grand_Prix","raceName":"Italian
+ Grand Prix","Circuit":{"circuitId":"monza","url":"https://en.wikipedia.org/wiki/Monza_Circuit","circuitName":"Autodromo
+ Nazionale di Monza","Location":{"lat":"45.6156","long":"9.28111","locality":"Monza","country":"Italy"}},"date":"1999-09-12"},{"season":"1999","round":"14","url":"https://en.wikipedia.org/wiki/1999_European_Grand_Prix","raceName":"European
+ Grand Prix","Circuit":{"circuitId":"nurburgring","url":"https://en.wikipedia.org/wiki/N%C3%BCrburgring","circuitName":"Nürburgring","Location":{"lat":"50.3356","long":"6.9475","locality":"Nürburg","country":"Germany"}},"date":"1999-09-26"},{"season":"1999","round":"15","url":"https://en.wikipedia.org/wiki/1999_Malaysian_Grand_Prix","raceName":"Malaysian
+ Grand Prix","Circuit":{"circuitId":"sepang","url":"https://en.wikipedia.org/wiki/Sepang_International_Circuit","circuitName":"Sepang
+ International Circuit","Location":{"lat":"2.76083","long":"101.738","locality":"Kuala
+ Lumpur","country":"Malaysia"}},"date":"1999-10-17"},{"season":"1999","round":"16","url":"https://en.wikipedia.org/wiki/1999_Japanese_Grand_Prix","raceName":"Japanese
+ Grand Prix","Circuit":{"circuitId":"suzuka","url":"https://en.wikipedia.org/wiki/Suzuka_International_Racing_Course","circuitName":"Suzuka
+ Circuit","Location":{"lat":"34.8431","long":"136.541","locality":"Suzuka","country":"Japan"}},"date":"1999-10-31"}]}}}'
+ recorded_at: 2025-08-04 01:38:35
+- request:
+ method: GET
+ uri: https://api.jolpi.ca/ergast/f1/2018.json?limit=40
+ response:
+ status: 200
+ headers:
+ Server: nginx/1.28.0
+ Date: Mon, 04 Aug 2025 01:38:36 GMT
+ Content-Type: application/json
+ Transfer-Encoding: chunked
+ Connection: keep-alive
+ Vary: Accept, origin
+ Allow: GET, HEAD, OPTIONS
+ Expires: Mon, 04 Aug 2025 02:38:36 GMT
+ Cache-Control: max-age=3600
+ X-Frame-Options: DENY
+ X-Content-Type-Options: nosniff
+ Referrer-Policy: same-origin
+ Cross-Origin-Opener-Policy: same-origin
+ Content-Encoding: gzip
+ body:
+ string: '{"MRData":{"xmlns":"","series":"f1","url":"https://api.jolpi.ca/ergast/f1/2018.json","limit":"40","offset":"0","total":"21","RaceTable":{"season":"2018","Races":[{"season":"2018","round":"1","url":"https://en.wikipedia.org/wiki/2018_Australian_Grand_Prix","raceName":"Australian
+ Grand Prix","Circuit":{"circuitId":"albert_park","url":"https://en.wikipedia.org/wiki/Albert_Park_Circuit","circuitName":"Albert
+ Park Grand Prix Circuit","Location":{"lat":"-37.8497","long":"144.968","locality":"Melbourne","country":"Australia"}},"date":"2018-03-25","time":"05:10:00Z","FirstPractice":{"date":"2018-03-23"},"SecondPractice":{"date":"2018-03-23"},"ThirdPractice":{"date":"2018-03-24"},"Qualifying":{"date":"2018-03-24"}},{"season":"2018","round":"2","url":"https://en.wikipedia.org/wiki/2018_Bahrain_Grand_Prix","raceName":"Bahrain
+ Grand Prix","Circuit":{"circuitId":"bahrain","url":"https://en.wikipedia.org/wiki/Bahrain_International_Circuit","circuitName":"Bahrain
+ International Circuit","Location":{"lat":"26.0325","long":"50.5106","locality":"Sakhir","country":"Bahrain"}},"date":"2018-04-08","time":"15:10:00Z","FirstPractice":{"date":"2018-04-06"},"SecondPractice":{"date":"2018-04-06"},"ThirdPractice":{"date":"2018-04-07"},"Qualifying":{"date":"2018-04-07"}},{"season":"2018","round":"3","url":"https://en.wikipedia.org/wiki/2018_Chinese_Grand_Prix","raceName":"Chinese
+ Grand Prix","Circuit":{"circuitId":"shanghai","url":"https://en.wikipedia.org/wiki/Shanghai_International_Circuit","circuitName":"Shanghai
+ International Circuit","Location":{"lat":"31.3389","long":"121.22","locality":"Shanghai","country":"China"}},"date":"2018-04-15","time":"06:10:00Z","FirstPractice":{"date":"2018-04-13"},"SecondPractice":{"date":"2018-04-13"},"ThirdPractice":{"date":"2018-04-14"},"Qualifying":{"date":"2018-04-14"}},{"season":"2018","round":"4","url":"https://en.wikipedia.org/wiki/2018_Azerbaijan_Grand_Prix","raceName":"Azerbaijan
+ Grand Prix","Circuit":{"circuitId":"baku","url":"https://en.wikipedia.org/wiki/Baku_City_Circuit","circuitName":"Baku
+ City Circuit","Location":{"lat":"40.3725","long":"49.8533","locality":"Baku","country":"Azerbaijan"}},"date":"2018-04-29","time":"12:10:00Z","FirstPractice":{"date":"2018-04-27"},"SecondPractice":{"date":"2018-04-27"},"ThirdPractice":{"date":"2018-04-28"},"Qualifying":{"date":"2018-04-28"}},{"season":"2018","round":"5","url":"https://en.wikipedia.org/wiki/2018_Spanish_Grand_Prix","raceName":"Spanish
+ Grand Prix","Circuit":{"circuitId":"catalunya","url":"https://en.wikipedia.org/wiki/Circuit_de_Barcelona-Catalunya","circuitName":"Circuit
+ de Barcelona-Catalunya","Location":{"lat":"41.57","long":"2.26111","locality":"Montmeló","country":"Spain"}},"date":"2018-05-13","time":"13:10:00Z","FirstPractice":{"date":"2018-05-11"},"SecondPractice":{"date":"2018-05-11"},"ThirdPractice":{"date":"2018-05-12"},"Qualifying":{"date":"2018-05-12"}},{"season":"2018","round":"6","url":"https://en.wikipedia.org/wiki/2018_Monaco_Grand_Prix","raceName":"Monaco
+ Grand Prix","Circuit":{"circuitId":"monaco","url":"https://en.wikipedia.org/wiki/Circuit_de_Monaco","circuitName":"Circuit
+ de Monaco","Location":{"lat":"43.7347","long":"7.42056","locality":"Monte-Carlo","country":"Monaco"}},"date":"2018-05-27","time":"13:10:00Z","FirstPractice":{"date":"2018-05-24"},"SecondPractice":{"date":"2018-05-24"},"ThirdPractice":{"date":"2018-05-26"},"Qualifying":{"date":"2018-05-26"}},{"season":"2018","round":"7","url":"https://en.wikipedia.org/wiki/2018_Canadian_Grand_Prix","raceName":"Canadian
+ Grand Prix","Circuit":{"circuitId":"villeneuve","url":"https://en.wikipedia.org/wiki/Circuit_Gilles_Villeneuve","circuitName":"Circuit
+ Gilles Villeneuve","Location":{"lat":"45.5","long":"-73.5228","locality":"Montreal","country":"Canada"}},"date":"2018-06-10","time":"18:10:00Z","FirstPractice":{"date":"2018-06-08"},"SecondPractice":{"date":"2018-06-08"},"ThirdPractice":{"date":"2018-06-09"},"Qualifying":{"date":"2018-06-09"}},{"season":"2018","round":"8","url":"https://en.wikipedia.org/wiki/2018_French_Grand_Prix","raceName":"French
+ Grand Prix","Circuit":{"circuitId":"ricard","url":"https://en.wikipedia.org/wiki/Circuit_Paul_Ricard","circuitName":"Circuit
+ Paul Ricard","Location":{"lat":"43.2506","long":"5.79167","locality":"Le Castellet","country":"France"}},"date":"2018-06-24","time":"14:10:00Z","FirstPractice":{"date":"2018-06-22"},"SecondPractice":{"date":"2018-06-22"},"ThirdPractice":{"date":"2018-06-23"},"Qualifying":{"date":"2018-06-23"}},{"season":"2018","round":"9","url":"https://en.wikipedia.org/wiki/2018_Austrian_Grand_Prix","raceName":"Austrian
+ Grand Prix","Circuit":{"circuitId":"red_bull_ring","url":"https://en.wikipedia.org/wiki/Red_Bull_Ring","circuitName":"Red
+ Bull Ring","Location":{"lat":"47.2197","long":"14.7647","locality":"Spielberg","country":"Austria"}},"date":"2018-07-01","time":"13:10:00Z","FirstPractice":{"date":"2018-06-29"},"SecondPractice":{"date":"2018-06-29"},"ThirdPractice":{"date":"2018-06-30"},"Qualifying":{"date":"2018-06-30"}},{"season":"2018","round":"10","url":"https://en.wikipedia.org/wiki/2018_British_Grand_Prix","raceName":"British
+ Grand Prix","Circuit":{"circuitId":"silverstone","url":"https://en.wikipedia.org/wiki/Silverstone_Circuit","circuitName":"Silverstone
+ Circuit","Location":{"lat":"52.0786","long":"-1.01694","locality":"Silverstone","country":"UK"}},"date":"2018-07-08","time":"13:10:00Z","FirstPractice":{"date":"2018-07-06"},"SecondPractice":{"date":"2018-07-06"},"ThirdPractice":{"date":"2018-07-07"},"Qualifying":{"date":"2018-07-07"}},{"season":"2018","round":"11","url":"https://en.wikipedia.org/wiki/2018_German_Grand_Prix","raceName":"German
+ Grand Prix","Circuit":{"circuitId":"hockenheimring","url":"https://en.wikipedia.org/wiki/Hockenheimring","circuitName":"Hockenheimring","Location":{"lat":"49.3278","long":"8.56583","locality":"Hockenheim","country":"Germany"}},"date":"2018-07-22","time":"13:10:00Z","FirstPractice":{"date":"2018-07-20"},"SecondPractice":{"date":"2018-07-20"},"ThirdPractice":{"date":"2018-07-21"},"Qualifying":{"date":"2018-07-21"}},{"season":"2018","round":"12","url":"https://en.wikipedia.org/wiki/2018_Hungarian_Grand_Prix","raceName":"Hungarian
+ Grand Prix","Circuit":{"circuitId":"hungaroring","url":"https://en.wikipedia.org/wiki/Hungaroring","circuitName":"Hungaroring","Location":{"lat":"47.5789","long":"19.2486","locality":"Budapest","country":"Hungary"}},"date":"2018-07-29","time":"13:10:00Z","FirstPractice":{"date":"2018-07-27"},"SecondPractice":{"date":"2018-07-27"},"ThirdPractice":{"date":"2018-07-28"},"Qualifying":{"date":"2018-07-28"}},{"season":"2018","round":"13","url":"https://en.wikipedia.org/wiki/2018_Belgian_Grand_Prix","raceName":"Belgian
+ Grand Prix","Circuit":{"circuitId":"spa","url":"https://en.wikipedia.org/wiki/Circuit_de_Spa-Francorchamps","circuitName":"Circuit
+ de Spa-Francorchamps","Location":{"lat":"50.4372","long":"5.97139","locality":"Spa","country":"Belgium"}},"date":"2018-08-26","time":"13:10:00Z","FirstPractice":{"date":"2018-08-24"},"SecondPractice":{"date":"2018-08-24"},"ThirdPractice":{"date":"2018-08-25"},"Qualifying":{"date":"2018-08-25"}},{"season":"2018","round":"14","url":"https://en.wikipedia.org/wiki/2018_Italian_Grand_Prix","raceName":"Italian
+ Grand Prix","Circuit":{"circuitId":"monza","url":"https://en.wikipedia.org/wiki/Monza_Circuit","circuitName":"Autodromo
+ Nazionale di Monza","Location":{"lat":"45.6156","long":"9.28111","locality":"Monza","country":"Italy"}},"date":"2018-09-02","time":"13:10:00Z","FirstPractice":{"date":"2018-08-31"},"SecondPractice":{"date":"2018-08-31"},"ThirdPractice":{"date":"2018-09-01"},"Qualifying":{"date":"2018-09-01"}},{"season":"2018","round":"15","url":"https://en.wikipedia.org/wiki/2018_Singapore_Grand_Prix","raceName":"Singapore
+ Grand Prix","Circuit":{"circuitId":"marina_bay","url":"https://en.wikipedia.org/wiki/Marina_Bay_Street_Circuit","circuitName":"Marina
+ Bay Street Circuit","Location":{"lat":"1.2914","long":"103.864","locality":"Marina
+ Bay","country":"Singapore"}},"date":"2018-09-16","time":"12:10:00Z","FirstPractice":{"date":"2018-09-14"},"SecondPractice":{"date":"2018-09-14"},"ThirdPractice":{"date":"2018-09-15"},"Qualifying":{"date":"2018-09-15"}},{"season":"2018","round":"16","url":"https://en.wikipedia.org/wiki/2018_Russian_Grand_Prix","raceName":"Russian
+ Grand Prix","Circuit":{"circuitId":"sochi","url":"https://en.wikipedia.org/wiki/Sochi_Autodrom","circuitName":"Sochi
+ Autodrom","Location":{"lat":"43.4057","long":"39.9578","locality":"Sochi","country":"Russia"}},"date":"2018-09-30","time":"11:10:00Z","FirstPractice":{"date":"2018-09-28"},"SecondPractice":{"date":"2018-09-28"},"ThirdPractice":{"date":"2018-09-29"},"Qualifying":{"date":"2018-09-29"}},{"season":"2018","round":"17","url":"https://en.wikipedia.org/wiki/2018_Japanese_Grand_Prix","raceName":"Japanese
+ Grand Prix","Circuit":{"circuitId":"suzuka","url":"https://en.wikipedia.org/wiki/Suzuka_International_Racing_Course","circuitName":"Suzuka
+ Circuit","Location":{"lat":"34.8431","long":"136.541","locality":"Suzuka","country":"Japan"}},"date":"2018-10-07","time":"05:10:00Z","FirstPractice":{"date":"2018-10-05"},"SecondPractice":{"date":"2018-10-05"},"ThirdPractice":{"date":"2018-10-06"},"Qualifying":{"date":"2018-10-06"}},{"season":"2018","round":"18","url":"https://en.wikipedia.org/wiki/2018_United_States_Grand_Prix","raceName":"United
+ States Grand Prix","Circuit":{"circuitId":"americas","url":"https://en.wikipedia.org/wiki/Circuit_of_the_Americas","circuitName":"Circuit
+ of the Americas","Location":{"lat":"30.1328","long":"-97.6411","locality":"Austin","country":"USA"}},"date":"2018-10-21","time":"18:10:00Z","FirstPractice":{"date":"2018-10-19"},"SecondPractice":{"date":"2018-10-19"},"ThirdPractice":{"date":"2018-10-20"},"Qualifying":{"date":"2018-10-20"}},{"season":"2018","round":"19","url":"https://en.wikipedia.org/wiki/2018_Mexican_Grand_Prix","raceName":"Mexican
+ Grand Prix","Circuit":{"circuitId":"rodriguez","url":"https://en.wikipedia.org/wiki/Aut%C3%B3dromo_Hermanos_Rodr%C3%ADguez","circuitName":"Autódromo
+ Hermanos Rodríguez","Location":{"lat":"19.4042","long":"-99.0907","locality":"Mexico
+ City","country":"Mexico"}},"date":"2018-10-28","time":"19:10:00Z","FirstPractice":{"date":"2018-10-26"},"SecondPractice":{"date":"2018-10-26"},"ThirdPractice":{"date":"2018-10-27"},"Qualifying":{"date":"2018-10-27"}},{"season":"2018","round":"20","url":"https://en.wikipedia.org/wiki/2018_Brazilian_Grand_Prix","raceName":"Brazilian
+ Grand Prix","Circuit":{"circuitId":"interlagos","url":"https://en.wikipedia.org/wiki/Interlagos_Circuit","circuitName":"Autódromo
+ José Carlos Pace","Location":{"lat":"-23.7036","long":"-46.6997","locality":"São
+ Paulo","country":"Brazil"}},"date":"2018-11-11","time":"17:10:00Z","FirstPractice":{"date":"2018-11-09"},"SecondPractice":{"date":"2018-11-09"},"ThirdPractice":{"date":"2018-11-10"},"Qualifying":{"date":"2018-11-10"}},{"season":"2018","round":"21","url":"https://en.wikipedia.org/wiki/2018_Abu_Dhabi_Grand_Prix","raceName":"Abu
+ Dhabi Grand Prix","Circuit":{"circuitId":"yas_marina","url":"https://en.wikipedia.org/wiki/Yas_Marina_Circuit","circuitName":"Yas
+ Marina Circuit","Location":{"lat":"24.4672","long":"54.6031","locality":"Abu
+ Dhabi","country":"UAE"}},"date":"2018-11-25","time":"13:10:00Z","FirstPractice":{"date":"2018-11-23"},"SecondPractice":{"date":"2018-11-23"},"ThirdPractice":{"date":"2018-11-24"},"Qualifying":{"date":"2018-11-24"}}]}}}'
+ recorded_at: 2025-08-04 01:38:36
+recorded_with: VCR-vcr/2.0.0
diff --git a/tests/testthat/_vcr/load_sprint.yml b/tests/testthat/_vcr/load_sprint.yml
new file mode 100644
index 00000000..a59b9aaf
--- /dev/null
+++ b/tests/testthat/_vcr/load_sprint.yml
@@ -0,0 +1,62 @@
+http_interactions:
+- request:
+ method: GET
+ uri: https://api.jolpi.ca/ergast/f1/2025/2/sprint.json?limit=40
+ response:
+ status: 200
+ headers:
+ Server: nginx/1.28.0
+ Date: Mon, 04 Aug 2025 01:39:22 GMT
+ Content-Type: application/json
+ Transfer-Encoding: chunked
+ Connection: keep-alive
+ Vary: Accept, origin
+ Allow: GET, HEAD, OPTIONS
+ Expires: Mon, 04 Aug 2025 02:39:22 GMT
+ Cache-Control: max-age=3600
+ X-Frame-Options: DENY
+ X-Content-Type-Options: nosniff
+ Referrer-Policy: same-origin
+ Cross-Origin-Opener-Policy: same-origin
+ Content-Encoding: gzip
+ body:
+ string: '{"MRData":{"xmlns":"","series":"f1","url":"https://api.jolpi.ca/ergast/f1/2025/2/sprint.json","limit":"40","offset":"0","total":"20","RaceTable":{"season":"2025","round":"2","Races":[{"season":"2025","round":"2","url":"https://en.wikipedia.org/wiki/2025_Chinese_Grand_Prix","raceName":"Chinese
+ Grand Prix","Circuit":{"circuitId":"shanghai","url":"https://en.wikipedia.org/wiki/Shanghai_International_Circuit","circuitName":"Shanghai
+ International Circuit","Location":{"lat":"31.3389","long":"121.22","locality":"Shanghai","country":"China"}},"date":"2025-03-23","time":"07:00:00Z","SprintResults":[{"number":"44","position":"1","positionText":"1","points":"8","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"},"Constructor":{"constructorId":"ferrari","url":"http://en.wikipedia.org/wiki/Scuderia_Ferrari","name":"Ferrari","nationality":"Italian"},"grid":"1","laps":"19","status":"Finished","Time":{"millis":"1839965","time":"30:39.965"},"FastestLap":{"rank":"1","lap":"2","Time":{"time":"1:35.399"}}},{"number":"81","position":"2","positionText":"2","points":"7","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"},"Constructor":{"constructorId":"mclaren","url":"http://en.wikipedia.org/wiki/McLaren","name":"McLaren","nationality":"British"},"grid":"3","laps":"19","status":"Finished","Time":{"millis":"1846854","time":"+6.889"},"FastestLap":{"rank":"4","lap":"7","Time":{"time":"1:35.854"}}},{"number":"1","position":"3","positionText":"3","points":"6","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"},"Constructor":{"constructorId":"red_bull","url":"http://en.wikipedia.org/wiki/Red_Bull_Racing","name":"Red
+ Bull","nationality":"Austrian"},"grid":"2","laps":"19","status":"Finished","Time":{"millis":"1849769","time":"+9.804"},"FastestLap":{"rank":"2","lap":"2","Time":{"time":"1:35.745"}}},{"number":"63","position":"4","positionText":"4","points":"5","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"},"Constructor":{"constructorId":"mercedes","url":"http://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_One","name":"Mercedes","nationality":"German"},"grid":"5","laps":"19","status":"Finished","Time":{"millis":"1851557","time":"+11.592"},"FastestLap":{"rank":"5","lap":"4","Time":{"time":"1:35.891"}}},{"number":"16","position":"5","positionText":"5","points":"4","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"},"Constructor":{"constructorId":"ferrari","url":"http://en.wikipedia.org/wiki/Scuderia_Ferrari","name":"Ferrari","nationality":"Italian"},"grid":"4","laps":"19","status":"Finished","Time":{"millis":"1852155","time":"+12.190"},"FastestLap":{"rank":"6","lap":"4","Time":{"time":"1:36.255"}}},{"number":"22","position":"6","positionText":"6","points":"3","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"},"Constructor":{"constructorId":"rb","url":"http://en.wikipedia.org/wiki/RB_Formula_One_Team","name":"RB
+ F1 Team","nationality":"Italian"},"grid":"8","laps":"19","status":"Finished","Time":{"millis":"1862253","time":"+22.288"},"FastestLap":{"rank":"8","lap":"4","Time":{"time":"1:36.388"}}},{"number":"12","position":"7","positionText":"7","points":"2","Driver":{"driverId":"antonelli","permanentNumber":"12","code":"ANT","url":"https://en.wikipedia.org/wiki/Andrea_Kimi_Antonelli","givenName":"Andrea
+ Kimi","familyName":"Antonelli","dateOfBirth":"2006-08-25","nationality":"Italian"},"Constructor":{"constructorId":"mercedes","url":"http://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_One","name":"Mercedes","nationality":"German"},"grid":"7","laps":"19","status":"Finished","Time":{"millis":"1863003","time":"+23.038"},"FastestLap":{"rank":"7","lap":"5","Time":{"time":"1:36.311"}}},{"number":"4","position":"8","positionText":"8","points":"1","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"},"Constructor":{"constructorId":"mclaren","url":"http://en.wikipedia.org/wiki/McLaren","name":"McLaren","nationality":"British"},"grid":"6","laps":"19","status":"Finished","Time":{"millis":"1863436","time":"+23.471"},"FastestLap":{"rank":"11","lap":"4","Time":{"time":"1:36.708"}}},{"number":"18","position":"9","positionText":"9","points":"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"},"Constructor":{"constructorId":"aston_martin","url":"http://en.wikipedia.org/wiki/Aston_Martin_in_Formula_One","name":"Aston
+ Martin","nationality":"British"},"grid":"10","laps":"19","status":"Finished","Time":{"millis":"1864881","time":"+24.916"},"FastestLap":{"rank":"9","lap":"4","Time":{"time":"1:36.435"}}},{"number":"14","position":"10","positionText":"10","points":"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"},"Constructor":{"constructorId":"aston_martin","url":"http://en.wikipedia.org/wiki/Aston_Martin_in_Formula_One","name":"Aston
+ Martin","nationality":"British"},"grid":"11","laps":"19","status":"Finished","Time":{"millis":"1878183","time":"+38.218"},"FastestLap":{"rank":"12","lap":"8","Time":{"time":"1:37.058"}}},{"number":"23","position":"11","positionText":"11","points":"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"},"Constructor":{"constructorId":"williams","url":"http://en.wikipedia.org/wiki/Williams_Grand_Prix_Engineering","name":"Williams","nationality":"British"},"grid":"9","laps":"19","status":"Finished","Time":{"millis":"1879257","time":"+39.292"},"FastestLap":{"rank":"15","lap":"7","Time":{"time":"1:37.344"}}},{"number":"10","position":"12","positionText":"12","points":"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"},"Constructor":{"constructorId":"alpine","url":"http://en.wikipedia.org/wiki/Alpine_F1_Team","name":"Alpine
+ F1 Team","nationality":"French"},"grid":"17","laps":"19","status":"Finished","Time":{"millis":"1879614","time":"+39.649"},"FastestLap":{"rank":"17","lap":"3","Time":{"time":"1:37.481"}}},{"number":"6","position":"13","positionText":"13","points":"0","Driver":{"driverId":"hadjar","permanentNumber":"6","code":"HAD","url":"https://en.wikipedia.org/wiki/Isack_Hadjar","givenName":"Isack","familyName":"Hadjar","dateOfBirth":"2004-09-28","nationality":"French"},"Constructor":{"constructorId":"rb","url":"http://en.wikipedia.org/wiki/RB_Formula_One_Team","name":"RB
+ F1 Team","nationality":"Italian"},"grid":"15","laps":"19","status":"Finished","Time":{"millis":"1882365","time":"+42.400"},"FastestLap":{"rank":"18","lap":"3","Time":{"time":"1:37.549"}}},{"number":"30","position":"14","positionText":"14","points":"0","Driver":{"driverId":"lawson","permanentNumber":"30","code":"LAW","url":"http://en.wikipedia.org/wiki/Liam_Lawson","givenName":"Liam","familyName":"Lawson","dateOfBirth":"2002-02-11","nationality":"New
+ Zealander"},"Constructor":{"constructorId":"red_bull","url":"http://en.wikipedia.org/wiki/Red_Bull_Racing","name":"Red
+ Bull","nationality":"Austrian"},"grid":"19","laps":"19","status":"Finished","Time":{"millis":"1884869","time":"+44.904"},"FastestLap":{"rank":"14","lap":"4","Time":{"time":"1:37.163"}}},{"number":"87","position":"15","positionText":"15","points":"0","Driver":{"driverId":"bearman","permanentNumber":"87","code":"BEA","url":"http://en.wikipedia.org/wiki/Oliver_Bearman","givenName":"Oliver","familyName":"Bearman","dateOfBirth":"2005-05-08","nationality":"British"},"Constructor":{"constructorId":"haas","url":"http://en.wikipedia.org/wiki/Haas_F1_Team","name":"Haas
+ F1 Team","nationality":"American"},"grid":"12","laps":"19","status":"Finished","Time":{"millis":"1885614","time":"+45.649"},"FastestLap":{"rank":"13","lap":"3","Time":{"time":"1:37.135"}}},{"number":"31","position":"16","positionText":"16","points":"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"},"Constructor":{"constructorId":"haas","url":"http://en.wikipedia.org/wiki/Haas_F1_Team","name":"Haas
+ F1 Team","nationality":"American"},"grid":"18","laps":"19","status":"Finished","Time":{"millis":"1886147","time":"+46.182"},"FastestLap":{"rank":"19","lap":"3","Time":{"time":"1:37.554"}}},{"number":"55","position":"17","positionText":"17","points":"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"},"Constructor":{"constructorId":"williams","url":"http://en.wikipedia.org/wiki/Williams_Grand_Prix_Engineering","name":"Williams","nationality":"British"},"grid":"13","laps":"19","status":"Finished","Time":{"millis":"1891341","time":"+51.376"},"FastestLap":{"rank":"3","lap":"13","Time":{"time":"1:35.819"}}},{"number":"5","position":"18","positionText":"18","points":"0","Driver":{"driverId":"bortoleto","permanentNumber":"5","code":"BOR","url":"https://en.wikipedia.org/wiki/Gabriel_Bortoleto","givenName":"Gabriel","familyName":"Bortoleto","dateOfBirth":"2004-10-14","nationality":"Brazilian"},"Constructor":{"constructorId":"sauber","url":"http://en.wikipedia.org/wiki/Sauber_Motorsport","name":"Sauber","nationality":"Swiss"},"grid":"14","laps":"19","status":"Finished","Time":{"millis":"1893905","time":"+53.940"},"FastestLap":{"rank":"16","lap":"3","Time":{"time":"1:37.475"}}},{"number":"27","position":"19","positionText":"19","points":"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"},"Constructor":{"constructorId":"sauber","url":"http://en.wikipedia.org/wiki/Sauber_Motorsport","name":"Sauber","nationality":"Swiss"},"grid":"20","laps":"19","status":"Finished","Time":{"millis":"1896647","time":"+56.682"},"FastestLap":{"rank":"10","lap":"4","Time":{"time":"1:36.529"}}},{"number":"7","position":"20","positionText":"20","points":"0","Driver":{"driverId":"doohan","permanentNumber":"7","code":"DOO","url":"http://en.wikipedia.org/wiki/Jack_Doohan","givenName":"Jack","familyName":"Doohan","dateOfBirth":"2003-01-20","nationality":"Australian"},"Constructor":{"constructorId":"alpine","url":"http://en.wikipedia.org/wiki/Alpine_F1_Team","name":"Alpine
+ F1 Team","nationality":"French"},"grid":"16","laps":"19","status":"Finished","Time":{"millis":"1910177","time":"+1:10.212"},"FastestLap":{"rank":"20","lap":"3","Time":{"time":"1:37.686"}}}]}]}}}'
+ recorded_at: 2025-08-04 01:39:22
+- request:
+ method: GET
+ uri: https://api.jolpi.ca/ergast/f1/2021/11/sprint.json?limit=40
+ response:
+ status: 200
+ headers:
+ Server: nginx/1.28.0
+ Date: Mon, 04 Aug 2025 01:39:22 GMT
+ Content-Type: application/json
+ Transfer-Encoding: chunked
+ Connection: keep-alive
+ Vary: Accept, origin
+ Allow: GET, HEAD, OPTIONS
+ Expires: Mon, 04 Aug 2025 02:39:22 GMT
+ Cache-Control: max-age=3600
+ X-Frame-Options: DENY
+ X-Content-Type-Options: nosniff
+ Referrer-Policy: same-origin
+ Cross-Origin-Opener-Policy: same-origin
+ Content-Encoding: gzip
+ body:
+ string: '{"MRData":{"xmlns":"","series":"f1","url":"https://api.jolpi.ca/ergast/f1/2021/11/sprint.json","limit":"40","offset":"0","total":"0","RaceTable":{"season":"2021","round":"11","Races":[]}}}'
+ recorded_at: 2025-08-04 01:39:22
+recorded_with: VCR-vcr/2.0.0
diff --git a/tests/testthat/_vcr/load_standings.yml b/tests/testthat/_vcr/load_standings.yml
new file mode 100644
index 00000000..7228c65c
--- /dev/null
+++ b/tests/testthat/_vcr/load_standings.yml
@@ -0,0 +1,30 @@
+http_interactions:
+- request:
+ method: GET
+ uri: https://api.jolpi.ca/ergast/f1/2021/last/constructorStandings.json?limit=40
+ response:
+ status: 200
+ headers:
+ Server: nginx/1.28.0
+ Date: Mon, 04 Aug 2025 01:39:23 GMT
+ Content-Type: application/json
+ Transfer-Encoding: chunked
+ Connection: keep-alive
+ Vary: Accept, origin
+ Allow: GET, HEAD, OPTIONS
+ Expires: Mon, 04 Aug 2025 02:39:23 GMT
+ Cache-Control: max-age=3600
+ X-Frame-Options: DENY
+ X-Content-Type-Options: nosniff
+ Referrer-Policy: same-origin
+ Cross-Origin-Opener-Policy: same-origin
+ Content-Encoding: gzip
+ body:
+ string: '{"MRData":{"xmlns":"","series":"f1","url":"https://api.jolpi.ca/ergast/f1/2021/last/constructorstandings.json","limit":"40","offset":"0","total":"10","StandingsTable":{"season":"2021","round":"22","StandingsLists":[{"season":"2021","round":"22","ConstructorStandings":[{"position":"1","positionText":"1","points":"613.5","wins":"9","Constructor":{"constructorId":"mercedes","url":"http://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_One","name":"Mercedes","nationality":"German"}},{"position":"2","positionText":"2","points":"585.5","wins":"11","Constructor":{"constructorId":"red_bull","url":"http://en.wikipedia.org/wiki/Red_Bull_Racing","name":"Red
+ Bull","nationality":"Austrian"}},{"position":"3","positionText":"3","points":"323.5","wins":"0","Constructor":{"constructorId":"ferrari","url":"http://en.wikipedia.org/wiki/Scuderia_Ferrari","name":"Ferrari","nationality":"Italian"}},{"position":"4","positionText":"4","points":"275","wins":"1","Constructor":{"constructorId":"mclaren","url":"http://en.wikipedia.org/wiki/McLaren","name":"McLaren","nationality":"British"}},{"position":"5","positionText":"5","points":"155","wins":"1","Constructor":{"constructorId":"alpine","url":"http://en.wikipedia.org/wiki/Alpine_F1_Team","name":"Alpine
+ F1 Team","nationality":"French"}},{"position":"6","positionText":"6","points":"142","wins":"0","Constructor":{"constructorId":"alphatauri","url":"http://en.wikipedia.org/wiki/Scuderia_AlphaTauri","name":"AlphaTauri","nationality":"Italian"}},{"position":"7","positionText":"7","points":"77","wins":"0","Constructor":{"constructorId":"aston_martin","url":"http://en.wikipedia.org/wiki/Aston_Martin_in_Formula_One","name":"Aston
+ Martin","nationality":"British"}},{"position":"8","positionText":"8","points":"23","wins":"0","Constructor":{"constructorId":"williams","url":"http://en.wikipedia.org/wiki/Williams_Grand_Prix_Engineering","name":"Williams","nationality":"British"}},{"position":"9","positionText":"9","points":"13","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":"0","wins":"0","Constructor":{"constructorId":"haas","url":"http://en.wikipedia.org/wiki/Haas_F1_Team","name":"Haas
+ F1 Team","nationality":"American"}}]}]}}}'
+ recorded_at: 2025-08-04 01:39:23
+recorded_with: VCR-vcr/2.0.0
diff --git a/tests/testthat/setup.R b/tests/testthat/setup.R
index 1be1171b..7e5ea71c 100644
--- a/tests/testthat/setup.R
+++ b/tests/testthat/setup.R
@@ -6,8 +6,7 @@ skip_if_no_ff1 <- function() {
if (!require("reticulate", quietly = TRUE)) {
testthat::skip("Reticulate unavailable for testing")
}
- have_ff1 <- "fastf1" %in% reticulate::py_list_packages()$package
- if (!have_ff1) {
+ if (!reticulate::py_module_available("fastf1")) {
testthat::skip("fastf1 not available for testing")
}
}
@@ -35,7 +34,7 @@ skip_if_no_py <- function() {
# helper function to skip if jolpica isn't working
skip_if_no_jolpica <- function() {
testthat::skip_if_offline("jolpi.ca") # This will also skip on CRAN
- if (is.null(get_jolpica_content("current/circuits.json?limit=40"))) {
+ if (is.null(get_jolpica_content("current/circuits.json"))) {
testthat::skip("No Jolpica connection available for testing")
}
}
diff --git a/tests/testthat/test-clear_f1_cache.R b/tests/testthat/test-clear_f1_cache.R
index 14f93b2f..6af4fffa 100644
--- a/tests/testthat/test-clear_f1_cache.R
+++ b/tests/testthat/test-clear_f1_cache.R
@@ -5,13 +5,18 @@ test_that("Cache Clearing works for memoised functions to file", {
# Set testing specific parameters - this disposes after the test finishes
if (dir.exists(file.path(tempdir(), "tst_clear_cache"))) {
- unlink(file.path(tempdir(), "tst_clear_cache"), recursive = TRUE, force = TRUE)
+ unlink(
+ file.path(tempdir(), "tst_clear_cache"),
+ recursive = TRUE,
+ force = TRUE
+ )
}
withr::local_file(file.path(tempdir(), "tst_clear_cache"))
dir.create(file.path(tempdir(), "tst_clear_cache"), recursive = TRUE)
withr::local_options(f1dataR.cache = file.path(tempdir(), "tst_clear_cache"))
expect_false(memoise::has_cache(load_schedule)())
+ vcr::local_cassette("clear_cache")
tmp <- load_schedule()
expect_true(memoise::has_cache(load_schedule)())
clear_f1_cache()
@@ -24,6 +29,7 @@ test_that("load_ciruits (off cache) works", {
# Set testing specific parameters - this disposes after the test finishes
change_cache("off", persist = FALSE)
+ vcr::local_cassette("load_cache")
ciruits_2021 <- load_circuits(2021)
expect_equal(nrow(ciruits_2021), 21)
@@ -40,6 +46,7 @@ test_that("load_ciruits (memory cache) works", {
change_cache("memory", persist = TRUE)
expect_equal(getOption("f1dataR.cache"), "memory")
+ vcr::local_cassette("load_cache")
ciruits_2021 <- load_circuits(2021)
expect_equal(nrow(ciruits_2021), 21)
@@ -50,7 +57,10 @@ test_that("load_ciruits (memory cache) works", {
test_that("load_ciruits (bad path cache) works", {
# Set testing specific parameters - this disposes after the test finishes
- expect_error(change_cache("fakedirectory"), "Attempt to set cache to fakedirectory failed*")
+ expect_error(
+ change_cache("fakedirectory"),
+ "Attempt to set cache to fakedirectory failed*"
+ )
})
@@ -61,6 +71,7 @@ test_that("load_ciruits (filesystem cache) works", {
withr::local_options("f1dataR.cache" = NULL)
change_cache(cache = "filesystem")
+ vcr::local_cassette("load_cache")
ciruits_2021 <- load_circuits(2021)
expect_equal(nrow(ciruits_2021), 21)
diff --git a/tests/testthat/test-load_circuit_details.R b/tests/testthat/test-load_circuit_details.R
index 97279506..ecbddcbc 100644
--- a/tests/testthat/test-load_circuit_details.R
+++ b/tests/testthat/test-load_circuit_details.R
@@ -18,7 +18,7 @@ test_that("load circuit details works", {
if (ff1_ver < "3.1") {
expect_error(
circuit_details <- load_circuit_details(2023, "bahrain"),
- "An old version of FastF1 is in use"
+ "Skipping load_race_session as FastF1 is out of date."
)
skip("Skipping load_circuit_details tests as FastF1 is out of date.")
}
diff --git a/tests/testthat/test-load_constructors.R b/tests/testthat/test-load_constructors.R
index e9b07f5a..8f89e4f2 100644
--- a/tests/testthat/test-load_constructors.R
+++ b/tests/testthat/test-load_constructors.R
@@ -14,7 +14,6 @@ test_that("load_constructors works", {
skip_if(is.null(constructors))
expect_equal(ncol(constructors), 3)
- expect_equal(constructors[1, ]$constructor_id, "adams")
expect_true(nrow(unique(constructors)) >= 212)
})
diff --git a/tests/testthat/test-load_driver_telemetry.R b/tests/testthat/test-load_driver_telemetry.R
index 634afbf3..d46506f0 100644
--- a/tests/testthat/test-load_driver_telemetry.R
+++ b/tests/testthat/test-load_driver_telemetry.R
@@ -19,7 +19,7 @@ test_that("driver telemetry", {
if (ff1_ver < "3.1") {
expect_error(
telem <- load_driver_telemetry(season = 2023, round = "Brazil", session = "S", driver = "HAM", laps = "all"),
- "An old version of FastF1 is in use"
+ "Skipping load_race_session as FastF1 is out of date."
)
skip("Skipping load_driver_telemetry tests as FastF1 is out of date.")
}
diff --git a/tests/testthat/test-load_drivers.R b/tests/testthat/test-load_drivers.R
index 2a567977..3dbc2bf7 100644
--- a/tests/testthat/test-load_drivers.R
+++ b/tests/testthat/test-load_drivers.R
@@ -16,6 +16,7 @@ test_that("Drivers Load works", {
expect_equal(drivers_2021$driver_id[2], "bottas")
expect_equal(drivers_2021$code[1], "ALO")
+ vcr::local_cassette("load_drivers")
drivers_1999 <- load_drivers(1999)
expect_equal(nrow(drivers_1999), 24)
expect_equal(drivers_1999$driver_id[1], "alesi")
diff --git a/tests/testthat/test-load_laps.R b/tests/testthat/test-load_laps.R
index be7abde1..be184543 100644
--- a/tests/testthat/test-load_laps.R
+++ b/tests/testthat/test-load_laps.R
@@ -25,6 +25,7 @@ test_that("load_laps works", {
expect_error(load_laps(2021, race = 1))
# 2021 Spa had very few laps
+ vcr::local_cassette("load_laps")
laps_short <- load_laps(2021, 12)
expect_equal(nrow(laps_short), 20)
diff --git a/tests/testthat/test-load_quali.R b/tests/testthat/test-load_quali.R
index 279d5700..47aa2312 100644
--- a/tests/testthat/test-load_quali.R
+++ b/tests/testthat/test-load_quali.R
@@ -17,6 +17,7 @@ test_that("load_quali works", {
expect_equal(quali_2021_1$driver_id[2], "hamilton")
expect_equal(quali_2021_1$position[1], "1")
+ vcr::local_cassette("load_quali")
quali_2004 <- load_quali(2004, 1)
expect_equal(nrow(quali_2004), 20)
expect_equal(quali_2004$driver_id[2], "barrichello")
diff --git a/tests/testthat/test-load_race_session.R b/tests/testthat/test-load_race_session.R
index bbf8758c..6902b4d8 100644
--- a/tests/testthat/test-load_race_session.R
+++ b/tests/testthat/test-load_race_session.R
@@ -20,7 +20,7 @@ test_that("Load Session (file cached) Works", {
if (ff1_ver < "3.1") {
expect_error(
session <- load_race_session(season = 2023, round = 1),
- "An old version of FastF1 is in use"
+ "Skipping load_race_session as FastF1 is out of date."
)
skip("Skipping load_race_session as FastF1 is out of date.")
}
@@ -81,7 +81,7 @@ test_that("Load Session (memory cached) Works", {
if (ff1_ver < "3.1") {
expect_error(
session <- load_race_session(season = 2023, round = 1),
- "An old version of FastF1 is in use"
+ "Skipping load_race_session as FastF1 is out of date."
)
skip("Skipping load_race_session (memory cache) test as FastF1 is out of date.")
}
diff --git a/tests/testthat/test-load_results.R b/tests/testthat/test-load_results.R
index 7c399f02..ffe03fda 100644
--- a/tests/testthat/test-load_results.R
+++ b/tests/testthat/test-load_results.R
@@ -16,7 +16,7 @@ test_that("load_results works", {
expect_equal(nrow(results_2021_1), 20)
expect_equal(results_2021_1$driver_id[4], "norris")
expect_equal(results_2021_1$position[1], "1")
-
+ vcr::local_cassette("load_results")
results_2003 <- load_results(2003, 1)
expect_equal(nrow(results_2003), 20)
expect_equal(results_2003$driver_id[2], "montoya")
@@ -31,7 +31,7 @@ test_that("load_results works", {
expect_equal(ncol(results_2003), ncol(results_2021_12))
expect_equal(ncol(results_2021_1), ncol(results_2021_12))
- expect_error(load_results(3050, 2), "`season` must be between 1950 and *")
+ expect_error(load_results(3050, 2), "`season` must be between 1950 and")
})
test_that("load_results works without internet", {
diff --git a/tests/testthat/test-load_schedule.R b/tests/testthat/test-load_schedule.R
index 87b7adb4..4f93b8d4 100644
--- a/tests/testthat/test-load_schedule.R
+++ b/tests/testthat/test-load_schedule.R
@@ -16,7 +16,7 @@ test_that("load_schedule works", {
expect_equal(nrow(schedule_2021), 22)
expect_equal(schedule_2021$season[1], "2021")
expect_equal(schedule_2021$race_name[2], "Emilia Romagna Grand Prix")
-
+ vcr::local_cassette("load_schedule")
schedule_1999 <- load_schedule(1999)
expect_equal(nrow(schedule_1999), 16)
expect_equal(schedule_1999$circuit_id[1], "albert_park")
diff --git a/tests/testthat/test-load_session_laps.R b/tests/testthat/test-load_session_laps.R
index 40db4bbc..69bbedcf 100644
--- a/tests/testthat/test-load_session_laps.R
+++ b/tests/testthat/test-load_session_laps.R
@@ -18,7 +18,7 @@ test_that("load session laps works", {
if (ff1_ver < "3.1") {
expect_error(
laps <- load_session_laps(season = 2023, round = "bahrain"),
- "An old version of FastF1 is in use"
+ "Skipping load_race_session as FastF1 is out of date."
)
skip("Skipping load_session_laps tests as FastF1 is out of date.")
}
diff --git a/tests/testthat/test-load_sprint.R b/tests/testthat/test-load_sprint.R
index 637a8ef4..2b5c66e8 100644
--- a/tests/testthat/test-load_sprint.R
+++ b/tests/testthat/test-load_sprint.R
@@ -17,6 +17,7 @@ test_that("load_sprint works", {
expect_equal(sprint_2021_10$driver_id[3], "bottas")
expect_equal(sprint_2021_10$position[1], "1")
+ vcr::local_cassette("load_sprint")
sprint_2025_2 <- load_sprint(2025, 2)
expect_equal(nrow(sprint_2025_2), 20)
diff --git a/tests/testthat/test-load_standings.R b/tests/testthat/test-load_standings.R
index 720af0db..042824ec 100644
--- a/tests/testthat/test-load_standings.R
+++ b/tests/testthat/test-load_standings.R
@@ -14,6 +14,7 @@ test_that("load_standings works", {
expect_equal(nrow(standings_2021), 21)
+ vcr::local_cassette("load_standings")
standings_2021_constructor <- load_standings(2021, type = "constructor")
expect_equal(nrow(standings_2021_constructor), 10)
diff --git a/tests/testthat/test-plot_fastest.R b/tests/testthat/test-plot_fastest.R
index 79ef6c80..72979692 100644
--- a/tests/testthat/test-plot_fastest.R
+++ b/tests/testthat/test-plot_fastest.R
@@ -17,8 +17,14 @@ test_that("graphics work", {
# Ensure caught failure if no ggplot2, then skip remainder
if (!require("ggplot2", quietly = TRUE)) {
expect_error(
- plot_fastest(season = 2023, round = 1, session = "R", driver = "HAM", color = "gear"),
- "f1dataR::plot_fastest() requires ggplot2 package installation"
+ plot_fastest(
+ season = 2023,
+ round = 1,
+ session = "R",
+ driver = "HAM",
+ color = "gear"
+ ),
+ "requires ggplot2 package installation"
)
testthat::skip("ggplot2 not available for testing graphics")
}
@@ -28,14 +34,20 @@ test_that("graphics work", {
if (ff1_ver < "3.1") {
expect_error(
session <- load_race_session(season = 2023, round = 1),
- "An old version of FastF1 is in use"
+ "Skipping load_race_session as FastF1 is out of date."
)
skip("Skipping graphics tests as FastF1 is out of date.")
}
# Check deprecation
expect_error(
- plot_fastest(season = 2023, race = 1, session = "R", driver = "HAM", color = "gear"),
+ plot_fastest(
+ season = 2023,
+ race = 1,
+ session = "R",
+ driver = "HAM",
+ color = "gear"
+ ),
"was deprecated in f1dataR"
)
@@ -67,7 +79,10 @@ test_that("correct_track_ratio works", {
)
testthat::skip("ggplot2 not available for testing graphics")
}
- expect_error(correct_track_ratio("bob"), "`trackplot` must be a `ggplot` object")
+ expect_error(
+ correct_track_ratio("bob"),
+ "`trackplot` must be a `ggplot` object"
+ )
})
test_that("graphics works without internet", {
@@ -78,7 +93,11 @@ test_that("graphics works without internet", {
# Note: The test suite can't delete the old fastf1_http_cache.sqlite file
# because python's process has it locked.
if (dir.exists(file.path(tempdir(), "tst_graphics2"))) {
- unlink(file.path(tempdir(), "tst_graphics2"), recursive = TRUE, force = TRUE)
+ unlink(
+ file.path(tempdir(), "tst_graphics2"),
+ recursive = TRUE,
+ force = TRUE
+ )
}
withr::local_file(file.path(tempdir(), "tst_graphics2"))
dir.create(file.path(tempdir(), "tst_graphics2"), recursive = TRUE)
@@ -86,7 +105,9 @@ test_that("graphics works without internet", {
ff1_ver <- get_fastf1_version()
if (ff1_ver < "3.1") {
- skip("Skipping load_circuit_details (no internet) test as FastF1 is out of date.")
+ skip(
+ "Skipping load_circuit_details (no internet) test as FastF1 is out of date."
+ )
}
# if no ggplot2, then skip remainder
if (!require("ggplot2", quietly = TRUE)) {
@@ -101,7 +122,10 @@ test_that("graphics works without internet", {
suppressWarnings({
suppressMessages({
httptest2::without_internet({
- expect_message(plot_fastest(2023, 1, "R", "HAM", "gear"), "f1dataR: Can't connect to F1 Live Timing for FastF1 data download")
+ expect_message(
+ plot_fastest(2023, 1, "R", "HAM", "gear"),
+ "f1dataR: Can't connect to F1 Live Timing for FastF1 data download"
+ )
expect_null(plot_fastest(2023, 1, "R", "HAM", "gear"))
})
})
diff --git a/tests/testthat/test-plotting_style.R b/tests/testthat/test-plotting_style.R
index c1f99459..bff70867 100644
--- a/tests/testthat/test-plotting_style.R
+++ b/tests/testthat/test-plotting_style.R
@@ -6,7 +6,11 @@ test_that("aesthetics works", {
# Note: The test suite can't delete the old fastf1_http_cache.sqlite file
# because python's process has it locked.
if (dir.exists(file.path(tempdir(), "tst_aesthetics"))) {
- unlink(file.path(tempdir(), "tst_aesthetics"), recursive = TRUE, force = TRUE)
+ unlink(
+ file.path(tempdir(), "tst_aesthetics"),
+ recursive = TRUE,
+ force = TRUE
+ )
}
withr::local_file(file.path(tempdir(), "tst_aesthetics"))
dir.create(file.path(tempdir(), "tst_aesthetics"), recursive = TRUE)
@@ -29,32 +33,44 @@ test_that("aesthetics works", {
expect_equal(driver1, driver2)
expect_equal(driver1$driver, "ALO")
- expect_equal(names(driver1), c("linestyle", "marker", "color", "driver", "abbreviation"))
+ expect_equal(
+ names(driver1),
+ c("linestyle", "marker", "color", "driver", "abbreviation")
+ )
- expect_true(grepl("^#[0-9A-Fa-f]{6}$", get_driver_color(driver = "HAM", season = 2024)))
+ expect_true(grepl(
+ "^#[0-9A-Fa-f]{6}$",
+ get_driver_color(driver = "HAM", season = 2024)
+ ))
expect_equal(get_driver_color("HAM", 2024), get_driver_colour("HAM", 2024))
expect_true(grepl("^#[0-9A-Fa-f]{6}$", get_team_color("Red Bull", 2024)))
- expect_equal(get_team_color("Red Bull", 2024), get_team_colour("Red Bull", 2024))
+ expect_equal(
+ get_team_color("Red Bull", 2024),
+ get_team_colour("Red Bull", 2024)
+ )
colormap <- get_driver_color_map(2024, 1)
expect_true(is.data.frame(colormap))
expect_equal(names(colormap), c("abbreviation", "color"))
expect_equal(nrow(colormap), 20)
- expect_error(get_driver_style(c("Lando Norris", "Max Verstappen"), 2024, 1),
+ expect_error(
+ get_driver_style(c("Lando Norris", "Max Verstappen"), 2024, 1),
"`driver` must be a character vector of length one.",
fixed = TRUE
)
expect_error(get_driver_style("q", 2024, 1), "Error running FastF1 code:")
- expect_error(get_driver_color(c("Lando Norris", "Max Verstappen"), 2024, 1),
+ expect_error(
+ get_driver_color(c("Lando Norris", "Max Verstappen"), 2024, 1),
"`driver` must be a character vector of length one.",
fixed = TRUE
)
expect_error(get_driver_color("q", 2024, 1), "Error running FastF1 code:")
- expect_error(get_team_color(c("Red Bull", "Mercedes"), 2024, 1),
+ expect_error(
+ get_team_color(c("Red Bull", "Mercedes"), 2024, 1),
"`team` must be a character vector of length one.",
fixed = TRUE
)
@@ -92,7 +108,10 @@ test_that("lookups works", {
expect_equal(get_team_by_driver("HAM", 2024), "Mercedes")
expect_equal(get_team_name("Merc", 2024), "Mercedes")
expect_equal(get_team_name("Haas", 2024, short = TRUE), "Haas")
- expect_equal(get_drivers_by_team("Mercedes", 2024), c("Lewis Hamilton", "George Russell"))
+ expect_equal(
+ get_drivers_by_team("Mercedes", 2024),
+ c("Lewis Hamilton", "George Russell")
+ )
dt <- get_session_drivers_and_teams(2024, 1)
expect_true(is.data.frame(dt))
@@ -102,39 +121,81 @@ test_that("lookups works", {
expect_equal(
get_tire_compounds(2024),
data.frame(
- compound = c("SOFT", "MEDIUM", "HARD", "INTERMEDIATE", "WET", "UNKNOWN", "TEST-UNKNOWN"),
- color = c("#da291c", "#ffd12e", "#f0f0ec", "#43b02a", "#0067ad", "#00ffff", "#434649")
+ compound = c(
+ "SOFT",
+ "MEDIUM",
+ "HARD",
+ "INTERMEDIATE",
+ "WET",
+ "UNKNOWN",
+ "TEST-UNKNOWN"
+ ),
+ color = c(
+ "#da291c",
+ "#ffd12e",
+ "#f0f0ec",
+ "#43b02a",
+ "#0067ad",
+ "#00ffff",
+ "#434649"
+ )
)
)
- expect_error(get_driver_abbreviation(c("Lewis", "George"), 2024),
+ expect_error(
+ get_driver_abbreviation(c("Lewis", "George"), 2024),
"`driver_name` must be a character vector of length one.",
fixed = TRUE
)
- expect_error(get_driver_name(c("Lewis", "George"), 2024),
+ expect_error(
+ get_driver_name(c("Lewis", "George"), 2024),
"`driver_name` must be a character vector of length one.",
fixed = TRUE
)
- expect_error(get_team_by_driver(c("Lewis", "George"), 2024),
+ expect_error(
+ get_team_by_driver(c("Lewis", "George"), 2024),
"`driver_name` must be a character vector of length one.",
fixed = TRUE
)
- expect_error(get_team_name(c("Merc", "Aston"), 2024),
+ expect_error(
+ get_team_name(c("Merc", "Aston"), 2024),
"`team_name` must be a character vector of length one.",
fixed = TRUE
)
- expect_error(get_team_name("Merc", 2024, short = "yes"),
+ expect_error(
+ get_team_name("Merc", 2024, short = "yes"),
"`short` must be a single logical value.",
fixed = TRUE
)
- expect_error(get_drivers_by_team(c("Merc", "Aston"), 2024),
+ expect_error(
+ get_drivers_by_team(c("Merc", "Aston"), 2024),
"`team_name` must be a character vector of length one.",
fixed = TRUE
)
- expect_error(get_driver_abbreviation("q", 2024), "Error running FastF1 code:", fixed = TRUE)
- expect_error(get_driver_name("q", 2024), "Error running FastF1 code:", fixed = TRUE)
- expect_error(get_team_by_driver("q", 2024), "Error running FastF1 code:", fixed = TRUE)
- expect_error(get_team_name("q", 2024), "Error running FastF1 code:", fixed = TRUE)
- expect_error(get_drivers_by_team("q", 2024), "Error running FastF1 code:", fixed = TRUE)
+ expect_error(
+ get_driver_abbreviation("q", 2024),
+ "Error running FastF1 code:",
+ fixed = TRUE
+ )
+ expect_error(
+ get_driver_name("q", 2024),
+ "Error running FastF1 code:",
+ fixed = TRUE
+ )
+ expect_error(
+ get_team_by_driver("q", 2024),
+ "Error running FastF1 code:",
+ fixed = TRUE
+ )
+ expect_error(
+ get_team_name("q", 2024),
+ "Error running FastF1 code:",
+ fixed = TRUE
+ )
+ expect_error(
+ get_drivers_by_team("q", 2024),
+ "Error running FastF1 code:",
+ fixed = TRUE
+ )
})
diff --git a/tests/testthat/test-utils.R b/tests/testthat/test-utils.R
index f7391bfe..51b1be82 100644
--- a/tests/testthat/test-utils.R
+++ b/tests/testthat/test-utils.R
@@ -12,7 +12,7 @@ test_that("utility functions work", {
expect_gte(get_current_season(), 2022)
# get_jolpica_content() is inherently tested in load_x functions too
- url <- "2022/circuits.json?limit=40"
+ url <- "2022/circuits.json"
expect_warning(get_ergast_content(url), regexp = "was deprecated in f1dataR")
# Test for ergast deprecation
diff --git a/vignettes/introduction.Rmd b/vignettes/introduction.Rmd
index 0c411651..8db71669 100644
--- a/vignettes/introduction.Rmd
+++ b/vignettes/introduction.Rmd
@@ -217,6 +217,3 @@ ggplot(pit_constructor, aes(x = team_name, y = pit_time, fill = team_name)) +
Average time in pits for each team at the 2023 Azerbaijan Grand Prix
- -# Help -If you're having trouble with `fastf1 is not available` errors, please check out the "Setup FastF1 Connection" vignette (`vignette("setup_fastf1", "f1dataR")`). diff --git a/vignettes/introduction.Rmd.orig b/vignettes/introduction.Rmd.orig index 97e1cb6b..3c629a0b 100644 --- a/vignettes/introduction.Rmd.orig +++ b/vignettes/introduction.Rmd.orig @@ -29,7 +29,6 @@ if (dir.exists(file.path(tempdir(), "vignettes", "vig_build_tmp"))) { dir.create(file.path(tempdir(), "vignettes", "vig_build_tmp"), recursive = TRUE) withr::local_options(f1dataR.cache = file.path(tempdir(), "vignettes", "vig_build_tmp")) withr::local_timezone("UTC") -f1dataR::setup_fastf1() ``` ## Basics @@ -180,6 +179,3 @@ ggplot(pit_constructor, aes(x = team_name, y = pit_time, fill = team_name)) + ) + ggtitle("Average time in pit lane for each team", subtitle = "Azerbaijan Grand Prix 2023") ``` - -# Help -If you're having trouble with `fastf1 is not available` errors, please check out the "Setup FastF1 Connection" vignette (`vignette("setup_fastf1", "f1dataR")`). diff --git a/vignettes/setup_fastf1.Rmd b/vignettes/setup_fastf1.Rmd deleted file mode 100644 index 74d1357b..00000000 --- a/vignettes/setup_fastf1.Rmd +++ /dev/null @@ -1,68 +0,0 @@ ---- -title: "Setup FastF1 Connection" -output: rmarkdown::html_vignette -vignette: > - %\VignetteIndexEntry{Setup FastF1 Connection} - %\VignetteEngine{knitr::rmarkdown} - %\VignetteEncoding{UTF-8} ---- - -```{r, include = FALSE} -knitr::opts_chunk$set( - collapse = TRUE, - comment = "#>" -) -``` - -# Introduction - -This vignette briefly describes setting up the `f1dataR` package to work properly with with -the Python package [`FastF1`](https://docs.fastf1.dev/). This guide may help resolve some issues -that might arise when you get the following warning or error messages: - -- `Ensure fastf1 python package is installed. Please run this to install the most recent version: setup_fastf1()` -- `Error in if (get_fastf1_version() < '3.1') { :` - `missing value where TRUE/FALSE needed` - -If these happen to you (particularly if you're a new user of `f1dataR`) read on! - -# `f1dataR`'s Relationship to Python - -At the core of the `f1dataR` package, the connection to the Python package is created -by using [`reticulate`](https://rstudio.github.io/reticulate/). This provides the -connection used to call on Python and return objects to R. However, it has to be -set up properly to work. - -> **_NOTE:_** If you are comfortable with `reticulate`, set up a virtualenv or -condaenv and point reticulate to that with your .RProfile before calling `library(fastf1)`, -and you can skip the rest of this guide. - -# Setting up `reticulate` - -There are a few options to get the `reticulate` set up in a way that works well for -`f1dataR` to use it. - -## Accept all defaults - -To use all of the defaults and set up the `reticulate` package, you can use the below -helper function. - -```r -setup_fastf1() -``` - -This will create a virtual environment using your system's default Python version, -and install `fastf1` in that python environment. It will also tell `reticulate` to use that -environment instead of just running in your main system. Many resources exist online to explain python environments in more detail. - -# Repeat/Recurring Issues - -If you have repeat issues with the package failing to connect to your proper environment, -you can force a complete recreation of the virtual environment by calling: - -```r -setup_fastf1(new_env = TRUE) -``` - -If you've configured the package to use a custom environment name, the above function will require that name supplied as -the `envname` parameter.