diff --git a/R/config.R b/R/config.R index a5534b1..37354a3 100644 --- a/R/config.R +++ b/R/config.R @@ -5,7 +5,18 @@ .uscogdata_env <- new.env(parent = emptyenv()) .uscogdata_defaults <- list( - url = "https://cloud.civilytics.org/s/REPLACE_WITH_SHARE_TOKEN/download/", + # Public HuggingFace mirror of the published corpus: CC-BY-4.0, no + # credential, CDN-backed. This is the default so `library(uscogdata)` + # followed by a verb works with zero configuration -- previously the + # default was a REPLACE_WITH_SHARE_TOKEN sentinel and no document in the + # package supplied a working URL, so a new user had no path to a session. + # + # The trailing slash is required: every consumer concatenates onto this + # (see .resolve_url(), which enforces it anyway). + # + # Override with USCOGDATA_URL or options(uscogdata.url=) to read a + # Nextcloud share or a local copy made by cog_mirror(). + url = "https://huggingface.co/datasets/civilytics/us-cog-finance/resolve/main/", cache_dir = NULL, manifest_ttl_secs = 3600L ) diff --git a/R/manifest.R b/R/manifest.R index 1161e70..07e8b67 100644 --- a/R/manifest.R +++ b/R/manifest.R @@ -28,7 +28,7 @@ "*" = "{.code Sys.setenv(USCOGDATA_URL = \"/\")}", "*" = "{.code options(uscogdata.url = \"/\")}", i = "For an offline smoke test, use the bundled fixture: {.code system.file(\"extdata/fixture_corpus\", package = \"uscogdata\")}.", - i = "For the live Civilytics corpus, request the Nextcloud share URL from the package maintainer." + i = "The public corpus is the default: unset USCOGDATA_URL to use it, or point it at a local copy made by {.code cog_mirror()}." ), class = "uscogdata_url_not_configured") } invisible(url) diff --git a/tests/testthat/test-config.R b/tests/testthat/test-config.R index 3461ab2..45579e9 100644 --- a/tests/testthat/test-config.R +++ b/tests/testthat/test-config.R @@ -64,3 +64,26 @@ test_that(".resolve_url does not invent a slash for an empty setting", { withr::local_options(uscogdata.url = "") expect_equal(.resolve_url(), "") }) + +test_that("the default corpus URL is real, not a placeholder", { + # setup.R points USCOGDATA_URL at the bundled fixture for the whole suite, + # so both the env var and the option have to be cleared to see the default. + withr::local_envvar(USCOGDATA_URL = NA) + withr::local_options(uscogdata.url = NULL) + url <- .resolve_url() + expect_false(grepl("REPLACE_WITH", url, fixed = TRUE)) + expect_match(url, "^https://") + expect_match(url, "/$") +}) + +test_that("an explicitly-set sentinel URL still aborts", { + # The guard must survive the default change: a user who half-edited a + # copied config still gets the actionable error. + withr::local_envvar( + USCOGDATA_URL = "https://other.example/s/REPLACE_WITH_SHARE_TOKEN/x/" + ) + expect_error( + .check_url_configured(.resolve_url()), + class = "uscogdata_url_not_configured" + ) +}) diff --git a/tests/testthat/test-manifest.R b/tests/testthat/test-manifest.R index 31c9462..f2b3937 100644 --- a/tests/testthat/test-manifest.R +++ b/tests/testthat/test-manifest.R @@ -4,12 +4,14 @@ # protect users from silent failures when USCOGDATA_URL is misconfigured # or returns non-JSON content. -test_that("cog_open aborts with actionable error when URL is the placeholder default", { +test_that("cog_open aborts with actionable error when URL contains the sentinel", { uscogdata:::cog_close() on.exit(uscogdata:::cog_close(), add = TRUE) - placeholder <- "https://cloud.civilytics.org/s/REPLACE_WITH_SHARE_TOKEN/download/" - withr::with_envvar(c(USCOGDATA_URL = placeholder), { + # No longer the package default (that is the public HF corpus). This is a + # user who copied a config template and did not finish editing it. + sentinel_url <- "https://cloud.civilytics.org/s/REPLACE_WITH_SHARE_TOKEN/download/" + withr::with_envvar(c(USCOGDATA_URL = sentinel_url), { expect_error( uscogdata:::cog_open(), class = "uscogdata_url_not_configured" @@ -35,8 +37,10 @@ test_that("placeholder guard error names both env var and option as remediation" uscogdata:::cog_close() on.exit(uscogdata:::cog_close(), add = TRUE) - placeholder <- "https://cloud.civilytics.org/s/REPLACE_WITH_SHARE_TOKEN/download/" - withr::with_envvar(c(USCOGDATA_URL = placeholder), { + # No longer the package default (that is the public HF corpus). This is a + # user who copied a config template and did not finish editing it. + sentinel_url <- "https://cloud.civilytics.org/s/REPLACE_WITH_SHARE_TOKEN/download/" + withr::with_envvar(c(USCOGDATA_URL = sentinel_url), { msg <- tryCatch(uscogdata:::cog_open(), error = conditionMessage) expect_match(msg, "USCOGDATA_URL", fixed = TRUE) expect_match(msg, "uscogdata.url", fixed = TRUE)