|
1 | 1 |
|
2 | 2 | # Script that runs with the Pull baselines action to download and save the weekly baselines from the FluSight-baseline repository. |
3 | 3 | # Retrieves specifically FluSight-baseline, FluSight-base_seasonal, and FluSight-equal_cat. |
| 4 | +# Runs Hub Validations on the files. |
4 | 5 |
|
5 | | -# load package |
| 6 | +# Load required libraries |
6 | 7 | library(lubridate) |
| 8 | +library(hubValidations) |
| 9 | +library(fs) |
7 | 10 |
|
8 | | -# Get last Saturday |
9 | | -current_ref_date <- ceiling_date(Sys.Date(), "week") - days(1) |
10 | | -date_str <- format(current_ref_date, "%Y-%m-%d") |
11 | | - |
12 | | -# Types and their source folders |
13 | | -baseline_types <- c("FluSight-baseline", "FluSight-base_seasonal", "FluSight-equal_cat") |
14 | | -baseline_folders <- c("Flusight-baseline", "Flusight-seasonal-baseline", "Flusight-equal_cat") |
15 | | - |
16 | | -# Loop and download each one |
17 | | -for (i in seq_along(baseline_types)) { |
18 | | - type <- baseline_types[i] |
19 | | - folder <- baseline_folders[i] |
20 | | - filename <- paste0(date_str, "-", type, ".csv") |
21 | | - |
22 | | - # Corrected file URL |
23 | | - file_url <- paste0( |
24 | | - "https://raw.githubusercontent.com/cdcepi/Flusight-baseline/main/weekly-submission/forecasts/", |
25 | | - folder, "/", filename |
26 | | - ) |
27 | | - |
28 | | - # Save to model-output/<type>/<filename> |
29 | | - target_dir <- file.path("model-output", type) |
30 | | - dir.create(target_dir, recursive = TRUE, showWarnings = FALSE) |
31 | | - destfile <- file.path(target_dir, filename) |
32 | | - |
33 | | - # Attempt download |
34 | | - download_success <- tryCatch({ |
35 | | - download.file(url = file_url, destfile = destfile, method = "libcurl") |
36 | | - cat("✅ Downloaded and saved:", destfile, "\n") |
37 | | - TRUE |
38 | | - }, error = function(e) { |
39 | | - cat("❌ Failed to download", filename, "\nReason:", e$message, "\n") |
40 | | - FALSE |
41 | | - }) |
42 | | -} |
| 11 | +# Prepare output file for PR body |
| 12 | +result_file <- "validation_result.md" |
| 13 | + |
| 14 | +# Wrap the entire script in a top-level tryCatch |
| 15 | +tryCatch({ |
| 16 | + |
| 17 | + # Set up reference date and file names |
| 18 | + current_ref_date <- ceiling_date(Sys.Date(), "week") - days(1) |
| 19 | + date_str <- format(current_ref_date, "%Y-%m-%d") |
| 20 | + |
| 21 | + baseline_types <- c("FluSight-baseline", "FluSight-base_seasonal", "FluSight-equal_cat") |
| 22 | + baseline_folders <- c("Flusight-baseline", "Flusight-seasonal-baseline", "Flusight-equal_cat") |
| 23 | + |
| 24 | + downloaded_files <- c() |
| 25 | + validation_results <- list() |
| 26 | + |
| 27 | + for (i in seq_along(baseline_types)) { |
| 28 | + type <- baseline_types[i] |
| 29 | + folder <- baseline_folders[i] |
| 30 | + filename <- paste0(date_str, "-", type, ".csv") |
| 31 | + |
| 32 | + file_url <- paste0( |
| 33 | + "https://raw.githubusercontent.com/cdcepi/Flusight-baseline/main/weekly-submission/forecasts/", |
| 34 | + folder, "/", filename |
| 35 | + ) |
| 36 | + |
| 37 | + target_dir <- file.path("model-output", type) |
| 38 | + dir_create(target_dir, recurse = TRUE) |
| 39 | + destfile <- file.path(target_dir, filename) |
| 40 | + |
| 41 | + # Attempt to download |
| 42 | + download_success <- tryCatch({ |
| 43 | + download.file(url = file_url, destfile = destfile, method = "libcurl") |
| 44 | + cat("✅ Downloaded and saved:", destfile, "\n") |
| 45 | + downloaded_files <- c(downloaded_files, file.path(type, filename)) |
| 46 | + TRUE |
| 47 | + }, error = function(e) { |
| 48 | + msg <- paste("❌ Failed to download", filename, "Reason:", e$message) |
| 49 | + cat(msg, "\n") |
| 50 | + validation_results[[file.path(type, filename)]] <- list(status = "error", message = msg) |
| 51 | + FALSE |
| 52 | + }) |
| 53 | + |
| 54 | + # Only attempt validation if download succeeded |
| 55 | + if (download_success) { |
| 56 | + file_path <- file.path(type, filename) |
| 57 | + result <- tryCatch({ |
| 58 | + v <- hubValidations::validate_submission(hub_path = ".", file_path = file_path) |
| 59 | + |
| 60 | + # Try to check for validation errors |
| 61 | + err_msg <- tryCatch({ |
| 62 | + hubValidations::check_for_errors(v, verbose = TRUE) |
| 63 | + NULL # Passed |
| 64 | + }, error = function(e) { |
| 65 | + e$message # Return error message |
| 66 | + }) |
| 67 | + |
| 68 | + list(status = if (is.null(err_msg)) "pass" else "fail", message = err_msg) |
| 69 | + |
| 70 | + }, error = function(e) { |
| 71 | + list(status = "error", message = e$message) |
| 72 | + }) |
| 73 | + |
| 74 | + validation_results[[file_path]] <- result |
| 75 | + } |
| 76 | + } |
| 77 | + |
| 78 | + # Compose validation_result.md content |
| 79 | + messages <- c("### 🧪 Validation Results") |
| 80 | + |
| 81 | + for (file in names(validation_results)) { |
| 82 | + res <- validation_results[[file]] |
| 83 | + if (res$status == "pass") { |
| 84 | + messages <- c(messages, paste0("✅ **", file, "** passed validation.")) |
| 85 | + } else { |
| 86 | + messages <- c(messages, paste0("❌ **", file, "**: ", res$message)) |
| 87 | + } |
| 88 | + } |
| 89 | + |
| 90 | + writeLines(messages, result_file) |
| 91 | + |
| 92 | +}, error = function(e) { |
| 93 | + writeLines(c("### 🧪 Validation Results", "❌ Script failed unexpectedly:", e$message), result_file) |
| 94 | +}) |
43 | 95 |
|
44 | 96 |
|
0 commit comments