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