R/cran-dependencies.R

Defines functions cran_dependencies_cache cran_descriptions_cache wood_cran_dependencies

Documented in wood_cran_dependencies

#' Get dependencies of a package on CRAN
#'
#' @description This function queries CRAN for dependencies of the selected
#' version of a selected package. By default, it queries the latest version.
#'
#' @template package
#' @param version `character(1)`\cr
#'  A version code without leading `"v"`, e.g. `"1.6.0"`.
#'
#' @return A data frame with three columns, all in string format:
#' * `package` (package name),
#' * `version` (minimum version requirement or `NA` if none),
#' * `type` (dependency type, e.g. `"Imports"`).
#'
#' @examplesIf !woodendesc:::is_cran_check()
#' wood_cran_dependencies("deepdep")
#' wood_cran_dependencies("ggplot2", version = "3.4.0")
#'
#' @family cran
#' @family dependencies
#' @export
wood_cran_dependencies <- function(package, version = "latest") {
  assert_param_package(package)
  assert_param_version(version)

  version <- match_version_cran(package, version)

  descs <- cran_descriptions_cache(package)
  # Use cached data if available
  if (!is.null(descs)) {
    desc <- descs[[version]]
    if (!is.null(desc)) {
      return(extract_dependencies(desc, parser = parse_dependencies_crandb))
    }
  }
  # If not, try version-specific cache
  desc <- cran_dependencies_cache(package, version)
  extract_dependencies(desc)
}

cran_descriptions_cache <- function(package) {
  with_cache({}, "descriptions", "CRAN", package)
}

cran_dependencies_cache <- function(package, version) {
  with_cache({
    desc <- rlang::try_fetch({
      httr2::request("https://raw.githubusercontent.com") |>
        httr2::req_url_path_append("cran", package, version, "DESCRIPTION") |>
        httr2::req_perform() |>
        httr2::resp_body_string()
    }, httr2_http_404 = function(cnd) {
      rlang::abort(
        sprintf("Can't find package `%1$s` or version `%2$s` on CRAN.", package, version),
        parent = cnd
      )
    })

    read_dcf(desc)[[package]]
  }, "dependencies", "CRAN", package, version)
}
ErdaradunGaztea/woodendesc documentation built on Feb. 1, 2025, 2:26 a.m.