feat: default to the public corpus so the package works unconfigured
The default was a REPLACE_WITH_SHARE_TOKEN sentinel and no document in the package supplied a working URL, so a new user installing uscogdata had no path to a session at all -- just an actionable-looking error with nothing actionable behind it. The default is now the public HuggingFace mirror: CC-BY-4.0, no credential, CDN-backed, and it keeps the origin's uplink out of the read path. USCOGDATA_URL and options(uscogdata.url=) still override, so Nextcloud and cog_mirror() copies are unaffected. The sentinel guard stays for half-edited configs; the two tests covering it set the URL explicitly, so they only needed renaming to stop calling it 'the default'.
This commit is contained in:
+12
-1
@@ -5,7 +5,18 @@
|
|||||||
.uscogdata_env <- new.env(parent = emptyenv())
|
.uscogdata_env <- new.env(parent = emptyenv())
|
||||||
|
|
||||||
.uscogdata_defaults <- list(
|
.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,
|
cache_dir = NULL,
|
||||||
manifest_ttl_secs = 3600L
|
manifest_ttl_secs = 3600L
|
||||||
)
|
)
|
||||||
|
|||||||
+1
-1
@@ -28,7 +28,7 @@
|
|||||||
"*" = "{.code Sys.setenv(USCOGDATA_URL = \"<url-or-local-path>/\")}",
|
"*" = "{.code Sys.setenv(USCOGDATA_URL = \"<url-or-local-path>/\")}",
|
||||||
"*" = "{.code options(uscogdata.url = \"<url-or-local-path>/\")}",
|
"*" = "{.code options(uscogdata.url = \"<url-or-local-path>/\")}",
|
||||||
i = "For an offline smoke test, use the bundled fixture: {.code system.file(\"extdata/fixture_corpus\", package = \"uscogdata\")}.",
|
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")
|
), class = "uscogdata_url_not_configured")
|
||||||
}
|
}
|
||||||
invisible(url)
|
invisible(url)
|
||||||
|
|||||||
@@ -64,3 +64,26 @@ test_that(".resolve_url does not invent a slash for an empty setting", {
|
|||||||
withr::local_options(uscogdata.url = "")
|
withr::local_options(uscogdata.url = "")
|
||||||
expect_equal(.resolve_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"
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|||||||
@@ -4,12 +4,14 @@
|
|||||||
# protect users from silent failures when USCOGDATA_URL is misconfigured
|
# protect users from silent failures when USCOGDATA_URL is misconfigured
|
||||||
# or returns non-JSON content.
|
# 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()
|
uscogdata:::cog_close()
|
||||||
on.exit(uscogdata:::cog_close(), add = TRUE)
|
on.exit(uscogdata:::cog_close(), add = TRUE)
|
||||||
|
|
||||||
placeholder <- "https://cloud.civilytics.org/s/REPLACE_WITH_SHARE_TOKEN/download/"
|
# No longer the package default (that is the public HF corpus). This is a
|
||||||
withr::with_envvar(c(USCOGDATA_URL = placeholder), {
|
# 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(
|
expect_error(
|
||||||
uscogdata:::cog_open(),
|
uscogdata:::cog_open(),
|
||||||
class = "uscogdata_url_not_configured"
|
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()
|
uscogdata:::cog_close()
|
||||||
on.exit(uscogdata:::cog_close(), add = TRUE)
|
on.exit(uscogdata:::cog_close(), add = TRUE)
|
||||||
|
|
||||||
placeholder <- "https://cloud.civilytics.org/s/REPLACE_WITH_SHARE_TOKEN/download/"
|
# No longer the package default (that is the public HF corpus). This is a
|
||||||
withr::with_envvar(c(USCOGDATA_URL = placeholder), {
|
# 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)
|
msg <- tryCatch(uscogdata:::cog_open(), error = conditionMessage)
|
||||||
expect_match(msg, "USCOGDATA_URL", fixed = TRUE)
|
expect_match(msg, "USCOGDATA_URL", fixed = TRUE)
|
||||||
expect_match(msg, "uscogdata.url", fixed = TRUE)
|
expect_match(msg, "uscogdata.url", fixed = TRUE)
|
||||||
|
|||||||
Reference in New Issue
Block a user