Skip to content

Commit

Permalink
fix tests; new get_avail_date() to avoid a blind + 1 day
Browse files Browse the repository at this point in the history
  • Loading branch information
pawelru committed Aug 26, 2024
1 parent ab5ffe3 commit 99091e6
Show file tree
Hide file tree
Showing 21 changed files with 183 additions and 46 deletions.
4 changes: 4 additions & 0 deletions NAMESPACE
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# Generated by roxygen2: do not edit by hand

S3method(get_avail_date,remote_ref)
S3method(get_avail_date,remote_ref_cran)
S3method(get_avail_date,remote_ref_standard)
S3method(get_ref_min,remote_ref)
S3method(get_ref_min,remote_ref_cran)
S3method(get_ref_min,remote_ref_github)
Expand All @@ -17,6 +20,7 @@ S3method(solve_ip,min_isolated_deps_installation_proposal)
export(check_ip)
export(download_ip)
export(execute_ip)
export(get_avail_date)
export(get_ref_max)
export(get_ref_min)
export(get_ref_min_incl_cran)
Expand Down
13 changes: 7 additions & 6 deletions R/deps_installation_proposal.R
Original file line number Diff line number Diff line change
Expand Up @@ -197,23 +197,24 @@ new_min_cohort_deps_installation_proposal <- function(path, # nolint
version <- version_from_desc(d, i_ref$package)
i_ref_ver <- get_ref_min(i_ref, version$op, version$op_ver)

get_release_date(i_ref_ver)
get_avail_date(i_ref_ver)
}
)

# Obtain the maximum release data of all the dependencies
deps_release_dates_v <- unlist(lapply(deps_release_dates, as.Date, origin = "1970-01-01"))
if (length(deps_release_dates_v) == 1 && is.na(deps_release_dates_v)) {
deps_release_dates_v <- Inf
}
max_release_date <- as.Date(
max(
as.Date(-Inf), # Suppress warning when running max() with all NA and `na.rm = TRUE`
unlist(
lapply(deps_release_dates, as.Date, origin = "1970-01-01")
),
deps_release_dates_v,
na.rm = TRUE
),
origin = "1970-01-01"
)

ppm_repo <- get_ppm_snapshot_by_date(max_release_date + 1)
ppm_repo <- get_ppm_snapshot_by_date(max_release_date)

config <- append_config(config, list("cran_mirror" = ppm_repo))

Expand Down
104 changes: 89 additions & 15 deletions R/get_ref.R
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@ get_ref_min_incl_cran <- function(remote_ref, op = "", op_ver = "") {

#' @rdname get_ref_min_incl_cran
#' @export
#' @examples
#' verdepcheck:::get_ref_min_incl_cran(pkgdepends::parse_pkg_ref("bioc::MultiAssayExperiment"))
#' @examplesIf Sys.getenv("R_USER_CACHE_DIR", "") != ""
#' verdepcheck:::get_ref_min_incl_cran(pkgdepends::parse_pkg_ref("dplyr"))
#' @examples
#' verdepcheck:::get_ref_min_incl_cran(pkgdepends::parse_pkg_ref("bioc::MultiAssayExperiment"))
get_ref_min_incl_cran.remote_ref <- function(remote_ref, op = "", op_ver = "") {
get_ref_min(remote_ref, op, op_ver)
}
Expand All @@ -27,7 +27,7 @@ get_ref_min_incl_cran.remote_ref <- function(remote_ref, op = "", op_ver = "") {
#' @importFrom pkgdepends parse_pkg_ref
#' @export
#' @examplesIf Sys.getenv("R_USER_CACHE_DIR", "") != ""
#' verdepcheck:::get_ref_min_incl_cran(pkgdepends::parse_pkg_ref("cran/dplyr"))
#' verdepcheck:::get_ref_min_incl_cran(pkgdepends::parse_pkg_ref("tidyverse/dplyr"))
get_ref_min_incl_cran.remote_ref_github <- function(remote_ref, op = "", op_ver = "") {
if (check_if_on_cran(remote_ref, op = op, op_ver = op_ver)) {
gh_res <- get_ref_min(remote_ref, op, op_ver)
Expand All @@ -53,10 +53,10 @@ get_ref_min_incl_cran.remote_ref_github <- function(remote_ref, op = "", op_ver
#' @keywords internal
#'
#' @examplesIf Sys.getenv("R_USER_CACHE_DIR", "") != ""
#' verdepcheck:::check_if_on_cran(list(package = "dplyr"))
#' verdepcheck:::check_if_on_cran(list(package = "dplyr"), op = ">=", op_ver = "1.1.0")
#' verdepcheck:::check_if_on_cran(list(package = "dplyr"), op = ">=", op_ver = "9999.9.99")
#' verdepcheck:::check_if_on_cran(list(package = "dplyr"), op = "<", op_ver = "0.0.0")
#' verdepcheck:::check_if_on_cran(pkgdepends::parse_pkg_ref("dplyr"))
#' verdepcheck:::check_if_on_cran(pkgdepends::parse_pkg_ref("dplyr"), op = ">=", op_ver = "1.1.0")
#' verdepcheck:::check_if_on_cran(pkgdepends::parse_pkg_ref("dplyr"), op = ">=", op_ver = "9999.9.99")
#' verdepcheck:::check_if_on_cran(pkgdepends::parse_pkg_ref("dplyr"), op = "<", op_ver = "0.0.0")
check_if_on_cran <- function(remote_ref, op = "", op_ver = "") {
cran_listings <- pkgcache::meta_cache_list(remote_ref$package)
if (op == "" || op_ver == "") {
Expand Down Expand Up @@ -140,7 +140,7 @@ get_ref_min.remote_ref_standard <- function(remote_ref, op = "", op_ver = "") {
#' @importFrom pkgdepends parse_pkg_ref
#'
#' @examplesIf gh::gh_token() != ""
#' get_ref_min(pkgdepends::parse_pkg_ref("cran/dplyr"))
#' get_ref_min(pkgdepends::parse_pkg_ref("tidyverse/dplyr"))
get_ref_min.remote_ref_github <- function(remote_ref, op = "", op_ver = "") {
if (remote_ref$commitish != "") {
return(remote_ref)
Expand Down Expand Up @@ -276,7 +276,9 @@ get_desc_from_gh <- function(org, repo, ref = "") {
#'
#' @examplesIf Sys.getenv("R_USER_CACHE_DIR", "") != ""
#' get_ref_max(pkgdepends::parse_pkg_ref("dplyr"))
#' get_ref_max(pkgdepends::parse_pkg_ref("cran::dplyr"))
#' get_ref_max(pkgdepends::parse_pkg_ref("tidyverse/dplyr"))
#' get_ref_max(pkgdepends::parse_pkg_ref("bioc::MultiAssayExperiment"))
get_ref_max <- function(remote_ref) {
get_ref_internal(remote_ref, include_release = FALSE)
}
Expand All @@ -291,9 +293,11 @@ get_ref_max <- function(remote_ref) {
#'
#' @examplesIf Sys.getenv("R_USER_CACHE_DIR", "") != ""
#' get_ref_release(pkgdepends::parse_pkg_ref("dplyr"))
#' get_ref_release(pkgdepends::parse_pkg_ref("cran::dplyr"))
#' get_ref_release(pkgdepends::parse_pkg_ref("tidyverse/dplyr"))
#' get_ref_release(pkgdepends::parse_pkg_ref("bioc::MultiAssayExperiment"))
get_ref_release <- function(remote_ref) {
get_ref_internal(remote_ref)
get_ref_internal(remote_ref, include_input = FALSE)
}

#' Get reference of the maximal version of the package.
Expand Down Expand Up @@ -404,6 +408,7 @@ get_version <- function(remote_ref) {
#' @examplesIf Sys.getenv("R_USER_CACHE_DIR", "") != ""
#' get_version(pkgdepends::parse_pkg_ref("dplyr"))
#' get_version(pkgdepends::parse_pkg_ref("tidyverse/dplyr"))
#' get_version(pkgdepends::parse_pkg_ref("tidyverse/dplyr@v1.1.0"))
#' get_version(pkgdepends::parse_pkg_ref("bioc::MultiAssayExperiment"))
get_version.remote_ref <- function(remote_ref) {
x <- pkgdepends::new_pkg_deps(remote_ref$ref, config = list(dependencies = FALSE))
Expand Down Expand Up @@ -462,13 +467,12 @@ get_release_date.remote_ref_github <- function(remote_ref) {
as.Date(resp$data$repository$object$committedDate)
}

#' Get release date from GitHub references
#'
#' @rdname get_release_date
#' @export
#'
#' @examplesIf Sys.getenv("R_USER_CACHE_DIR", "") != ""
#' get_release_date(pkgdepends::parse_pkg_ref("dplyr@1.1.0"))
#' get_release_date(pkgdepends::parse_pkg_ref("cran::dplyr"))
#' get_release_date(pkgdepends::parse_pkg_ref("cran::dplyr@1.1.0"))
get_release_date.remote_ref_cran <- function(remote_ref) {
rel_data <- get_release_data(remote_ref$package)

Expand Down Expand Up @@ -520,7 +524,7 @@ get_release_date.remote_ref <- function(remote_ref) {
#' @keywords internal
#' @examplesIf Sys.getenv("R_USER_CACHE_DIR", "") != ""
#' verdepcheck:::get_release_data("dplyr")
#' verdepcheck:::get_release_data("SummarizedExperiment")
#' verdepcheck:::get_release_data("MultiAssayExperiment")
get_release_data <- function(package) {
cran_archive <- pkgcache::cran_archive_list(packages = package)[, c("package", "version", "mtime")]
cran_current <- head(
Expand All @@ -546,11 +550,15 @@ get_release_data <- function(package) {
)
} else if (cran_current$type == "bioc") {
url <- sprintf(
"https://packagemanager.posit.co/__api__/repos/4/packages/%s?bioc_version=%s",
"https://packagemanager.posit.co/__api__/repos/bioconductor/packages/%s?bioc_version=%s",
package,
pkgcache::bioc_version()
)
release_date <- as.POSIXct(jsonlite::fromJSON(readLines(url, warn = FALSE))$occurred)
data <- jsonlite::fromJSON(readLines(url, warn = FALSE))
release_date <- as.POSIXct(data$occurred) %||%
as.POSIXct(data$package_date) %||%
as.POSIXct(data$date_publication) %||%
as.POSIXct(NA)
cran_current <- data.frame(
type = "bioc",
package = package,
Expand All @@ -567,3 +575,69 @@ get_release_data <- function(package) {
cran_current <- setNames(cran_current, names(cran_archive))
rbind(cran_archive, cran_current)
}


#' Get available date for the package.
#'
#' Oftentimes, the release date of the package does not correspond to the date when the package is
#' available in the PPM. Usually it takes one day for the PPM to sync with the CRAN.
#' This function will return the date when the package is available in the PPM.
#'
#' @inheritParams get_ref_min
#' @param start (`Date`) optional, the date when the package was released
#' @returns Date. This can be safely used as a snapshot date for the PPM.
#'
#' @export
get_avail_date <- function(remote_ref, start = get_release_date(remote_ref)) {
if (is.na(start)) {
return(as.Date(NA_real_))
}
UseMethod("get_avail_date", remote_ref)
}

#' @rdname get_avail_date
#' @export
#'
#' @examplesIf Sys.getenv("R_USER_CACHE_DIR", "") != ""
#' get_avail_date(pkgdepends::parse_pkg_ref("cran::dplyr"))
#' get_avail_date(pkgdepends::parse_pkg_ref("cran::dplyr@1.1.0"))
get_avail_date.remote_ref_cran <- function(remote_ref, start = get_release_date(remote_ref)) {
max_iter <- 5
i <- 0
date <- start
while (i <= max_iter) {
ppm_url <- get_ppm_snapshot_by_date(date)
date <- unname(as.Date(sub(".*/", "", ppm_url)))
data <- available.packages(
repos = ppm_url,
filters = list(function(db) db[db[, "Package"] == remote_ref$package, ])
)
if (length(data) > 0) {
return(date)
}
date <- date + 1
i <- i + 1
}
warning("No available date found.")
as.Date(NA_real_)
}

#' @rdname get_avail_date
#' @export
#'
#' @examplesIf Sys.getenv("R_USER_CACHE_DIR", "") != ""
#' get_avail_date(pkgdepends::parse_pkg_ref("dplyr"))
#' get_avail_date(pkgdepends::parse_pkg_ref("dplyr@1.1.0"))
get_avail_date.remote_ref_standard <- function(remote_ref, start = get_release_date(remote_ref)) {
get_avail_date.remote_ref_cran(remote_ref, start = start)
}

#' @rdname get_avail_date
#' @export
#'
#' @examplesIf Sys.getenv("R_USER_CACHE_DIR", "") != "" && gh::gh_token() != ""
#' get_avail_date(pkgdepends::parse_pkg_ref("bioc::MultiAssayExperiment"))
#' get_avail_date(pkgdepends::parse_pkg_ref("tidyverse/dplyr@v1.1.0"))
get_avail_date.remote_ref <- function(remote_ref, start = get_release_date(remote_ref)) {
start + 1
}
2 changes: 1 addition & 1 deletion R/solve.R
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ solve_ip.deps_installation_proposal <- function(ip) {

#' Try to solve using min_isolated method. If Error - use [resolve_ignoring_release_remote]
#'
#' For each direct dependency, resolve that package using PPM snapshot as of release date + 1.
#' For each direct dependency, resolve that package using PPM snapshot as of release date.
#' Finally, combine resolutions and run solve.
#'
#' @keywords internal
Expand Down
5 changes: 3 additions & 2 deletions R/utils.R
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ get_ppm_snapshot_by_date <- function(date = NA) {
)
}

#' Resolve the dependencies of a package based on its release date + 1.
#' Resolve the dependencies of a package based on its release date.
#'
#' @importFrom pkgdepends new_pkg_deps parse_pkg_ref
#' @keywords internal
Expand All @@ -55,8 +55,9 @@ resolve_ppm_snapshot <- function(pkg_ref_str, operator, pkg_version) {
i_ref_minver <- get_ref_min_incl_cran(i_ref, operator, pkg_version)

i_release_date <- get_release_date(i_ref_minver)
i_avail_date <- get_avail_date(i_ref_minver, start = i_release_date)

ppm_repo <- get_ppm_snapshot_by_date(i_release_date)
ppm_repo <- get_ppm_snapshot_by_date(i_avail_date)

i_pkg_deps <- pkgdepends::new_pkg_deps(
ifelse(
Expand Down
1 change: 1 addition & 0 deletions _pkgdown.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,5 @@ reference:
contents:
- starts_with("get_ref_")
- get_release_date
- get_avail_date
- get_version
8 changes: 4 additions & 4 deletions man/check_if_on_cran.Rd

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

44 changes: 44 additions & 0 deletions man/get_avail_date.Rd

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

2 changes: 2 additions & 0 deletions man/get_ref_max.Rd

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

2 changes: 1 addition & 1 deletion man/get_ref_min.Rd

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

4 changes: 2 additions & 2 deletions man/get_ref_min_incl_cran.Rd

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

2 changes: 2 additions & 0 deletions man/get_ref_release.Rd

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

2 changes: 1 addition & 1 deletion man/get_release_data.Rd

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

Loading

0 comments on commit 99091e6

Please sign in to comment.