Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 23 additions & 6 deletions R/cybed-fetch.R
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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(
Expand Down Expand Up @@ -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))
Expand Down
6 changes: 3 additions & 3 deletions man/cybed_fetch.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions man/load_graph.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 16 additions & 4 deletions python/src/cybedtools/fetch.py
Original file line number Diff line number Diff line change
Expand Up @@ -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``).

Expand Down Expand Up @@ -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
-------
Expand All @@ -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(
Expand Down
Loading