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

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.