From 30655c7930c9b315cdbcef931b63be27f156a673 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Tue, 28 Nov 2023 12:22:39 -0500 Subject: [PATCH 1/7] fill in ? for public endpoints --- tests/testthat/test-endpoints.R | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/testthat/test-endpoints.R b/tests/testthat/test-endpoints.R index 7bdf0fa4..ca5f3d24 100644 --- a/tests/testthat/test-endpoints.R +++ b/tests/testthat/test-endpoints.R @@ -37,7 +37,7 @@ test_that("basic_epidata_call", { fetch_args = fetch_args_list(dry_run = TRUE) ) %>% request_url()) expect_no_error(pub_dengue_nowcast( - locations = "?", + locations = "ca", epiweeks = epirange(201501, 202001), fetch_args = fetch_args_list(dry_run = TRUE) ) %>% request_url()) @@ -84,7 +84,7 @@ test_that("basic_epidata_call", { fetch_args = fetch_args_list(dry_run = TRUE) ) %>% request_url()) expect_no_error(pub_kcdc_ili( - regions = "?", + regions = "ROK", epiweeks = epirange(201201, 202001), fetch_args = fetch_args_list(dry_run = TRUE) ) %>% request_url()) @@ -213,7 +213,7 @@ test_that("endpoints fail when given args via dots", { ) expect_error( pub_kcdc_ili( - regions = "?", + regions = "ROK", date_range = epirange(201201, 202001) ), regexp = dots_error From 89556fd736ab7d7e09665910420093fec039e316 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Tue, 28 Nov 2023 17:50:03 -0500 Subject: [PATCH 2/7] add missing field info entries --- R/endpoints.R | 216 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 214 insertions(+), 2 deletions(-) diff --git a/R/endpoints.R b/R/endpoints.R index 2acebe76..724e1555 100644 --- a/R/endpoints.R +++ b/R/endpoints.R @@ -432,7 +432,63 @@ pub_covid_hosp_facility <- function( create_epidata_field_info( "total_patients_hosp_confirmed_influenza_and_covid_7d_avg", "float" - ) + ), + create_epidata_field_info("geocoded_hospital_address", "text"), + create_epidata_field_info("hhs_ids", "text"), + create_epidata_field_info("is_corrected", "bool"), + create_epidata_field_info( + "previous_day_admission_adult_covid_confirmed_7_day_coverage", + "int" + ), + create_epidata_field_info( + "previous_day_admission_adult_covid_suspected_7_day_coverage", + "int" + ), + create_epidata_field_info( + "previous_day_admission_pediatric_covid_confirmed_7_day_coverage", + "int" + ), + create_epidata_field_info( + "previous_day_admission_pediatric_covid_suspected_7_day_coverage", + "int" + ), + create_epidata_field_info( + "previous_week_patients_covid_vaccinated_doses_all_7_day", + "int" + ), + create_epidata_field_info( + "previous_week_patients_covid_vaccinated_doses_all_7_day_sum", + "int" + ), + create_epidata_field_info( + "previous_week_patients_covid_vaccinated_doses_one_7_day", + "int" + ), + create_epidata_field_info( + "previous_week_patients_covid_vaccinated_doses_one_7_day_sum", + "int" + ), + create_epidata_field_info( + "previous_week_personnel_covid_vaccd_doses_administered_7_day", + "int" + ), + create_epidata_field_info( + "previous_week_personnel_covid_vaccd_doses_administered_7_day_sum", + "int" + ), + create_epidata_field_info("total_personnel_covid_vaccinated_doses_all_7_day", "int"), + create_epidata_field_info( + "total_personnel_covid_vaccinated_doses_all_7_day_sum", + "int" + ), + create_epidata_field_info("total_personnel_covid_vaccinated_doses_none_7_day", "int"), + create_epidata_field_info( + "total_personnel_covid_vaccinated_doses_none_7_day_sum", + "int" + ), + create_epidata_field_info("total_personnel_covid_vaccinated_doses_one_7_day", "int"), + create_epidata_field_info("total_personnel_covid_vaccinated_doses_one_7_day_sum", + "int") ) ) %>% fetch(fetch_args = fetch_args) } @@ -618,7 +674,157 @@ pub_covid_hosp_state_timeseries <- function( create_epidata_field_info("percent_of_inpatients_with_covid", "float"), create_epidata_field_info("inpatient_bed_covid_utilization", "float"), create_epidata_field_info("adult_icu_bed_covid_utilization", "float"), - create_epidata_field_info("adult_icu_bed_utilization", "float") + create_epidata_field_info("adult_icu_bed_utilization", "float"), + create_epidata_field_info("geocoded_state", "text"), + create_epidata_field_info("deaths_covid", "int"), + create_epidata_field_info("deaths_covid_coverage", "int"), + create_epidata_field_info("icu_patients_confirmed_influenza", "int"), + create_epidata_field_info("icu_patients_confirmed_influenza_coverage", "int"), + create_epidata_field_info( + "on_hand_supply_therapeutic_a_casirivimab_imdevimab_courses", + "int" + ), + create_epidata_field_info("on_hand_supply_therapeutic_b_bamlanivimab_courses", "int"), + create_epidata_field_info( + "on_hand_supply_therapeutic_c_bamlanivimab_etesevimab_courses", + "int" + ), + create_epidata_field_info("previous_day_admission_adult_covid_confirmed_18_19", "int"), + create_epidata_field_info( + "previous_day_admission_adult_covid_confirmed_18_19_coverage", + "int" + ), + create_epidata_field_info("previous_day_admission_adult_covid_confirmed_20_29", "int"), + create_epidata_field_info( + "previous_day_admission_adult_covid_confirmed_20_29_coverage", + "int" + ), + create_epidata_field_info("previous_day_admission_adult_covid_confirmed_30_39", "int"), + create_epidata_field_info( + "previous_day_admission_adult_covid_confirmed_30_39_coverage", + "int" + ), + create_epidata_field_info("previous_day_admission_adult_covid_confirmed_40_49", "int"), + create_epidata_field_info( + "previous_day_admission_adult_covid_confirmed_40_49_coverage", + "int" + ), + create_epidata_field_info("previous_day_admission_adult_covid_confirmed_50_59", "int"), + create_epidata_field_info( + "previous_day_admission_adult_covid_confirmed_50_59_coverage", + "int" + ), + create_epidata_field_info("previous_day_admission_adult_covid_confirmed_60_69", "int"), + create_epidata_field_info( + "previous_day_admission_adult_covid_confirmed_60_69_coverage", + "int" + ), + create_epidata_field_info("previous_day_admission_adult_covid_confirmed_70_79", "int"), + create_epidata_field_info( + "previous_day_admission_adult_covid_confirmed_70_79_coverage", + "int" + ), + create_epidata_field_info( + "previous_day_admission_adult_covid_confirmed_80plus", + "int" + ), + create_epidata_field_info( + "previous_day_admission_adult_covid_confirmed_80plus_coverage", + "int" + ), + create_epidata_field_info( + "previous_day_admission_adult_covid_confirmed_unknown", + "int" + ), + create_epidata_field_info( + "previous_day_admission_adult_covid_confirmed_unknown_coverage", + "int" + ), + create_epidata_field_info("previous_day_admission_adult_covid_suspected_18_19", "int"), + create_epidata_field_info( + "previous_day_admission_adult_covid_suspected_18_19_coverage", + "int" + ), + create_epidata_field_info("previous_day_admission_adult_covid_suspected_20_29", "int"), + create_epidata_field_info( + "previous_day_admission_adult_covid_suspected_20_29_coverage", + "int" + ), + create_epidata_field_info("previous_day_admission_adult_covid_suspected_30_39", "int"), + create_epidata_field_info( + "previous_day_admission_adult_covid_suspected_30_39_coverage", + "int" + ), + create_epidata_field_info("previous_day_admission_adult_covid_suspected_40_49", "int"), + create_epidata_field_info( + "previous_day_admission_adult_covid_suspected_40_49_coverage", + "int" + ), + create_epidata_field_info("previous_day_admission_adult_covid_suspected_50_59", "int"), + create_epidata_field_info( + "previous_day_admission_adult_covid_suspected_50_59_coverage", + "int" + ), + create_epidata_field_info("previous_day_admission_adult_covid_suspected_60_69", "int"), + create_epidata_field_info( + "previous_day_admission_adult_covid_suspected_60_69_coverage", + "int" + ), + create_epidata_field_info("previous_day_admission_adult_covid_suspected_70_79", "int"), + create_epidata_field_info( + "previous_day_admission_adult_covid_suspected_70_79_coverage", + "int" + ), + create_epidata_field_info( + "previous_day_admission_adult_covid_suspected_80plus", + "int" + ), + create_epidata_field_info( + "previous_day_admission_adult_covid_suspected_80plus_coverage", + "int" + ), + create_epidata_field_info( + "previous_day_admission_adult_covid_suspected_unknown", + "int" + ), + create_epidata_field_info( + "previous_day_admission_adult_covid_suspected_unknown_coverage", + "int" + ), + create_epidata_field_info("previous_day_admission_influenza_confirmed", "int"), + create_epidata_field_info( + "previous_day_admission_influenza_confirmed_coverage", + "int" + ), + create_epidata_field_info("previous_day_deaths_covid_and_influenza", "int"), + create_epidata_field_info("previous_day_deaths_covid_and_influenza_coverage", "int"), + create_epidata_field_info("previous_day_deaths_influenza", "int"), + create_epidata_field_info("previous_day_deaths_influenza_coverage", "int"), + create_epidata_field_info( + "previous_week_therapeutic_a_casirivimab_imdevimab_courses_used", + "int" + ), + create_epidata_field_info( + "previous_week_therapeutic_b_bamlanivimab_courses_used", + "int" + ), + create_epidata_field_info( + "previous_week_therapeutic_c_bamlanivimab_etesevimab_courses_used", + "int" + ), + create_epidata_field_info( + "total_patients_hospitalized_confirmed_influenza_covid", + "int" + ), + create_epidata_field_info( + "total_patients_hospitalized_confirmed_influenza_covid_coverage", + "int" + ), + create_epidata_field_info("total_patients_hospitalized_confirmed_influenza", "int"), + create_epidata_field_info( + "total_patients_hospitalized_confirmed_influenza_coverage", + "int" + ) ) ) %>% fetch(fetch_args = fetch_args) } @@ -656,6 +862,11 @@ pub_covidcast_meta <- function(fetch_args = fetch_args_list()) { categories = c("week", "day") ), + create_epidata_field_info( + "geo_type", + "categorical", + categories = c("nation", "msa", "hrr", "hhs", "state", "county", "dma") + ), create_epidata_field_info("min_time", "date"), create_epidata_field_info("max_time", "date"), create_epidata_field_info("num_locations", "int"), @@ -1205,6 +1416,7 @@ pub_fluview <- function( create_epidata_field_info("lag", "int"), create_epidata_field_info("num_ili", "int"), create_epidata_field_info("num_patients", "int"), + create_epidata_field_info("num_providers", "int"), create_epidata_field_info("num_age_0", "int"), create_epidata_field_info("num_age_1", "int"), create_epidata_field_info("num_age_2", "int"), From 2fce66d1e7880da7b69223fbc4648744185f3d93 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Wed, 29 Nov 2023 10:17:02 -0500 Subject: [PATCH 3/7] parse `release_date`s as date --- R/endpoints.R | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/R/endpoints.R b/R/endpoints.R index 724e1555..0c73fbd0 100644 --- a/R/endpoints.R +++ b/R/endpoints.R @@ -1242,7 +1242,7 @@ pub_flusurv <- function(locations, epiweeks, ..., issues = NULL, lag = NULL, fet lag = lag ), list( - create_epidata_field_info("release_date", "text"), + create_epidata_field_info("release_date", "date"), create_epidata_field_info("location", "text"), create_epidata_field_info("issue", "epiweek"), create_epidata_field_info("epiweek", "epiweek"), @@ -1300,7 +1300,7 @@ pub_fluview_clinical <- function(regions, epiweeks, ..., issues = NULL, lag = NU lag = lag ), list( - create_epidata_field_info("release_date", "text"), + create_epidata_field_info("release_date", "date"), create_epidata_field_info("region", "text"), create_epidata_field_info("issue", "epiweek"), create_epidata_field_info("epiweek", "epiweek"), @@ -1335,7 +1335,7 @@ pub_fluview_meta <- function(fetch_args = fetch_args_list()) { "fluview_meta/", list(), list( - create_epidata_field_info("latest_update", "text"), + create_epidata_field_info("latest_update", "date"), create_epidata_field_info("latest_issue", "date"), create_epidata_field_info("table_rows", "int") ) @@ -1409,7 +1409,7 @@ pub_fluview <- function( auth = auth ), list( - create_epidata_field_info("release_date", "text"), + create_epidata_field_info("release_date", "date"), create_epidata_field_info("region", "text"), create_epidata_field_info("issue", "epiweek"), create_epidata_field_info("epiweek", "epiweek"), @@ -1559,7 +1559,7 @@ pub_kcdc_ili <- function(regions, epiweeks, ..., issues = NULL, lag = NULL, fetc lag = lag ), list( - create_epidata_field_info("release_date", "text"), + create_epidata_field_info("release_date", "date"), create_epidata_field_info("region", "text"), create_epidata_field_info("issue", "epiweek"), create_epidata_field_info("epiweek", "epiweek"), @@ -1692,7 +1692,7 @@ pub_nidss_flu <- function(regions, epiweeks, ..., issues = NULL, lag = NULL, fet lag = lag ), list( - create_epidata_field_info("release_date", "text"), + create_epidata_field_info("release_date", "date"), create_epidata_field_info("region", "text"), create_epidata_field_info("epiweek", "epiweek"), create_epidata_field_info("issue", "epiweek"), @@ -1742,7 +1742,7 @@ pvt_norostat <- function(auth, locations, epiweeks, fetch_args = fetch_args_list epiweeks = epiweeks ), list( - create_epidata_field_info("release_date", "text"), + create_epidata_field_info("release_date", "date"), create_epidata_field_info("epiweek", "epiweek"), create_epidata_field_info("value", "int") ) @@ -1823,7 +1823,7 @@ pub_paho_dengue <- function(regions, epiweeks, ..., issues = NULL, lag = NULL, f lag = lag ), list( - create_epidata_field_info("release_date", "text"), + create_epidata_field_info("release_date", "date"), create_epidata_field_info("region", "text"), create_epidata_field_info("serotype", "text"), create_epidata_field_info("epiweek", "epiweek"), From fa038fa347d430e56ddbf3550338024935719657 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Wed, 29 Nov 2023 10:40:37 -0500 Subject: [PATCH 4/7] allow dash-separate dates to be parsed --- R/model.R | 2 +- tests/testthat/test-model.R | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/R/model.R b/R/model.R index 93d79807..7cc6e638 100644 --- a/R/model.R +++ b/R/model.R @@ -174,7 +174,7 @@ parse_data_frame <- function(epidata_call, df, disable_date_parsing = FALSE) { #' @keywords internal parse_api_date <- function(value) { - as.Date(as.character(value), format = "%Y%m%d") + as.Date(as.character(value), tryFormats = c("%Y%m%d", "%Y-%m-%d")) } #' parse_api_week converts an integer to a date diff --git a/tests/testthat/test-model.R b/tests/testthat/test-model.R index d5acf51d..36a5d1d5 100644 --- a/tests/testthat/test-model.R +++ b/tests/testthat/test-model.R @@ -98,3 +98,13 @@ test_that("parse_data_frame warns when df contains fields not listed in meta", { mock_df$rate_age_0 <- NULL expect_no_warning(parse_data_frame(epidata_call, mock_df)) }) + +test_that("parse_api_date accepts str and int input", { + expect_identical(parse_api_date("20200101"), as.Date("2020-01-01")) + expect_identical(parse_api_date(20200101), as.Date("2020-01-01")) +}) + +test_that("parse_api_date accepts YYYYMMDD and YYYY-MM-DD", { + expect_identical(parse_api_date(20200101), as.Date("2020-01-01")) + expect_identical(parse_api_date("2020-01-01"), as.Date("2020-01-01")) +}) From 5e7a0f655363d0afa39bccb236857a0cd4da07af Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Wed, 29 Nov 2023 11:36:23 -0500 Subject: [PATCH 5/7] test missing date parsing behavior --- tests/testthat/test-model.R | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tests/testthat/test-model.R b/tests/testthat/test-model.R index 36a5d1d5..9f9b739c 100644 --- a/tests/testthat/test-model.R +++ b/tests/testthat/test-model.R @@ -57,11 +57,12 @@ test_that("null parsing", { # see generate_test_data.R mock_df <- as.data.frame(readr::read_rds(testthat::test_path("data/flusurv-epiweeks.rds"))) metadata <- epidata_call$meta - mock_df[[metadata[[1]]$name]][1] <- list(NULL) + mock_df[[metadata[[1]]$name]][1] <- NA mock_df[[metadata[[2]]$name]] <- c(TRUE) epidata_call$meta[[2]]$type <- "bool" - res <- parse_data_frame(epidata_call, mock_df) %>% as_tibble() + expect_no_error(res <- parse_data_frame(epidata_call, mock_df) %>% as_tibble()) expect_true(res$location) + expect_identical(res$release_date, as.Date(NA)) # if the call has no metadata, return the whole frame as is epidata_call$meta <- NULL @@ -108,3 +109,7 @@ test_that("parse_api_date accepts YYYYMMDD and YYYY-MM-DD", { expect_identical(parse_api_date(20200101), as.Date("2020-01-01")) expect_identical(parse_api_date("2020-01-01"), as.Date("2020-01-01")) }) + +test_that("parse_api_date handles missing values appropriately", { + expect_identical(parse_api_date(NA), as.Date(NA)) +}) From d534e3e7069a6c3ae5db722907a1985887cf51b6 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Wed, 29 Nov 2023 11:41:23 -0500 Subject: [PATCH 6/7] linting --- R/endpoints.R | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/R/endpoints.R b/R/endpoints.R index 0c73fbd0..1e1521b3 100644 --- a/R/endpoints.R +++ b/R/endpoints.R @@ -487,8 +487,10 @@ pub_covid_hosp_facility <- function( "int" ), create_epidata_field_info("total_personnel_covid_vaccinated_doses_one_7_day", "int"), - create_epidata_field_info("total_personnel_covid_vaccinated_doses_one_7_day_sum", - "int") + create_epidata_field_info( + "total_personnel_covid_vaccinated_doses_one_7_day_sum", + "int" + ) ) ) %>% fetch(fetch_args = fetch_args) } @@ -823,8 +825,8 @@ pub_covid_hosp_state_timeseries <- function( create_epidata_field_info("total_patients_hospitalized_confirmed_influenza", "int"), create_epidata_field_info( "total_patients_hospitalized_confirmed_influenza_coverage", - "int" - ) + "int" + ) ) ) %>% fetch(fetch_args = fetch_args) } From 38a5c1bf962e13c1ca6ea61fc73a37881fdf9d72 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Wed, 29 Nov 2023 11:46:25 -0500 Subject: [PATCH 7/7] fill in ? for private endpoints --- tests/testthat/test-endpoints.R | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/testthat/test-endpoints.R b/tests/testthat/test-endpoints.R index ca5f3d24..53aca4cf 100644 --- a/tests/testthat/test-endpoints.R +++ b/tests/testthat/test-endpoints.R @@ -43,8 +43,8 @@ test_that("basic_epidata_call", { ) %>% request_url()) expect_no_error(pvt_dengue_sensors( auth = "yourkey", - names = "?", - locations = "?", + names = "ght", + locations = "ag", epiweeks = epirange(201501, 202001), fetch_args = fetch_args_list(dry_run = TRUE) ) %>% request_url()) @@ -80,7 +80,7 @@ test_that("basic_epidata_call", { auth = "yourkey", locations = "ca", epiweeks = epirange(201201, 202001), - query = "?", + query = "how to get over the flu", fetch_args = fetch_args_list(dry_run = TRUE) ) %>% request_url()) expect_no_error(pub_kcdc_ili(