-
Notifications
You must be signed in to change notification settings - Fork 0
/
cran-dependencies.R
55 lines (51 loc) · 1.67 KB
/
cran-dependencies.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#' 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"`).
#'
#' @examples
#' \donttest{
#' 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({
url <- raw_github_url("cran", package, version, "DESCRIPTION")
desc <- download_safely(url, on_status = list(
`404` = function() stopf("Can't find package `%1$s` on CRAN.", package)
))
read_dcf(desc)[[package]]
}, "dependencies", "CRAN", package, version)
}