From a5eee26ebfa603328f443b45c553966677e8692d Mon Sep 17 00:00:00 2001 From: "Jonathan Beus, MD" Date: Tue, 11 Nov 2025 11:30:33 -0500 Subject: [PATCH 01/31] Refactor geocoding processing with unique name repair --- entrypoint.R | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/entrypoint.R b/entrypoint.R index cd0c1e0..03621a9 100755 --- a/entrypoint.R +++ b/entrypoint.R @@ -76,10 +76,11 @@ if (nrow(d_for_geocoding) > 0) { ## extract results, if a tie then take first returned result d_for_geocoding <- d_for_geocoding %>% dplyr::mutate( - row_index = 1:nrow(d_for_geocoding), - geocodes = purrr::map(geocodes, ~ .x %>% - purrr::map(unlist) %>% - as_tibble()) + geocodes = purrr::map( + geocodes, + ~ purrr::map(.x, unlist) %>% + tibble::as_tibble(.name_repair = "unique") + ) ) %>% tidyr::unnest(cols = c(geocodes)) %>% dplyr::group_by(row_index) %>% From 49a626b94a4e9d1da1a3bd0d99138e8f5fb5766d Mon Sep 17 00:00:00 2001 From: "Jonathan Beus, MD" Date: Tue, 11 Nov 2025 11:32:17 -0500 Subject: [PATCH 02/31] Add row_index to geocoding results --- entrypoint.R | 1 + 1 file changed, 1 insertion(+) diff --git a/entrypoint.R b/entrypoint.R index 03621a9..8193952 100755 --- a/entrypoint.R +++ b/entrypoint.R @@ -76,6 +76,7 @@ if (nrow(d_for_geocoding) > 0) { ## extract results, if a tie then take first returned result d_for_geocoding <- d_for_geocoding %>% dplyr::mutate( + row_index = 1:nrow(d_for_geocoding), geocodes = purrr::map( geocodes, ~ purrr::map(.x, unlist) %>% From 629a5656169ff8ff0b99b6d72e8e1670ae07a4c7 Mon Sep 17 00:00:00 2001 From: "Jonathan Beus, MD" Date: Wed, 12 Nov 2025 20:43:28 -0500 Subject: [PATCH 03/31] update to R 4.4.3 and update packages; add logging to R function --- Dockerfile | 14 +- entrypoint.R | 89 ++- renv.lock | 1814 +++++++++++++++++++++++++++++++++++++------- renv/activate.R | 825 ++++++++++++++------ renv/settings.dcf | 1 + renv/settings.json | 19 + 6 files changed, 2242 insertions(+), 520 deletions(-) create mode 100644 renv/settings.json diff --git a/Dockerfile b/Dockerfile index 5cced36..82cafbd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,8 @@ -FROM rocker/r-ver:4.4.1 +FROM ghcr.io/rocker-org/r-ver:4.4.3 # DeGAUSS container metadata ENV degauss_name="geocoder" -ENV degauss_version="3.4.0" +ENV degauss_version="3.4.1" ENV degauss_description="geocodes" ENV degauss_argument="valid_geocode_score_threshold [default: 0.5]" @@ -48,11 +48,19 @@ WORKDIR /app # install required version of renv RUN R --quiet -e "install.packages('remotes', repos = c(CRAN = 'https://packagemanager.posit.co/cran/latest'))" -RUN R --quiet -e "remotes::install_github('rstudio/renv@v1.0.7')" +RUN R --quiet -e "remotes::install_github('rstudio/renv@v1.1.5')" + +# Fix for bit package compilation issue with R 4.5.x +# The bit package needs R_NO_REMAP to be defined before including R headers +RUN mkdir -p /root/.R && \ + echo 'PKG_CFLAGS = -DR_NO_REMAP' > /root/.R/Makevars COPY renv.lock . RUN R --quiet -e "renv::restore(repos = c(CRAN = 'https://packagemanager.posit.co/cran/latest'))" +# Clean up Makevars after installation +RUN rm -f /root/.R/Makevars + COPY geocode.rb . COPY entrypoint.R . diff --git a/entrypoint.R b/entrypoint.R index 8193952..0075050 100755 --- a/entrypoint.R +++ b/entrypoint.R @@ -13,6 +13,12 @@ doc <- " opt <- docopt::docopt(doc) if (is.null(opt$score_threshold)) opt$score_threshold <- 0.5 +cat("[INFO] ========================================\n", file = stdout()) +cat(sprintf("[INFO] geocoder entrypoint.R starting\n"), file = stdout()) +cat(sprintf("[INFO] Input file: %s\n", opt$filename), file = stdout()) +cat(sprintf("[INFO] Score threshold: %s\n", opt$score_threshold), file = stdout()) +cat("[INFO] ========================================\n", file = stdout()) + d <- readr::read_csv(opt$filename, show_col_types = FALSE) # d <- readr::read_csv('test/my_address_file.csv') # d <- readr::read_csv('test/my_address_file_missing.csv') @@ -21,6 +27,7 @@ d <- readr::read_csv(opt$filename, show_col_types = FALSE) if (!"address" %in% names(d)) stop("no column called address found in the input file", call. = FALSE) ## clean up addresses / classify 'bad' addresses +cat(sprintf("[INFO] Processing %d total addresses\n", nrow(d)), file = stdout()) d$address <- dht::clean_address(d$address) d$po_box <- dht::address_is_po_box(d$address) d$cincy_inst_foster_addr <- dht::address_is_institutional(d$address) @@ -29,9 +36,12 @@ d$non_address_text <- dht::address_is_nonaddress(d$address) ## exclude 'bad' addresses from geocoding (unless specified to return all geocodes) if (opt$score_threshold == "all") { d_for_geocoding <- d + cat(sprintf("[INFO] Score threshold set to 'all' - will geocode all %d addresses\n", nrow(d_for_geocoding)), file = stdout()) } else { d_excluded_for_address <- dplyr::filter(d, cincy_inst_foster_addr | po_box | non_address_text) d_for_geocoding <- dplyr::filter(d, !cincy_inst_foster_addr & !po_box & !non_address_text) + cat(sprintf("[INFO] Excluded %d addresses (PO boxes, institutional, or non-address text)\n", nrow(d_excluded_for_address)), file = stdout()) + cat(sprintf("[INFO] Will geocode %d addresses with score threshold %.2f\n", nrow(d_for_geocoding), as.numeric(opt$score_threshold)), file = stdout()) } out_template <- tibble( @@ -45,19 +55,39 @@ cli::cli_alert_info("now geocoding ...", wrap = TRUE) geocode <- function(addr_string) { stopifnot(class(addr_string) == "character") - out <- system2("ruby", - args = c("/app/geocode.rb", shQuote(addr_string)), - stderr = FALSE, stdout = TRUE - ) - - if (length(out) > 0) { - out <- out %>% - jsonlite::fromJSON() - - out <- - bind_rows(out_template, out) %>% - .[2, ] + out <- tryCatch({ + system2("ruby", + args = c("/app/geocode.rb", shQuote(addr_string)), + stderr = FALSE, stdout = TRUE + ) + }, error = function(e) { + cat(sprintf("[ERROR] geocode() system2 call failed for address: %s\n", substr(addr_string, 1, 50)), file = stdout()) + cat(sprintf("[ERROR] Error message: %s\n", e$message), file = stdout()) + return(character(0)) + }) + + if (length(out) > 0 && !is.null(out) && out != "") { + tryCatch({ + out <- out %>% + jsonlite::fromJSON() + + # Handle case where fromJSON returns empty or malformed data + if (is.null(out) || length(out) == 0) { + cat(sprintf("[WARN] Empty JSON result for address: %s\n", substr(addr_string, 1, 50)), file = stdout()) + return(out_template) + } + + out <- + bind_rows(out_template, out) %>% + .[2, ] + }, error = function(e) { + cat(sprintf("[ERROR] JSON parsing/processing failed for address: %s\n", substr(addr_string, 1, 50)), file = stdout()) + cat(sprintf("[ERROR] Error message: %s\n", e$message), file = stdout()) + cat(sprintf("[DEBUG] Raw output: %s\n", paste(out, collapse = " | ")), file = stdout()) + return(out_template) + }) } else { + cat(sprintf("[WARN] No output from geocoder for address: %s\n", substr(addr_string, 1, 50)), file = stdout()) out <- out_template } @@ -66,6 +96,7 @@ geocode <- function(addr_string) { # if any geocodes are returned, regardless of score_threshold... if (nrow(d_for_geocoding) > 0) { + cat(sprintf("[INFO] Starting geocoding of %d addresses...\n", nrow(d_for_geocoding)), file = stdout()) d_for_geocoding$geocodes <- mappp::mappp(d_for_geocoding$address, geocode, parallel = TRUE, @@ -73,14 +104,37 @@ if (nrow(d_for_geocoding) > 0) { cache_name = "geocoding_cache" ) + cat("[INFO] Geocoding complete, now processing results...\n", file = stdout()) + ## extract results, if a tie then take first returned result d_for_geocoding <- d_for_geocoding %>% dplyr::mutate( row_index = 1:nrow(d_for_geocoding), geocodes = purrr::map( geocodes, - ~ purrr::map(.x, unlist) %>% - tibble::as_tibble(.name_repair = "unique") + ~ { + # Handle NULL or empty geocode results + if (is.null(.x) || length(.x) == 0) { + return(list(out_template)) + } + + # Map over each element and ensure proper structure + result <- purrr::map(.x, function(item) { + if (is.null(item) || length(item) == 0) { + return(out_template) + } + unlist(item) + }) + + # Convert to tibble with name repair + tryCatch({ + tibble::as_tibble(result, .name_repair = "unique") + }, error = function(e) { + # If conversion fails, return the template + cat(sprintf("[ERROR] Failed to convert geocode result to tibble: %s\n", e$message), file = stdout()) + out_template + }) + } ) ) %>% tidyr::unnest(cols = c(geocodes)) %>% @@ -99,9 +153,12 @@ if (nrow(d_for_geocoding) > 0) { ordered = TRUE )) %>% dplyr::arrange(desc(precision), score) + + cat(sprintf("[INFO] Successfully processed %d geocoded addresses\n", nrow(d_for_geocoding)), file = stdout()) } else if (nrow(d_for_geocoding) == 0 & opt$score_threshold != "all") { # if no geocodes are returned and not returning all geocodes, # then bind non-geocoded with out template + cat("[INFO] No addresses to geocode after filtering\n", file = stdout()) d_excluded_for_address <- bind_rows(d_excluded_for_address, out_template) %>% .[1:nrow(.) - 1, ] @@ -110,8 +167,10 @@ if (nrow(d_for_geocoding) > 0) { ## clean up 'bad' address columns / filter to precise geocodes cli::cli_alert_info("geocoding complete; now filtering to precise geocodes...", wrap = TRUE) if (opt$score_threshold == "all") { + cat("[INFO] Returning all geocodes without filtering\n", file = stdout()) out_file <- d_for_geocoding } else { +cat(sprintf("[INFO] Filtering geocodes with score threshold %.2f\n", as.numeric(opt$score_threshold)), file = stdout()) out_file <- dplyr::bind_rows(d_excluded_for_address, d_for_geocoding) %>% dplyr::mutate( geocode_result = dplyr::case_when( @@ -128,11 +187,13 @@ out_file <- dplyr::bind_rows(d_excluded_for_address, d_for_geocoding) %>% } ## write out file +cat(sprintf("[INFO] Writing output file with %d rows\n", nrow(out_file)), file = stdout()) dht::write_geomarker_file( out_file, filename = opt$filename, argument = glue::glue("score_threshold_{opt$score_threshold}") ) +cat("[INFO] Output file written successfully\n", file = stdout()) ## summarize geocoding results and ## print geocoding results summary to console diff --git a/renv.lock b/renv.lock index 25c47f3..09d086b 100644 --- a/renv.lock +++ b/renv.lock @@ -1,6 +1,6 @@ { "R": { - "Version": "4.4.1", + "Version": "4.4.3", "Repositories": [] }, "Packages": { @@ -8,663 +8,1895 @@ "Package": "R6", "Version": "2.5.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Title": "Encapsulated Classes with Reference Semantics", + "Authors@R": "person(\"Winston\", \"Chang\", role = c(\"aut\", \"cre\"), email = \"winston@stdout.org\")", + "Description": "Creates classes with reference semantics, similar to R's built-in reference classes. Compared to reference classes, R6 classes are simpler and lighter-weight, and they are not built on S4 classes so they do not require the methods package. These classes allow public and private members, and they support inheritance, even when the classes are defined in different packages.", + "Depends": [ + "R (>= 3.0)" ], - "Hash": "470851b6d5d0ac559e9d01bb352b4021" + "Suggests": [ + "testthat", + "pryr" + ], + "License": "MIT + file LICENSE", + "URL": "https://r6.r-lib.org, https://github.com/r-lib/R6/", + "BugReports": "https://github.com/r-lib/R6/issues", + "RoxygenNote": "7.1.1", + "NeedsCompilation": "no", + "Author": "Winston Chang [aut, cre]", + "Maintainer": "Winston Chang ", + "Repository": "RSPM", + "Encoding": "UTF-8" }, "bit": { "Package": "bit", "Version": "4.0.5", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Type": "Package", + "Title": "Classes and Methods for Fast Memory-Efficient Boolean Selections", + "Date": "2022-11-13", + "Author": "Jens Oehlschlägel [aut, cre], Brian Ripley [ctb]", + "Maintainer": "Jens Oehlschlägel ", + "Depends": [ + "R (>= 2.9.2)" + ], + "Suggests": [ + "testthat (>= 0.11.0)", + "roxygen2", + "knitr", + "rmarkdown", + "microbenchmark", + "bit64 (>= 4.0.0)", + "ff (>= 4.0.0)" ], - "Hash": "d242abec29412ce988848d0294b208fd" + "Description": "Provided are classes for boolean and skewed boolean vectors, fast boolean methods, fast unique and non-unique integer sorting, fast set operations on sorted and unsorted sets of integers, and foundations for ff (range index, compression, chunked processing).", + "License": "GPL-2 | GPL-3", + "LazyLoad": "yes", + "ByteCompile": "yes", + "Encoding": "UTF-8", + "URL": "https://github.com/truecluster/bit", + "VignetteBuilder": "knitr, rmarkdown", + "RoxygenNote": "7.2.0", + "NeedsCompilation": "yes", + "Repository": "RSPM" }, "bit64": { "Package": "bit64", "Version": "4.0.5", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "bit", + "Type": "Package", + "Title": "A S3 Class for Vectors of 64bit Integers", + "Date": "2020-08-29", + "Author": "Jens Oehlschlägel [aut, cre], Leonardo Silvestri [ctb]", + "Maintainer": "Jens Oehlschlägel ", + "Depends": [ + "R (>= 3.0.1)", + "bit (>= 4.0.0)", + "utils", "methods", - "stats", - "utils" + "stats" ], - "Hash": "9fe98599ca456d6552421db0d6772d8f" + "Description": "Package 'bit64' provides serializable S3 atomic 64bit (signed) integers. These are useful for handling database keys and exact counting in +-2^63. WARNING: do not use them as replacement for 32bit integers, integer64 are not supported for subscripting by R-core and they have different semantics when combined with double, e.g. integer64 + double => integer64. Class integer64 can be used in vectors, matrices, arrays and data.frames. Methods are available for coercion from and to logicals, integers, doubles, characters and factors as well as many elementwise and summary functions. Many fast algorithmic operations such as 'match' and 'order' support inter- active data exploration and manipulation and optionally leverage caching.", + "License": "GPL-2 | GPL-3", + "LazyLoad": "yes", + "ByteCompile": "yes", + "URL": "https://github.com/truecluster/bit64", + "Encoding": "UTF-8", + "Repository": "RSPM", + "Repository/R-Forge/Project": "ff", + "Repository/R-Forge/Revision": "177", + "Repository/R-Forge/DateTimeStamp": "2018-08-17 17:45:18", + "NeedsCompilation": "yes" }, "cachem": { "Package": "cachem", "Version": "1.1.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "fastmap", - "rlang" + "Title": "Cache R Objects with Automatic Pruning", + "Description": "Key-value stores with automatic pruning. Caches can limit either their total size or the age of the oldest object (or both), automatically pruning objects to maintain the constraints.", + "Authors@R": "c( person(\"Winston\", \"Chang\", , \"winston@posit.co\", c(\"aut\", \"cre\")), person(family = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")))", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "ByteCompile": "true", + "URL": "https://cachem.r-lib.org/, https://github.com/r-lib/cachem", + "Imports": [ + "rlang", + "fastmap (>= 1.2.0)" ], - "Hash": "cd9a672193789068eb5a2aad65a0dedf" + "Suggests": [ + "testthat" + ], + "RoxygenNote": "7.2.3", + "Config/Needs/routine": "lobstr", + "Config/Needs/website": "pkgdown", + "NeedsCompilation": "yes", + "Author": "Winston Chang [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Winston Chang ", + "Repository": "RSPM" }, "cli": { "Package": "cli", "Version": "3.6.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Helpers for Developing Command Line Interfaces", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Hadley\", \"Wickham\", role = \"ctb\"), person(\"Kirill\", \"Müller\", role = \"ctb\"), person(\"Salim\", \"Brüggemann\", , \"salim-b@pm.me\", role = \"ctb\", comment = c(ORCID = \"0000-0002-5329-5987\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A suite of tools to build attractive command line interfaces ('CLIs'), from semantic elements: headings, lists, alerts, paragraphs, etc. Supports custom themes via a 'CSS'-like language. It also contains a number of lower level 'CLI' elements: rules, boxes, trees, and 'Unicode' symbols with 'ASCII' alternatives. It support ANSI colors and text styles as well.", + "License": "MIT + file LICENSE", + "URL": "https://cli.r-lib.org, https://github.com/r-lib/cli", + "BugReports": "https://github.com/r-lib/cli/issues", + "Depends": [ + "R (>= 3.4)" + ], + "Imports": [ "utils" ], - "Hash": "b21916dd77a27642b447374a5d30ecf3" + "Suggests": [ + "callr", + "covr", + "crayon", + "digest", + "glue (>= 1.6.0)", + "grDevices", + "htmltools", + "htmlwidgets", + "knitr", + "methods", + "mockery", + "processx", + "ps (>= 1.3.4.9000)", + "rlang (>= 1.0.2.9003)", + "rmarkdown", + "rprojroot", + "rstudioapi", + "testthat", + "tibble", + "whoami", + "withr" + ], + "Config/Needs/website": "r-lib/asciicast, bench, brio, cpp11, decor, desc, fansi, prettyunits, sessioninfo, tidyverse/tidytemplate, usethis, vctrs", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "yes", + "Author": "Gábor Csárdi [aut, cre], Hadley Wickham [ctb], Kirill Müller [ctb], Salim Brüggemann [ctb] (), Posit Software, PBC [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "RSPM" }, "clipr": { "Package": "clipr", "Version": "0.8.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Type": "Package", + "Title": "Read and Write from the System Clipboard", + "Authors@R": "c( person(\"Matthew\", \"Lincoln\", , \"matthew.d.lincoln@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4387-3384\")), person(\"Louis\", \"Maddox\", role = \"ctb\"), person(\"Steve\", \"Simpson\", role = \"ctb\"), person(\"Jennifer\", \"Bryan\", role = \"ctb\") )", + "Description": "Simple utility functions to read from and write to the Windows, OS X, and X11 clipboards.", + "License": "GPL-3", + "URL": "https://github.com/mdlincoln/clipr, http://matthewlincoln.net/clipr/", + "BugReports": "https://github.com/mdlincoln/clipr/issues", + "Imports": [ "utils" ], - "Hash": "3f038e5ac7f41d4ac41ce658c85e3042" + "Suggests": [ + "covr", + "knitr", + "rmarkdown", + "rstudioapi (>= 0.5)", + "testthat (>= 2.0.0)" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.1.2", + "SystemRequirements": "xclip (https://github.com/astrand/xclip) or xsel (http://www.vergenet.net/~conrad/software/xsel/) for accessing the X11 clipboard, or wl-clipboard (https://github.com/bugaevc/wl-clipboard) for systems using Wayland.", + "NeedsCompilation": "no", + "Author": "Matthew Lincoln [aut, cre] (), Louis Maddox [ctb], Steve Simpson [ctb], Jennifer Bryan [ctb]", + "Maintainer": "Matthew Lincoln ", + "Repository": "RSPM" }, "cpp11": { "Package": "cpp11", "Version": "0.4.7", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Title": "A C++11 Interface for R's C Interface", + "Authors@R": "c( person(\"Davis\", \"Vaughan\", email = \"davis@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4777-038X\")), person(\"Jim\",\"Hester\", role = \"aut\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"Romain\", \"François\", role = \"aut\", comment = c(ORCID = \"0000-0002-2444-4226\")), person(\"Benjamin\", \"Kietzman\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Provides a header only, C++11 interface to R's C interface. Compared to other approaches 'cpp11' strives to be safe against long jumps from the C API as well as C++ exceptions, conform to normal R function semantics and supports interaction with 'ALTREP' vectors.", + "License": "MIT + file LICENSE", + "URL": "https://cpp11.r-lib.org, https://github.com/r-lib/cpp11", + "BugReports": "https://github.com/r-lib/cpp11/issues", + "Depends": [ + "R (>= 3.5.0)" + ], + "Suggests": [ + "bench", + "brio", + "callr", + "cli", + "covr", + "decor", + "desc", + "ggplot2", + "glue", + "knitr", + "lobstr", + "mockery", + "progress", + "rmarkdown", + "scales", + "Rcpp", + "testthat (>= 3.2.0)", + "tibble", + "utils", + "vctrs", + "withr" ], - "Hash": "5a295d7d963cc5035284dcdbaf334f4e" + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/Needs/cpp11/cpp_register": "brio, cli, decor, desc, glue, tibble, vctrs", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "no", + "Author": "Davis Vaughan [aut, cre] (), Jim Hester [aut] (), Romain François [aut] (), Benjamin Kietzman [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Davis Vaughan ", + "Repository": "RSPM" }, "crayon": { "Package": "crayon", "Version": "1.5.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "Colored Terminal Output", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Brodie\", \"Gaslam\", , \"brodie.gaslam@yahoo.com\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "The crayon package is now superseded. Please use the 'cli' package for new projects. Colored terminal output on terminals that support 'ANSI' color and highlight codes. It also works in 'Emacs' 'ESS'. 'ANSI' color support is automatically detected. Colors and highlighting can be combined and nested. New styles can also be created easily. This package was inspired by the 'chalk' 'JavaScript' project.", + "License": "MIT + file LICENSE", + "URL": "https://r-lib.github.io/crayon/, https://github.com/r-lib/crayon", + "BugReports": "https://github.com/r-lib/crayon/issues", + "Imports": [ "grDevices", "methods", "utils" ], - "Hash": "859d96e65ef198fd43e82b9628d593ef" + "Suggests": [ + "mockery", + "rstudioapi", + "testthat", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.1", + "Collate": "'aaa-rstudio-detect.R' 'aaaa-rematch2.R' 'aab-num-ansi-colors.R' 'aac-num-ansi-colors.R' 'ansi-256.R' 'ansi-palette.R' 'combine.R' 'string.R' 'utils.R' 'crayon-package.R' 'disposable.R' 'enc-utils.R' 'has_ansi.R' 'has_color.R' 'link.R' 'styles.R' 'machinery.R' 'parts.R' 'print.R' 'style-var.R' 'show.R' 'string_operations.R'", + "NeedsCompilation": "no", + "Author": "Gábor Csárdi [aut, cre], Brodie Gaslam [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "RSPM" }, "dht": { "Package": "dht", "Version": "1.2.3", "Source": "GitHub", + "Title": "A Collection of Functions to Assist Building DeGAUSS Containers", + "Authors@R": "c( person(given = \"Erika\", family = \"Rasnick\", role = c(\"aut\", \"cre\"), email = \"erika.rasnick@cchmc.org\"), person(given = \"Cole\", family = \"Brokamp\", role = c(\"aut\")) )", + "Description": "degauss helper tools are used to develop and run DeGAUSS containers.", + "License": "GPL (>= 3)", + "Encoding": "UTF-8", + "LazyData": "true", + "Roxygen": "list(markdown = TRUE)", + "RoxygenNote": "7.2.2", + "Suggests": [ + "testthat (>= 3.0.0)", + "sf (>= 0.8-1)", + "renv (>= 0.8.3)", + "tibble", + "knitr", + "rmarkdown" + ], + "Imports": [ + "cli (>= 2.2.0)", + "magrittr", + "readr (>= 2.0.0)", + "dplyr (>= 1.0.0)", + "tidyr (>= 1.0.0)", + "glue (>= 1.4.2)", + "fs (>= 1.5.0)", + "withr (>= 2.2.0)", + "purrr (>= 0.3.4)", + "stringr (>= 1.4.0)", + "whisker (>= 0.4)", + "ps (>= 1.6.0)", + "prettyunits", + "tidyselect" + ], + "Depends": [ + "R (>= 2.10)" + ], + "Config/testthat/edition": "3", + "URL": "http://degauss.org/dht", + "VignetteBuilder": "knitr", + "BugReports": "https://github.com/degauss-org/dht/issues", + "Author": "Erika Rasnick [aut, cre], Cole Brokamp [aut]", + "Maintainer": "Erika Rasnick ", "RemoteType": "github", "RemoteHost": "api.github.com", "RemoteUsername": "degauss-org", "RemoteRepo": "dht", "RemoteRef": "master", - "RemoteSha": "f0b59bbb91697a55074d065642ed012b652e7d31", - "Requirements": [ - "R", - "cli", - "dplyr", - "fs", - "glue", - "magrittr", - "prettyunits", - "ps", - "purrr", - "readr", - "stringr", - "tidyr", - "tidyselect", - "whisker", - "withr" - ], - "Hash": "05547abc78751624749fb01f2a2e49b9" + "RemoteSha": "f0b59bbb91697a55074d065642ed012b652e7d31" }, "digest": { "Package": "digest", "Version": "0.6.37", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Authors@R": "c(person(\"Dirk\", \"Eddelbuettel\", role = c(\"aut\", \"cre\"), email = \"edd@debian.org\", comment = c(ORCID = \"0000-0001-6419-907X\")), person(\"Antoine\", \"Lucas\", role=\"ctb\"), person(\"Jarek\", \"Tuszynski\", role=\"ctb\"), person(\"Henrik\", \"Bengtsson\", role=\"ctb\", comment = c(ORCID = \"0000-0002-7579-5165\")), person(\"Simon\", \"Urbanek\", role=\"ctb\", comment = c(ORCID = \"0000-0003-2297-1732\")), person(\"Mario\", \"Frasca\", role=\"ctb\"), person(\"Bryan\", \"Lewis\", role=\"ctb\"), person(\"Murray\", \"Stokely\", role=\"ctb\"), person(\"Hannes\", \"Muehleisen\", role=\"ctb\"), person(\"Duncan\", \"Murdoch\", role=\"ctb\"), person(\"Jim\", \"Hester\", role=\"ctb\"), person(\"Wush\", \"Wu\", role=\"ctb\", comment = c(ORCID = \"0000-0001-5180-0567\")), person(\"Qiang\", \"Kou\", role=\"ctb\", comment = c(ORCID = \"0000-0001-6786-5453\")), person(\"Thierry\", \"Onkelinx\", role=\"ctb\", comment = c(ORCID = \"0000-0001-8804-4216\")), person(\"Michel\", \"Lang\", role=\"ctb\", comment = c(ORCID = \"0000-0001-9754-0393\")), person(\"Viliam\", \"Simko\", role=\"ctb\"), person(\"Kurt\", \"Hornik\", role=\"ctb\", comment = c(ORCID = \"0000-0003-4198-9911\")), person(\"Radford\", \"Neal\", role=\"ctb\", comment = c(ORCID = \"0000-0002-2473-3407\")), person(\"Kendon\", \"Bell\", role=\"ctb\", comment = c(ORCID = \"0000-0002-9093-8312\")), person(\"Matthew\", \"de Queljoe\", role=\"ctb\"), person(\"Dmitry\", \"Selivanov\", role=\"ctb\"), person(\"Ion\", \"Suruceanu\", role=\"ctb\"), person(\"Bill\", \"Denney\", role=\"ctb\"), person(\"Dirk\", \"Schumacher\", role=\"ctb\"), person(\"András\", \"Svraka\", role=\"ctb\"), person(\"Sergey\", \"Fedorov\", role=\"ctb\"), person(\"Will\", \"Landau\", role=\"ctb\", comment = c(ORCID = \"0000-0003-1878-3253\")), person(\"Floris\", \"Vanderhaeghe\", role=\"ctb\", comment = c(ORCID = \"0000-0002-6378-6229\")), person(\"Kevin\", \"Tappe\", role=\"ctb\"), person(\"Harris\", \"McGehee\", role=\"ctb\"), person(\"Tim\", \"Mastny\", role=\"ctb\"), person(\"Aaron\", \"Peikert\", role=\"ctb\", comment = c(ORCID = \"0000-0001-7813-818X\")), person(\"Mark\", \"van der Loo\", role=\"ctb\", comment = c(ORCID = \"0000-0002-9807-4686\")), person(\"Chris\", \"Muir\", role=\"ctb\", comment = c(ORCID = \"0000-0003-2555-3878\")), person(\"Moritz\", \"Beller\", role=\"ctb\", comment = c(ORCID = \"0000-0003-4852-0526\")), person(\"Sebastian\", \"Campbell\", role=\"ctb\"), person(\"Winston\", \"Chang\", role=\"ctb\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Dean\", \"Attali\", role=\"ctb\", comment = c(ORCID = \"0000-0002-5645-3493\")), person(\"Michael\", \"Chirico\", role=\"ctb\", comment = c(ORCID = \"0000-0003-0787-087X\")), person(\"Kevin\", \"Ushey\", role=\"ctb\"))", + "Date": "2024-08-19", + "Title": "Create Compact Hash Digests of R Objects", + "Description": "Implementation of a function 'digest()' for the creation of hash digests of arbitrary R objects (using the 'md5', 'sha-1', 'sha-256', 'crc32', 'xxhash', 'murmurhash', 'spookyhash', 'blake3', 'crc32c', 'xxh3_64', and 'xxh3_128' algorithms) permitting easy comparison of R language objects, as well as functions such as'hmac()' to create hash-based message authentication code. Please note that this package is not meant to be deployed for cryptographic purposes for which more comprehensive (and widely tested) libraries such as 'OpenSSL' should be used.", + "URL": "https://github.com/eddelbuettel/digest, https://dirk.eddelbuettel.com/code/digest.html", + "BugReports": "https://github.com/eddelbuettel/digest/issues", + "Depends": [ + "R (>= 3.3.0)" + ], + "Imports": [ "utils" ], - "Hash": "33698c4b3127fc9f506654607fb73676" + "License": "GPL (>= 2)", + "Suggests": [ + "tinytest", + "simplermarkdown" + ], + "VignetteBuilder": "simplermarkdown", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Dirk Eddelbuettel [aut, cre] (), Antoine Lucas [ctb], Jarek Tuszynski [ctb], Henrik Bengtsson [ctb] (), Simon Urbanek [ctb] (), Mario Frasca [ctb], Bryan Lewis [ctb], Murray Stokely [ctb], Hannes Muehleisen [ctb], Duncan Murdoch [ctb], Jim Hester [ctb], Wush Wu [ctb] (), Qiang Kou [ctb] (), Thierry Onkelinx [ctb] (), Michel Lang [ctb] (), Viliam Simko [ctb], Kurt Hornik [ctb] (), Radford Neal [ctb] (), Kendon Bell [ctb] (), Matthew de Queljoe [ctb], Dmitry Selivanov [ctb], Ion Suruceanu [ctb], Bill Denney [ctb], Dirk Schumacher [ctb], András Svraka [ctb], Sergey Fedorov [ctb], Will Landau [ctb] (), Floris Vanderhaeghe [ctb] (), Kevin Tappe [ctb], Harris McGehee [ctb], Tim Mastny [ctb], Aaron Peikert [ctb] (), Mark van der Loo [ctb] (), Chris Muir [ctb] (), Moritz Beller [ctb] (), Sebastian Campbell [ctb], Winston Chang [ctb] (), Dean Attali [ctb] (), Michael Chirico [ctb] (), Kevin Ushey [ctb]", + "Maintainer": "Dirk Eddelbuettel ", + "Repository": "RSPM" }, "docopt": { "Package": "docopt", "Version": "0.7.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Type": "Package", + "Title": "Command-Line Interface Specification Language", + "Author": "Edwin de Jonge (edwindjonge@gmail.com)", + "Maintainer": "Edwin de Jonge ", + "Description": "Define a command-line interface by just giving it a description in the specific format.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/docopt/docopt.R", + "BugReports": "https://github.com/docopt/docopt.R/issues", + "Imports": [ "methods" ], - "Hash": "e9eeef7931ee99ca0093f3f20b88e09b" + "Suggests": [ + "testthat" + ], + "RoxygenNote": "7.1.0", + "NeedsCompilation": "no", + "Repository": "RSPM", + "Encoding": "UTF-8" }, "dplyr": { "Package": "dplyr", "Version": "1.1.4", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", - "cli", + "Type": "Package", + "Title": "A Grammar of Data Manipulation", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Romain\", \"François\", role = \"aut\", comment = c(ORCID = \"0000-0002-2444-4226\")), person(\"Lionel\", \"Henry\", role = \"aut\"), person(\"Kirill\", \"Müller\", role = \"aut\", comment = c(ORCID = \"0000-0002-1416-3412\")), person(\"Davis\", \"Vaughan\", , \"davis@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4777-038X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A fast, consistent tool for working with data frame like objects, both in memory and out of memory.", + "License": "MIT + file LICENSE", + "URL": "https://dplyr.tidyverse.org, https://github.com/tidyverse/dplyr", + "BugReports": "https://github.com/tidyverse/dplyr/issues", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ + "cli (>= 3.4.0)", "generics", - "glue", - "lifecycle", - "magrittr", + "glue (>= 1.3.2)", + "lifecycle (>= 1.0.3)", + "magrittr (>= 1.5)", "methods", - "pillar", - "rlang", - "tibble", - "tidyselect", + "pillar (>= 1.9.0)", + "R6", + "rlang (>= 1.1.0)", + "tibble (>= 3.2.0)", + "tidyselect (>= 1.2.0)", "utils", - "vctrs" + "vctrs (>= 0.6.4)" ], - "Hash": "fedd9d00c2944ff00a0e2696ccf048ec" + "Suggests": [ + "bench", + "broom", + "callr", + "covr", + "DBI", + "dbplyr (>= 2.2.1)", + "ggplot2", + "knitr", + "Lahman", + "lobstr", + "microbenchmark", + "nycflights13", + "purrr", + "rmarkdown", + "RMySQL", + "RPostgreSQL", + "RSQLite", + "stringi (>= 1.7.6)", + "testthat (>= 3.1.5)", + "tidyr (>= 1.3.0)", + "withr" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse, shiny, pkgdown, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut, cre] (), Romain François [aut] (), Lionel Henry [aut], Kirill Müller [aut] (), Davis Vaughan [aut] (), Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "RSPM" }, "evaluate": { "Package": "evaluate", "Version": "0.24.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Type": "Package", + "Title": "Parsing and Evaluation Tools that Provide More Details than the Default", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Yihui\", \"Xie\", role = \"aut\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Michael\", \"Lawrence\", role = \"ctb\"), person(\"Thomas\", \"Kluyver\", role = \"ctb\"), person(\"Jeroen\", \"Ooms\", role = \"ctb\"), person(\"Barret\", \"Schloerke\", role = \"ctb\"), person(\"Adam\", \"Ryczkowski\", role = \"ctb\"), person(\"Hiroaki\", \"Yutani\", role = \"ctb\"), person(\"Michel\", \"Lang\", role = \"ctb\"), person(\"Karolis\", \"Koncevičius\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Parsing and evaluation tools that make it easy to recreate the command line behaviour of R.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/r-lib/evaluate", + "BugReports": "https://github.com/r-lib/evaluate/issues", + "Depends": [ + "R (>= 4.0.0)" + ], + "Imports": [ "methods" ], - "Hash": "a1066cbc05caee9a4bf6d90f194ff4da" + "Suggests": [ + "covr", + "ggplot2", + "lattice", + "rlang", + "testthat (>= 3.0.0)", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], Yihui Xie [aut] (), Michael Lawrence [ctb], Thomas Kluyver [ctb], Jeroen Ooms [ctb], Barret Schloerke [ctb], Adam Ryczkowski [ctb], Hiroaki Yutani [ctb], Michel Lang [ctb], Karolis Koncevičius [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "RSPM" }, "fansi": { "Package": "fansi", "Version": "1.0.6", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "ANSI Control Sequence Aware String Functions", + "Description": "Counterparts to R string manipulation functions that account for the effects of ANSI text formatting control sequences.", + "Authors@R": "c( person(\"Brodie\", \"Gaslam\", email=\"brodie.gaslam@yahoo.com\", role=c(\"aut\", \"cre\")), person(\"Elliott\", \"Sales De Andrade\", role=\"ctb\"), person(family=\"R Core Team\", email=\"R-core@r-project.org\", role=\"cph\", comment=\"UTF8 byte length calcs from src/util.c\" ))", + "Depends": [ + "R (>= 3.1.0)" + ], + "License": "GPL-2 | GPL-3", + "URL": "https://github.com/brodieG/fansi", + "BugReports": "https://github.com/brodieG/fansi/issues", + "VignetteBuilder": "knitr", + "Suggests": [ + "unitizer", + "knitr", + "rmarkdown" + ], + "Imports": [ "grDevices", "utils" ], - "Hash": "962174cf2aeb5b9eea581522286a911f" + "RoxygenNote": "7.2.3", + "Encoding": "UTF-8", + "Collate": "'constants.R' 'fansi-package.R' 'internal.R' 'load.R' 'misc.R' 'nchar.R' 'strwrap.R' 'strtrim.R' 'strsplit.R' 'substr2.R' 'trimws.R' 'tohtml.R' 'unhandled.R' 'normalize.R' 'sgr.R'", + "NeedsCompilation": "yes", + "Author": "Brodie Gaslam [aut, cre], Elliott Sales De Andrade [ctb], R Core Team [cph] (UTF8 byte length calcs from src/util.c)", + "Maintainer": "Brodie Gaslam ", + "Repository": "RSPM" }, "fastmap": { "Package": "fastmap", "Version": "1.2.0", "Source": "Repository", - "Repository": "CRAN", - "Hash": "aa5e1cd11c2d15497494c5292d7ffcc8" + "Title": "Fast Data Structures", + "Authors@R": "c( person(\"Winston\", \"Chang\", email = \"winston@posit.co\", role = c(\"aut\", \"cre\")), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(given = \"Tessil\", role = \"cph\", comment = \"hopscotch_map library\") )", + "Description": "Fast implementation of data structures, including a key-value store, stack, and queue. Environments are commonly used as key-value stores in R, but every time a new key is used, it is added to R's global symbol table, causing a small amount of memory leakage. This can be problematic in cases where many different keys are used. Fastmap avoids this memory leak issue by implementing the map using data structures in C++.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "Suggests": [ + "testthat (>= 2.1.1)" + ], + "URL": "https://r-lib.github.io/fastmap/, https://github.com/r-lib/fastmap", + "BugReports": "https://github.com/r-lib/fastmap/issues", + "NeedsCompilation": "yes", + "Author": "Winston Chang [aut, cre], Posit Software, PBC [cph, fnd], Tessil [cph] (hopscotch_map library)", + "Maintainer": "Winston Chang ", + "Repository": "RSPM" }, "fs": { "Package": "fs", "Version": "1.6.4", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Cross-Platform File System Operations Based on 'libuv'", + "Authors@R": "c( person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"libuv project contributors\", role = \"cph\", comment = \"libuv library\"), person(\"Joyent, Inc. and other Node contributors\", role = \"cph\", comment = \"libuv library\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A cross-platform interface to file system operations, built on top of the 'libuv' C library.", + "License": "MIT + file LICENSE", + "URL": "https://fs.r-lib.org, https://github.com/r-lib/fs", + "BugReports": "https://github.com/r-lib/fs/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ "methods" ], - "Hash": "15aeb8c27f5ea5161f9f6a641fafd93a" + "Suggests": [ + "covr", + "crayon", + "knitr", + "pillar (>= 1.0.0)", + "rmarkdown", + "spelling", + "testthat (>= 3.0.0)", + "tibble (>= 1.1.0)", + "vctrs (>= 0.3.0)", + "withr" + ], + "VignetteBuilder": "knitr", + "ByteCompile": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Copyright": "file COPYRIGHTS", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.2.3", + "SystemRequirements": "GNU make", + "NeedsCompilation": "yes", + "Author": "Jim Hester [aut], Hadley Wickham [aut], Gábor Csárdi [aut, cre], libuv project contributors [cph] (libuv library), Joyent, Inc. and other Node contributors [cph] (libuv library), Posit Software, PBC [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "RSPM" }, "generics": { "Package": "generics", "Version": "0.1.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Common S3 Generics not Provided by Base R Methods Related to Model Fitting", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = c(\"aut\", \"cre\")), person(\"Max\", \"Kuhn\", , \"max@rstudio.com\", role = \"aut\"), person(\"Davis\", \"Vaughan\", , \"davis@rstudio.com\", role = \"aut\"), person(\"RStudio\", role = \"cph\") )", + "Description": "In order to reduce potential package dependencies and conflicts, generics provides a number of commonly used S3 generics.", + "License": "MIT + file LICENSE", + "URL": "https://generics.r-lib.org, https://github.com/r-lib/generics", + "BugReports": "https://github.com/r-lib/generics/issues", + "Depends": [ + "R (>= 3.2)" + ], + "Imports": [ "methods" ], - "Hash": "15e9634c0fcd294799e9b2e929ed1b86" + "Suggests": [ + "covr", + "pkgload", + "testthat (>= 3.0.0)", + "tibble", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.0", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], Max Kuhn [aut], Davis Vaughan [aut], RStudio [cph]", + "Maintainer": "Hadley Wickham ", + "Repository": "RSPM" }, "glue": { "Package": "glue", "Version": "1.7.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Interpreted String Literals", + "Authors@R": "c( person(\"Jim\", \"Hester\", role = \"aut\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "An implementation of interpreted string literals, inspired by Python's Literal String Interpolation and Docstrings and Julia's Triple-Quoted String Literals .", + "License": "MIT + file LICENSE", + "URL": "https://glue.tidyverse.org/, https://github.com/tidyverse/glue", + "BugReports": "https://github.com/tidyverse/glue/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ "methods" ], - "Hash": "e0b3a53876554bd45879e596cdb10a52" + "Suggests": [ + "crayon", + "DBI (>= 1.2.0)", + "dplyr", + "knitr", + "magrittr", + "rlang", + "rmarkdown", + "RSQLite", + "testthat (>= 3.2.0)", + "vctrs (>= 0.3.0)", + "waldo (>= 0.3.0)", + "withr" + ], + "VignetteBuilder": "knitr", + "ByteCompile": "true", + "Config/Needs/website": "bench, forcats, ggbeeswarm, ggplot2, R.utils, rprintf, tidyr, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3.9000", + "NeedsCompilation": "yes", + "Author": "Jim Hester [aut] (), Jennifer Bryan [aut, cre] (), Posit Software, PBC [cph, fnd]", + "Maintainer": "Jennifer Bryan ", + "Repository": "RSPM" }, "highr": { "Package": "highr", "Version": "0.11", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "xfun" + "Type": "Package", + "Title": "Syntax Highlighting for R Source Code", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Yixuan\", \"Qiu\", role = \"aut\"), person(\"Christopher\", \"Gandrud\", role = \"ctb\"), person(\"Qiang\", \"Li\", role = \"ctb\") )", + "Description": "Provides syntax highlighting for R source code. Currently it supports LaTeX and HTML output. Source code of other languages is supported via Andre Simon's highlight package ().", + "Depends": [ + "R (>= 3.3.0)" + ], + "Imports": [ + "xfun (>= 0.18)" ], - "Hash": "d65ba49117ca223614f71b60d85b8ab7" + "Suggests": [ + "knitr", + "markdown", + "testit" + ], + "License": "GPL", + "URL": "https://github.com/yihui/highr", + "BugReports": "https://github.com/yihui/highr/issues", + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.1", + "NeedsCompilation": "no", + "Author": "Yihui Xie [aut, cre] (), Yixuan Qiu [aut], Christopher Gandrud [ctb], Qiang Li [ctb]", + "Maintainer": "Yihui Xie ", + "Repository": "RSPM" }, "hms": { "Package": "hms", "Version": "1.1.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "Pretty Time of Day", + "Date": "2023-03-21", + "Authors@R": "c( person(\"Kirill\", \"Müller\", role = c(\"aut\", \"cre\"), email = \"kirill@cynkra.com\", comment = c(ORCID = \"0000-0002-1416-3412\")), person(\"R Consortium\", role = \"fnd\"), person(\"RStudio\", role = \"fnd\") )", + "Description": "Implements an S3 class for storing and formatting time-of-day values, based on the 'difftime' class.", + "Imports": [ "lifecycle", "methods", "pkgconfig", - "rlang", - "vctrs" + "rlang (>= 1.0.2)", + "vctrs (>= 0.3.8)" ], - "Hash": "b59377caa7ed00fa41808342002138f9" + "Suggests": [ + "crayon", + "lubridate", + "pillar (>= 1.1.0)", + "testthat (>= 3.0.0)" + ], + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "URL": "https://hms.tidyverse.org/, https://github.com/tidyverse/hms", + "BugReports": "https://github.com/tidyverse/hms/issues", + "RoxygenNote": "7.2.3", + "Config/testthat/edition": "3", + "Config/autostyle/scope": "line_breaks", + "Config/autostyle/strict": "false", + "Config/Needs/website": "tidyverse/tidytemplate", + "NeedsCompilation": "no", + "Author": "Kirill Müller [aut, cre] (), R Consortium [fnd], RStudio [fnd]", + "Maintainer": "Kirill Müller ", + "Repository": "RSPM" }, "jsonlite": { "Package": "jsonlite", "Version": "1.8.8", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "A Simple and Robust JSON Parser and Generator for R", + "License": "MIT + file LICENSE", + "Depends": [ "methods" ], - "Hash": "e1b9c55281c5adc4dd113652d9e26768" + "Authors@R": "c( person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroen@berkeley.edu\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"Duncan\", \"Temple Lang\", role = \"ctb\"), person(\"Lloyd\", \"Hilaiel\", role = \"cph\", comment=\"author of bundled libyajl\"))", + "URL": "https://jeroen.r-universe.dev/jsonlite https://arxiv.org/abs/1403.2805", + "BugReports": "https://github.com/jeroen/jsonlite/issues", + "Maintainer": "Jeroen Ooms ", + "VignetteBuilder": "knitr, R.rsp", + "Description": "A reasonably fast JSON parser and generator, optimized for statistical data and the web. Offers simple, flexible tools for working with JSON in R, and is particularly powerful for building pipelines and interacting with a web API. The implementation is based on the mapping described in the vignette (Ooms, 2014). In addition to converting JSON data from/to R objects, 'jsonlite' contains functions to stream, validate, and prettify JSON data. The unit tests included with the package verify that all edge cases are encoded and decoded consistently for use with dynamic data in systems and applications.", + "Suggests": [ + "httr", + "vctrs", + "testthat", + "knitr", + "rmarkdown", + "R.rsp", + "sf" + ], + "RoxygenNote": "7.2.3", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] (), Duncan Temple Lang [ctb], Lloyd Hilaiel [cph] (author of bundled libyajl)", + "Repository": "RSPM" }, "knitr": { "Package": "knitr", "Version": "1.48", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "evaluate", - "highr", + "Type": "Package", + "Title": "A General-Purpose Package for Dynamic Report Generation in R", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Abhraneel\", \"Sarma\", role = \"ctb\"), person(\"Adam\", \"Vogt\", role = \"ctb\"), person(\"Alastair\", \"Andrew\", role = \"ctb\"), person(\"Alex\", \"Zvoleff\", role = \"ctb\"), person(\"Amar\", \"Al-Zubaidi\", role = \"ctb\"), person(\"Andre\", \"Simon\", role = \"ctb\", comment = \"the CSS files under inst/themes/ were derived from the Highlight package http://www.andre-simon.de\"), person(\"Aron\", \"Atkins\", role = \"ctb\"), person(\"Aaron\", \"Wolen\", role = \"ctb\"), person(\"Ashley\", \"Manton\", role = \"ctb\"), person(\"Atsushi\", \"Yasumoto\", role = \"ctb\", comment = c(ORCID = \"0000-0002-8335-495X\")), person(\"Ben\", \"Baumer\", role = \"ctb\"), person(\"Brian\", \"Diggs\", role = \"ctb\"), person(\"Brian\", \"Zhang\", role = \"ctb\"), person(\"Bulat\", \"Yapparov\", role = \"ctb\"), person(\"Cassio\", \"Pereira\", role = \"ctb\"), person(\"Christophe\", \"Dervieux\", role = \"ctb\"), person(\"David\", \"Hall\", role = \"ctb\"), person(\"David\", \"Hugh-Jones\", role = \"ctb\"), person(\"David\", \"Robinson\", role = \"ctb\"), person(\"Doug\", \"Hemken\", role = \"ctb\"), person(\"Duncan\", \"Murdoch\", role = \"ctb\"), person(\"Elio\", \"Campitelli\", role = \"ctb\"), person(\"Ellis\", \"Hughes\", role = \"ctb\"), person(\"Emily\", \"Riederer\", role = \"ctb\"), person(\"Fabian\", \"Hirschmann\", role = \"ctb\"), person(\"Fitch\", \"Simeon\", role = \"ctb\"), person(\"Forest\", \"Fang\", role = \"ctb\"), person(c(\"Frank\", \"E\", \"Harrell\", \"Jr\"), role = \"ctb\", comment = \"the Sweavel package at inst/misc/Sweavel.sty\"), person(\"Garrick\", \"Aden-Buie\", role = \"ctb\"), person(\"Gregoire\", \"Detrez\", role = \"ctb\"), person(\"Hadley\", \"Wickham\", role = \"ctb\"), person(\"Hao\", \"Zhu\", role = \"ctb\"), person(\"Heewon\", \"Jeon\", role = \"ctb\"), person(\"Henrik\", \"Bengtsson\", role = \"ctb\"), person(\"Hiroaki\", \"Yutani\", role = \"ctb\"), person(\"Ian\", \"Lyttle\", role = \"ctb\"), person(\"Hodges\", \"Daniel\", role = \"ctb\"), person(\"Jacob\", \"Bien\", role = \"ctb\"), person(\"Jake\", \"Burkhead\", role = \"ctb\"), person(\"James\", \"Manton\", role = \"ctb\"), person(\"Jared\", \"Lander\", role = \"ctb\"), person(\"Jason\", \"Punyon\", role = \"ctb\"), person(\"Javier\", \"Luraschi\", role = \"ctb\"), person(\"Jeff\", \"Arnold\", role = \"ctb\"), person(\"Jenny\", \"Bryan\", role = \"ctb\"), person(\"Jeremy\", \"Ashkenas\", role = c(\"ctb\", \"cph\"), comment = \"the CSS file at inst/misc/docco-classic.css\"), person(\"Jeremy\", \"Stephens\", role = \"ctb\"), person(\"Jim\", \"Hester\", role = \"ctb\"), person(\"Joe\", \"Cheng\", role = \"ctb\"), person(\"Johannes\", \"Ranke\", role = \"ctb\"), person(\"John\", \"Honaker\", role = \"ctb\"), person(\"John\", \"Muschelli\", role = \"ctb\"), person(\"Jonathan\", \"Keane\", role = \"ctb\"), person(\"JJ\", \"Allaire\", role = \"ctb\"), person(\"Johan\", \"Toloe\", role = \"ctb\"), person(\"Jonathan\", \"Sidi\", role = \"ctb\"), person(\"Joseph\", \"Larmarange\", role = \"ctb\"), person(\"Julien\", \"Barnier\", role = \"ctb\"), person(\"Kaiyin\", \"Zhong\", role = \"ctb\"), person(\"Kamil\", \"Slowikowski\", role = \"ctb\"), person(\"Karl\", \"Forner\", role = \"ctb\"), person(c(\"Kevin\", \"K.\"), \"Smith\", role = \"ctb\"), person(\"Kirill\", \"Mueller\", role = \"ctb\"), person(\"Kohske\", \"Takahashi\", role = \"ctb\"), person(\"Lorenz\", \"Walthert\", role = \"ctb\"), person(\"Lucas\", \"Gallindo\", role = \"ctb\"), person(\"Marius\", \"Hofert\", role = \"ctb\"), person(\"Martin\", \"Modrák\", role = \"ctb\"), person(\"Michael\", \"Chirico\", role = \"ctb\"), person(\"Michael\", \"Friendly\", role = \"ctb\"), person(\"Michal\", \"Bojanowski\", role = \"ctb\"), person(\"Michel\", \"Kuhlmann\", role = \"ctb\"), person(\"Miller\", \"Patrick\", role = \"ctb\"), person(\"Nacho\", \"Caballero\", role = \"ctb\"), person(\"Nick\", \"Salkowski\", role = \"ctb\"), person(\"Niels Richard\", \"Hansen\", role = \"ctb\"), person(\"Noam\", \"Ross\", role = \"ctb\"), person(\"Obada\", \"Mahdi\", role = \"ctb\"), person(\"Pavel N.\", \"Krivitsky\", role = \"ctb\", comment=c(ORCID = \"0000-0002-9101-3362\")), person(\"Pedro\", \"Faria\", role = \"ctb\"), person(\"Qiang\", \"Li\", role = \"ctb\"), person(\"Ramnath\", \"Vaidyanathan\", role = \"ctb\"), person(\"Richard\", \"Cotton\", role = \"ctb\"), person(\"Robert\", \"Krzyzanowski\", role = \"ctb\"), person(\"Rodrigo\", \"Copetti\", role = \"ctb\"), person(\"Romain\", \"Francois\", role = \"ctb\"), person(\"Ruaridh\", \"Williamson\", role = \"ctb\"), person(\"Sagiru\", \"Mati\", role = \"ctb\", comment = c(ORCID = \"0000-0003-1413-3974\")), person(\"Scott\", \"Kostyshak\", role = \"ctb\"), person(\"Sebastian\", \"Meyer\", role = \"ctb\"), person(\"Sietse\", \"Brouwer\", role = \"ctb\"), person(c(\"Simon\", \"de\"), \"Bernard\", role = \"ctb\"), person(\"Sylvain\", \"Rousseau\", role = \"ctb\"), person(\"Taiyun\", \"Wei\", role = \"ctb\"), person(\"Thibaut\", \"Assus\", role = \"ctb\"), person(\"Thibaut\", \"Lamadon\", role = \"ctb\"), person(\"Thomas\", \"Leeper\", role = \"ctb\"), person(\"Tim\", \"Mastny\", role = \"ctb\"), person(\"Tom\", \"Torsney-Weir\", role = \"ctb\"), person(\"Trevor\", \"Davis\", role = \"ctb\"), person(\"Viktoras\", \"Veitas\", role = \"ctb\"), person(\"Weicheng\", \"Zhu\", role = \"ctb\"), person(\"Wush\", \"Wu\", role = \"ctb\"), person(\"Zachary\", \"Foster\", role = \"ctb\"), person(\"Zhian N.\", \"Kamvar\", role = \"ctb\", comment = c(ORCID = \"0000-0003-1458-7108\")), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Provides a general-purpose tool for dynamic report generation in R using Literate Programming techniques.", + "Depends": [ + "R (>= 3.3.0)" + ], + "Imports": [ + "evaluate (>= 0.15)", + "highr (>= 0.11)", "methods", "tools", - "xfun", - "yaml" + "xfun (>= 0.44)", + "yaml (>= 2.1.19)" ], - "Hash": "acf380f300c721da9fde7df115a5f86f" + "Suggests": [ + "bslib", + "codetools", + "DBI (>= 0.4-1)", + "digest", + "formatR", + "gifski", + "gridSVG", + "htmlwidgets (>= 0.7)", + "jpeg", + "JuliaCall (>= 0.11.1)", + "magick", + "markdown (>= 1.3)", + "png", + "ragg", + "reticulate (>= 1.4)", + "rgl (>= 0.95.1201)", + "rlang", + "rmarkdown", + "sass", + "showtext", + "styler (>= 1.2.0)", + "targets (>= 0.6.0)", + "testit", + "tibble", + "tikzDevice (>= 0.10)", + "tinytex (>= 0.46)", + "webshot", + "rstudioapi", + "svglite" + ], + "License": "GPL", + "URL": "https://yihui.org/knitr/", + "BugReports": "https://github.com/yihui/knitr/issues", + "Encoding": "UTF-8", + "VignetteBuilder": "knitr", + "SystemRequirements": "Package vignettes based on R Markdown v2 or reStructuredText require Pandoc (http://pandoc.org). The function rst2pdf() requires rst2pdf (https://github.com/rst2pdf/rst2pdf).", + "Collate": "'block.R' 'cache.R' 'utils.R' 'citation.R' 'hooks-html.R' 'plot.R' 'defaults.R' 'concordance.R' 'engine.R' 'highlight.R' 'themes.R' 'header.R' 'hooks-asciidoc.R' 'hooks-chunk.R' 'hooks-extra.R' 'hooks-latex.R' 'hooks-md.R' 'hooks-rst.R' 'hooks-textile.R' 'hooks.R' 'output.R' 'package.R' 'pandoc.R' 'params.R' 'parser.R' 'pattern.R' 'rocco.R' 'spin.R' 'table.R' 'template.R' 'utils-conversion.R' 'utils-rd2html.R' 'utils-string.R' 'utils-sweave.R' 'utils-upload.R' 'utils-vignettes.R' 'zzz.R'", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Yihui Xie [aut, cre] (), Abhraneel Sarma [ctb], Adam Vogt [ctb], Alastair Andrew [ctb], Alex Zvoleff [ctb], Amar Al-Zubaidi [ctb], Andre Simon [ctb] (the CSS files under inst/themes/ were derived from the Highlight package http://www.andre-simon.de), Aron Atkins [ctb], Aaron Wolen [ctb], Ashley Manton [ctb], Atsushi Yasumoto [ctb] (), Ben Baumer [ctb], Brian Diggs [ctb], Brian Zhang [ctb], Bulat Yapparov [ctb], Cassio Pereira [ctb], Christophe Dervieux [ctb], David Hall [ctb], David Hugh-Jones [ctb], David Robinson [ctb], Doug Hemken [ctb], Duncan Murdoch [ctb], Elio Campitelli [ctb], Ellis Hughes [ctb], Emily Riederer [ctb], Fabian Hirschmann [ctb], Fitch Simeon [ctb], Forest Fang [ctb], Frank E Harrell Jr [ctb] (the Sweavel package at inst/misc/Sweavel.sty), Garrick Aden-Buie [ctb], Gregoire Detrez [ctb], Hadley Wickham [ctb], Hao Zhu [ctb], Heewon Jeon [ctb], Henrik Bengtsson [ctb], Hiroaki Yutani [ctb], Ian Lyttle [ctb], Hodges Daniel [ctb], Jacob Bien [ctb], Jake Burkhead [ctb], James Manton [ctb], Jared Lander [ctb], Jason Punyon [ctb], Javier Luraschi [ctb], Jeff Arnold [ctb], Jenny Bryan [ctb], Jeremy Ashkenas [ctb, cph] (the CSS file at inst/misc/docco-classic.css), Jeremy Stephens [ctb], Jim Hester [ctb], Joe Cheng [ctb], Johannes Ranke [ctb], John Honaker [ctb], John Muschelli [ctb], Jonathan Keane [ctb], JJ Allaire [ctb], Johan Toloe [ctb], Jonathan Sidi [ctb], Joseph Larmarange [ctb], Julien Barnier [ctb], Kaiyin Zhong [ctb], Kamil Slowikowski [ctb], Karl Forner [ctb], Kevin K. Smith [ctb], Kirill Mueller [ctb], Kohske Takahashi [ctb], Lorenz Walthert [ctb], Lucas Gallindo [ctb], Marius Hofert [ctb], Martin Modrák [ctb], Michael Chirico [ctb], Michael Friendly [ctb], Michal Bojanowski [ctb], Michel Kuhlmann [ctb], Miller Patrick [ctb], Nacho Caballero [ctb], Nick Salkowski [ctb], Niels Richard Hansen [ctb], Noam Ross [ctb], Obada Mahdi [ctb], Pavel N. Krivitsky [ctb] (), Pedro Faria [ctb], Qiang Li [ctb], Ramnath Vaidyanathan [ctb], Richard Cotton [ctb], Robert Krzyzanowski [ctb], Rodrigo Copetti [ctb], Romain Francois [ctb], Ruaridh Williamson [ctb], Sagiru Mati [ctb] (), Scott Kostyshak [ctb], Sebastian Meyer [ctb], Sietse Brouwer [ctb], Simon de Bernard [ctb], Sylvain Rousseau [ctb], Taiyun Wei [ctb], Thibaut Assus [ctb], Thibaut Lamadon [ctb], Thomas Leeper [ctb], Tim Mastny [ctb], Tom Torsney-Weir [ctb], Trevor Davis [ctb], Viktoras Veitas [ctb], Weicheng Zhu [ctb], Wush Wu [ctb], Zachary Foster [ctb], Zhian N. Kamvar [ctb] (), Posit Software, PBC [cph, fnd]", + "Maintainer": "Yihui Xie ", + "Repository": "RSPM" }, "lifecycle": { "Package": "lifecycle", "Version": "1.0.4", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", + "Title": "Manage the Life Cycle of your Package Functions", + "Authors@R": "c( person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = c(\"aut\", \"cre\")), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Manage the life cycle of your exported functions with shared conventions, documentation badges, and user-friendly deprecation warnings.", + "License": "MIT + file LICENSE", + "URL": "https://lifecycle.r-lib.org/, https://github.com/r-lib/lifecycle", + "BugReports": "https://github.com/r-lib/lifecycle/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ + "cli (>= 3.4.0)", "glue", - "rlang" + "rlang (>= 1.1.0)" ], - "Hash": "b8552d117e1b808b09a832f589b79035" + "Suggests": [ + "covr", + "crayon", + "knitr", + "lintr", + "rmarkdown", + "testthat (>= 3.0.1)", + "tibble", + "tidyverse", + "tools", + "vctrs", + "withr" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate, usethis", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.1", + "NeedsCompilation": "no", + "Author": "Lionel Henry [aut, cre], Hadley Wickham [aut] (), Posit Software, PBC [cph, fnd]", + "Maintainer": "Lionel Henry ", + "Repository": "RSPM" }, "magrittr": { "Package": "magrittr", "Version": "2.0.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Type": "Package", + "Title": "A Forward-Pipe Operator for R", + "Authors@R": "c( person(\"Stefan Milton\", \"Bache\", , \"stefan@stefanbache.dk\", role = c(\"aut\", \"cph\"), comment = \"Original author and creator of magrittr\"), person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = \"aut\"), person(\"Lionel\", \"Henry\", , \"lionel@rstudio.com\", role = \"cre\"), person(\"RStudio\", role = c(\"cph\", \"fnd\")) )", + "Description": "Provides a mechanism for chaining commands with a new forward-pipe operator, %>%. This operator will forward a value, or the result of an expression, into the next function call/expression. There is flexible support for the type of right-hand side expressions. For more information, see package vignette. To quote Rene Magritte, \"Ceci n'est pas un pipe.\"", + "License": "MIT + file LICENSE", + "URL": "https://magrittr.tidyverse.org, https://github.com/tidyverse/magrittr", + "BugReports": "https://github.com/tidyverse/magrittr/issues", + "Depends": [ + "R (>= 3.4.0)" + ], + "Suggests": [ + "covr", + "knitr", + "rlang", + "rmarkdown", + "testthat" ], - "Hash": "7ce2733a9826b3aeb1775d56fd305472" + "VignetteBuilder": "knitr", + "ByteCompile": "Yes", + "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "RoxygenNote": "7.1.2", + "NeedsCompilation": "yes", + "Author": "Stefan Milton Bache [aut, cph] (Original author and creator of magrittr), Hadley Wickham [aut], Lionel Henry [cre], RStudio [cph, fnd]", + "Maintainer": "Lionel Henry ", + "Repository": "RSPM" }, "mappp": { "Package": "mappp", "Version": "1.0.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "Map in Parallel with Progress", + "Authors@R": "person(given = \"Cole\", family = \"Brokamp\", role = c(\"aut\", \"cre\"), email = \"cole.brokamp@gmail.com\")", + "Description": "Provides one function, which is a wrapper around purrr::map() with some extras on top, including parallel computation, progress bars, error handling, and result caching.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "Imports": [ "memoise", + "progress", + "pbmcapply", "parallel", "parallelly", - "pbmcapply", - "progress", "purrr", "rlang" ], - "Hash": "969ed5fab0c1752ddd0a43f789c9ac4e" + "RoxygenNote": "7.1.1", + "URL": "https://github.com/cole-brokamp/mappp", + "BugReports": "https://github.com/cole-brokamp/mappp/issues", + "Suggests": [ + "testthat (>= 3.0.0)" + ], + "Config/testthat/edition": "3", + "NeedsCompilation": "no", + "Author": "Cole Brokamp [aut, cre]", + "Maintainer": "Cole Brokamp ", + "Repository": "RSPM" }, "memoise": { "Package": "memoise", "Version": "2.0.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "cachem", - "rlang" + "Title": "'Memoisation' of Functions", + "Authors@R": "c(person(given = \"Hadley\", family = \"Wickham\", role = \"aut\", email = \"hadley@rstudio.com\"), person(given = \"Jim\", family = \"Hester\", role = \"aut\"), person(given = \"Winston\", family = \"Chang\", role = c(\"aut\", \"cre\"), email = \"winston@rstudio.com\"), person(given = \"Kirill\", family = \"Müller\", role = \"aut\", email = \"krlmlr+r@mailbox.org\"), person(given = \"Daniel\", family = \"Cook\", role = \"aut\", email = \"danielecook@gmail.com\"), person(given = \"Mark\", family = \"Edmondson\", role = \"ctb\", email = \"r@sunholo.com\"))", + "Description": "Cache the results of a function so that when you call it again with the same arguments it returns the previously computed value.", + "License": "MIT + file LICENSE", + "URL": "https://memoise.r-lib.org, https://github.com/r-lib/memoise", + "BugReports": "https://github.com/r-lib/memoise/issues", + "Imports": [ + "rlang (>= 0.4.10)", + "cachem" ], - "Hash": "e2817ccf4a065c5d9d7f2cfbe7c1d78c" + "Suggests": [ + "digest", + "aws.s3", + "covr", + "googleAuthR", + "googleCloudStorageR", + "httr", + "testthat" + ], + "Encoding": "UTF-8", + "RoxygenNote": "7.1.2", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut], Jim Hester [aut], Winston Chang [aut, cre], Kirill Müller [aut], Daniel Cook [aut], Mark Edmondson [ctb]", + "Maintainer": "Winston Chang ", + "Repository": "RSPM" }, "parallelly": { "Package": "parallelly", "Version": "1.38.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "Enhancing the 'parallel' Package", + "Imports": [ "parallel", "tools", "utils" ], - "Hash": "6e8b139c1904f5e9e14c69db64453bbe" + "Authors@R": "c( person(\"Henrik\", \"Bengtsson\", role = c(\"aut\", \"cre\", \"cph\"), email = \"henrikb@braju.com\", comment = c(ORCID = \"0000-0002-7579-5165\")), person(\"Mike\", \"Cheng\", role = c(\"ctb\"), email = \"mikefc@coolbutuseless.com\") )", + "Description": "Utility functions that enhance the 'parallel' package and support the built-in parallel backends of the 'future' package. For example, availableCores() gives the number of CPU cores available to your R process as given by the operating system, 'cgroups' and Linux containers, R options, and environment variables, including those set by job schedulers on high-performance compute clusters. If none is set, it will fall back to parallel::detectCores(). Another example is makeClusterPSOCK(), which is backward compatible with parallel::makePSOCKcluster() while doing a better job in setting up remote cluster workers without the need for configuring the firewall to do port-forwarding to your local computer.", + "License": "LGPL (>= 2.1)", + "LazyLoad": "TRUE", + "ByteCompile": "TRUE", + "URL": "https://parallelly.futureverse.org, https://github.com/HenrikBengtsson/parallelly", + "BugReports": "https://github.com/HenrikBengtsson/parallelly/issues", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "yes", + "Author": "Henrik Bengtsson [aut, cre, cph] (), Mike Cheng [ctb]", + "Maintainer": "Henrik Bengtsson ", + "Repository": "RSPM" }, "pbmcapply": { "Package": "pbmcapply", "Version": "1.5.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "parallel", - "utils" + "Type": "Package", + "Title": "Tracking the Progress of Mc*pply with Progress Bar", + "Author": "Kevin Kuang (aut), Quyu Kong (ctb), Francesco Napolitano (ctb)", + "Maintainer": "Kevin kuang ", + "Description": "A light-weight package helps you track and visualize the progress of parallel version of vectorized R functions (mc*apply). Parallelization (mc.core > 1) works only on *nix (Linux, Unix such as macOS) system due to the lack of fork() functionality, which is essential for mc*apply, on Windows.", + "Depends": [ + "utils", + "parallel" ], - "Hash": "bf173fb42b60f8f404f7a9f9c3f95d0d" + "BugReports": "https://github.com/kvnkuang/pbmcapply/issues", + "URL": "https://github.com/kvnkuang/pbmcapply", + "License": "MIT + file LICENSE", + "RoxygenNote": "6.1.1", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Repository": "RSPM" }, "pillar": { "Package": "pillar", "Version": "1.9.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "cli", + "Title": "Coloured Formatting for Columns", + "Authors@R": "c(person(given = \"Kirill\", family = \"M\\u00fcller\", role = c(\"aut\", \"cre\"), email = \"kirill@cynkra.com\", comment = c(ORCID = \"0000-0002-1416-3412\")), person(given = \"Hadley\", family = \"Wickham\", role = \"aut\"), person(given = \"RStudio\", role = \"cph\"))", + "Description": "Provides 'pillar' and 'colonnade' generics designed for formatting columns of data using the full range of colours provided by modern terminals.", + "License": "MIT + file LICENSE", + "URL": "https://pillar.r-lib.org/, https://github.com/r-lib/pillar", + "BugReports": "https://github.com/r-lib/pillar/issues", + "Imports": [ + "cli (>= 2.3.0)", "fansi", "glue", "lifecycle", - "rlang", - "utf8", + "rlang (>= 1.0.2)", + "utf8 (>= 1.1.0)", "utils", - "vctrs" + "vctrs (>= 0.5.0)" ], - "Hash": "15da5a8412f317beeee6175fbc76f4bb" + "Suggests": [ + "bit64", + "DBI", + "debugme", + "DiagrammeR", + "dplyr", + "formattable", + "ggplot2", + "knitr", + "lubridate", + "nanotime", + "nycflights13", + "palmerpenguins", + "rmarkdown", + "scales", + "stringi", + "survival", + "testthat (>= 3.1.1)", + "tibble", + "units (>= 0.7.2)", + "vdiffr", + "withr" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "format_multi_fuzz, format_multi_fuzz_2, format_multi, ctl_colonnade, ctl_colonnade_1, ctl_colonnade_2", + "Config/autostyle/scope": "line_breaks", + "Config/autostyle/strict": "true", + "Config/gha/extra-packages": "DiagrammeR=?ignore-before-r=3.5.0", + "Config/Needs/website": "tidyverse/tidytemplate", + "NeedsCompilation": "no", + "Author": "Kirill Müller [aut, cre] (), Hadley Wickham [aut], RStudio [cph]", + "Maintainer": "Kirill Müller ", + "Repository": "RSPM" }, "pkgconfig": { "Package": "pkgconfig", "Version": "2.0.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "Private Configuration for 'R' Packages", + "Author": "Gábor Csárdi", + "Maintainer": "Gábor Csárdi ", + "Description": "Set configuration options on a per-package basis. Options set by a given package only apply to that package, other packages are unaffected.", + "License": "MIT + file LICENSE", + "LazyData": "true", + "Imports": [ "utils" ], - "Hash": "01f28d4278f15c76cddbea05899c5d6f" + "Suggests": [ + "covr", + "testthat", + "disposables (>= 1.0.3)" + ], + "URL": "https://github.com/r-lib/pkgconfig#readme", + "BugReports": "https://github.com/r-lib/pkgconfig/issues", + "Encoding": "UTF-8", + "NeedsCompilation": "no", + "Repository": "RSPM" }, "prettyunits": { "Package": "prettyunits", "Version": "1.2.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Title": "Pretty, Human Readable Formatting of Quantities", + "Authors@R": "c( person(\"Gabor\", \"Csardi\", email=\"csardi.gabor@gmail.com\", role=c(\"aut\", \"cre\")), person(\"Bill\", \"Denney\", email=\"wdenney@humanpredictions.com\", role=c(\"ctb\"), comment=c(ORCID=\"0000-0002-5759-428X\")), person(\"Christophe\", \"Regouby\", email=\"christophe.regouby@free.fr\", role=c(\"ctb\")) )", + "Description": "Pretty, human readable formatting of quantities. Time intervals: '1337000' -> '15d 11h 23m 20s'. Vague time intervals: '2674000' -> 'about a month ago'. Bytes: '1337' -> '1.34 kB'. Rounding: '99' with 3 significant digits -> '99.0' p-values: '0.00001' -> '<0.0001'. Colors: '#FF0000' -> 'red'. Quantities: '1239437' -> '1.24 M'.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/r-lib/prettyunits", + "BugReports": "https://github.com/r-lib/prettyunits/issues", + "Depends": [ + "R(>= 2.10)" + ], + "Suggests": [ + "codetools", + "covr", + "testthat" ], - "Hash": "6b01fc98b1e86c4f705ce9dcfd2f57c7" + "RoxygenNote": "7.2.3", + "Encoding": "UTF-8", + "NeedsCompilation": "no", + "Author": "Gabor Csardi [aut, cre], Bill Denney [ctb] (), Christophe Regouby [ctb]", + "Maintainer": "Gabor Csardi ", + "Repository": "RSPM" }, "progress": { "Package": "progress", "Version": "1.2.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", + "Title": "Terminal Progress Bars", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Rich\", \"FitzJohn\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Configurable Progress bars, they may include percentage, elapsed time, and/or the estimated completion time. They work in terminals, in 'Emacs' 'ESS', 'RStudio', 'Windows' 'Rgui' and the 'macOS' 'R.app'. The package also provides a 'C++' 'API', that works with or without 'Rcpp'.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/r-lib/progress#readme, http://r-lib.github.io/progress/", + "BugReports": "https://github.com/r-lib/progress/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ "crayon", "hms", - "prettyunits" + "prettyunits", + "R6" + ], + "Suggests": [ + "Rcpp", + "testthat (>= 3.0.0)", + "withr" ], - "Hash": "f4625e061cb2865f111b47ff163a5ca6" + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "no", + "Author": "Gábor Csárdi [aut, cre], Rich FitzJohn [aut], Posit Software, PBC [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "RSPM" }, "ps": { "Package": "ps", "Version": "1.7.7", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "List, Query, Manipulate System Processes", + "Authors@R": "c( person(\"Jay\", \"Loden\", role = \"aut\"), person(\"Dave\", \"Daeschler\", role = \"aut\"), person(\"Giampaolo\", \"Rodola'\", role = \"aut\"), person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "List, query and manipulate all system processes, on 'Windows', 'Linux' and 'macOS'.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/r-lib/ps, https://ps.r-lib.org/", + "BugReports": "https://github.com/r-lib/ps/issues", + "Depends": [ + "R (>= 3.4)" + ], + "Imports": [ "utils" ], - "Hash": "878b467580097e9c383acbb16adab57a" + "Suggests": [ + "callr", + "covr", + "curl", + "pillar", + "pingr", + "processx (>= 3.1.0)", + "R6", + "rlang", + "testthat (>= 3.0.0)", + "webfakes" + ], + "Biarch": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "yes", + "Author": "Jay Loden [aut], Dave Daeschler [aut], Giampaolo Rodola' [aut], Gábor Csárdi [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "RSPM" }, "purrr": { "Package": "purrr", "Version": "1.0.2", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "lifecycle", - "magrittr", - "rlang", - "vctrs" + "Title": "Functional Programming Tools", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Lionel\", \"Henry\", , \"lionel@rstudio.com\", role = \"aut\"), person(\"RStudio\", role = c(\"cph\", \"fnd\")) )", + "Description": "A complete and consistent functional programming toolkit for R.", + "License": "MIT + file LICENSE", + "URL": "https://purrr.tidyverse.org/, https://github.com/tidyverse/purrr", + "BugReports": "https://github.com/tidyverse/purrr/issues", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ + "cli (>= 3.6.1)", + "lifecycle (>= 1.0.3)", + "magrittr (>= 1.5.0)", + "rlang (>= 1.1.1)", + "vctrs (>= 0.6.3)" + ], + "Suggests": [ + "covr", + "dplyr (>= 0.7.8)", + "httr", + "knitr", + "lubridate", + "rmarkdown", + "testthat (>= 3.0.0)", + "tibble", + "tidyselect" ], - "Hash": "1cba04a4e9414bdefc9dcaa99649a8dc" + "LinkingTo": [ + "cli" + ], + "VignetteBuilder": "knitr", + "Biarch": "true", + "Config/Needs/website": "tidyverse/tidytemplate, tidyr", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut, cre] (), Lionel Henry [aut], RStudio [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "RSPM" }, "readr": { "Package": "readr", "Version": "2.1.5", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", - "cli", + "Title": "Read Rectangular Text Data", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Romain\", \"Francois\", role = \"ctb\"), person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Shelby\", \"Bearrows\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"https://github.com/mandreyel/\", role = \"cph\", comment = \"mio library\"), person(\"Jukka\", \"Jylänki\", role = c(\"ctb\", \"cph\"), comment = \"grisu3 implementation\"), person(\"Mikkel\", \"Jørgensen\", role = c(\"ctb\", \"cph\"), comment = \"grisu3 implementation\") )", + "Description": "The goal of 'readr' is to provide a fast and friendly way to read rectangular data (like 'csv', 'tsv', and 'fwf'). It is designed to flexibly parse many types of data found in the wild, while still cleanly failing when data unexpectedly changes.", + "License": "MIT + file LICENSE", + "URL": "https://readr.tidyverse.org, https://github.com/tidyverse/readr", + "BugReports": "https://github.com/tidyverse/readr/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ + "cli (>= 3.2.0)", "clipr", - "cpp11", "crayon", - "hms", - "lifecycle", + "hms (>= 0.4.1)", + "lifecycle (>= 0.2.0)", "methods", + "R6", "rlang", "tibble", - "tzdb", "utils", - "vroom" + "vroom (>= 1.6.0)" ], - "Hash": "9de96463d2117f6ac49980577939dfb3" + "Suggests": [ + "covr", + "curl", + "datasets", + "knitr", + "rmarkdown", + "spelling", + "stringi", + "testthat (>= 3.2.0)", + "tzdb (>= 0.1.1)", + "waldo", + "withr", + "xml2" + ], + "LinkingTo": [ + "cpp11", + "tzdb (>= 0.1.1)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "false", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut], Jim Hester [aut], Romain Francois [ctb], Jennifer Bryan [aut, cre] (), Shelby Bearrows [ctb], Posit Software, PBC [cph, fnd], https://github.com/mandreyel/ [cph] (mio library), Jukka Jylänki [ctb, cph] (grisu3 implementation), Mikkel Jørgensen [ctb, cph] (grisu3 implementation)", + "Maintainer": "Jennifer Bryan ", + "Repository": "RSPM" }, "renv": { "Package": "renv", - "Version": "1.0.7", + "Version": "1.1.5", "Source": "GitHub", + "Type": "Package", + "Title": "Project Environments", + "Authors@R": "c( person(\"Kevin\", \"Ushey\", role = c(\"aut\", \"cre\"), email = \"kevin@rstudio.com\", comment = c(ORCID = \"0000-0003-2880-7407\")), person(\"Hadley\", \"Wickham\", role = c(\"aut\"), email = \"hadley@rstudio.com\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A dependency management toolkit for R. Using 'renv', you can create and manage project-local R libraries, save the state of these libraries to a 'lockfile', and later restore your library as required. Together, these tools can help make your projects more isolated, portable, and reproducible.", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/renv/, https://github.com/rstudio/renv", + "BugReports": "https://github.com/rstudio/renv/issues", + "Imports": [ + "utils" + ], + "Suggests": [ + "BiocManager", + "cli", + "compiler", + "covr", + "cpp11", + "devtools", + "generics", + "gitcreds", + "jsonlite", + "jsonvalidate", + "knitr", + "miniUI", + "modules", + "packrat", + "pak", + "R6", + "remotes", + "reticulate", + "rmarkdown", + "rstudioapi", + "shiny", + "testthat", + "uuid", + "waldo", + "yaml", + "webfakes" + ], + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "Roxygen": "list(markdown = TRUE)", + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "bioconductor,python,install,restore,snapshot,retrieve,remotes", + "Author": "Kevin Ushey [aut, cre] (), Hadley Wickham [aut] (), Posit Software, PBC [cph, fnd]", + "Maintainer": "Kevin Ushey ", "RemoteType": "github", "RemoteHost": "api.github.com", - "RemoteRepo": "renv", "RemoteUsername": "rstudio", - "RemoteRef": "v1.0.7", - "RemoteSha": "265a03869234f07c9171b6829d09427577e19baa", - "Requirements": [ - "utils" - ], - "Hash": "c9546c795efae077e4d11bce9eb9d059" + "RemoteRepo": "renv", + "RemoteRef": "7824b328b9064492bcd998717eddda9512afe91d", + "RemoteSha": "7824b328b9064492bcd998717eddda9512afe91d" }, "rlang": { "Package": "rlang", "Version": "1.1.4", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Functions for Base Types and Core R and 'Tidyverse' Features", + "Description": "A toolbox for working with base types, core R features like the condition system, and core 'Tidyverse' features like tidy evaluation.", + "Authors@R": "c( person(\"Lionel\", \"Henry\", ,\"lionel@posit.co\", c(\"aut\", \"cre\")), person(\"Hadley\", \"Wickham\", ,\"hadley@posit.co\", \"aut\"), person(given = \"mikefc\", email = \"mikefc@coolbutuseless.com\", role = \"cph\", comment = \"Hash implementation based on Mike's xxhashlite\"), person(given = \"Yann\", family = \"Collet\", role = \"cph\", comment = \"Author of the embedded xxHash library\"), person(given = \"Posit, PBC\", role = c(\"cph\", \"fnd\")) )", + "License": "MIT + file LICENSE", + "ByteCompile": "true", + "Biarch": "true", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ "utils" ], - "Hash": "3eec01f8b1dee337674b2e34ab1f9bc1" + "Suggests": [ + "cli (>= 3.1.0)", + "covr", + "crayon", + "fs", + "glue", + "knitr", + "magrittr", + "methods", + "pillar", + "rmarkdown", + "stats", + "testthat (>= 3.0.0)", + "tibble", + "usethis", + "vctrs (>= 0.2.3)", + "withr" + ], + "Enhances": [ + "winch" + ], + "Encoding": "UTF-8", + "RoxygenNote": "7.3.1", + "URL": "https://rlang.r-lib.org, https://github.com/r-lib/rlang", + "BugReports": "https://github.com/r-lib/rlang/issues", + "Config/testthat/edition": "3", + "Config/Needs/website": "dplyr, tidyverse/tidytemplate", + "NeedsCompilation": "yes", + "Author": "Lionel Henry [aut, cre], Hadley Wickham [aut], mikefc [cph] (Hash implementation based on Mike's xxhashlite), Yann Collet [cph] (Author of the embedded xxHash library), Posit, PBC [cph, fnd]", + "Maintainer": "Lionel Henry ", + "Repository": "RSPM" }, "stringi": { "Package": "stringi", "Version": "1.8.4", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "stats", + "Date": "2024-05-06", + "Title": "Fast and Portable Character String Processing Facilities", + "Description": "A collection of character string/text/natural language processing tools for pattern searching (e.g., with 'Java'-like regular expressions or the 'Unicode' collation algorithm), random string generation, case mapping, string transliteration, concatenation, sorting, padding, wrapping, Unicode normalisation, date-time formatting and parsing, and many more. They are fast, consistent, convenient, and - thanks to 'ICU' (International Components for Unicode) - portable across all locales and platforms. Documentation about 'stringi' is provided via its website at and the paper by Gagolewski (2022, ).", + "URL": "https://stringi.gagolewski.com/, https://github.com/gagolews/stringi, https://icu.unicode.org/", + "BugReports": "https://github.com/gagolews/stringi/issues", + "SystemRequirements": "ICU4C (>= 61, optional)", + "Type": "Package", + "Depends": [ + "R (>= 3.4)" + ], + "Imports": [ "tools", - "utils" + "utils", + "stats" ], - "Hash": "39e1144fd75428983dc3f63aa53dfa91" + "Biarch": "TRUE", + "License": "file LICENSE", + "Author": "Marek Gagolewski [aut, cre, cph] (), Bartek Tartanus [ctb], and others (stringi source code); Unicode, Inc. and others (ICU4C source code, Unicode Character Database)", + "Maintainer": "Marek Gagolewski ", + "RoxygenNote": "7.2.3", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "License_is_FOSS": "yes", + "Repository": "RSPM" }, "stringr": { "Package": "stringr", "Version": "1.5.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Simple, Consistent Wrappers for Common String Operations", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\", \"cph\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A consistent, simple and easy to use set of wrappers around the fantastic 'stringi' package. All function and argument names (and positions) are consistent, all functions deal with \"NA\"'s and zero length vectors in the same way, and the output from one function is easy to feed into the input of another.", + "License": "MIT + file LICENSE", + "URL": "https://stringr.tidyverse.org, https://github.com/tidyverse/stringr", + "BugReports": "https://github.com/tidyverse/stringr/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ "cli", - "glue", - "lifecycle", + "glue (>= 1.6.1)", + "lifecycle (>= 1.0.3)", "magrittr", - "rlang", - "stringi", - "vctrs" + "rlang (>= 1.0.0)", + "stringi (>= 1.5.3)", + "vctrs (>= 0.4.0)" ], - "Hash": "960e2ae9e09656611e0b8214ad543207" + "Suggests": [ + "covr", + "dplyr", + "gt", + "htmltools", + "htmlwidgets", + "knitr", + "rmarkdown", + "testthat (>= 3.0.0)", + "tibble" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre, cph], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "RSPM" }, "tibble": { "Package": "tibble", "Version": "3.2.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "fansi", - "lifecycle", + "Title": "Simple Data Frames", + "Authors@R": "c(person(given = \"Kirill\", family = \"M\\u00fcller\", role = c(\"aut\", \"cre\"), email = \"kirill@cynkra.com\", comment = c(ORCID = \"0000-0002-1416-3412\")), person(given = \"Hadley\", family = \"Wickham\", role = \"aut\", email = \"hadley@rstudio.com\"), person(given = \"Romain\", family = \"Francois\", role = \"ctb\", email = \"romain@r-enthusiasts.com\"), person(given = \"Jennifer\", family = \"Bryan\", role = \"ctb\", email = \"jenny@rstudio.com\"), person(given = \"RStudio\", role = c(\"cph\", \"fnd\")))", + "Description": "Provides a 'tbl_df' class (the 'tibble') with stricter checking and better formatting than the traditional data frame.", + "License": "MIT + file LICENSE", + "URL": "https://tibble.tidyverse.org/, https://github.com/tidyverse/tibble", + "BugReports": "https://github.com/tidyverse/tibble/issues", + "Depends": [ + "R (>= 3.4.0)" + ], + "Imports": [ + "fansi (>= 0.4.0)", + "lifecycle (>= 1.0.0)", "magrittr", "methods", - "pillar", + "pillar (>= 1.8.1)", "pkgconfig", - "rlang", + "rlang (>= 1.0.2)", "utils", - "vctrs" + "vctrs (>= 0.4.2)" ], - "Hash": "a84e2cc86d07289b3b6f5069df7a004c" + "Suggests": [ + "bench", + "bit64", + "blob", + "brio", + "callr", + "cli", + "covr", + "crayon (>= 1.3.4)", + "DiagrammeR", + "dplyr", + "evaluate", + "formattable", + "ggplot2", + "here", + "hms", + "htmltools", + "knitr", + "lubridate", + "mockr", + "nycflights13", + "pkgbuild", + "pkgload", + "purrr", + "rmarkdown", + "stringi", + "testthat (>= 3.0.2)", + "tidyr", + "withr" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "vignette-formats, as_tibble, add, invariants", + "Config/autostyle/scope": "line_breaks", + "Config/autostyle/strict": "true", + "Config/autostyle/rmd": "false", + "Config/Needs/website": "tidyverse/tidytemplate", + "NeedsCompilation": "yes", + "Author": "Kirill Müller [aut, cre] (), Hadley Wickham [aut], Romain Francois [ctb], Jennifer Bryan [ctb], RStudio [cph, fnd]", + "Maintainer": "Kirill Müller ", + "Repository": "RSPM" }, "tidyr": { "Package": "tidyr", "Version": "1.3.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "cpp11", - "dplyr", + "Title": "Tidy Messy Data", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Davis\", \"Vaughan\", , \"davis@posit.co\", role = \"aut\"), person(\"Maximilian\", \"Girlich\", role = \"aut\"), person(\"Kevin\", \"Ushey\", , \"kevin@posit.co\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Tools to help to create tidy data, where each column is a variable, each row is an observation, and each cell contains a single value. 'tidyr' contains tools for changing the shape (pivoting) and hierarchy (nesting and 'unnesting') of a dataset, turning deeply nested lists into rectangular data frames ('rectangling'), and extracting values out of string columns. It also includes tools for working with missing values (both implicit and explicit).", + "License": "MIT + file LICENSE", + "URL": "https://tidyr.tidyverse.org, https://github.com/tidyverse/tidyr", + "BugReports": "https://github.com/tidyverse/tidyr/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ + "cli (>= 3.4.1)", + "dplyr (>= 1.0.10)", "glue", - "lifecycle", + "lifecycle (>= 1.0.3)", "magrittr", - "purrr", - "rlang", - "stringr", - "tibble", - "tidyselect", + "purrr (>= 1.0.1)", + "rlang (>= 1.1.1)", + "stringr (>= 1.5.0)", + "tibble (>= 2.1.1)", + "tidyselect (>= 1.2.0)", "utils", - "vctrs" + "vctrs (>= 0.5.2)" + ], + "Suggests": [ + "covr", + "data.table", + "knitr", + "readr", + "repurrrsive (>= 1.1.0)", + "rmarkdown", + "testthat (>= 3.0.0)" + ], + "LinkingTo": [ + "cpp11 (>= 0.4.0)" ], - "Hash": "915fb7ce036c22a6a33b5a8adb712eb1" + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.3.0", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut, cre], Davis Vaughan [aut], Maximilian Girlich [aut], Kevin Ushey [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "RSPM" }, "tidyselect": { "Package": "tidyselect", "Version": "1.2.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "glue", - "lifecycle", - "rlang", - "vctrs", + "Title": "Select from a Set of Strings", + "Authors@R": "c( person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = c(\"aut\", \"cre\")), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A backend for the selecting functions of the 'tidyverse'. It makes it easy to implement select-like functions in your own packages in a way that is consistent with other 'tidyverse' interfaces for selection.", + "License": "MIT + file LICENSE", + "URL": "https://tidyselect.r-lib.org, https://github.com/r-lib/tidyselect", + "BugReports": "https://github.com/r-lib/tidyselect/issues", + "Depends": [ + "R (>= 3.4)" + ], + "Imports": [ + "cli (>= 3.3.0)", + "glue (>= 1.3.0)", + "lifecycle (>= 1.0.3)", + "rlang (>= 1.0.4)", + "vctrs (>= 0.5.2)", "withr" ], - "Hash": "829f27b9c4919c16b593794a6344d6c0" + "Suggests": [ + "covr", + "crayon", + "dplyr", + "knitr", + "magrittr", + "rmarkdown", + "stringr", + "testthat (>= 3.1.1)", + "tibble (>= 2.1.3)" + ], + "VignetteBuilder": "knitr", + "ByteCompile": "true", + "Config/testthat/edition": "3", + "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.0.9000", + "NeedsCompilation": "yes", + "Author": "Lionel Henry [aut, cre], Hadley Wickham [aut], Posit Software, PBC [cph, fnd]", + "Maintainer": "Lionel Henry ", + "Repository": "RSPM" }, "tzdb": { "Package": "tzdb", "Version": "0.4.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cpp11" + "Title": "Time Zone Database Information", + "Authors@R": "c( person(\"Davis\", \"Vaughan\", , \"davis@posit.co\", role = c(\"aut\", \"cre\")), person(\"Howard\", \"Hinnant\", role = \"cph\", comment = \"Author of the included date library\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Provides an up-to-date copy of the Internet Assigned Numbers Authority (IANA) Time Zone Database. It is updated periodically to reflect changes made by political bodies to time zone boundaries, UTC offsets, and daylight saving time rules. Additionally, this package provides a C++ interface for working with the 'date' library. 'date' provides comprehensive support for working with dates and date-times, which this package exposes to make it easier for other R packages to utilize. Headers are provided for calendar specific calculations, along with a limited interface for time zone manipulations.", + "License": "MIT + file LICENSE", + "URL": "https://tzdb.r-lib.org, https://github.com/r-lib/tzdb", + "BugReports": "https://github.com/r-lib/tzdb/issues", + "Depends": [ + "R (>= 3.5.0)" ], - "Hash": "f561504ec2897f4d46f0c7657e488ae1" + "Suggests": [ + "covr", + "testthat (>= 3.0.0)" + ], + "LinkingTo": [ + "cpp11 (>= 0.4.2)" + ], + "Biarch": "yes", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "yes", + "Author": "Davis Vaughan [aut, cre], Howard Hinnant [cph] (Author of the included date library), Posit Software, PBC [cph, fnd]", + "Maintainer": "Davis Vaughan ", + "Repository": "RSPM" }, "utf8": { "Package": "utf8", "Version": "1.2.4", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Title": "Unicode Text Processing", + "Authors@R": "c(person(given = c(\"Patrick\", \"O.\"), family = \"Perry\", role = c(\"aut\", \"cph\")), person(given = \"Kirill\", family = \"M\\u00fcller\", role = \"cre\", email = \"kirill@cynkra.com\"), person(given = \"Unicode, Inc.\", role = c(\"cph\", \"dtc\"), comment = \"Unicode Character Database\"))", + "Description": "Process and print 'UTF-8' encoded international text (Unicode). Input, validate, normalize, encode, format, and display.", + "License": "Apache License (== 2.0) | file LICENSE", + "URL": "https://ptrckprry.com/r-utf8/, https://github.com/patperry/r-utf8", + "BugReports": "https://github.com/patperry/r-utf8/issues", + "Depends": [ + "R (>= 2.10)" + ], + "Suggests": [ + "cli", + "covr", + "knitr", + "rlang", + "rmarkdown", + "testthat (>= 3.0.0)", + "withr" ], - "Hash": "62b65c52671e6665f803ff02954446e9" + "VignetteBuilder": "knitr, rmarkdown", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "yes", + "Author": "Patrick O. Perry [aut, cph], Kirill Müller [cre], Unicode, Inc. [cph, dtc] (Unicode Character Database)", + "Maintainer": "Kirill Müller ", + "Repository": "RSPM" }, "vctrs": { "Package": "vctrs", "Version": "0.6.5", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", + "Title": "Vector Helpers", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = \"aut\"), person(\"Davis\", \"Vaughan\", , \"davis@posit.co\", role = c(\"aut\", \"cre\")), person(\"data.table team\", role = \"cph\", comment = \"Radix sort based on data.table's forder() and their contribution to R's order()\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Defines new notions of prototype and size that are used to provide tools for consistent and well-founded type-coercion and size-recycling, and are in turn connected to ideas of type- and size-stability useful for analysing function interfaces.", + "License": "MIT + file LICENSE", + "URL": "https://vctrs.r-lib.org/, https://github.com/r-lib/vctrs", + "BugReports": "https://github.com/r-lib/vctrs/issues", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ + "cli (>= 3.4.0)", "glue", - "lifecycle", - "rlang" + "lifecycle (>= 1.0.3)", + "rlang (>= 1.1.0)" ], - "Hash": "c03fa420630029418f7e6da3667aac4a" + "Suggests": [ + "bit64", + "covr", + "crayon", + "dplyr (>= 0.8.5)", + "generics", + "knitr", + "pillar (>= 1.4.4)", + "pkgdown (>= 2.0.1)", + "rmarkdown", + "testthat (>= 3.0.0)", + "tibble (>= 3.1.3)", + "waldo (>= 0.2.0)", + "withr", + "xml2", + "zeallot" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "Language": "en-GB", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut], Lionel Henry [aut], Davis Vaughan [aut, cre], data.table team [cph] (Radix sort based on data.table's forder() and their contribution to R's order()), Posit Software, PBC [cph, fnd]", + "Maintainer": "Davis Vaughan ", + "Repository": "RSPM" }, "vroom": { "Package": "vroom", "Version": "1.6.5", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Read and Write Rectangular Text Data Quickly", + "Authors@R": "c( person(\"Jim\", \"Hester\", role = \"aut\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Shelby\", \"Bearrows\", role = \"ctb\"), person(\"https://github.com/mandreyel/\", role = \"cph\", comment = \"mio library\"), person(\"Jukka\", \"Jylänki\", role = \"cph\", comment = \"grisu3 implementation\"), person(\"Mikkel\", \"Jørgensen\", role = \"cph\", comment = \"grisu3 implementation\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "The goal of 'vroom' is to read and write data (like 'csv', 'tsv' and 'fwf') quickly. When reading it uses a quick initial indexing step, then reads the values lazily , so only the data you actually use needs to be read. The writer formats the data in parallel and writes to disk asynchronously from formatting.", + "License": "MIT + file LICENSE", + "URL": "https://vroom.r-lib.org, https://github.com/tidyverse/vroom", + "BugReports": "https://github.com/tidyverse/vroom/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ "bit64", - "cli", - "cpp11", + "cli (>= 3.2.0)", "crayon", "glue", "hms", - "lifecycle", + "lifecycle (>= 1.0.3)", "methods", - "progress", - "rlang", + "rlang (>= 0.4.2)", "stats", - "tibble", + "tibble (>= 2.0.0)", "tidyselect", - "tzdb", - "vctrs", + "tzdb (>= 0.1.1)", + "vctrs (>= 0.2.0)", "withr" ], - "Hash": "390f9315bc0025be03012054103d227c" + "Suggests": [ + "archive", + "bench (>= 1.1.0)", + "covr", + "curl", + "dplyr", + "forcats", + "fs", + "ggplot2", + "knitr", + "patchwork", + "prettyunits", + "purrr", + "rmarkdown", + "rstudioapi", + "scales", + "spelling", + "testthat (>= 2.1.0)", + "tidyr", + "utils", + "waldo", + "xml2" + ], + "LinkingTo": [ + "cpp11 (>= 0.2.0)", + "progress (>= 1.2.1)", + "tzdb (>= 0.1.1)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "nycflights13, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "false", + "Copyright": "file COPYRIGHTS", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.2.3.9000", + "NeedsCompilation": "yes", + "Author": "Jim Hester [aut] (), Hadley Wickham [aut] (), Jennifer Bryan [aut, cre] (), Shelby Bearrows [ctb], https://github.com/mandreyel/ [cph] (mio library), Jukka Jylänki [cph] (grisu3 implementation), Mikkel Jørgensen [cph] (grisu3 implementation), Posit Software, PBC [cph, fnd]", + "Maintainer": "Jennifer Bryan ", + "Repository": "RSPM" }, "whisker": { "Package": "whisker", "Version": "0.4.1", "Source": "Repository", - "Repository": "CRAN", - "Hash": "c6abfa47a46d281a7d5159d0a8891e88" + "Maintainer": "Edwin de Jonge ", + "License": "GPL-3", + "Title": "{{mustache}} for R, Logicless Templating", + "Type": "Package", + "LazyLoad": "yes", + "Author": "Edwin de Jonge", + "Description": "Implements 'Mustache' logicless templating.", + "URL": "https://github.com/edwindj/whisker", + "Suggests": [ + "markdown" + ], + "RoxygenNote": "6.1.1", + "NeedsCompilation": "no", + "Repository": "RSPM", + "Encoding": "UTF-8" }, "withr": { "Package": "withr", "Version": "3.0.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "grDevices", - "graphics" + "Title": "Run Code 'With' Temporarily Modified Global State", + "Authors@R": "c( person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = c(\"aut\", \"cre\")), person(\"Kirill\", \"Müller\", , \"krlmlr+r@mailbox.org\", role = \"aut\"), person(\"Kevin\", \"Ushey\", , \"kevinushey@gmail.com\", role = \"aut\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Winston\", \"Chang\", role = \"aut\"), person(\"Jennifer\", \"Bryan\", role = \"ctb\"), person(\"Richard\", \"Cotton\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A set of functions to run code 'with' safely and temporarily modified global state. Many of these functions were originally a part of the 'devtools' package, this provides a simple package with limited dependencies to provide access to these functions.", + "License": "MIT + file LICENSE", + "URL": "https://withr.r-lib.org, https://github.com/r-lib/withr#readme", + "BugReports": "https://github.com/r-lib/withr/issues", + "Depends": [ + "R (>= 3.6.0)" + ], + "Imports": [ + "graphics", + "grDevices" ], - "Hash": "07909200e8bbe90426fbfeb73e1e27aa" + "Suggests": [ + "callr", + "DBI", + "knitr", + "methods", + "rlang", + "rmarkdown (>= 2.12)", + "RSQLite", + "testthat (>= 3.0.0)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "Collate": "'aaa.R' 'collate.R' 'connection.R' 'db.R' 'defer-exit.R' 'standalone-defer.R' 'defer.R' 'devices.R' 'local_.R' 'with_.R' 'dir.R' 'env.R' 'file.R' 'language.R' 'libpaths.R' 'locale.R' 'makevars.R' 'namespace.R' 'options.R' 'par.R' 'path.R' 'rng.R' 'seed.R' 'wrap.R' 'sink.R' 'tempfile.R' 'timezone.R' 'torture.R' 'utils.R' 'with.R'", + "NeedsCompilation": "no", + "Author": "Jim Hester [aut], Lionel Henry [aut, cre], Kirill Müller [aut], Kevin Ushey [aut], Hadley Wickham [aut], Winston Chang [aut], Jennifer Bryan [ctb], Richard Cotton [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Lionel Henry ", + "Repository": "RSPM" }, "xfun": { "Package": "xfun", "Version": "0.47", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Type": "Package", + "Title": "Supporting Functions for Packages Maintained by 'Yihui Xie'", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\", \"cph\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Wush\", \"Wu\", role = \"ctb\"), person(\"Daijiang\", \"Li\", role = \"ctb\"), person(\"Xianying\", \"Tan\", role = \"ctb\"), person(\"Salim\", \"Brüggemann\", role = \"ctb\", email = \"salim-b@pm.me\", comment = c(ORCID = \"0000-0002-5329-5987\")), person(\"Christophe\", \"Dervieux\", role = \"ctb\"), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person() )", + "Description": "Miscellaneous functions commonly used in other packages maintained by 'Yihui Xie'.", + "Depends": [ + "R (>= 3.2.0)" + ], + "Imports": [ "grDevices", "stats", "tools" ], - "Hash": "36ab21660e2d095fef0d83f689e0477c" + "Suggests": [ + "testit", + "parallel", + "codetools", + "methods", + "rstudioapi", + "tinytex (>= 0.30)", + "mime", + "markdown (>= 1.5)", + "knitr (>= 1.47)", + "htmltools", + "remotes", + "pak", + "rhub", + "renv", + "curl", + "xml2", + "jsonlite", + "magick", + "yaml", + "qs", + "rmarkdown" + ], + "License": "MIT + file LICENSE", + "URL": "https://github.com/yihui/xfun", + "BugReports": "https://github.com/yihui/xfun/issues", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "VignetteBuilder": "knitr", + "NeedsCompilation": "yes", + "Author": "Yihui Xie [aut, cre, cph] (), Wush Wu [ctb], Daijiang Li [ctb], Xianying Tan [ctb], Salim Brüggemann [ctb] (), Christophe Dervieux [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Yihui Xie ", + "Repository": "RSPM" }, "yaml": { "Package": "yaml", "Version": "2.3.10", "Source": "Repository", - "Repository": "CRAN", - "Hash": "51dab85c6c98e50a18d7551e9d49f76c" + "Type": "Package", + "Title": "Methods to Convert R Data to YAML and Back", + "Date": "2024-07-22", + "Suggests": [ + "RUnit" + ], + "Author": "Shawn P Garbett [aut], Jeremy Stephens [aut, cre], Kirill Simonov [aut], Yihui Xie [ctb], Zhuoer Dong [ctb], Hadley Wickham [ctb], Jeffrey Horner [ctb], reikoch [ctb], Will Beasley [ctb], Brendan O'Connor [ctb], Gregory R. Warnes [ctb], Michael Quinn [ctb], Zhian N. Kamvar [ctb], Charlie Gao [ctb]", + "Maintainer": "Shawn Garbett ", + "License": "BSD_3_clause + file LICENSE", + "Description": "Implements the 'libyaml' 'YAML' 1.1 parser and emitter () for R.", + "URL": "https://github.com/vubiostat/r-yaml/", + "BugReports": "https://github.com/vubiostat/r-yaml/issues", + "NeedsCompilation": "yes", + "Repository": "RSPM", + "Encoding": "UTF-8" } } } diff --git a/renv/activate.R b/renv/activate.R index e961251..f223e3f 100644 --- a/renv/activate.R +++ b/renv/activate.R @@ -2,10 +2,28 @@ local({ # the requested version of renv - version <- "0.15.4" + version <- "1.1.5" + attr(version, "sha") <- "7824b328b9064492bcd998717eddda9512afe91d" # the project directory - project <- getwd() + project <- Sys.getenv("RENV_PROJECT") + if (!nzchar(project)) + project <- getwd() + + # use start-up diagnostics if enabled + diagnostics <- Sys.getenv("RENV_STARTUP_DIAGNOSTICS", unset = "FALSE") + if (diagnostics) { + start <- Sys.time() + profile <- tempfile("renv-startup-", fileext = ".Rprof") + utils::Rprof(profile) + on.exit({ + utils::Rprof(NULL) + elapsed <- signif(difftime(Sys.time(), start, units = "auto"), digits = 2L) + writeLines(sprintf("- renv took %s to run the autoloader.", format(elapsed))) + writeLines(sprintf("- Profile: %s", profile)) + print(utils::summaryRprof(profile)) + }, add = TRUE) + } # figure out whether the autoloader is enabled enabled <- local({ @@ -15,8 +33,16 @@ local({ if (!is.null(override)) return(override) + # if we're being run in a context where R_LIBS is already set, + # don't load -- presumably we're being run as a sub-process and + # the parent process has already set up library paths for us + rcmd <- Sys.getenv("R_CMD", unset = NA) + rlibs <- Sys.getenv("R_LIBS", unset = NA) + if (!is.na(rlibs) && !is.na(rcmd)) + return(FALSE) + # next, check environment variables - # TODO: prefer using the configuration one in the future + # prefer using the configuration one in the future envvars <- c( "RENV_CONFIG_AUTOLOADER_ENABLED", "RENV_AUTOLOADER_ENABLED", @@ -34,9 +60,22 @@ local({ }) - if (!enabled) + # bail if we're not enabled + if (!enabled) { + + # if we're not enabled, we might still need to manually load + # the user profile here + profile <- Sys.getenv("R_PROFILE_USER", unset = "~/.Rprofile") + if (file.exists(profile)) { + cfg <- Sys.getenv("RENV_CONFIG_USER_PROFILE", unset = "TRUE") + if (tolower(cfg) %in% c("true", "t", "1")) + sys.source(profile, envir = globalenv()) + } + return(FALSE) + } + # avoid recursion if (identical(getOption("renv.autoloader.running"), TRUE)) { warning("ignoring recursive attempt to run renv autoloader") @@ -54,27 +93,155 @@ local({ # mask 'utils' packages, will come first on the search path library(utils, lib.loc = .Library) - # unload renv if it's already been laoded + # unload renv if it's already been loaded if ("renv" %in% loadedNamespaces()) unloadNamespace("renv") # load bootstrap tools + ansify <- function(text) { + if (renv_ansify_enabled()) + renv_ansify_enhanced(text) + else + renv_ansify_default(text) + } + + renv_ansify_enabled <- function() { + + override <- Sys.getenv("RENV_ANSIFY_ENABLED", unset = NA) + if (!is.na(override)) + return(as.logical(override)) + + pane <- Sys.getenv("RSTUDIO_CHILD_PROCESS_PANE", unset = NA) + if (identical(pane, "build")) + return(FALSE) + + testthat <- Sys.getenv("TESTTHAT", unset = "false") + if (tolower(testthat) %in% "true") + return(FALSE) + + iderun <- Sys.getenv("R_CLI_HAS_HYPERLINK_IDE_RUN", unset = "false") + if (tolower(iderun) %in% "false") + return(FALSE) + + TRUE + + } + + renv_ansify_default <- function(text) { + text + } + + renv_ansify_enhanced <- function(text) { + + # R help links + pattern <- "`\\?(renv::(?:[^`])+)`" + replacement <- "`\033]8;;x-r-help:\\1\a?\\1\033]8;;\a`" + text <- gsub(pattern, replacement, text, perl = TRUE) + + # runnable code + pattern <- "`(renv::(?:[^`])+)`" + replacement <- "`\033]8;;x-r-run:\\1\a\\1\033]8;;\a`" + text <- gsub(pattern, replacement, text, perl = TRUE) + + # return ansified text + text + + } + + renv_ansify_init <- function() { + + envir <- renv_envir_self() + if (renv_ansify_enabled()) + assign("ansify", renv_ansify_enhanced, envir = envir) + else + assign("ansify", renv_ansify_default, envir = envir) + + } + `%||%` <- function(x, y) { - if (is.environment(x) || length(x)) x else y + if (is.null(x)) y else x + } + + catf <- function(fmt, ..., appendLF = TRUE) { + + quiet <- getOption("renv.bootstrap.quiet", default = FALSE) + if (quiet) + return(invisible()) + + msg <- sprintf(fmt, ...) + cat(msg, file = stdout(), sep = if (appendLF) "\n" else "") + + invisible(msg) + + } + + header <- function(label, + ..., + prefix = "#", + suffix = "-", + n = min(getOption("width"), 78)) + { + label <- sprintf(label, ...) + n <- max(n - nchar(label) - nchar(prefix) - 2L, 8L) + if (n <= 0) + return(paste(prefix, label)) + + tail <- paste(rep.int(suffix, n), collapse = "") + paste0(prefix, " ", label, " ", tail) + + } + + heredoc <- function(text, leave = 0) { + + # remove leading, trailing whitespace + trimmed <- gsub("^\\s*\\n|\\n\\s*$", "", text) + + # split into lines + lines <- strsplit(trimmed, "\n", fixed = TRUE)[[1L]] + + # compute common indent + indent <- regexpr("[^[:space:]]", lines) + common <- min(setdiff(indent, -1L)) - leave + text <- paste(substring(lines, common), collapse = "\n") + + # substitute in ANSI links for executable renv code + ansify(text) + } bootstrap <- function(version, library) { + friendly <- renv_bootstrap_version_friendly(version) + section <- header(sprintf("Bootstrapping renv %s", friendly)) + catf(section) + # attempt to download renv - tarball <- tryCatch(renv_bootstrap_download(version), error = identity) - if (inherits(tarball, "error")) - stop("failed to download renv ", version) + catf("- Downloading renv ... ", appendLF = FALSE) + withCallingHandlers( + tarball <- renv_bootstrap_download(version), + error = function(err) { + catf("FAILED") + stop("failed to download:\n", conditionMessage(err)) + } + ) + catf("OK") + on.exit(unlink(tarball), add = TRUE) # now attempt to install - status <- tryCatch(renv_bootstrap_install(version, tarball, library), error = identity) - if (inherits(status, "error")) - stop("failed to install renv ", version) + catf("- Installing renv ... ", appendLF = FALSE) + withCallingHandlers( + status <- renv_bootstrap_install(version, tarball, library), + error = function(err) { + catf("FAILED") + stop("failed to install:\n", conditionMessage(err)) + } + ) + catf("OK") + + # add empty line to break up bootstrapping from normal output + catf("") + return(invisible()) } renv_bootstrap_tests_running <- function() { @@ -83,28 +250,32 @@ local({ renv_bootstrap_repos <- function() { + # get CRAN repository + cran <- getOption("renv.repos.cran", "https://cloud.r-project.org") + # check for repos override repos <- Sys.getenv("RENV_CONFIG_REPOS_OVERRIDE", unset = NA) - if (!is.na(repos)) + if (!is.na(repos)) { + + # check for RSPM; if set, use a fallback repository for renv + rspm <- Sys.getenv("RSPM", unset = NA) + if (identical(rspm, repos)) + repos <- c(RSPM = rspm, CRAN = cran) + return(repos) + } + # check for lockfile repositories repos <- tryCatch(renv_bootstrap_repos_lockfile(), error = identity) if (!inherits(repos, "error") && length(repos)) return(repos) - # if we're testing, re-use the test repositories - if (renv_bootstrap_tests_running()) - return(getOption("renv.tests.repos")) - # retrieve current repos repos <- getOption("repos") # ensure @CRAN@ entries are resolved - repos[repos == "@CRAN@"] <- getOption( - "renv.repos.cran", - "https://cloud.r-project.org" - ) + repos[repos == "@CRAN@"] <- cran # add in renv.bootstrap.repos if set default <- c(FALLBACK = "https://cloud.r-project.org") @@ -143,33 +314,34 @@ local({ renv_bootstrap_download <- function(version) { - # if the renv version number has 4 components, assume it must - # be retrieved via github - nv <- numeric_version(version) - components <- unclass(nv)[[1]] - - # if this appears to be a development version of 'renv', we'll - # try to restore from github - dev <- length(components) == 4L - - # begin collecting different methods for finding renv - methods <- c( - renv_bootstrap_download_tarball, - if (dev) - renv_bootstrap_download_github - else c( - renv_bootstrap_download_cran_latest, - renv_bootstrap_download_cran_archive + sha <- attr(version, "sha", exact = TRUE) + + methods <- if (!is.null(sha)) { + + # attempting to bootstrap a development version of renv + c( + function() renv_bootstrap_download_tarball(sha), + function() renv_bootstrap_download_github(sha) + ) + + } else { + + # attempting to bootstrap a release version of renv + c( + function() renv_bootstrap_download_tarball(version), + function() renv_bootstrap_download_cran_latest(version), + function() renv_bootstrap_download_cran_archive(version) ) - ) + + } for (method in methods) { - path <- tryCatch(method(version), error = identity) + path <- tryCatch(method(), error = identity) if (is.character(path) && file.exists(path)) return(path) } - stop("failed to download renv ", version) + stop("All download methods failed") } @@ -185,43 +357,78 @@ local({ if (fixup) mode <- "w+b" - utils::download.file( + args <- list( url = url, destfile = destfile, mode = mode, quiet = TRUE ) + if ("headers" %in% names(formals(utils::download.file))) { + headers <- renv_bootstrap_download_custom_headers(url) + if (length(headers) && is.character(headers)) + args$headers <- headers + } + + do.call(utils::download.file, args) + } - renv_bootstrap_download_cran_latest <- function(version) { + renv_bootstrap_download_custom_headers <- function(url) { - spec <- renv_bootstrap_download_cran_latest_find(version) + headers <- getOption("renv.download.headers") + if (is.null(headers)) + return(character()) + + if (!is.function(headers)) + stopf("'renv.download.headers' is not a function") + + headers <- headers(url) + if (length(headers) == 0L) + return(character()) + + if (is.list(headers)) + headers <- unlist(headers, recursive = FALSE, use.names = TRUE) - message("* Downloading renv ", version, " ... ", appendLF = FALSE) + ok <- + is.character(headers) && + is.character(names(headers)) && + all(nzchar(names(headers))) + if (!ok) + stop("invocation of 'renv.download.headers' did not return a named character vector") + + headers + + } + + renv_bootstrap_download_cran_latest <- function(version) { + + spec <- renv_bootstrap_download_cran_latest_find(version) type <- spec$type repos <- spec$repos - info <- tryCatch( - utils::download.packages( - pkgs = "renv", - destdir = tempdir(), - repos = repos, - type = type, - quiet = TRUE - ), + baseurl <- utils::contrib.url(repos = repos, type = type) + ext <- if (identical(type, "source")) + ".tar.gz" + else if (Sys.info()[["sysname"]] == "Windows") + ".zip" + else + ".tgz" + name <- sprintf("renv_%s%s", version, ext) + url <- paste(baseurl, name, sep = "/") + + destfile <- file.path(tempdir(), name) + status <- tryCatch( + renv_bootstrap_download_impl(url, destfile), condition = identity ) - if (inherits(info, "condition")) { - message("FAILED") + if (inherits(status, "condition")) return(FALSE) - } # report success and return - message("OK (downloaded ", type, ")") - info[1, 2] + destfile } @@ -240,10 +447,21 @@ local({ for (type in types) { for (repos in renv_bootstrap_repos()) { + # build arguments for utils::available.packages() call + args <- list(type = type, repos = repos) + + # add custom headers if available -- note that + # utils::available.packages() will pass this to download.file() + if ("headers" %in% names(formals(utils::download.file))) { + headers <- renv_bootstrap_download_custom_headers(repos) + if (length(headers) && is.character(headers)) + args$headers <- headers + } + # retrieve package database db <- tryCatch( as.data.frame( - utils::available.packages(type = type, repos = repos), + do.call(utils::available.packages, args), stringsAsFactors = FALSE ), error = identity @@ -277,8 +495,6 @@ local({ urls <- file.path(repos, "src/contrib/Archive/renv", name) destfile <- file.path(tempdir(), name) - message("* Downloading renv ", version, " ... ", appendLF = FALSE) - for (url in urls) { status <- tryCatch( @@ -286,14 +502,11 @@ local({ condition = identity ) - if (identical(status, 0L)) { - message("OK") + if (identical(status, 0L)) return(destfile) - } } - message("FAILED") return(FALSE) } @@ -307,24 +520,37 @@ local({ return() # allow directories - info <- file.info(tarball, extra_cols = FALSE) - if (identical(info$isdir, TRUE)) { + if (dir.exists(tarball)) { name <- sprintf("renv_%s.tar.gz", version) tarball <- file.path(tarball, name) } # bail if it doesn't exist - if (!file.exists(tarball)) + if (!file.exists(tarball)) { + + # let the user know we weren't able to honour their request + fmt <- "- RENV_BOOTSTRAP_TARBALL is set (%s) but does not exist." + msg <- sprintf(fmt, tarball) + warning(msg) + + # bail return() - fmt <- "* Bootstrapping with tarball at path '%s'." - msg <- sprintf(fmt, tarball) - message(msg) + } + catf("- Using local tarball '%s'.", tarball) tarball } + renv_bootstrap_github_token <- function() { + for (envvar in c("GITHUB_TOKEN", "GITHUB_PAT", "GH_TOKEN")) { + envval <- Sys.getenv(envvar, unset = NA) + if (!is.na(envval)) + return(envval) + } + } + renv_bootstrap_download_github <- function(version) { enabled <- Sys.getenv("RENV_BOOTSTRAP_FROM_GITHUB", unset = "TRUE") @@ -332,23 +558,24 @@ local({ return(FALSE) # prepare download options - pat <- Sys.getenv("GITHUB_PAT") - if (nzchar(Sys.which("curl")) && nzchar(pat)) { + token <- renv_bootstrap_github_token() + if (is.null(token)) + token <- "" + + if (nzchar(Sys.which("curl")) && nzchar(token)) { fmt <- "--location --fail --header \"Authorization: token %s\"" - extra <- sprintf(fmt, pat) + extra <- sprintf(fmt, token) saved <- options("download.file.method", "download.file.extra") options(download.file.method = "curl", download.file.extra = extra) on.exit(do.call(base::options, saved), add = TRUE) - } else if (nzchar(Sys.which("wget")) && nzchar(pat)) { + } else if (nzchar(Sys.which("wget")) && nzchar(token)) { fmt <- "--header=\"Authorization: token %s\"" - extra <- sprintf(fmt, pat) + extra <- sprintf(fmt, token) saved <- options("download.file.method", "download.file.extra") options(download.file.method = "wget", download.file.extra = extra) on.exit(do.call(base::options, saved), add = TRUE) } - message("* Downloading renv ", version, " from GitHub ... ", appendLF = FALSE) - url <- file.path("https://api.github.com/repos/rstudio/renv/tarball", version) name <- sprintf("renv_%s.tar.gz", version) destfile <- file.path(tempdir(), name) @@ -358,26 +585,105 @@ local({ condition = identity ) - if (!identical(status, 0L)) { - message("FAILED") + if (!identical(status, 0L)) return(FALSE) - } - message("OK") + renv_bootstrap_download_augment(destfile) + return(destfile) } + # Add Sha to DESCRIPTION. This is stop gap until #890, after which we + # can use renv::install() to fully capture metadata. + renv_bootstrap_download_augment <- function(destfile) { + sha <- renv_bootstrap_git_extract_sha1_tar(destfile) + if (is.null(sha)) { + return() + } + + # Untar + tempdir <- tempfile("renv-github-") + on.exit(unlink(tempdir, recursive = TRUE), add = TRUE) + untar(destfile, exdir = tempdir) + pkgdir <- dir(tempdir, full.names = TRUE)[[1]] + + # Modify description + desc_path <- file.path(pkgdir, "DESCRIPTION") + desc_lines <- readLines(desc_path) + remotes_fields <- c( + "RemoteType: github", + "RemoteHost: api.github.com", + "RemoteRepo: renv", + "RemoteUsername: rstudio", + "RemotePkgRef: rstudio/renv", + paste("RemoteRef: ", sha), + paste("RemoteSha: ", sha) + ) + writeLines(c(desc_lines[desc_lines != ""], remotes_fields), con = desc_path) + + # Re-tar + local({ + old <- setwd(tempdir) + on.exit(setwd(old), add = TRUE) + + tar(destfile, compression = "gzip") + }) + invisible() + } + + # Extract the commit hash from a git archive. Git archives include the SHA1 + # hash as the comment field of the tarball pax extended header + # (see https://www.kernel.org/pub/software/scm/git/docs/git-archive.html) + # For GitHub archives this should be the first header after the default one + # (512 byte) header. + renv_bootstrap_git_extract_sha1_tar <- function(bundle) { + + # open the bundle for reading + # We use gzcon for everything because (from ?gzcon) + # > Reading from a connection which does not supply a 'gzip' magic + # > header is equivalent to reading from the original connection + conn <- gzcon(file(bundle, open = "rb", raw = TRUE)) + on.exit(close(conn)) + + # The default pax header is 512 bytes long and the first pax extended header + # with the comment should be 51 bytes long + # `52 comment=` (11 chars) + 40 byte SHA1 hash + len <- 0x200 + 0x33 + res <- rawToChar(readBin(conn, "raw", n = len)[0x201:len]) + + if (grepl("^52 comment=", res)) { + sub("52 comment=", "", res) + } else { + NULL + } + } + renv_bootstrap_install <- function(version, tarball, library) { # attempt to install it into project library - message("* Installing renv ", version, " ... ", appendLF = FALSE) dir.create(library, showWarnings = FALSE, recursive = TRUE) + output <- renv_bootstrap_install_impl(library, tarball) + + # check for successful install + status <- attr(output, "status") + if (is.null(status) || identical(status, 0L)) + return(status) + + # an error occurred; report it + header <- "installation of renv failed" + lines <- paste(rep.int("=", nchar(header)), collapse = "") + text <- paste(c(header, lines, output), collapse = "\n") + stop(text) + + } + + renv_bootstrap_install_impl <- function(library, tarball) { # invoke using system2 so we can capture and report output bin <- R.home("bin") exe <- if (Sys.info()[["sysname"]] == "Windows") "R.exe" else "R" - r <- file.path(bin, exe) + R <- file.path(bin, exe) args <- c( "--vanilla", "CMD", "INSTALL", "--no-multiarch", @@ -385,27 +691,23 @@ local({ shQuote(path.expand(tarball)) ) - output <- system2(r, args, stdout = TRUE, stderr = TRUE) - message("Done!") + system2(R, args, stdout = TRUE, stderr = TRUE) - # check for successful install - status <- attr(output, "status") - if (is.numeric(status) && !identical(status, 0L)) { - header <- "Error installing renv:" - lines <- paste(rep.int("=", nchar(header)), collapse = "") - text <- c(header, lines, output) - writeLines(text, con = stderr()) - } + } - status + renv_bootstrap_platform_prefix_default <- function() { - } + # read version component + version <- Sys.getenv("RENV_PATHS_VERSION", unset = "R-%v") - renv_bootstrap_platform_prefix <- function() { + # expand placeholders + placeholders <- list( + list("%v", format(getRversion()[1, 1:2])), + list("%V", format(getRversion()[1, 1:3])) + ) - # construct version prefix - version <- paste(R.version$major, R.version$minor, sep = ".") - prefix <- paste("R", numeric_version(version)[1, 1:2], sep = "-") + for (placeholder in placeholders) + version <- gsub(placeholder[[1L]], placeholder[[2L]], version, fixed = TRUE) # include SVN revision for development versions of R # (to avoid sharing platform-specific artefacts with released versions of R) @@ -414,10 +716,19 @@ local({ identical(R.version[["nickname"]], "Unsuffered Consequences") if (devel) - prefix <- paste(prefix, R.version[["svn rev"]], sep = "-r") + version <- paste(version, R.version[["svn rev"]], sep = "-r") + + version + + } + + renv_bootstrap_platform_prefix <- function() { + + # construct version prefix + version <- renv_bootstrap_platform_prefix_default() # build list of path components - components <- c(prefix, R.version$platform) + components <- c(version, R.version$platform) # include prefix if provided by user prefix <- renv_bootstrap_platform_prefix_impl() @@ -438,6 +749,9 @@ local({ # if the user has requested an automatic prefix, generate it auto <- Sys.getenv("RENV_PATHS_PREFIX_AUTO", unset = NA) + if (is.na(auto) && getRversion() >= "4.4.0") + auto <- "TRUE" + if (auto %in% c("TRUE", "True", "true", "1")) return(renv_bootstrap_platform_prefix_auto()) @@ -607,34 +921,67 @@ local({ } - renv_bootstrap_validate_version <- function(version) { + renv_bootstrap_validate_version <- function(version, description = NULL) { + + # resolve description file + # + # avoid passing lib.loc to `packageDescription()` below, since R will + # use the loaded version of the package by default anyhow. note that + # this function should only be called after 'renv' is loaded + # https://github.com/rstudio/renv/issues/1625 + description <- description %||% packageDescription("renv") - loadedversion <- utils::packageDescription("renv", fields = "Version") - if (version == loadedversion) + # check whether requested version 'version' matches loaded version of renv + sha <- attr(version, "sha", exact = TRUE) + valid <- if (!is.null(sha)) + renv_bootstrap_validate_version_dev(sha, description) + else + renv_bootstrap_validate_version_release(version, description) + + if (valid) return(TRUE) - # assume four-component versions are from GitHub; three-component - # versions are from CRAN - components <- strsplit(loadedversion, "[.-]")[[1]] - remote <- if (length(components) == 4L) - paste("rstudio/renv", loadedversion, sep = "@") + # the loaded version of renv doesn't match the requested version; + # give the user instructions on how to proceed + dev <- identical(description[["RemoteType"]], "github") + remote <- if (dev) + paste("rstudio/renv", description[["RemoteSha"]], sep = "@") else - paste("renv", loadedversion, sep = "@") + paste("renv", description[["Version"]], sep = "@") - fmt <- paste( - "renv %1$s was loaded from project library, but this project is configured to use renv %2$s.", - "Use `renv::record(\"%3$s\")` to record renv %1$s in the lockfile.", - "Use `renv::restore(packages = \"renv\")` to install renv %2$s into the project library.", - sep = "\n" + # display both loaded version + sha if available + friendly <- renv_bootstrap_version_friendly( + version = description[["Version"]], + sha = if (dev) description[["RemoteSha"]] ) - msg <- sprintf(fmt, loadedversion, version, remote) - warning(msg, call. = FALSE) + fmt <- heredoc(" + renv %1$s was loaded from project library, but this project is configured to use renv %2$s. + - Use `renv::record(\"%3$s\")` to record renv %1$s in the lockfile. + - Use `renv::restore(packages = \"renv\")` to install renv %2$s into the project library. + ") + catf(fmt, friendly, renv_bootstrap_version_friendly(version), remote) FALSE } + renv_bootstrap_validate_version_dev <- function(version, description) { + + expected <- description[["RemoteSha"]] + if (!is.character(expected)) + return(FALSE) + + pattern <- sprintf("^\\Q%s\\E", version) + grepl(pattern, expected, perl = TRUE) + + } + + renv_bootstrap_validate_version_release <- function(version, description) { + expected <- description[["Version"]] + is.character(expected) && identical(expected, version) + } + renv_bootstrap_hash_text <- function(text) { hashfile <- tempfile("renv-hash-") @@ -654,6 +1001,12 @@ local({ # warn if the version of renv loaded does not match renv_bootstrap_validate_version(version) + # execute renv load hooks, if any + hooks <- getHook("renv::autoload") + for (hook in hooks) + if (is.function(hook)) + tryCatch(hook(), error = warnify) + # load the project renv::load(project) @@ -669,7 +1022,7 @@ local({ return(profile) # check for a profile file (nothing to do if it doesn't exist) - path <- renv_bootstrap_paths_renv("profile", profile = FALSE) + path <- renv_bootstrap_paths_renv("profile", profile = FALSE, project = project) if (!file.exists(path)) return(NULL) @@ -793,99 +1146,173 @@ local({ } + renv_bootstrap_version_friendly <- function(version, shafmt = NULL, sha = NULL) { + sha <- sha %||% attr(version, "sha", exact = TRUE) + parts <- c(version, sprintf(shafmt %||% " [sha: %s]", substring(sha, 1L, 7L))) + paste(parts, collapse = "") + } - renv_json_read <- function(file = NULL, text = NULL) { + renv_bootstrap_exec <- function(project, libpath, version) { + if (!renv_bootstrap_load(project, libpath, version)) + renv_bootstrap_run(project, libpath, version) + } + + renv_bootstrap_run <- function(project, libpath, version) { - text <- paste(text %||% read(file), collapse = "\n") + # perform bootstrap + bootstrap(version, libpath) - # find strings in the JSON - pattern <- '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' - locs <- gregexpr(pattern, text)[[1]] + # exit early if we're just testing bootstrap + if (!is.na(Sys.getenv("RENV_BOOTSTRAP_INSTALL_ONLY", unset = NA))) + return(TRUE) - # if any are found, replace them with placeholders - replaced <- text - strings <- character() - replacements <- character() + # try again to load + if (requireNamespace("renv", lib.loc = libpath, quietly = TRUE)) { + return(renv::load(project = project)) + } + + # failed to download or load renv; warn the user + msg <- c( + "Failed to find an renv installation: the project will not be loaded.", + "Use `renv::activate()` to re-initialize the project." + ) + + warning(paste(msg, collapse = "\n"), call. = FALSE) + + } - if (!identical(c(locs), -1L)) { + renv_json_read <- function(file = NULL, text = NULL) { - # get the string values - starts <- locs - ends <- locs + attr(locs, "match.length") - 1L - strings <- substring(text, starts, ends) + jlerr <- NULL - # only keep those requiring escaping - strings <- grep("[[\\]{}:]", strings, perl = TRUE, value = TRUE) + # if jsonlite is loaded, use that instead + if ("jsonlite" %in% loadedNamespaces()) { - # compute replacements - replacements <- sprintf('"\032%i\032"', seq_along(strings)) + json <- tryCatch(renv_json_read_jsonlite(file, text), error = identity) + if (!inherits(json, "error")) + return(json) - # replace the strings - mapply(function(string, replacement) { - replaced <<- sub(string, replacement, replaced, fixed = TRUE) - }, strings, replacements) + jlerr <- json } - # transform the JSON into something the R parser understands - transformed <- replaced - transformed <- gsub("[[{]", "list(", transformed) - transformed <- gsub("[]}]", ")", transformed) - transformed <- gsub(":", "=", transformed, fixed = TRUE) - text <- paste(transformed, collapse = "\n") + # otherwise, fall back to the default JSON reader + json <- tryCatch(renv_json_read_default(file, text), error = identity) + if (!inherits(json, "error")) + return(json) - # parse it - json <- parse(text = text, keep.source = FALSE, srcfile = NULL)[[1L]] + # report an error + if (!is.null(jlerr)) + stop(jlerr) + else + stop(json) + + } + + renv_json_read_jsonlite <- function(file = NULL, text = NULL) { + text <- paste(text %||% readLines(file, warn = FALSE), collapse = "\n") + jsonlite::fromJSON(txt = text, simplifyVector = FALSE) + } - # construct map between source strings, replaced strings - map <- as.character(parse(text = strings)) - names(map) <- as.character(parse(text = replacements)) + renv_json_read_patterns <- function() { - # convert to list - map <- as.list(map) + list( - # remap strings in object - remapped <- renv_json_remap(json, map) + # objects + list("{", "\t\n\tobject(\t\n\t", TRUE), + list("}", "\t\n\t)\t\n\t", TRUE), - # evaluate - eval(remapped, envir = baseenv()) + # arrays + list("[", "\t\n\tarray(\t\n\t", TRUE), + list("]", "\n\t\n)\n\t\n", TRUE), + + # maps + list(":", "\t\n\t=\t\n\t", TRUE), + + # newlines + list("\\u000a", "\n", FALSE) + + ) } - renv_json_remap <- function(json, map) { + renv_json_read_envir <- function() { + + envir <- new.env(parent = emptyenv()) + + envir[["+"]] <- `+` + envir[["-"]] <- `-` - # fix names - if (!is.null(names(json))) { - lhs <- match(names(json), names(map), nomatch = 0L) - rhs <- match(names(map), names(json), nomatch = 0L) - names(json)[rhs] <- map[lhs] + envir[["object"]] <- function(...) { + result <- list(...) + names(result) <- as.character(names(result)) + result } - # fix values - if (is.character(json)) - return(map[[json]] %||% json) - - # handle true, false, null - if (is.name(json)) { - text <- as.character(json) - if (text == "true") - return(TRUE) - else if (text == "false") - return(FALSE) - else if (text == "null") - return(NULL) + envir[["array"]] <- list + + envir[["true"]] <- TRUE + envir[["false"]] <- FALSE + envir[["null"]] <- NULL + + envir + + } + + renv_json_read_remap <- function(object, patterns) { + + # repair names if necessary + if (!is.null(names(object))) { + + nms <- names(object) + for (pattern in patterns) + nms <- gsub(pattern[[2L]], pattern[[1L]], nms, fixed = TRUE) + names(object) <- nms + } - # recurse - if (is.recursive(json)) { - for (i in seq_along(json)) { - json[i] <- list(renv_json_remap(json[[i]], map)) - } + # repair strings if necessary + if (is.character(object)) { + for (pattern in patterns) + object <- gsub(pattern[[2L]], pattern[[1L]], object, fixed = TRUE) } - json + # recurse for other objects + if (is.recursive(object)) + for (i in seq_along(object)) + object[i] <- list(renv_json_read_remap(object[[i]], patterns)) + + # return remapped object + object + + } + + renv_json_read_default <- function(file = NULL, text = NULL) { + + # read json text + text <- paste(text %||% readLines(file, warn = FALSE), collapse = "\n") + + # convert into something the R parser will understand + patterns <- renv_json_read_patterns() + transformed <- text + for (pattern in patterns) + transformed <- gsub(pattern[[1L]], pattern[[2L]], transformed, fixed = TRUE) + + # parse it + rfile <- tempfile("renv-json-", fileext = ".R") + on.exit(unlink(rfile), add = TRUE) + writeLines(transformed, con = rfile) + json <- parse(rfile, keep.source = FALSE, srcfile = NULL)[[1L]] + + # evaluate in safe environment + result <- eval(json, envir = renv_json_read_envir()) + + # fix up strings if necessary -- do so only with reversible patterns + patterns <- Filter(function(pattern) pattern[[3L]], patterns) + renv_json_read_remap(result, patterns) } + # load the renv profile, if any renv_bootstrap_profile_load(project) @@ -899,35 +1326,9 @@ local({ # construct full libpath libpath <- file.path(root, prefix) - # attempt to load - if (renv_bootstrap_load(project, libpath, version)) - return(TRUE) - - # load failed; inform user we're about to bootstrap - prefix <- paste("# Bootstrapping renv", version) - postfix <- paste(rep.int("-", 77L - nchar(prefix)), collapse = "") - header <- paste(prefix, postfix) - message(header) - - # perform bootstrap - bootstrap(version, libpath) - - # exit early if we're just testing bootstrap - if (!is.na(Sys.getenv("RENV_BOOTSTRAP_INSTALL_ONLY", unset = NA))) - return(TRUE) - - # try again to load - if (requireNamespace("renv", lib.loc = libpath, quietly = TRUE)) { - message("* Successfully installed and loaded renv ", version, ".") - return(renv::load()) - } - - # failed to download or load renv; warn the user - msg <- c( - "Failed to find an renv installation: the project will not be loaded.", - "Use `renv::activate()` to re-initialize the project." - ) + # run bootstrap code + renv_bootstrap_exec(project, libpath, version) - warning(paste(msg, collapse = "\n"), call. = FALSE) + invisible() }) diff --git a/renv/settings.dcf b/renv/settings.dcf index fc4e479..664e830 100644 --- a/renv/settings.dcf +++ b/renv/settings.dcf @@ -6,3 +6,4 @@ snapshot.type: implicit use.cache: TRUE vcs.ignore.library: TRUE vcs.ignore.local: TRUE +sysreqs.enabled: FALSE diff --git a/renv/settings.json b/renv/settings.json new file mode 100644 index 0000000..f836f3f --- /dev/null +++ b/renv/settings.json @@ -0,0 +1,19 @@ +{ + "bioconductor.version": null, + "external.libraries": [], + "ignored.packages": [], + "package.dependency.fields": [ + "Imports", + "Depends", + "LinkingTo" + ], + "ppm.enabled": null, + "ppm.ignored.urls": [], + "r.version": [], + "snapshot.type": "implicit", + "use.cache": true, + "vcs.ignore.cellar": true, + "vcs.ignore.library": true, + "vcs.ignore.local": true, + "vcs.manage.ignores": true +} From f46375a64a0380d6c014d47fa4220f4a98d187f8 Mon Sep 17 00:00:00 2001 From: "Jonathan Beus, MD" Date: Wed, 12 Nov 2025 21:09:23 -0500 Subject: [PATCH 04/31] update ruby to reflect deprecation of File.exists? --- lib/geocoder/us.rb | 2 +- lib/geocoder/us/database.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/geocoder/us.rb b/lib/geocoder/us.rb index a39bc81..a3904ba 100644 --- a/lib/geocoder/us.rb +++ b/lib/geocoder/us.rb @@ -7,7 +7,7 @@ # General usage is as follows: # # >> require 'geocoder/us' -# >> db = Geocoder::US::Database.new("/opt/tiger/geocoder.db") +# >> db = Geocoder::US::Database.new("/opt/geocoder.db") # >> p db.geocode("1600 Pennsylvania Av, Washington DC") # # [{:pretyp=>"", :street=>"Pennsylvania", :sufdir=>"NW", :zip=>"20502", diff --git a/lib/geocoder/us/database.rb b/lib/geocoder/us/database.rb index 4239c60..55e800b 100644 --- a/lib/geocoder/us/database.rb +++ b/lib/geocoder/us/database.rb @@ -39,7 +39,7 @@ def initialize (filename, options = {}) :create => false, :dbtype => 1} options = defaults.merge options raise ArgumentError, "can't find database #{filename}" \ - unless options[:create] or File.exists? filename + unless options[:create] or File.exist? filename @db = SQLite3::Database.new( filename ) @st = {} @dbtype = options[:dbtype] From 6ee586eb68f7925e3ec5a70ce9ca04df2e5ef936 Mon Sep 17 00:00:00 2001 From: "Jonathan Beus, MD" Date: Wed, 12 Nov 2025 21:19:21 -0500 Subject: [PATCH 05/31] fixed additional ruby compatibility issues --- lib/geocoder/us/database.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/geocoder/us/database.rb b/lib/geocoder/us/database.rb index 55e800b..232f5fc 100644 --- a/lib/geocoder/us/database.rb +++ b/lib/geocoder/us/database.rb @@ -153,7 +153,7 @@ def execute_statement (st, *params) result = st.execute(*params) columns = result.columns.map {|c| c.to_sym} result.each {|row| - rows << Hash[*(columns.zip(row).flatten)]} + rows << columns.zip(row).to_h} end if @debug @@ -630,7 +630,7 @@ def clean_record! (record) unless record[:score].nil? record.keys.each {|k| record[k] = "" if record[k].nil? } # clean up nils record.delete :components unless @debug - record.delete_if {|k,v| k.is_a? Fixnum or + record.delete_if {|k,v| k.is_a? Integer or [:geometry, :side, :tlid, :fid, :fid1, :fid2, :street_phone, :city_phone, :fromhn, :tohn, :paflag, :flipped, :street_score, :city_score, :priority, :fips_class, :fips_place, :status].include? k} From c3c27cc27f4a60ec1a7479afd2258b4cc51ee921 Mon Sep 17 00:00:00 2001 From: "Jonathan Beus, MD" Date: Wed, 12 Nov 2025 21:38:04 -0500 Subject: [PATCH 06/31] updates for caching --- Dockerfile | 9 ++++++++- entrypoint.R | 31 ++++--------------------------- 2 files changed, 12 insertions(+), 28 deletions(-) diff --git a/Dockerfile b/Dockerfile index 82cafbd..2b9de28 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,15 @@ +# Stage 1: Download the database (so that caching helps) +FROM alpine:latest AS downloader +RUN apk add --no-cache wget +RUN wget https://geomarker.s3.amazonaws.com/geocoder_2021.db -O /geocoder.db + +# Stage 2: Main image FROM ghcr.io/rocker-org/r-ver:4.4.3 +COPY --from=downloader /geocoder.db /opt/geocoder.db # DeGAUSS container metadata ENV degauss_name="geocoder" -ENV degauss_version="3.4.1" +ENV degauss_version="3.5.0" ENV degauss_description="geocodes" ENV degauss_argument="valid_geocode_score_threshold [default: 0.5]" diff --git a/entrypoint.R b/entrypoint.R index 0075050..f1475e3 100755 --- a/entrypoint.R +++ b/entrypoint.R @@ -109,33 +109,10 @@ if (nrow(d_for_geocoding) > 0) { ## extract results, if a tie then take first returned result d_for_geocoding <- d_for_geocoding %>% dplyr::mutate( - row_index = 1:nrow(d_for_geocoding), - geocodes = purrr::map( - geocodes, - ~ { - # Handle NULL or empty geocode results - if (is.null(.x) || length(.x) == 0) { - return(list(out_template)) - } - - # Map over each element and ensure proper structure - result <- purrr::map(.x, function(item) { - if (is.null(item) || length(item) == 0) { - return(out_template) - } - unlist(item) - }) - - # Convert to tibble with name repair - tryCatch({ - tibble::as_tibble(result, .name_repair = "unique") - }, error = function(e) { - # If conversion fails, return the template - cat(sprintf("[ERROR] Failed to convert geocode result to tibble: %s\n", e$message), file = stdout()) - out_template - }) - } - ) + row_index = 1:nrow(d_for_geocoding), + geocodes = purrr::map(geocodes, ~ .x %>% + purrr::map(unlist) %>% + as_tibble()) ) %>% tidyr::unnest(cols = c(geocodes)) %>% dplyr::group_by(row_index) %>% From ff2bc4ed82b95c1703cdfce443bb1ad985bd688b Mon Sep 17 00:00:00 2001 From: "Jonathan Beus, MD" Date: Wed, 12 Nov 2025 21:39:41 -0500 Subject: [PATCH 07/31] update dockerfile --- Dockerfile | 3 --- 1 file changed, 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 2b9de28..0e6bc9e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -19,9 +19,6 @@ LABEL "org.degauss.version"="${degauss_version}" LABEL "org.degauss.description"="${degauss_description}" LABEL "org.degauss.argument"="${degauss_argument}" -ADD https://geomarker.s3.amazonaws.com/geocoder_2021.db /opt/geocoder.db -# COPY geocoder.db /opt/geocoder.db - RUN apt-get update && apt-get install -y \ libssl-dev \ libssh2-1-dev \ From 469f48eed5635add0e420701946bfe5767e02bd8 Mon Sep 17 00:00:00 2001 From: "Jonathan Beus, MD" Date: Wed, 12 Nov 2025 21:53:04 -0500 Subject: [PATCH 08/31] changes to github workflow --- .github/workflows/build-deploy-release.yaml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-deploy-release.yaml b/.github/workflows/build-deploy-release.yaml index 347b26f..1abd1f9 100644 --- a/.github/workflows/build-deploy-release.yaml +++ b/.github/workflows/build-deploy-release.yaml @@ -7,7 +7,8 @@ jobs: runs-on: ubuntu-latest env: registry: ghcr.io - username: degauss-org + username: ${{ github.repository_owner }} + # username: degauss-org repository: geocoder strategy: fail-fast: false @@ -16,12 +17,12 @@ jobs: uses: actions/checkout@v2 - name: create latest tag variable run: | - container="${{ env.registry }}/${{ env.username}}/${{ env.repository }}:latest" + container="${{ env.registry }}/${{ env.username }}/${{ env.repository }}:latest" echo "container=${container}" >> $GITHUB_ENV - name: create release tag variable if: github.event_name == 'release' run: | - versioned="${{ env.registry }}/${{ env.username}}/${{ env.repository }}:${GITHUB_REF##*/}" + versioned="${{ env.registry }}/${{ env.username }}/${{ env.repository }}:${GITHUB_REF##*/}" echo "versioned=${versioned}" >> $GITHUB_ENV - name: build container run: | From 03e0982ea4cb7751a8d02e491a85178e2e0db4fa Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 13 Nov 2025 03:00:08 +0000 Subject: [PATCH 09/31] Initial plan From 9731ab9cd6d3bc7a0211151f0726e2abb82f8bfa Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 13 Nov 2025 03:02:35 +0000 Subject: [PATCH 10/31] Configure build-deploy-release workflow to trigger on v3.5.0 tag Co-authored-by: beusj <8457943+beusj@users.noreply.github.com> --- .github/workflows/build-deploy-release.yaml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-deploy-release.yaml b/.github/workflows/build-deploy-release.yaml index 1abd1f9..d2a727c 100644 --- a/.github/workflows/build-deploy-release.yaml +++ b/.github/workflows/build-deploy-release.yaml @@ -1,7 +1,8 @@ name: build-deploy-release on: - release: - types: [published] + push: + tags: + - v3.5.0 jobs: deploy-images: runs-on: ubuntu-latest @@ -20,7 +21,7 @@ jobs: container="${{ env.registry }}/${{ env.username }}/${{ env.repository }}:latest" echo "container=${container}" >> $GITHUB_ENV - name: create release tag variable - if: github.event_name == 'release' + if: startsWith(github.ref, 'refs/tags/') run: | versioned="${{ env.registry }}/${{ env.username }}/${{ env.repository }}:${GITHUB_REF##*/}" echo "versioned=${versioned}" >> $GITHUB_ENV From 4fc2e84b7b9ea8808090c79917a9e14d51741ae4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 13 Nov 2025 03:08:39 +0000 Subject: [PATCH 11/31] Initial plan From de9bdd9bd6c12cc809e15b2c545c477853625688 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 13 Nov 2025 03:11:34 +0000 Subject: [PATCH 12/31] Update build-deploy-release.yaml to run on any push with a tag Co-authored-by: beusj <8457943+beusj@users.noreply.github.com> --- .github/workflows/build-deploy-release.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-deploy-release.yaml b/.github/workflows/build-deploy-release.yaml index 1abd1f9..f59bb2a 100644 --- a/.github/workflows/build-deploy-release.yaml +++ b/.github/workflows/build-deploy-release.yaml @@ -2,6 +2,9 @@ name: build-deploy-release on: release: types: [published] + push: + tags: + - '*' jobs: deploy-images: runs-on: ubuntu-latest @@ -20,7 +23,7 @@ jobs: container="${{ env.registry }}/${{ env.username }}/${{ env.repository }}:latest" echo "container=${container}" >> $GITHUB_ENV - name: create release tag variable - if: github.event_name == 'release' + if: github.event_name == 'release' || github.event_name == 'push' run: | versioned="${{ env.registry }}/${{ env.username }}/${{ env.repository }}:${GITHUB_REF##*/}" echo "versioned=${versioned}" >> $GITHUB_ENV From 9b13b615b7e04a51e0af39ed43e4a1761cdcffa7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 13 Nov 2025 03:32:36 +0000 Subject: [PATCH 13/31] Initial plan From 8971646d192fcbb8e555142a8c5eb4c8f5082d5c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 13 Nov 2025 03:36:02 +0000 Subject: [PATCH 14/31] Update GitHub Actions to remove deprecated save-state command Co-authored-by: beusj <8457943+beusj@users.noreply.github.com> --- .github/workflows/build-deploy-pr.yaml | 4 ++-- .github/workflows/build-deploy-release.yaml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-deploy-pr.yaml b/.github/workflows/build-deploy-pr.yaml index adf8ec0..cd945e7 100644 --- a/.github/workflows/build-deploy-pr.yaml +++ b/.github/workflows/build-deploy-pr.yaml @@ -12,7 +12,7 @@ jobs: fail-fast: false steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: create latest tag variable run: | container="${{ env.registry }}/${{ env.username}}/${{ env.repository }}:latest" @@ -31,7 +31,7 @@ jobs: docker run --rm -v "${PWD}/test":/tmp ${{ env.container }} my_address_file.csv 0.6 docker run --rm -v "${PWD}/test":/tmp ${{ env.container }} my_address_file.csv all - name: login to ghcr - uses: docker/login-action@v1 + uses: docker/login-action@v3 with: registry: ${{ env.registry }} username: ${{ env.username }} diff --git a/.github/workflows/build-deploy-release.yaml b/.github/workflows/build-deploy-release.yaml index f59bb2a..b870f1d 100644 --- a/.github/workflows/build-deploy-release.yaml +++ b/.github/workflows/build-deploy-release.yaml @@ -17,7 +17,7 @@ jobs: fail-fast: false steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: create latest tag variable run: | container="${{ env.registry }}/${{ env.username }}/${{ env.repository }}:latest" @@ -36,7 +36,7 @@ jobs: docker run --rm -v "${PWD}/test":/tmp ${{ env.container }} my_address_file.csv 0.6 docker run --rm -v "${PWD}/test":/tmp ${{ env.container }} my_address_file.csv all - name: login to ghcr - uses: docker/login-action@v1 + uses: docker/login-action@v3 with: registry: ${{ env.registry }} username: ${{ env.username }} From d08609e90663502c1aa4fc2c10f6712e7986d2bb Mon Sep 17 00:00:00 2001 From: "Jonathan Beus, MD" Date: Thu, 13 Nov 2025 11:50:50 -0500 Subject: [PATCH 15/31] Modify deployment username in workflow Updated GitHub Actions workflow to use a specific username for deployment. --- .github/workflows/build-deploy-release.yaml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build-deploy-release.yaml b/.github/workflows/build-deploy-release.yaml index b870f1d..84f0f32 100644 --- a/.github/workflows/build-deploy-release.yaml +++ b/.github/workflows/build-deploy-release.yaml @@ -2,16 +2,13 @@ name: build-deploy-release on: release: types: [published] - push: - tags: - - '*' jobs: deploy-images: runs-on: ubuntu-latest env: registry: ghcr.io - username: ${{ github.repository_owner }} - # username: degauss-org + # username: ${{ github.repository_owner }} + username: degauss-org repository: geocoder strategy: fail-fast: false From a96290a3689aa3df81b467a285fef2f593e5b7d8 Mon Sep 17 00:00:00 2001 From: "Jonathan Beus, MD" Date: Tue, 18 Nov 2025 20:01:29 +0000 Subject: [PATCH 16/31] planned .github workflow changes --- .github/workflows/build-deploy-pr.yaml | 2 +- .github/workflows/build-deploy-release.yaml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-deploy-pr.yaml b/.github/workflows/build-deploy-pr.yaml index cd945e7..4d2fa43 100644 --- a/.github/workflows/build-deploy-pr.yaml +++ b/.github/workflows/build-deploy-pr.yaml @@ -39,4 +39,4 @@ jobs: - name: deploy pull request container run: | docker tag ${{ env.container }} ${{ env.versioned }} - docker push ${{ env.versioned }} + docker push ${{ env.versioned }} \ No newline at end of file diff --git a/.github/workflows/build-deploy-release.yaml b/.github/workflows/build-deploy-release.yaml index 84f0f32..1f00499 100644 --- a/.github/workflows/build-deploy-release.yaml +++ b/.github/workflows/build-deploy-release.yaml @@ -20,7 +20,7 @@ jobs: container="${{ env.registry }}/${{ env.username }}/${{ env.repository }}:latest" echo "container=${container}" >> $GITHUB_ENV - name: create release tag variable - if: github.event_name == 'release' || github.event_name == 'push' + if: github.event_name == 'release' run: | versioned="${{ env.registry }}/${{ env.username }}/${{ env.repository }}:${GITHUB_REF##*/}" echo "versioned=${versioned}" >> $GITHUB_ENV @@ -42,4 +42,4 @@ jobs: run: | docker tag ${{ env.container }} ${{ env.versioned }} docker push ${{ env.versioned }} - docker push ${{ env.container }} + docker push ${{ env.container }} \ No newline at end of file From e4c372421f89aa07f3e904eed038f36487152743 Mon Sep 17 00:00:00 2001 From: "Jonathan Beus, MD" Date: Tue, 18 Nov 2025 20:02:03 +0000 Subject: [PATCH 17/31] revert staging of database changes --- Dockerfile | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/Dockerfile b/Dockerfile index 0e6bc9e..45af6a4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,4 @@ -# Stage 1: Download the database (so that caching helps) -FROM alpine:latest AS downloader -RUN apk add --no-cache wget -RUN wget https://geomarker.s3.amazonaws.com/geocoder_2021.db -O /geocoder.db - -# Stage 2: Main image FROM ghcr.io/rocker-org/r-ver:4.4.3 -COPY --from=downloader /geocoder.db /opt/geocoder.db # DeGAUSS container metadata ENV degauss_name="geocoder" @@ -19,6 +12,9 @@ LABEL "org.degauss.version"="${degauss_version}" LABEL "org.degauss.description"="${degauss_description}" LABEL "org.degauss.argument"="${degauss_argument}" +ADD https://geomarker.s3.amazonaws.com/geocoder_2021.db /opt/geocoder.db +# COPY geocoder.db /opt/geocoder.db + RUN apt-get update && apt-get install -y \ libssl-dev \ libssh2-1-dev \ @@ -54,17 +50,10 @@ WORKDIR /app RUN R --quiet -e "install.packages('remotes', repos = c(CRAN = 'https://packagemanager.posit.co/cran/latest'))" RUN R --quiet -e "remotes::install_github('rstudio/renv@v1.1.5')" -# Fix for bit package compilation issue with R 4.5.x -# The bit package needs R_NO_REMAP to be defined before including R headers -RUN mkdir -p /root/.R && \ - echo 'PKG_CFLAGS = -DR_NO_REMAP' > /root/.R/Makevars COPY renv.lock . RUN R --quiet -e "renv::restore(repos = c(CRAN = 'https://packagemanager.posit.co/cran/latest'))" -# Clean up Makevars after installation -RUN rm -f /root/.R/Makevars - COPY geocode.rb . COPY entrypoint.R . From e9de1fccd3fe7f13614ae145a54bc772d8e85778 Mon Sep 17 00:00:00 2001 From: "Jonathan Beus, MD" Date: Tue, 18 Nov 2025 20:02:34 +0000 Subject: [PATCH 18/31] undo logging changes to entrypoint.R --- entrypoint.R | 67 ++++++++++------------------------------------------ 1 file changed, 13 insertions(+), 54 deletions(-) diff --git a/entrypoint.R b/entrypoint.R index f1475e3..bdfb9de 100755 --- a/entrypoint.R +++ b/entrypoint.R @@ -13,12 +13,6 @@ doc <- " opt <- docopt::docopt(doc) if (is.null(opt$score_threshold)) opt$score_threshold <- 0.5 -cat("[INFO] ========================================\n", file = stdout()) -cat(sprintf("[INFO] geocoder entrypoint.R starting\n"), file = stdout()) -cat(sprintf("[INFO] Input file: %s\n", opt$filename), file = stdout()) -cat(sprintf("[INFO] Score threshold: %s\n", opt$score_threshold), file = stdout()) -cat("[INFO] ========================================\n", file = stdout()) - d <- readr::read_csv(opt$filename, show_col_types = FALSE) # d <- readr::read_csv('test/my_address_file.csv') # d <- readr::read_csv('test/my_address_file_missing.csv') @@ -27,7 +21,6 @@ d <- readr::read_csv(opt$filename, show_col_types = FALSE) if (!"address" %in% names(d)) stop("no column called address found in the input file", call. = FALSE) ## clean up addresses / classify 'bad' addresses -cat(sprintf("[INFO] Processing %d total addresses\n", nrow(d)), file = stdout()) d$address <- dht::clean_address(d$address) d$po_box <- dht::address_is_po_box(d$address) d$cincy_inst_foster_addr <- dht::address_is_institutional(d$address) @@ -36,12 +29,9 @@ d$non_address_text <- dht::address_is_nonaddress(d$address) ## exclude 'bad' addresses from geocoding (unless specified to return all geocodes) if (opt$score_threshold == "all") { d_for_geocoding <- d - cat(sprintf("[INFO] Score threshold set to 'all' - will geocode all %d addresses\n", nrow(d_for_geocoding)), file = stdout()) } else { d_excluded_for_address <- dplyr::filter(d, cincy_inst_foster_addr | po_box | non_address_text) d_for_geocoding <- dplyr::filter(d, !cincy_inst_foster_addr & !po_box & !non_address_text) - cat(sprintf("[INFO] Excluded %d addresses (PO boxes, institutional, or non-address text)\n", nrow(d_excluded_for_address)), file = stdout()) - cat(sprintf("[INFO] Will geocode %d addresses with score threshold %.2f\n", nrow(d_for_geocoding), as.numeric(opt$score_threshold)), file = stdout()) } out_template <- tibble( @@ -55,39 +45,19 @@ cli::cli_alert_info("now geocoding ...", wrap = TRUE) geocode <- function(addr_string) { stopifnot(class(addr_string) == "character") - out <- tryCatch({ - system2("ruby", - args = c("/app/geocode.rb", shQuote(addr_string)), - stderr = FALSE, stdout = TRUE - ) - }, error = function(e) { - cat(sprintf("[ERROR] geocode() system2 call failed for address: %s\n", substr(addr_string, 1, 50)), file = stdout()) - cat(sprintf("[ERROR] Error message: %s\n", e$message), file = stdout()) - return(character(0)) - }) - - if (length(out) > 0 && !is.null(out) && out != "") { - tryCatch({ - out <- out %>% - jsonlite::fromJSON() - - # Handle case where fromJSON returns empty or malformed data - if (is.null(out) || length(out) == 0) { - cat(sprintf("[WARN] Empty JSON result for address: %s\n", substr(addr_string, 1, 50)), file = stdout()) - return(out_template) - } - - out <- - bind_rows(out_template, out) %>% - .[2, ] - }, error = function(e) { - cat(sprintf("[ERROR] JSON parsing/processing failed for address: %s\n", substr(addr_string, 1, 50)), file = stdout()) - cat(sprintf("[ERROR] Error message: %s\n", e$message), file = stdout()) - cat(sprintf("[DEBUG] Raw output: %s\n", paste(out, collapse = " | ")), file = stdout()) - return(out_template) - }) + out <- system2("ruby", + args = c("/app/geocode.rb", shQuote(addr_string)), + stderr = FALSE, stdout = TRUE + ) + + if (length(out) > 0) { + out <- out %>% + jsonlite::fromJSON() + + out <- + bind_rows(out_template, out) %>% + .[2, ] } else { - cat(sprintf("[WARN] No output from geocoder for address: %s\n", substr(addr_string, 1, 50)), file = stdout()) out <- out_template } @@ -96,7 +66,6 @@ geocode <- function(addr_string) { # if any geocodes are returned, regardless of score_threshold... if (nrow(d_for_geocoding) > 0) { - cat(sprintf("[INFO] Starting geocoding of %d addresses...\n", nrow(d_for_geocoding)), file = stdout()) d_for_geocoding$geocodes <- mappp::mappp(d_for_geocoding$address, geocode, parallel = TRUE, @@ -104,8 +73,6 @@ if (nrow(d_for_geocoding) > 0) { cache_name = "geocoding_cache" ) - cat("[INFO] Geocoding complete, now processing results...\n", file = stdout()) - ## extract results, if a tie then take first returned result d_for_geocoding <- d_for_geocoding %>% dplyr::mutate( @@ -130,12 +97,9 @@ if (nrow(d_for_geocoding) > 0) { ordered = TRUE )) %>% dplyr::arrange(desc(precision), score) - - cat(sprintf("[INFO] Successfully processed %d geocoded addresses\n", nrow(d_for_geocoding)), file = stdout()) } else if (nrow(d_for_geocoding) == 0 & opt$score_threshold != "all") { # if no geocodes are returned and not returning all geocodes, # then bind non-geocoded with out template - cat("[INFO] No addresses to geocode after filtering\n", file = stdout()) d_excluded_for_address <- bind_rows(d_excluded_for_address, out_template) %>% .[1:nrow(.) - 1, ] @@ -144,10 +108,8 @@ if (nrow(d_for_geocoding) > 0) { ## clean up 'bad' address columns / filter to precise geocodes cli::cli_alert_info("geocoding complete; now filtering to precise geocodes...", wrap = TRUE) if (opt$score_threshold == "all") { - cat("[INFO] Returning all geocodes without filtering\n", file = stdout()) out_file <- d_for_geocoding } else { -cat(sprintf("[INFO] Filtering geocodes with score threshold %.2f\n", as.numeric(opt$score_threshold)), file = stdout()) out_file <- dplyr::bind_rows(d_excluded_for_address, d_for_geocoding) %>% dplyr::mutate( geocode_result = dplyr::case_when( @@ -164,13 +126,11 @@ out_file <- dplyr::bind_rows(d_excluded_for_address, d_for_geocoding) %>% } ## write out file -cat(sprintf("[INFO] Writing output file with %d rows\n", nrow(out_file)), file = stdout()) dht::write_geomarker_file( out_file, filename = opt$filename, argument = glue::glue("score_threshold_{opt$score_threshold}") ) -cat("[INFO] Output file written successfully\n", file = stdout()) ## summarize geocoding results and ## print geocoding results summary to console @@ -197,5 +157,4 @@ if (opt$score_threshold != "all") { wrap = TRUE ) knitr::kable(geocode_summary %>% dplyr::select(geocode_result, `n (%)`)) -} - +} \ No newline at end of file From 6d78d6d6fb550a1f7cc067ab225d17c06024cee8 Mon Sep 17 00:00:00 2001 From: "Jonathan Beus, MD" Date: Tue, 18 Nov 2025 20:08:16 +0000 Subject: [PATCH 19/31] add additional information about ruby geocoder --- lib/geocoder/README.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 lib/geocoder/README.md diff --git a/lib/geocoder/README.md b/lib/geocoder/README.md new file mode 100644 index 0000000..aab1bd1 --- /dev/null +++ b/lib/geocoder/README.md @@ -0,0 +1,5 @@ +# Ruby Geocoder + +See this reposotiory for more information. + +[https://github.com/geocommons/geocoder](https://github.com/geocommons/geocoder) \ No newline at end of file From 5fb898d2adb7b2724940cb87e91b685cf0d3345d Mon Sep 17 00:00:00 2001 From: "Jonathan Beus, MD" Date: Tue, 18 Nov 2025 15:35:56 -0500 Subject: [PATCH 20/31] Build in user repo --- .github/workflows/build-deploy-release.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-deploy-release.yaml b/.github/workflows/build-deploy-release.yaml index 1f00499..6c82278 100644 --- a/.github/workflows/build-deploy-release.yaml +++ b/.github/workflows/build-deploy-release.yaml @@ -7,8 +7,8 @@ jobs: runs-on: ubuntu-latest env: registry: ghcr.io - # username: ${{ github.repository_owner }} - username: degauss-org + username: ${{ github.repository_owner }} + # username: degauss-org repository: geocoder strategy: fail-fast: false From 6b21a0b400a8c7cef78539313e16130f752e6b3c Mon Sep 17 00:00:00 2001 From: "Jonathan Beus, MD" Date: Tue, 18 Nov 2025 18:42:04 -0500 Subject: [PATCH 21/31] Add repository_dispatch event to workflow --- .github/workflows/build-deploy-release.yaml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-deploy-release.yaml b/.github/workflows/build-deploy-release.yaml index 6c82278..8fd2e08 100644 --- a/.github/workflows/build-deploy-release.yaml +++ b/.github/workflows/build-deploy-release.yaml @@ -2,13 +2,14 @@ name: build-deploy-release on: release: types: [published] + repository_dispatch: + types: [release-build, force-rebuild] jobs: deploy-images: runs-on: ubuntu-latest env: registry: ghcr.io - username: ${{ github.repository_owner }} - # username: degauss-org + username: ${{ github.event.organization.login || github.repository_owner }} repository: geocoder strategy: fail-fast: false @@ -42,4 +43,4 @@ jobs: run: | docker tag ${{ env.container }} ${{ env.versioned }} docker push ${{ env.versioned }} - docker push ${{ env.container }} \ No newline at end of file + docker push ${{ env.container }} From 4fdc6008c087b5e833f3b32e6d04c6fdc9c359c9 Mon Sep 17 00:00:00 2001 From: "Jonathan Beus, MD" Date: Tue, 18 Nov 2025 18:43:21 -0500 Subject: [PATCH 22/31] Update GitHub Actions workflow for dynamic username --- .github/workflows/build-deploy-pr.yaml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-deploy-pr.yaml b/.github/workflows/build-deploy-pr.yaml index 4d2fa43..61defab 100644 --- a/.github/workflows/build-deploy-pr.yaml +++ b/.github/workflows/build-deploy-pr.yaml @@ -1,12 +1,14 @@ name: build-deploy-pr on: pull_request: + repository_dispath: + types: [release-build, force-rebuild] jobs: deploy-images: runs-on: ubuntu-latest env: registry: ghcr.io - username: degauss-org + username: ${{ github.event.organization.login || github.repository_owner }} repository: geocoder strategy: fail-fast: false @@ -39,4 +41,4 @@ jobs: - name: deploy pull request container run: | docker tag ${{ env.container }} ${{ env.versioned }} - docker push ${{ env.versioned }} \ No newline at end of file + docker push ${{ env.versioned }} From c5e75d9f8338a619444043778424f5eed95857c4 Mon Sep 17 00:00:00 2001 From: "Jonathan Beus, MD" Date: Tue, 18 Nov 2025 18:44:26 -0500 Subject: [PATCH 23/31] Fix typo in event trigger for PR workflow --- .github/workflows/build-deploy-pr.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-deploy-pr.yaml b/.github/workflows/build-deploy-pr.yaml index 61defab..940ca07 100644 --- a/.github/workflows/build-deploy-pr.yaml +++ b/.github/workflows/build-deploy-pr.yaml @@ -1,7 +1,7 @@ name: build-deploy-pr on: pull_request: - repository_dispath: + repository_dispatch: types: [release-build, force-rebuild] jobs: deploy-images: From 1fb178bc5e90840793b5eddafbe5d5a7fcce7f56 Mon Sep 17 00:00:00 2001 From: "Jonathan Beus, MD" Date: Tue, 18 Nov 2025 18:52:57 -0500 Subject: [PATCH 24/31] Update manual build workflow for Docker images --- .github/workflows/manual_build.yml | 46 ++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 .github/workflows/manual_build.yml diff --git a/.github/workflows/manual_build.yml b/.github/workflows/manual_build.yml new file mode 100644 index 0000000..2f0669f --- /dev/null +++ b/.github/workflows/manual_build.yml @@ -0,0 +1,46 @@ +name: Manually Rebuild Docker + +on: + workflow_dispatch: + types: ['manual-rebuild'] + +jobs: + deploy-images: + runs-on: ubuntu-latest + env: + registry: ghcr.io + username: ${{ github.event.organization.login || github.repository_owner }} + repository: geocoder + strategy: + fail-fast: false + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: create latest tag variable + run: | + container="${{ env.registry }}/${{ env.username }}/${{ env.repository }}:latest" + echo "container=${container}" >> $GITHUB_ENV + - name: create release tag variable + if: github.event_name == 'release' + run: | + versioned="${{ env.registry }}/${{ env.username }}/${{ env.repository }}:${GITHUB_REF##*/}" + echo "versioned=${versioned}" >> $GITHUB_ENV + - name: build container + run: | + docker build -t ${{ env.container }} . + - name: test container + run: | + docker run --rm -v "${PWD}/test":/tmp ${{ env.container }} my_address_file.csv + docker run --rm -v "${PWD}/test":/tmp ${{ env.container }} my_address_file.csv 0.6 + docker run --rm -v "${PWD}/test":/tmp ${{ env.container }} my_address_file.csv all + - name: login to ghcr + uses: docker/login-action@v3 + with: + registry: ${{ env.registry }} + username: ${{ env.username }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: deploy release (and latest) container + run: | + docker tag ${{ env.container }} ${{ env.versioned }} + docker push ${{ env.versioned }} + docker push ${{ env.container }} From 64a1b4a7fe0a0c321d00f14908aed662d98cdce8 Mon Sep 17 00:00:00 2001 From: "Jonathan Beus, MD" Date: Tue, 18 Nov 2025 19:09:17 -0500 Subject: [PATCH 25/31] Rename manual_build.yml to build-manual.yml --- .github/workflows/build-manual.yml | 70 ++++++++++++++++++++++++++++++ .github/workflows/manual_build.yml | 46 -------------------- 2 files changed, 70 insertions(+), 46 deletions(-) create mode 100644 .github/workflows/build-manual.yml delete mode 100644 .github/workflows/manual_build.yml diff --git a/.github/workflows/build-manual.yml b/.github/workflows/build-manual.yml new file mode 100644 index 0000000..42a5786 --- /dev/null +++ b/.github/workflows/build-manual.yml @@ -0,0 +1,70 @@ +name: Manually Rebuild Docker + +on: + workflow_dispatch: + inputs: + tag: + description: "Optional image tag to push (e.g., v1.2.3). If empty, use repo tag at HEAD or short SHA." + required: false + default: "" + +jobs: + deploy-images: + runs-on: ubuntu-latest + env: + REGISTRY: ghcr.io + USERNAME: ${{ github.event.organization.login || github.repository_owner }} + REPOSITORY: geocoder + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 # needed to read tags + + - name: Determine image tags + shell: bash + run: | + set -euo pipefail + IMAGE="${REGISTRY}/${USERNAME}/${REPOSITORY}" + + INPUT_TAG="${{ github.event.inputs.tag }}" + if [ -n "$INPUT_TAG" ]; then + TAG="$INPUT_TAG" + else + # Use exact tag at HEAD if present; otherwise short SHA + TAG="$(git describe --tags --exact-match 2>/dev/null || true)" + if [ -z "$TAG" ]; then + TAG="$(git rev-parse --short HEAD)" + fi + fi + + echo "image=${IMAGE}" >> "$GITHUB_ENV" + echo "tag=${TAG}" >> "$GITHUB_ENV" + echo "versioned=${IMAGE}:${TAG}" >> "$GITHUB_ENV" + echo "latest=${IMAGE}:latest" >> "$GITHUB_ENV" + + echo "Will publish tags:" + echo " - ${IMAGE}:${TAG}" + echo " - ${IMAGE}:latest" + + - name: Build image + run: | + docker build -t "${{ env.versioned }}" -t "${{ env.latest }}" . + + - name: Test image + run: | + docker run --rm -v "${PWD}/test":/tmp "${{ env.versioned }}" my_address_file.csv + docker run --rm -v "${PWD}/test":/tmp "${{ env.versioned }}" my_address_file.csv 0.6 + docker run --rm -v "${PWD}/test":/tmp "${{ env.versioned }}" my_address_file.csv all + + - name: Login to GHCR + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ env.USERNAME }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Push images + run: | + docker push "${{ env.versioned }}" + docker push "${{ env.latest }}" diff --git a/.github/workflows/manual_build.yml b/.github/workflows/manual_build.yml deleted file mode 100644 index 2f0669f..0000000 --- a/.github/workflows/manual_build.yml +++ /dev/null @@ -1,46 +0,0 @@ -name: Manually Rebuild Docker - -on: - workflow_dispatch: - types: ['manual-rebuild'] - -jobs: - deploy-images: - runs-on: ubuntu-latest - env: - registry: ghcr.io - username: ${{ github.event.organization.login || github.repository_owner }} - repository: geocoder - strategy: - fail-fast: false - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: create latest tag variable - run: | - container="${{ env.registry }}/${{ env.username }}/${{ env.repository }}:latest" - echo "container=${container}" >> $GITHUB_ENV - - name: create release tag variable - if: github.event_name == 'release' - run: | - versioned="${{ env.registry }}/${{ env.username }}/${{ env.repository }}:${GITHUB_REF##*/}" - echo "versioned=${versioned}" >> $GITHUB_ENV - - name: build container - run: | - docker build -t ${{ env.container }} . - - name: test container - run: | - docker run --rm -v "${PWD}/test":/tmp ${{ env.container }} my_address_file.csv - docker run --rm -v "${PWD}/test":/tmp ${{ env.container }} my_address_file.csv 0.6 - docker run --rm -v "${PWD}/test":/tmp ${{ env.container }} my_address_file.csv all - - name: login to ghcr - uses: docker/login-action@v3 - with: - registry: ${{ env.registry }} - username: ${{ env.username }} - password: ${{ secrets.GITHUB_TOKEN }} - - name: deploy release (and latest) container - run: | - docker tag ${{ env.container }} ${{ env.versioned }} - docker push ${{ env.versioned }} - docker push ${{ env.container }} From 984bf62984b3cd87e31b5e15a82e28e0dc53058f Mon Sep 17 00:00:00 2001 From: Miles Raymond Date: Tue, 16 Dec 2025 11:46:39 -0800 Subject: [PATCH 26/31] Refactor Dockerfile for optimized build and dependencies Refactor Dockerfile to improve build process and dependencies. --- Dockerfile | 94 +++++++++++++++++++++++++++++------------------------- 1 file changed, 50 insertions(+), 44 deletions(-) diff --git a/Dockerfile b/Dockerfile index 45af6a4..34ddc62 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,62 +1,68 @@ -FROM ghcr.io/rocker-org/r-ver:4.4.3 +# https://stackoverflow.com/questions/34751814/build-postgres-docker-container-with-initial-schema +# PART 1 +# compile the gem for the build +FROM rocker/r-ver AS compiler -# DeGAUSS container metadata -ENV degauss_name="geocoder" -ENV degauss_version="3.5.0" -ENV degauss_description="geocodes" -ENV degauss_argument="valid_geocode_score_threshold [default: 0.5]" - -# add OCI labels based on environment variables too -LABEL "org.degauss.name"="${degauss_name}" -LABEL "org.degauss.version"="${degauss_version}" -LABEL "org.degauss.description"="${degauss_description}" -LABEL "org.degauss.argument"="${degauss_argument}" - -ADD https://geomarker.s3.amazonaws.com/geocoder_2021.db /opt/geocoder.db -# COPY geocoder.db /opt/geocoder.db +# copy statics +RUN mkdir /app +WORKDIR /app +COPY Makefile.ruby . +COPY /src ./src +COPY /lib ./lib +COPY /gemspec ./gemspec +# install dependencies RUN apt-get update && apt-get install -y \ - libssl-dev \ - libssh2-1-dev \ + bison \ + flex \ + gnupg \ libcurl4-openssl-dev \ + libsqlite3-dev \ + libssh2-1-dev \ + libssl-dev \ libxml2-dev \ make \ - sqlite3 \ - libsqlite3-dev \ - flex \ + pkg-config \ ruby-full \ - bison \ - gnupg \ - software-properties-common \ - pkg-config\ - && apt-get clean - + sqlite3 \ + software-properties-common RUN gem install sqlite3 json Text +RUN apt-get dist-upgrade -yq -RUN mkdir /app -WORKDIR /app - -COPY Makefile.ruby . -COPY /src ./src -COPY /lib ./lib -COPY /gemspec ./gemspec +# build gem +RUN make -f Makefile.ruby install -RUN make -f Makefile.ruby install \ - && gem install Geocoder-US-2.0.4.gem -WORKDIR /app - -# install required version of renv -RUN R --quiet -e "install.packages('remotes', repos = c(CRAN = 'https://packagemanager.posit.co/cran/latest'))" -RUN R --quiet -e "remotes::install_github('rstudio/renv@v1.1.5')" +# PART 2 +# only use ruby gem from compile layer +FROM rhub/r-minimal +# DeGAUSS container metadata +ENV degauss_name="geocoder" +ENV degauss_version="3.4.0" +ENV degauss_description="geocodes" +ENV degauss_argument="valid_geocode_score_threshold [default: 0.5]" -COPY renv.lock . -RUN R --quiet -e "renv::restore(repos = c(CRAN = 'https://packagemanager.posit.co/cran/latest'))" +# add OCI labels based on environment variables too +LABEL "org.degauss.name"="${degauss_name}" +LABEL "org.degauss.version"="${degauss_version}" +LABEL "org.degauss.description"="${degauss_description}" +LABEL "org.degauss.argument"="${degauss_argument}" -COPY geocode.rb . +# copy statics +RUN mkdir /app +WORKDIR /app +COPY --from=compiler /app/Geocoder-US-*.gem Geocoder-US.gem +ADD https://colebrokamp-dropbox.s3.amazonaws.com/geocoder.db /opt/geocoder.db COPY entrypoint.R . +COPY geocode.rb . -WORKDIR /tmp +# install entrypoint.R dependencies +RUN apk add ruby +RUN gem install Geocoder-US.gem +RUN R --quiet -e "install.packages(c('digest','knitr','mappp','remotes'), repos=c(CRAN='https://packagemanager.posit.co/cran/latest'))" +RUN R --quiet -e "remotes::install_github('degauss-org/dht')" +RUN apk upgrade --no-cache +WORKDIR /tmp ENTRYPOINT ["/app/entrypoint.R"] From b22a2a68d6d9a98aea76365aee1117b9d3239817 Mon Sep 17 00:00:00 2001 From: Miles Raymond Date: Tue, 16 Dec 2025 12:59:40 -0800 Subject: [PATCH 27/31] Modify R package installation in Dockerfile Updated R package installation to include additional dependencies. --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 34ddc62..b05ba3e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -60,7 +60,7 @@ COPY geocode.rb . # install entrypoint.R dependencies RUN apk add ruby RUN gem install Geocoder-US.gem -RUN R --quiet -e "install.packages(c('digest','knitr','mappp','remotes'), repos=c(CRAN='https://packagemanager.posit.co/cran/latest'))" +RUN R --quiet -e "install.packages(c('cli','digest','dplyr','fs','glue','knitr','magrittr','mappp','ps','purrr','readr','remotes','stringr','tidyr','tidyselect'), repos=c(CRAN='https://packagemanager.posit.co/cran/latest'))" RUN R --quiet -e "remotes::install_github('degauss-org/dht')" RUN apk upgrade --no-cache From 2cf5a95fb8f8cbc4add51772d3b99c5db48ff918 Mon Sep 17 00:00:00 2001 From: "Jonathan Beus, MD" Date: Wed, 24 Dec 2025 10:18:59 -0500 Subject: [PATCH 28/31] Revert "Modify R package installation in Dockerfile" This reverts commit b22a2a68d6d9a98aea76365aee1117b9d3239817. --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index b05ba3e..34ddc62 100644 --- a/Dockerfile +++ b/Dockerfile @@ -60,7 +60,7 @@ COPY geocode.rb . # install entrypoint.R dependencies RUN apk add ruby RUN gem install Geocoder-US.gem -RUN R --quiet -e "install.packages(c('cli','digest','dplyr','fs','glue','knitr','magrittr','mappp','ps','purrr','readr','remotes','stringr','tidyr','tidyselect'), repos=c(CRAN='https://packagemanager.posit.co/cran/latest'))" +RUN R --quiet -e "install.packages(c('digest','knitr','mappp','remotes'), repos=c(CRAN='https://packagemanager.posit.co/cran/latest'))" RUN R --quiet -e "remotes::install_github('degauss-org/dht')" RUN apk upgrade --no-cache From 4b007bb443f021e43036a552a70c592c8383e108 Mon Sep 17 00:00:00 2001 From: "Jonathan Beus, MD" Date: Wed, 24 Dec 2025 10:19:06 -0500 Subject: [PATCH 29/31] Revert "Refactor Dockerfile for optimized build and dependencies" This reverts commit 984bf62984b3cd87e31b5e15a82e28e0dc53058f. --- Dockerfile | 94 +++++++++++++++++++++++++----------------------------- 1 file changed, 44 insertions(+), 50 deletions(-) diff --git a/Dockerfile b/Dockerfile index 34ddc62..45af6a4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,45 +1,8 @@ -# https://stackoverflow.com/questions/34751814/build-postgres-docker-container-with-initial-schema -# PART 1 -# compile the gem for the build -FROM rocker/r-ver AS compiler - -# copy statics -RUN mkdir /app -WORKDIR /app -COPY Makefile.ruby . -COPY /src ./src -COPY /lib ./lib -COPY /gemspec ./gemspec - -# install dependencies -RUN apt-get update && apt-get install -y \ - bison \ - flex \ - gnupg \ - libcurl4-openssl-dev \ - libsqlite3-dev \ - libssh2-1-dev \ - libssl-dev \ - libxml2-dev \ - make \ - pkg-config \ - ruby-full \ - sqlite3 \ - software-properties-common -RUN gem install sqlite3 json Text -RUN apt-get dist-upgrade -yq - -# build gem -RUN make -f Makefile.ruby install - - -# PART 2 -# only use ruby gem from compile layer -FROM rhub/r-minimal +FROM ghcr.io/rocker-org/r-ver:4.4.3 # DeGAUSS container metadata ENV degauss_name="geocoder" -ENV degauss_version="3.4.0" +ENV degauss_version="3.5.0" ENV degauss_description="geocodes" ENV degauss_argument="valid_geocode_score_threshold [default: 0.5]" @@ -49,20 +12,51 @@ LABEL "org.degauss.version"="${degauss_version}" LABEL "org.degauss.description"="${degauss_description}" LABEL "org.degauss.argument"="${degauss_argument}" -# copy statics +ADD https://geomarker.s3.amazonaws.com/geocoder_2021.db /opt/geocoder.db +# COPY geocoder.db /opt/geocoder.db + +RUN apt-get update && apt-get install -y \ + libssl-dev \ + libssh2-1-dev \ + libcurl4-openssl-dev \ + libxml2-dev \ + make \ + sqlite3 \ + libsqlite3-dev \ + flex \ + ruby-full \ + bison \ + gnupg \ + software-properties-common \ + pkg-config\ + && apt-get clean + +RUN gem install sqlite3 json Text + RUN mkdir /app WORKDIR /app -COPY --from=compiler /app/Geocoder-US-*.gem Geocoder-US.gem -ADD https://colebrokamp-dropbox.s3.amazonaws.com/geocoder.db /opt/geocoder.db -COPY entrypoint.R . -COPY geocode.rb . -# install entrypoint.R dependencies -RUN apk add ruby -RUN gem install Geocoder-US.gem -RUN R --quiet -e "install.packages(c('digest','knitr','mappp','remotes'), repos=c(CRAN='https://packagemanager.posit.co/cran/latest'))" -RUN R --quiet -e "remotes::install_github('degauss-org/dht')" -RUN apk upgrade --no-cache +COPY Makefile.ruby . +COPY /src ./src +COPY /lib ./lib +COPY /gemspec ./gemspec + +RUN make -f Makefile.ruby install \ + && gem install Geocoder-US-2.0.4.gem + +WORKDIR /app + +# install required version of renv +RUN R --quiet -e "install.packages('remotes', repos = c(CRAN = 'https://packagemanager.posit.co/cran/latest'))" +RUN R --quiet -e "remotes::install_github('rstudio/renv@v1.1.5')" + + +COPY renv.lock . +RUN R --quiet -e "renv::restore(repos = c(CRAN = 'https://packagemanager.posit.co/cran/latest'))" + +COPY geocode.rb . +COPY entrypoint.R . WORKDIR /tmp + ENTRYPOINT ["/app/entrypoint.R"] From 79ac3062c5cb35d10d11e168bc55041400337859 Mon Sep 17 00:00:00 2001 From: Jonathan Beus MD Date: Tue, 30 Dec 2025 18:21:05 -0500 Subject: [PATCH 30/31] use env variable for geocoder db location --- .github/workflows/build-deploy-release.yaml | 4 +++- Dockerfile | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-deploy-release.yaml b/.github/workflows/build-deploy-release.yaml index 8fd2e08..dd02226 100644 --- a/.github/workflows/build-deploy-release.yaml +++ b/.github/workflows/build-deploy-release.yaml @@ -6,11 +6,13 @@ on: types: [release-build, force-rebuild] jobs: deploy-images: + environment: geocoder_release_build runs-on: ubuntu-latest env: registry: ghcr.io username: ${{ github.event.organization.login || github.repository_owner }} repository: geocoder + GEOCODER_S3_LOCATION: ${{ vars.GEOCODER_S3_LOCATION }} strategy: fail-fast: false steps: @@ -27,7 +29,7 @@ jobs: echo "versioned=${versioned}" >> $GITHUB_ENV - name: build container run: | - docker build -t ${{ env.container }} . + docker build --build-arg GEOCODER_S3_LOCATION="${GEOCODER_S3_LOCATION}" -t ${{ env.container }} . - name: test container run: | docker run --rm -v "${PWD}/test":/tmp ${{ env.container }} my_address_file.csv diff --git a/Dockerfile b/Dockerfile index 45af6a4..6ed34a2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,7 +12,11 @@ LABEL "org.degauss.version"="${degauss_version}" LABEL "org.degauss.description"="${degauss_description}" LABEL "org.degauss.argument"="${degauss_argument}" -ADD https://geomarker.s3.amazonaws.com/geocoder_2021.db /opt/geocoder.db + +# Allow S3 location to be set via build arg and env +ARG GEOCODER_S3_LOCATION +ENV GEOCODER_S3_LOCATION=${GEOCODER_S3_LOCATION} +ADD ${GEOCODER_S3_LOCATION} /opt/geocoder.db # COPY geocoder.db /opt/geocoder.db RUN apt-get update && apt-get install -y \ From 3828272bcfe4cad6ec5c32247b6d9093c6ccca7b Mon Sep 17 00:00:00 2001 From: "Jonathan Beus, MD" Date: Tue, 30 Dec 2025 18:53:59 -0500 Subject: [PATCH 31/31] Revert "use env variable for geocoder db location" This reverts commit 79ac3062c5cb35d10d11e168bc55041400337859. --- .github/workflows/build-deploy-release.yaml | 4 +--- Dockerfile | 6 +----- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build-deploy-release.yaml b/.github/workflows/build-deploy-release.yaml index dd02226..8fd2e08 100644 --- a/.github/workflows/build-deploy-release.yaml +++ b/.github/workflows/build-deploy-release.yaml @@ -6,13 +6,11 @@ on: types: [release-build, force-rebuild] jobs: deploy-images: - environment: geocoder_release_build runs-on: ubuntu-latest env: registry: ghcr.io username: ${{ github.event.organization.login || github.repository_owner }} repository: geocoder - GEOCODER_S3_LOCATION: ${{ vars.GEOCODER_S3_LOCATION }} strategy: fail-fast: false steps: @@ -29,7 +27,7 @@ jobs: echo "versioned=${versioned}" >> $GITHUB_ENV - name: build container run: | - docker build --build-arg GEOCODER_S3_LOCATION="${GEOCODER_S3_LOCATION}" -t ${{ env.container }} . + docker build -t ${{ env.container }} . - name: test container run: | docker run --rm -v "${PWD}/test":/tmp ${{ env.container }} my_address_file.csv diff --git a/Dockerfile b/Dockerfile index 6ed34a2..45af6a4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,11 +12,7 @@ LABEL "org.degauss.version"="${degauss_version}" LABEL "org.degauss.description"="${degauss_description}" LABEL "org.degauss.argument"="${degauss_argument}" - -# Allow S3 location to be set via build arg and env -ARG GEOCODER_S3_LOCATION -ENV GEOCODER_S3_LOCATION=${GEOCODER_S3_LOCATION} -ADD ${GEOCODER_S3_LOCATION} /opt/geocoder.db +ADD https://geomarker.s3.amazonaws.com/geocoder_2021.db /opt/geocoder.db # COPY geocoder.db /opt/geocoder.db RUN apt-get update && apt-get install -y \