diff --git a/R/cybed-fetch.R b/R/cybed-fetch.R index 86c18bf..4821bf3 100644 --- a/R/cybed-fetch.R +++ b/R/cybed-fetch.R @@ -1,3 +1,6 @@ +# Data release this package version was built and tested against. +cybed_data_release <- "2026.09.2" + # R/cybed-fetch.R # # User-facing data loader for the public per-framework data release @@ -127,10 +130,10 @@ cybed_download <- function(url, destfile) { #' re-downloaded. #' #' @param frameworks Character vector of framework slugs to fetch (as -#' carried by [framework_summary]`$framework_slug`, e.g. `"nice-v2"`), or +#' carried by [framework_summary]`$framework_slug`, e.g. `"nice-v2"`, or the release file slug, e.g. `"nice"`), or #' `NULL` (the default) for every framework the release manifest ships. #' @param version Character scalar release version (e.g. `"1.0.0"`), or -#' `NULL` (the default) for the release location's `"latest"` alias. +#' `NULL` (the default) for the data release this package version was built against, `cybed_data_release`. #' @return Invisibly, a tibble with one row per fetched framework: columns #' `framework_slug`, `path` (the cached file's local path), #' `sha256_verified` (logical, always `TRUE` on return -- a mismatch @@ -142,22 +145,36 @@ cybed_download <- function(url, destfile) { #' # Requires network access (or a `cybedtools.release_url` override #' # pointing at a local mock release for testing). #' tryCatch( -#' cybed_fetch(frameworks = "nice-v2"), +#' cybed_fetch(frameworks = "nice"), #' cybedtools_download_failed = function(cnd) message("No network: ", conditionMessage(cnd)) #' ) #' } cybed_fetch <- function(frameworks = NULL, version = NULL) { base_url <- cybed_release_base_url() - version <- if (is.null(version)) "latest" else version + version <- if (is.null(version)) cybed_data_release else version manifest <- cybed_read_manifest(base_url, version) files <- manifest$files manifest_slugs <- vapply(files, function(x) x$slug, character(1)) + # Release files use short slugs ("nice"); framework_summary uses versioned + # ones ("nice-v2"), carried in the manifest as license_slug. Accept either. + summary_slugs <- vapply( + files, + function(x) if (is.null(x$license_slug)) x$slug else x$license_slug, + character(1) + ) + if (is.null(frameworks)) { frameworks <- manifest_slugs } - unknown <- setdiff(frameworks, manifest_slugs) + resolved <- ifelse( + frameworks %in% manifest_slugs, + frameworks, + manifest_slugs[match(frameworks, summary_slugs)] + ) + unknown <- frameworks[is.na(resolved)] + frameworks <- resolved if (length(unknown)) { rlang::abort( c( @@ -229,7 +246,7 @@ cybed_fetch <- function(frameworks = NULL, version = NULL) { #' \donttest{ #' tryCatch( #' { -#' rdf <- load_graph(frameworks = "nice-v2") +#' rdf <- load_graph(frameworks = "nice") #' framework_metadata(rdf) #' }, #' cybedtools_download_failed = function(cnd) message("No network: ", conditionMessage(cnd)) diff --git a/man/cybed_fetch.Rd b/man/cybed_fetch.Rd index 257a456..535c436 100644 --- a/man/cybed_fetch.Rd +++ b/man/cybed_fetch.Rd @@ -8,11 +8,11 @@ cybed_fetch(frameworks = NULL, version = NULL) } \arguments{ \item{frameworks}{Character vector of framework slugs to fetch (as -carried by \link{framework_summary}\verb{$framework_slug}, e.g. \code{"nice-v2"}), or +carried by \link{framework_summary}\verb{$framework_slug}, e.g. \code{"nice-v2"}, or the release file slug, e.g. \code{"nice"}), or \code{NULL} (the default) for every framework the release manifest ships.} \item{version}{Character scalar release version (e.g. \code{"1.0.0"}), or -\code{NULL} (the default) for the release location's \code{"latest"} alias.} +\code{NULL} (the default) for the data release this package version was built against, \code{cybed_data_release}.} } \value{ Invisibly, a tibble with one row per fetched framework: columns @@ -39,7 +39,7 @@ re-downloaded. # Requires network access (or a `cybedtools.release_url` override # pointing at a local mock release for testing). tryCatch( - cybed_fetch(frameworks = "nice-v2"), + cybed_fetch(frameworks = "nice"), cybedtools_download_failed = function(cnd) message("No network: ", conditionMessage(cnd)) ) } diff --git a/man/load_graph.Rd b/man/load_graph.Rd index 93cd71b..a8887e3 100644 --- a/man/load_graph.Rd +++ b/man/load_graph.Rd @@ -8,11 +8,11 @@ load_graph(frameworks = NULL, version = NULL) } \arguments{ \item{frameworks}{Character vector of framework slugs to fetch (as -carried by \link{framework_summary}\verb{$framework_slug}, e.g. \code{"nice-v2"}), or +carried by \link{framework_summary}\verb{$framework_slug}, e.g. \code{"nice-v2"}, or the release file slug, e.g. \code{"nice"}), or \code{NULL} (the default) for every framework the release manifest ships.} \item{version}{Character scalar release version (e.g. \code{"1.0.0"}), or -\code{NULL} (the default) for the release location's \code{"latest"} alias.} +\code{NULL} (the default) for the data release this package version was built against, \code{cybed_data_release}.} } \value{ An rdf object (\code{\link[rdflib:rdf]{rdflib::rdf()}}) with every requested framework's @@ -29,7 +29,7 @@ hash) and parses them into one shared rdf object. \donttest{ tryCatch( { - rdf <- load_graph(frameworks = "nice-v2") + rdf <- load_graph(frameworks = "nice") framework_metadata(rdf) }, cybedtools_download_failed = function(cnd) message("No network: ", conditionMessage(cnd)) diff --git a/python/src/cybedtools/fetch.py b/python/src/cybedtools/fetch.py index 2646e7c..f7cefac 100644 --- a/python/src/cybedtools/fetch.py +++ b/python/src/cybedtools/fetch.py @@ -100,6 +100,10 @@ def _release_base_url() -> str: return _DEFAULT_BASE_URL +DATA_RELEASE = "2026.09.2" +"""Data release this package version was built and tested against.""" + + def _release_url_for(base_url: str, version: str, filename: str) -> str: """Build the URL of one release file (the manifest or a framework's ``.nt.gz``). @@ -256,12 +260,12 @@ def cybed_fetch( ---------- frameworks : list[str] or None Framework slugs to fetch (as carried by - ``framework_summary()["framework_slug"]``, e.g. ``"nice-v2"``), or + ``framework_summary()["framework_slug"]``, e.g. ``"nice-v2"``, or the release file slug, e.g. ``"nice"``), or ``None`` (the default) for every framework the release manifest ships. version : str or None Release version (e.g. ``"1.0.0"``), or ``None`` (the default) for - the release location's ``"latest"`` alias. + the data release this package version was built against, ``DATA_RELEASE``. Returns ------- @@ -281,13 +285,21 @@ def cybed_fetch( If a downloaded file's SHA-256 does not match the manifest. """ base_url = _release_base_url() - resolved_version = version if version is not None else "latest" + resolved_version = version if version is not None else DATA_RELEASE manifest = _read_manifest(base_url, resolved_version) files = manifest["files"] manifest_slugs = [entry["slug"] for entry in files] - requested = frameworks if frameworks is not None else manifest_slugs + # Release files use short slugs ("nice"); framework_summary uses versioned + # ones ("nice-v2"), carried in the manifest as license_slug. Accept either. + summary_to_release = { + entry.get("license_slug") or entry["slug"]: entry["slug"] for entry in files + } + raw = frameworks if frameworks is not None else manifest_slugs + requested = [ + s if s in manifest_slugs else summary_to_release.get(s, s) for s in raw + ] unknown = sorted(set(requested) - set(manifest_slugs)) if unknown: raise CybedtoolsFrameworkNotFoundError(