From ff9d137c71cb4702606a0ebf2069594c0abed90c Mon Sep 17 00:00:00 2001 From: Philip Bulsink Date: Thu, 9 Nov 2023 21:13:41 -0500 Subject: [PATCH 1/5] Added deprecation warn to get_fastf1_version() First step in #198 --- R/utils.R | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/R/utils.R b/R/utils.R index 980d77c1..24dcdb04 100644 --- a/R/utils.R +++ b/R/utils.R @@ -120,14 +120,14 @@ get_fastf1_version <- function() { cli::cli_warn("Ensure {.pkg fastf1} Python package is installed.\nPlease run this to install the most recent version:\n{.code setup_fastf1()}") return(NA) } - if (as.integer(substr(ver, start = 1, 1)) >= 3) { - return(3) - } else if (as.integer(substr(ver, start = 1, 1)) <= 2) { + major <- as.integer(substr(ver, start = 1, stop = 1)) + minor <- as.integer(substr(ver, start = 3, stop = 3)) + if (major < 3) { + lifecycle::deprecate_warn("1.4.1", what = I("fastf1 version < 3.1"), with = I("fastf1 version >= 3.1"), + details = c("Hard deprecation will occur between 2023 and 2024 F1 seasons")) cli::cli_inform("The Python package {.pgk fastf1} was updated to v3 recently.\nPlease update the version on your system by running:\n{.code setup_fastf1(newenv = TRUE)}\nFuture versions of {.pkg f1dataR} may not support {.pkg fastf1<3.0.0}.") - return(2) - } else { - return(NA) } + return(list(major = major, minor = minor)) } # nocov start From 5084232b8d07e42bc4419c05f24fed9e24a5aa38 Mon Sep 17 00:00:00 2001 From: Philip Bulsink Date: Thu, 9 Nov 2023 21:13:55 -0500 Subject: [PATCH 2/5] Updated files with get_fastf1_version() function --- R/clear_f1_cache.R | 2 +- R/load_driver_telemetry.R | 4 ++-- R/load_race_session.R | 2 +- R/load_session_laps.R | 6 +++--- tests/testthat/Rplots.pdf | Bin 0 -> 29352 bytes tests/testthat/test-load_driver_telemetry.R | 4 ++-- tests/testthat/test-load_session_laps.R | 2 +- vignettes/setup_fastf1.Rmd | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) create mode 100644 tests/testthat/Rplots.pdf diff --git a/R/clear_f1_cache.R b/R/clear_f1_cache.R index a904e58f..24b4b890 100644 --- a/R/clear_f1_cache.R +++ b/R/clear_f1_cache.R @@ -18,7 +18,7 @@ clear_f1_cache <- function() { if (reticulate::py_available(initialize = TRUE)) { if ("fastf1" %in% reticulate::py_list_packages()$package) { reticulate::py_run_string("import fastf1") - if (get_fastf1_version() >= 3) { + if (get_fastf1_version()$major >= 3) { try( reticulate::py_run_string(glue::glue("fastf1.Cache.clear_cache('{cache_dir}')", cache_dir = normalizePath(getOption("f1dataR.cache")) diff --git a/R/load_driver_telemetry.R b/R/load_driver_telemetry.R index 07aafc4b..e2c673e2 100644 --- a/R/load_driver_telemetry.R +++ b/R/load_driver_telemetry.R @@ -56,7 +56,7 @@ load_driver_telemetry <- function(season = get_current_season(), round = 1, sess # Param checks if (!(laps %in% c("fastest", "all"))) { if (is.numeric(laps)) { - if (get_fastf1_version() < 3) { + if (get_fastf1_version()$major < 3) { cli::cli_abort("{.var laps} can only be a lap number if using fastf1 v3.0 or higher") } if (as.numeric(laps) != as.integer(laps)) { @@ -80,7 +80,7 @@ load_driver_telemetry <- function(season = get_current_season(), round = 1, sess } ) - if (get_fastf1_version() < 3) { + if (get_fastf1_version()$major < 3) { add_v3_option <- ".add_driver_ahead()" } else { add_v3_option <- "" diff --git a/R/load_race_session.R b/R/load_race_session.R index 604baaeb..bba52062 100644 --- a/R/load_race_session.R +++ b/R/load_race_session.R @@ -69,7 +69,7 @@ load_race_session <- function(obj_name = "session", season = get_current_season( } reticulate::py_run_string("import fastf1") - if (get_fastf1_version() >= 3) { + if (get_fastf1_version()$major >= 3) { reticulate::py_run_string(glue::glue("fastf1.set_log_level('{log_level}')", log_level = log_level)) } diff --git a/R/load_session_laps.R b/R/load_session_laps.R index 5c00bf06..a7e771b5 100644 --- a/R/load_session_laps.R +++ b/R/load_session_laps.R @@ -32,7 +32,7 @@ load_session_laps <- function(season = get_current_season(), round = 1, session round <- race } - if (get_fastf1_version() < 3) { + if (get_fastf1_version()$major < 3) { cli::cli_alert_warning("An old version of FastF1 is in use. Additional data is provided if using FastF1 v3.0.0 or later.") } @@ -60,7 +60,7 @@ load_session_laps <- function(season = get_current_season(), round = 1, session )) } - if (session == "Q" && get_fastf1_version() >= 3) { + if (session == "Q" && get_fastf1_version()$major >= 3) { # prepping for Q1/Q2/Q3 labels - this has to happen before timedelta64 is converted to seconds reticulate::py_run_string(paste("q1, q2, q3 = laps.split_qualifying_sessions()", "q1len = len(q1.index)", @@ -91,7 +91,7 @@ load_session_laps <- function(season = get_current_season(), round = 1, session laps <- laps %>% dplyr::mutate("Time" = .data$Time) - if (session == "Q" && get_fastf1_version() >= 3) { + if (session == "Q" && get_fastf1_version()$major >= 3) { # pull the lengths of each Quali session from the python env. q1len <- reticulate::py_to_r(reticulate::py_get_item(py_env, "q1len")) q2len <- reticulate::py_to_r(reticulate::py_get_item(py_env, "q2len")) diff --git a/tests/testthat/Rplots.pdf b/tests/testthat/Rplots.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8c20a4b0e9a6d8b9d93492f5621c041827eb2e66 GIT binary patch literal 29352 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 twE^P-bV3(fG|(>p=z!X2v nrow(telem_fast)) expect_true(ncol(telem) == ncol(telem_fast)) - if (get_fastf1_version() >= 3) { + if (get_fastf1_version()$major >= 3) { expect_equal(telem_fast$session_time[[1]], 3518.641) expect_equal(telem_fast$time[[2]], 0.086) } # else { @@ -30,7 +30,7 @@ test_that("driver telemetry", { # "can only be a lap number if using fastf1 v3.0 or higher" # ) # } - if (get_fastf1_version() >= 3) { + if (get_fastf1_version()$major >= 3) { telem_lap <- load_driver_telemetry(season = 2022, round = "Brazil", session = "S", driver = "HAM", laps = 1) expect_equal(telem_lap$time[[1]], 0) expect_equal(telem_lap$speed[[1]], 0) diff --git a/tests/testthat/test-load_session_laps.R b/tests/testthat/test-load_session_laps.R index 39b2f8a9..3141f9c1 100644 --- a/tests/testthat/test-load_session_laps.R +++ b/tests/testthat/test-load_session_laps.R @@ -23,7 +23,7 @@ test_that("load session laps works", { expect_equal(laps$time, laps2$time) expect_true(!is.na(laps$time[1])) expect_equal(nrow(laps), nrow(laps2)) - if (get_fastf1_version() >= 3) { + if (get_fastf1_version()$major >= 3) { expect_true(all(lapsq$session_type %in% c("Q1", "Q2", "Q3"))) expect_true(all(c("Q1", "Q2", "Q3") %in% unique(lapsq$session_type))) } diff --git a/vignettes/setup_fastf1.Rmd b/vignettes/setup_fastf1.Rmd index 9f1fa00a..047dc2dc 100644 --- a/vignettes/setup_fastf1.Rmd +++ b/vignettes/setup_fastf1.Rmd @@ -21,7 +21,7 @@ the Python package [`FastF1`](https://docs.fastf1.dev/). This guide may help res 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) { :` +- `Error in if (get_fastf1_version()$major < 3) { :` `missing value where TRUE/FALSE needed` If these happen to you (particularly if you're a new user of `f1dataR`) read on! From 0af17fb3cb8181ddfeb595fb393ebf8145dc86c2 Mon Sep 17 00:00:00 2001 From: pbulsink Date: Fri, 10 Nov 2023 02:17:05 +0000 Subject: [PATCH 3/5] Style & Document code --- R/utils.R | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/R/utils.R b/R/utils.R index 24dcdb04..d2cb9902 100644 --- a/R/utils.R +++ b/R/utils.R @@ -123,8 +123,10 @@ get_fastf1_version <- function() { major <- as.integer(substr(ver, start = 1, stop = 1)) minor <- as.integer(substr(ver, start = 3, stop = 3)) if (major < 3) { - lifecycle::deprecate_warn("1.4.1", what = I("fastf1 version < 3.1"), with = I("fastf1 version >= 3.1"), - details = c("Hard deprecation will occur between 2023 and 2024 F1 seasons")) + lifecycle::deprecate_warn("1.4.1", + what = I("fastf1 version < 3.1"), with = I("fastf1 version >= 3.1"), + details = c("Hard deprecation will occur between 2023 and 2024 F1 seasons") + ) cli::cli_inform("The Python package {.pgk fastf1} was updated to v3 recently.\nPlease update the version on your system by running:\n{.code setup_fastf1(newenv = TRUE)}\nFuture versions of {.pkg f1dataR} may not support {.pkg fastf1<3.0.0}.") } return(list(major = major, minor = minor)) From 2bc22526fd4a01b79a07089d31e795e69e8b8d08 Mon Sep 17 00:00:00 2001 From: Philip Bulsink Date: Sat, 11 Nov 2023 20:45:05 -0500 Subject: [PATCH 4/5] generalize version parsing for any numeric.numeric --- R/utils.R | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/R/utils.R b/R/utils.R index d2cb9902..75be35e2 100644 --- a/R/utils.R +++ b/R/utils.R @@ -120,9 +120,8 @@ get_fastf1_version <- function() { cli::cli_warn("Ensure {.pkg fastf1} Python package is installed.\nPlease run this to install the most recent version:\n{.code setup_fastf1()}") return(NA) } - major <- as.integer(substr(ver, start = 1, stop = 1)) - minor <- as.integer(substr(ver, start = 3, stop = 3)) - if (major < 3) { + major <- as.integer(unlist(strsplit(ver, ".", fixed = T))[1]) + minor <- as.integer(unlist(strsplit(ver, ".", fixed = T))[2]) lifecycle::deprecate_warn("1.4.1", what = I("fastf1 version < 3.1"), with = I("fastf1 version >= 3.1"), details = c("Hard deprecation will occur between 2023 and 2024 F1 seasons") From 54d8a0c1df4ca0de9c475bba109c584d228c99d8 Mon Sep 17 00:00:00 2001 From: Philip Bulsink Date: Sat, 11 Nov 2023 20:45:33 -0500 Subject: [PATCH 5/5] Update lifecycle warn to < 3.1 Was previously only warning < 3 --- R/utils.R | 1 + 1 file changed, 1 insertion(+) diff --git a/R/utils.R b/R/utils.R index 75be35e2..102e609f 100644 --- a/R/utils.R +++ b/R/utils.R @@ -122,6 +122,7 @@ get_fastf1_version <- function() { } major <- as.integer(unlist(strsplit(ver, ".", fixed = T))[1]) minor <- as.integer(unlist(strsplit(ver, ".", fixed = T))[2]) + if (major < 3 | (major == 3 & minor < 1)) { lifecycle::deprecate_warn("1.4.1", what = I("fastf1 version < 3.1"), with = I("fastf1 version >= 3.1"), details = c("Hard deprecation will occur between 2023 and 2024 F1 seasons")