diff --git a/.github/workflows/R_CMD_check_Hades.yaml b/.github/workflows/R_CMD_check_Hades.yaml
index db1df5be..8d5a924c 100644
--- a/.github/workflows/R_CMD_check_Hades.yaml
+++ b/.github/workflows/R_CMD_check_Hades.yaml
@@ -21,10 +21,10 @@ jobs:
matrix:
config:
- {os: windows-latest, r: '4.2.3', rtools: '42', rspm: "https://cloud.r-project.org"}
- - {os: macOS-latest, r: '4.2.3', rtools: '42', rspm: "https://cloud.r-project.org"}
+ #- {os: macOS-latest, r: '4.2.3', rtools: '42', rspm: "https://cloud.r-project.org"}
- {os: ubuntu-20.04, r: '4.2.3', rtools: '42', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"}
- {os: windows-latest, r: 'release', rtools: '', rspm: "https://cloud.r-project.org"}
- #- {os: macOS-latest, r: 'release', rtools: '', rspm: "https://cloud.r-project.org"}
+ - {os: macOS-latest, r: 'release', rtools: '', rspm: "https://cloud.r-project.org"}
- {os: ubuntu-20.04, r: 'release', rtools: '', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"}
env:
diff --git a/DESCRIPTION b/DESCRIPTION
index e0fc6cf3..101a5847 100644
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -1,8 +1,8 @@
Package: Strategus
Type: Package
Title: Coordinating and Executing Analytics Using HADES Modules
-Version: 0.1.0
-Date: 2023-10-04
+Version: 0.2.0
+Date: 2023-01-26
Authors@R: c(
person("Martijn", "Schuemie", email = "schuemie@ohdsi.org", role = c("aut")),
person("Anthony", "Sena", email = "sena@ohdsi.org", role = c("aut", "cre")),
@@ -32,7 +32,8 @@ Imports:
methods,
tibble,
ResultModelManager (>= 0.3.0),
- SqlRender (>= 1.11.0)
+ SqlRender (>= 1.11.0),
+ semver
Suggests:
testthat (>= 3.0.0),
fs,
@@ -46,7 +47,7 @@ Remotes:
ohdsi/Eunomia
VignetteBuilder: knitr
NeedsCompilation: no
-RoxygenNote: 7.2.3
+RoxygenNote: 7.3.1
Roxygen: list(markdown = TRUE)
Encoding: UTF-8
Config/testthat/edition: 3
diff --git a/NAMESPACE b/NAMESPACE
index 2671ea51..dd45e9e0 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -2,6 +2,7 @@
export(addModuleSpecifications)
export(addSharedResources)
+export(compareLockFiles)
export(createCdmExecutionSettings)
export(createEmptyAnalysisSpecificiations)
export(createResultDataModels)
@@ -11,7 +12,10 @@ export(execute)
export(getModuleList)
export(retrieveConnectionDetails)
export(storeConnectionDetails)
+export(syncLockFile)
export(unlockKeyring)
+export(validateLockFile)
+export(verifyModuleInstallation)
import(CohortGenerator)
import(DatabaseConnector)
import(dplyr)
diff --git a/NEWS.md b/NEWS.md
index 1fd7ea44..4d70ca49 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -1,3 +1,14 @@
+Strategus 0.2.0
+===============
+- Add functions for developers to help with renv.lock file validation (#69)
+- Use renv project profiles for modules (#94)
+- Convert relative paths to absolute path before passing to a module (#99)
+- Address missing package dependencies in modules (#99)
+- Throw informative error message when connection detail reference not set in keyring (#100)
+- Validate execution settings (#101)
+- Pass temp emulation schema properly (#76)
+- Remove local library package dependencies (#96)
+
Strategus 0.1.0
===============
diff --git a/R/DatabaseMetaData.R b/R/DatabaseMetaData.R
index 121ca849..b4105ade 100644
--- a/R/DatabaseMetaData.R
+++ b/R/DatabaseMetaData.R
@@ -1,4 +1,4 @@
-# Copyright 2023 Observational Health Data Sciences and Informatics
+# Copyright 2024 Observational Health Data Sciences and Informatics
#
# This file is part of Strategus
#
diff --git a/R/Execution.R b/R/Execution.R
index c4e29680..2b073f3a 100644
--- a/R/Execution.R
+++ b/R/Execution.R
@@ -1,4 +1,4 @@
-# Copyright 2023 Observational Health Data Sciences and Informatics
+# Copyright 2024 Observational Health Data Sciences and Informatics
#
# This file is part of Strategus
#
@@ -48,9 +48,10 @@ execute <- function(analysisSpecifications,
checkmate::assertChoice(x = keyringName, choices = keyringList$keyring, null.ok = TRUE, add = errorMessages)
checkmate::reportAssertions(collection = errorMessages)
- # Assert that the temp emulation schema is set if required for the dbms
- # specified by the executionSettings
+ # Validate the execution settings
if (is(executionSettings, "CdmExecutionSettings")) {
+ # Assert that the temp emulation schema is set if required for the dbms
+ # specified by the executionSettings
connectionDetails <- retrieveConnectionDetails(
connectionDetailsReference = executionSettings$connectionDetailsReference,
keyringName = keyringName
@@ -59,8 +60,48 @@ execute <- function(analysisSpecifications,
dbms = connectionDetails$dbms,
tempEmulationSchema = executionSettings$tempEmulationSchema
)
+
+ # Validate that the table names specified in the execution settings
+ # do not violate the maximum table length. To do this we will render
+ # a query using the execution settings so that SqlRender can provide
+ # the appropriate warning. Only stop execution if we are running on
+ # Oracle; otherwise it is unclear if the table name length will have
+ # an impact
+ cohortTableChecks <- lapply(
+ X = executionSettings$cohortTableNames,
+ FUN = function(tableName) {
+ sql <- SqlRender::render(
+ sql = "CREATE TABLE @table;",
+ table = tableName
+ )
+ tryCatch(
+ {
+ SqlRender::translate(
+ sql = sql,
+ targetDialect = connectionDetails$dbms
+ )
+ return(TRUE)
+ },
+ warning = function(w) {
+ warning(w)
+ return(FALSE)
+ }
+ )
+ }
+ )
+
+ # Since the warning is thrown for all dbms systems, only stop if
+ # we are executing on Oracle
+ if (tolower(connectionDetails$dbms) == "oracle" && !all(unlist(cohortTableChecks))) {
+ stop("Your cohort table names are too long for Oracle. Please update your executionSettings to use shorter cohort table names and try again.")
+ }
}
+
+ # Validate the modules
modules <- ensureAllModulesInstantiated(analysisSpecifications)
+ if (isFALSE(modules$allModulesInstalled)) {
+ stop("Stopping execution due to module issues")
+ }
if (is.null(executionScriptFolder)) {
executionScriptFolder <- tempfile("strategusTempSettings")
@@ -72,6 +113,8 @@ execute <- function(analysisSpecifications,
}
dir.create(executionScriptFolder, recursive = TRUE)
}
+ # Normalize path to convert from relative to absolute path
+ executionScriptFolder <- normalizePath(executionScriptFolder, mustWork = F)
if (is(executionSettings, "CdmExecutionSettings")) {
executionSettings$databaseId <- createDatabaseMetaData(
@@ -79,7 +122,7 @@ execute <- function(analysisSpecifications,
keyringName = keyringName
)
}
- dependencies <- extractDependencies(modules)
+ dependencies <- extractDependencies(modules$modules)
fileName <- generateTargetsScript(
@@ -154,11 +197,11 @@ generateTargetsScript <- function(analysisSpecifications, executionSettings, dep
)
# Store settings objects in the temp folder so they are available in targets
- analysisSpecificationsFileName <- gsub("\\\\", "/", file.path(executionScriptFolder, "analysisSpecifications.rds"))
+ analysisSpecificationsFileName <- .formatAndNormalizeFilePathForScript(file.path(executionScriptFolder, "analysisSpecifications.rds"))
saveRDS(analysisSpecifications, analysisSpecificationsFileName)
- executionSettingsFileName <- gsub("\\\\", "/", file.path(executionScriptFolder, "executionSettings.rds"))
+ executionSettingsFileName <- .formatAndNormalizeFilePathForScript(file.path(executionScriptFolder, "executionSettings.rds"))
saveRDS(executionSettings, executionSettingsFileName)
- keyringSettingsFileName <- gsub("\\\\", "/", file.path(executionScriptFolder, "keyringSettings.rds"))
+ keyringSettingsFileName <- .formatAndNormalizeFilePathForScript(file.path(executionScriptFolder, "keyringSettings.rds"))
saveRDS(list(keyringName = keyringName), keyringSettingsFileName)
# Generate target names by module type
@@ -172,10 +215,10 @@ generateTargetsScript <- function(analysisSpecifications, executionSettings, dep
)
}
moduleToTargetNames <- bind_rows(moduleToTargetNames)
- moduleToTargetNamesFileName <- gsub("\\\\", "/", file.path(executionScriptFolder, "moduleTargetNames.rds"))
+ moduleToTargetNamesFileName <- .formatAndNormalizeFilePathForScript(file.path(executionScriptFolder, "moduleTargetNames.rds"))
saveRDS(moduleToTargetNames, moduleToTargetNamesFileName)
- dependenciesFileName <- gsub("\\\\", "/", file.path(executionScriptFolder, "dependencies.rds"))
+ dependenciesFileName <- .formatAndNormalizeFilePathForScript(file.path(executionScriptFolder, "dependencies.rds"))
saveRDS(dependencies, dependenciesFileName)
execResultsUpload <- all(c(
diff --git a/R/ModuleEnv.R b/R/ModuleEnv.R
index b26de8ba..87bb8b27 100644
--- a/R/ModuleEnv.R
+++ b/R/ModuleEnv.R
@@ -1,4 +1,4 @@
-# Copyright 2023 Observational Health Data Sciences and Informatics
+# Copyright 2024 Observational Health Data Sciences and Informatics
#
# This file is part of Strategus
#
@@ -47,8 +47,6 @@
#' @param injectVars list of var names list(name=value) to replace (e.g. replace list(foo = "some string") will
#' find the pattern foo and replace it with the string some string - be careful!
#' @param tempScriptFile tempFile to write script to
-#' @param useLocalStrategusLibrary Use the locally installed Strategus library? TRUE will use the Strategus
-#' installation from the calling R process.
#' @param job run as rstudio job
#' @param processName String name for process
#' @returns NULL invisibly
@@ -56,7 +54,6 @@ withModuleRenv <- function(code,
moduleFolder,
injectVars = list(),
tempScriptFile = tempfile(fileext = ".R"),
- useLocalStrategusLibrary = TRUE,
job = FALSE,
processName = paste(moduleFolder, "_renv_run")) {
# convert human readable code to a string for writing
@@ -81,19 +78,16 @@ withModuleRenv <- function(code,
}
}
- # Enforce attachment of Strategus from calling process - note one inside the renv
- if (useLocalStrategusLibrary) {
- script <- c(.getLocalLibraryScipt("Strategus"), script)
- # Adding Strategus dependencies to the script
- script <- c(.getLocalLibraryScipt("ParallelLogger"), script)
- script <- c(.getLocalLibraryScipt("CohortGenerator"), script)
- script <- c(.getLocalLibraryScipt("DatabaseConnector"), script)
- script <- c(.getLocalLibraryScipt("keyring"), script)
- script <- c(.getLocalLibraryScipt("openssl"), script)
- script <- c(.getLocalLibraryScipt("dplyr"), script)
- script <- c(.getLocalLibraryScipt("R6"), script)
+ # Turning off verbose output to hide renv output
+ # unless the user has set this option to TRUE.
+ if (!getOption(x = "renv.verbose", default = FALSE)) {
+ options(renv.verbose = FALSE)
}
+ # Import the Strategus functions we need to use in the module scripts
+ script <- c("retrieveConnectionDetails <- ", base::deparse(Strategus::retrieveConnectionDetails), script)
+ script <- c("unlockKeyring <- ", base::deparse(Strategus::unlockKeyring), script)
+
# Write file and execute script inside an renv
fileConn <- file(tempScriptFile)
writeLines(script, fileConn)
@@ -123,3 +117,7 @@ withModuleRenv <- function(code,
paste0("# option = ", optionName, " - could not be passed to this file, likely because it is a function.")
}
}
+
+.formatAndNormalizeFilePathForScript <- function(filePath) {
+ return(gsub("\\\\", "/", normalizePath(path = filePath, mustWork = F)))
+}
diff --git a/R/ModuleInstantiation.R b/R/ModuleInstantiation.R
index df27152f..82ef3407 100644
--- a/R/ModuleInstantiation.R
+++ b/R/ModuleInstantiation.R
@@ -1,4 +1,4 @@
-# Copyright 2023 Observational Health Data Sciences and Informatics
+# Copyright 2024 Observational Health Data Sciences and Informatics
#
# This file is part of Strategus
#
@@ -29,11 +29,15 @@
#'
#' @template AnalysisSpecifications
#'
+#' @template forceVerification
+#'
#' @return
-#' A tibble listing the instantiated modules.
+#' A list containing the install status of all modules
+#' (TRUE if all are installed properly) and a tibble listing
+#' the instantiated modules.
#'
#' @export
-ensureAllModulesInstantiated <- function(analysisSpecifications) {
+ensureAllModulesInstantiated <- function(analysisSpecifications, forceVerification = FALSE) {
modules <- getModuleTable(analysisSpecifications, distinct = TRUE)
# Verify only one version per module:
@@ -73,7 +77,227 @@ ensureAllModulesInstantiated <- function(analysisSpecifications) {
stop(message)
}
- return(modules)
+ # Verify all modules are properly installed
+ moduleInstallStatus <- list()
+ for (i in 1:nrow(modules)) {
+ status <- verifyModuleInstallation(
+ module = modules$module[i],
+ version = modules$version[i],
+ forceVerification = forceVerification
+ )
+ moduleInstallStatus[[length(moduleInstallStatus) + 1]] <- status
+ }
+ attr(modules, "moduleInstallStatus") <- moduleInstallStatus
+
+ installStatus <- unlist(lapply(moduleInstallStatus, FUN = function(x) {
+ x$moduleInstalled
+ }))
+ if (!all(installStatus)) {
+ problemModules <- moduleInstallStatus[!installStatus]
+ message("There were ", length(problemModules), " issue(s) found with your Strategus modules!")
+ for (i in seq_along(problemModules)) {
+ message("Issue #", i, ": Module ", problemModules[[i]]$moduleFolder, " could not install the following R packages:")
+ print(problemModules[[i]]$issues)
+ }
+ message("To fix these issues, open the module project (.Rproj file) at the path specified above and re-run \"renv::restore()\" and correct all issues")
+ }
+
+ return(
+ list(
+ allModulesInstalled = all(installStatus),
+ modules = modules
+ )
+ )
+}
+
+
+#' Verify a module is properly installed
+#'
+#' @description
+#' In some instances a module may fail to instantiate and install due to problems
+#' when calling renv::restore for the module's renv.lock file. This function
+#' will allow you to surface inconsistencies between the module renv.lock file
+#' and the module's renv project library. This function will check to that a
+#' module has been properly installed using internal functions of the `renv`
+#' package. If a module is verified to work via this function, the hash of
+#' the module's renv.lock file will be written to a text file in the module
+#' directory to indicate that it is ready for use. This will allow subsequent
+#' calls to work faster since the initial verification process can take some
+#' time.It is possible to re-run the verification of a module
+#' by using the `forceVerification` parameter.
+#'
+#' To fix issues with a module, you will need to open the module's .Rproj in
+#' RStudio instance and debug the issues when calling renv::restore().
+#'
+#' @param module The name of the module to verify (i.e. "CohortGeneratorModule")
+#'
+#' @param version The version of the module to verify (i.e. "0.2.1")
+#'
+#' @param silent When TRUE output of this verification process is suppressed
+#'
+#' @template forceVerification
+#'
+#' @return
+#' A list with the output of the consistency check
+#'
+#' @export
+verifyModuleInstallation <- function(module, version, silent = FALSE, forceVerification = FALSE) {
+ # Internal helper function
+ verifyModuleInstallationReturnValue <- function(moduleFolder, moduleInstalled, issues = NULL) {
+ returnVal <- list(
+ moduleFolder = moduleFolder,
+ moduleInstalled = moduleInstalled,
+ issues = issues
+ )
+ return(returnVal)
+ }
+
+ moduleFolder <- getModuleFolder(module, version)
+ if (!dir.exists(moduleFolder)) {
+ if (!silent) {
+ warning("Module ", module, ", Version: ", version, " not found at: ", moduleFolder, ". This means the module was never installed.")
+ }
+ return(
+ verifyModuleInstallationReturnValue(
+ moduleFolder = moduleFolder,
+ moduleInstalled = FALSE
+ )
+ )
+ }
+
+ if (!silent) {
+ message("Verifying module: ", module, ", (", version, ") at ", moduleFolder, "...", appendLF = F)
+ }
+ moduleStatusFileName <- "moduleStatus.txt"
+ renvLockFileName <- "renv.lock"
+
+ # If the lock file doesn't exist, we're not sure if we're dealing with a module.
+ if (!file.exists(file.path(moduleFolder, renvLockFileName))) {
+ if (!silent) {
+ message("ERROR - renv.lock file missing.")
+ }
+ return(
+ verifyModuleInstallationReturnValue(
+ moduleFolder = moduleFolder,
+ moduleInstalled = FALSE
+ )
+ )
+ }
+
+ # Check to see if we've already performed the verification by looking at the
+ # moduleStatus.txt file to see if the md5 in that file matches the one
+ # created by hashing the renv.lock file
+ lockfileContents <- ParallelLogger::loadSettingsFromJson(
+ fileName = file.path(moduleFolder, renvLockFileName)
+ )
+ lockfileHash <- digest::digest(
+ object = lockfileContents,
+ algo = "md5"
+ )
+ if (!forceVerification && file.exists(file.path(moduleFolder, moduleStatusFileName))) {
+ lockfileHashFromModuleStatusFile <- SqlRender::readSql(
+ sourceFile = file.path(moduleFolder, moduleStatusFileName)
+ )
+
+ # If the values match, the module is installed correctly
+ # return and exit
+ if (lockfileHashFromModuleStatusFile == lockfileHash) {
+ if (!silent) {
+ message("MODULE READY!")
+ }
+ return(
+ verifyModuleInstallationReturnValue(
+ moduleFolder = moduleFolder,
+ moduleInstalled = TRUE
+ )
+ )
+ }
+ }
+
+
+ # Now perform the consistency check to verify that the renv::restore()
+ # process executed successfully. We must do this in the module's context
+ Strategus:::withModuleRenv(
+ code = {
+ # Get the renv project status and then identify the packages used
+ # in the project to determine if there were issues when restoring
+ # the project from the renv.lock file.
+ projectStatus <- renv::status()
+
+ # Identify the list of package dependencies by using
+ # the data returned from renv::status() and
+ # renv::dependencies for the project.
+ library <- names(projectStatus$library$Packages)
+ lockfile <- names(projectStatus$lockfile$Packages)
+ packages <- sort(union(renv::dependencies(quiet = TRUE)$Package, "renv"))
+ packages <- sort(unique(c(library, lockfile, packages)))
+ projectStatus$packages <- packages
+ saveRDS(
+ object = list(
+ library = library,
+ lockfile = lockfile,
+ packages = packages
+ ),
+ file = "projectStatus.rds"
+ )
+ },
+ moduleFolder = moduleFolder
+ )
+
+ # The module's project status is written to the
+ # file system. Now we can get the module status and use the information
+ # to determine the restoration status
+ projectStatus <- readRDS(file.path(moduleFolder, "projectStatus.rds"))
+
+ library <- projectStatus$library
+ lockfile <- projectStatus$lockfile
+ packages <- projectStatus$packages
+
+ packageStatus <- data.frame(
+ package = packages,
+ installed = packages %in% library,
+ recorded = packages %in% lockfile,
+ used = packages %in% packages
+ )
+
+ # If all of the used & recorded packages are installed, then
+ # return TRUE for the module installed status. If not, return
+ # FALSE and set an attribute of the list that contains the issues
+ # discovered
+ ok <- packageStatus$installed & (packageStatus$used == packageStatus$recorded)
+ issues <- packageStatus[!ok, , drop = FALSE]
+ missing <- !issues$installed
+ issues$installed <- ifelse(issues$installed, "y", "n")
+ issues$recorded <- ifelse(issues$recorded, "y", "n")
+ issues$used <- ifelse(issues$used, "y", if (any(missing)) "?" else "n")
+ issues <- issues[issues$installed == "n" & issues$recorded == "y" & issues$used == "y", ]
+
+ moduleInstalled <- nrow(issues) == 0
+
+ if (isTRUE(moduleInstalled)) {
+ if (!silent) {
+ message("MODULE READY!")
+ }
+ # Write the contents of the md5 hash of the module's
+ # renv.lock file to the file system to note that the
+ # module's install status was successful and verified
+ SqlRender::writeSql(
+ sql = lockfileHash,
+ targetFile = file.path(moduleFolder, "moduleStatus.txt")
+ )
+ } else {
+ if (!silent) {
+ message("MODULE HAS ISSUES!")
+ }
+ }
+
+ return(
+ verifyModuleInstallationReturnValue(
+ moduleFolder = moduleFolder,
+ moduleInstalled = moduleInstalled,
+ issues = issues
+ )
+ )
}
getModuleTable <- function(analysisSpecifications, distinct = FALSE) {
@@ -121,15 +345,14 @@ getModuleMetaData <- function(moduleFolder) {
}
getModuleFolder <- function(module, version) {
+ assertModulesFolderSetting(x = Sys.getenv("INSTANTIATED_MODULES_FOLDER"))
moduleFolder <- file.path(Sys.getenv("INSTANTIATED_MODULES_FOLDER"), sprintf("%s_%s", module, version))
invisible(moduleFolder)
}
ensureModuleInstantiated <- function(module, version, remoteRepo, remoteUsername) {
+ assertModulesFolderSetting(x = Sys.getenv("INSTANTIATED_MODULES_FOLDER"))
instantiatedModulesFolder <- Sys.getenv("INSTANTIATED_MODULES_FOLDER")
- if (instantiatedModulesFolder == "") {
- stop("The INSTANTIATED_MODULES_FOLDER environment variable has not been set.")
- }
if (!dir.exists(instantiatedModulesFolder)) {
dir.create(instantiatedModulesFolder, recursive = TRUE)
}
@@ -193,12 +416,6 @@ instantiateModule <- function(module, version, remoteRepo, remoteUsername, modul
withModuleRenv(
code = {
- ParallelLogger::addDefaultFileLogger(
- fileName = file.path(moduleFolder, "moduleInitLog.txt")
- )
- ParallelLogger::addDefaultErrorReportLogger(
- fileName = file.path(moduleFolder, "moduleInitErrorReport.txt")
- )
renv::restore(prompt = FALSE)
},
moduleFolder = moduleFolder,
@@ -212,7 +429,7 @@ getModuleRenvDependencies <- function(moduleFolder) {
".Rprofile",
"renv.lock",
"renv/activate.R",
- "renv/settings.dcf"
+ "renv/settings.json"
)
missingFiles <- tibble::enframe(renvRequiredFiles) %>%
diff --git a/R/RenvHelpers.R b/R/RenvHelpers.R
new file mode 100644
index 00000000..822f7774
--- /dev/null
+++ b/R/RenvHelpers.R
@@ -0,0 +1,232 @@
+#' Compare two renv.lock files
+#'
+#' @description
+#' Used to compare renv.lock files and return the results in a data.frame.
+#' The return value will include a "full join" representation of the packages
+#' across the two lock files.
+#'
+#' @param filename1 The first renv.lock file name
+#'
+#' @param filename2 The second renv.lock file name
+#'
+#' @return
+#' A data.frame with the comparison of the rev.lock files
+#'
+#' @export
+compareLockFiles <- function(filename1, filename2) {
+ # Read the lock files
+ lockfile1 <- renv::lockfile_read(
+ file = filename1
+ )
+
+ lockfile2 <- renv::lockfile_read(
+ file = filename2
+ )
+
+ # Compare lock files
+ lockfile1Packages <- lockFileToDataFrame(lockfile1)
+ names(lockfile1Packages) <- paste0("lockfile1", names(lockfile1Packages))
+ lockfile2Packages <- lockFileToDataFrame(lockfile2)
+ names(lockfile2Packages) <- paste0("lockfile2", names(lockfile2Packages))
+ mergedLockFilePackages <- merge(
+ x = lockfile1Packages,
+ y = lockfile2Packages,
+ by.x = "lockfile1Name",
+ by.y = "lockfile2Name",
+ all = TRUE
+ )
+ return(mergedLockFilePackages)
+}
+
+#' Synchronize renv.lock files and overwrite the target file
+#' (read the description)
+#'
+#' @description
+#' Used to synchronize the values from the "source of truth" renv.lock file to
+#' the target renv.lock file. Packages are compared (by name) and if the version
+#' of the package in the "source of truth" is greater the one found in the
+#' target, the target renv.lock file will be updated. This function will
+#' automatically update the target file.
+#'
+#' Version comparison is handled by the `semver` package and since most packages
+#' use semantic versioning. When a package does not use semantic versioning,
+#' a warning is provided so the user can review.
+#'
+#' @param sourceOfTruthLockFileName The renv.lock file to use as the source of
+#' truth
+#'
+#' @param targetLockFileName The target renv.lock file that will be synced with
+#' the source of truth
+#'
+#' @return
+#' A data.frame containing the different packages and their version that
+#' were involved in the synchronization process
+#'
+#' @export
+syncLockFile <- function(sourceOfTruthLockFileName, targetLockFileName) {
+ findPackageByName <- function(list, packageName) {
+ index <- which(sapply(list, function(x) x$Package == packageName))
+ return(index)
+ }
+
+ # Read the lock files
+ sourceOfTruthLockFile <- renv::lockfile_read(
+ file = sourceOfTruthLockFileName
+ )
+ targetLockFile <- renv::lockfile_read(
+ file = targetLockFileName
+ )
+
+ # Compare the lock files to get the differences in package versions
+ comparedLockFiles <- compareLockFiles(
+ filename1 = sourceOfTruthLockFileName,
+ filename2 = targetLockFileName
+ )
+ verDiffs <- comparedLockFiles[!is.na(comparedLockFiles$lockfile2Version) &
+ comparedLockFiles$lockfile1Version != comparedLockFiles$lockfile2Version, ]
+ verDiffs <- verDiffs[!is.na(verDiffs$lockfile1Name), ]
+
+ if (nrow(verDiffs) == 0) {
+ rlang::inform("Lock files are already in sync.")
+ return(invisible(NULL))
+ }
+
+ # Update the target lock file based on the source of truth
+ for (i in 1:nrow(verDiffs)) {
+ index <- findPackageByName(targetLockFile$Packages, verDiffs[i, ]$lockfile1Name)
+ tryCatch(expr = {
+ semverPattern <- "^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?(?:\\+[0-9A-Za-z-]+)?$"
+ sourceOfTruthVersion <- verDiffs[i, ]$lockfile1Version
+ targetVersion <- targetLockFile$Packages[[index]]$Version
+ if (grepl(semverPattern, sourceOfTruthVersion) && grepl(semverPattern, targetVersion)) {
+ sourceOfTruthVersion <- semver::parse_version(sourceOfTruthVersion)
+ targetVersion <- semver::parse_version(targetVersion)
+ if (sourceOfTruthVersion > targetVersion) {
+ rlang::inform(
+ message = paste(verDiffs[i, ]$lockfile1Name, "[", targetVersion, "->", sourceOfTruthVersion, "]")
+ )
+ targetLockFile$Packages[[index]]$Version <- verDiffs[i, ]$lockfile1Version
+ if (!is.na(verDiffs[i, ]$lockfile1RemoteRef)) {
+ targetLockFile$Packages[[index]]$RemoteRef <- verDiffs[i, ]$lockfile1RemoteRef
+ }
+ } else {
+ rlang::inform(
+ message = paste(verDiffs[i, ]$lockfile1Name, "[ SKIPPING - ", targetVersion, ">", sourceOfTruthVersion, "]")
+ )
+ }
+ } else {
+ rlang::warn(paste0("Package: [", verDiffs[i, ]$lockfile1Name, "] - version number could not be parsed. Please inspect manually as it may require an upgrade."))
+ }
+ }, error = function(err) {
+ rlang::inform("An error occurred:", utils::str(err), "\n")
+ })
+ }
+
+ # Save the updated lock file
+ renv::lockfile_write(
+ lockfile = targetLockFile,
+ file = targetLockFileName
+ )
+
+ return(invisible(verDiffs))
+}
+
+#' Validate an renv.lock file to ensure it is ready for use by Strategus
+#'
+#' @description
+#' Will check an renv.lock file for a module to verify that it only references
+#' tagged packages and includes the packages required by Strategus. It will
+#' also check for suggested packages that are useful for testing, such as
+#' RSQLite.
+#'
+#' @param filename The renv.lock file to validate
+#'
+#' @export
+validateLockFile <- function(filename) {
+ # Read the lock file
+ lockFile <- renv::lockfile_read(
+ file = filename
+ )
+ # Create a data.frame from the renv.lock file
+ df <- lockFileToDataFrame(
+ lf = lockFile
+ )
+
+ # Check that the mandatory dependencies are met
+ message("Checking mandatory packages...", appendLF = F)
+ if (length(mandatoryPackages()) != nrow(df[df$Name %in% mandatoryPackages(), ])) {
+ missingPkgs <- setdiff(mandatoryPackages(), df[df$Name %in% mandatoryPackages(), ]$Name)
+ message("FAILED!")
+ message(" -- Missing the mandatory packages: ", paste(missingPkgs, collapse = ", "))
+ message(" Please record these missing dependencies in your renv.lock file.")
+ } else {
+ message("PASSED!")
+ }
+
+ # Check for suggested packages
+ message("Checking suggested packages...", appendLF = F)
+ if (length(suggestedPacakges()) != nrow(df[df$Name %in% suggestedPacakges(), ])) {
+ missingPkgs <- setdiff(suggestedPacakges(), df[df$Name %in% suggestedPacakges(), ]$Name)
+ message("WARNING!")
+ message(" -- Missing the suggested packages: ", paste(missingPkgs, collapse = ", "))
+ message(" This is an optional set of dependencies so you may decide if you wish to have them in your renv.lock file.")
+ } else {
+ message("PASSED!")
+ }
+
+ # Check that we're using declared versions of all packages
+ message("Checking all package using tagged versions in RemoteRef...", appendLF = F)
+ # Start by filtering out the CRAN Repository entries
+ dfFiltered <- df[tolower(df$Source) != "repository", ]
+ if (!all(grepl("^(v)?\\d+(\\.\\d+){2}$", dfFiltered$RemoteRef))) {
+ message("FAILED! Please check the following packages:")
+ problemPkgs <- dfFiltered[!grepl("^(v)?\\d+(\\.\\d+){2}$", dfFiltered$RemoteRef), ]
+ for (i in 1:nrow(problemPkgs)) {
+ message(paste0(" -- Package: ", problemPkgs$Name[[i]], "; RemoteRef: ", problemPkgs$RemoteRef[[i]]))
+ }
+ message(" Please ensure you are only including tagged versions of package dependencies in your renv.lock file.")
+ } else {
+ message("PASSED!")
+ }
+}
+
+#' List of mandatory packages for a Strategus module
+#'
+#' @keywords internal
+mandatoryPackages <- function() {
+ return(c(
+ "CohortGenerator",
+ "DatabaseConnector",
+ "keyring",
+ "ParallelLogger",
+ "renv",
+ "SqlRender"
+ ))
+}
+
+#' List of suggested packages for a Strategus module
+#'
+#' @keywords internal
+suggestedPacakges <- function() {
+ return(c("RSQLite"))
+}
+
+
+#' Convert a lock file to a data.frame
+#'
+#' @keywords internal
+lockFileToDataFrame <- function(lf) {
+ df <- data.frame()
+ for (i in 1:length(lf$Packages)) {
+ df <- rbind(
+ df,
+ data.frame(
+ Name = lf$Packages[[i]]$Package,
+ Version = lf$Packages[[i]]$Version,
+ Source = lf$Packages[[i]]$Source,
+ RemoteRef = ifelse(is.null(lf$Packages[[i]]$RemoteRef), yes = NA, no = lf$Packages[[i]]$RemoteRef)
+ )
+ )
+ }
+ return(df)
+}
diff --git a/R/ResultModelCreation.R b/R/ResultModelCreation.R
index 2446561a..8ff0f4fb 100644
--- a/R/ResultModelCreation.R
+++ b/R/ResultModelCreation.R
@@ -1,4 +1,4 @@
-# Copyright 2023 Observational Health Data Sciences and Informatics
+# Copyright 2024 Observational Health Data Sciences and Informatics
#
# This file is part of Strategus
#
@@ -36,6 +36,9 @@ createResultDataModels <- function(analysisSpecifications,
checkmate::reportAssertions(collection = errorMessages)
modules <- ensureAllModulesInstantiated(analysisSpecifications)
+ if (isFALSE(modules$allModulesInstalled)) {
+ stop("Stopping execution due to module issues")
+ }
if (is.null(executionScriptFolder)) {
@@ -48,6 +51,8 @@ createResultDataModels <- function(analysisSpecifications,
}
dir.create(executionScriptFolder, recursive = TRUE)
}
+ # Normalize path to convert from relative to absolute path
+ executionScriptFolder <- normalizePath(executionScriptFolder, mustWork = F)
script <- file.path(executionScriptFolder, "SchemaScript.R")
##
@@ -85,11 +90,11 @@ createResultDataModels <- function(analysisSpecifications,
)
# Store settings objects in the temp folder so they are available in targets
- analysisSpecificationsFileName <- gsub("\\\\", "/", file.path(executionScriptFolder, "analysisSpecifications.rds"))
+ analysisSpecificationsFileName <- .formatAndNormalizeFilePathForScript(file.path(executionScriptFolder, "analysisSpecifications.rds"))
saveRDS(analysisSpecifications, analysisSpecificationsFileName)
- executionSettingsFileName <- gsub("\\\\", "/", file.path(executionScriptFolder, "executionSettings.rds"))
+ executionSettingsFileName <- .formatAndNormalizeFilePathForScript(file.path(executionScriptFolder, "executionSettings.rds"))
saveRDS(executionSettings, executionSettingsFileName)
- keyringSettingsFileName <- gsub("\\\\", "/", file.path(executionScriptFolder, "keyringSettings.rds"))
+ keyringSettingsFileName <- .formatAndNormalizeFilePathForScript(file.path(executionScriptFolder, "keyringSettings.rds"))
saveRDS(list(keyringName = keyringName), keyringSettingsFileName)
# Generate target names by module type
@@ -103,7 +108,7 @@ createResultDataModels <- function(analysisSpecifications,
)
}
moduleToTargetNames <- bind_rows(moduleToTargetNames)
- moduleToTargetNamesFileName <- gsub("\\\\", "/", file.path(executionScriptFolder, "moduleTargetNames.rds"))
+ moduleToTargetNamesFileName <- .formatAndNormalizeFilePathForScript(file.path(executionScriptFolder, "moduleTargetNames.rds"))
saveRDS(moduleToTargetNames, moduleToTargetNamesFileName)
# Settings required inside script. There is probably a much cleaner way of doing this
@@ -141,7 +146,11 @@ runSchemaCreation <- function(analysisSpecifications, keyringSettings, moduleInd
version <- moduleSpecification$version
remoteRepo <- moduleSpecification$remoteRepo
remoteUsername <- moduleSpecification$remoteUsername
- moduleFolder <- ensureModuleInstantiated(module, version, remoteRepo, remoteUsername)
+ moduleInstallation <- verifyModuleInstallation(module, version, silent = TRUE)
+ moduleFolder <- moduleInstallation$moduleFolder
+ if (isFALSE(moduleInstallation$moduleInstalled)) {
+ stop("Stopping since module is not properly installed!")
+ }
# Create job context
moduleExecutionSettings <- executionSettings
@@ -161,12 +170,12 @@ runSchemaCreation <- function(analysisSpecifications, keyringSettings, moduleInd
moduleExecutionSettings = moduleExecutionSettings,
keyringSettings = keyringSettings
)
- jobContextFileName <- file.path(moduleExecutionSettings$workSubFolder, "jobContext.rds") # gsub("\\\\", "/", tempfile(fileext = ".rds"))
+ jobContextFileName <- .formatAndNormalizeFilePathForScript(file.path(moduleExecutionSettings$workSubFolder, "jobContext.rds"))
saveRDS(jobContext, jobContextFileName)
- dataModelExportPath <- file.path(moduleExecutionSettings$workSubFolder, "resultsDataModelSpecification.csv")
+ dataModelExportPath <- .formatAndNormalizeFilePathForScript(file.path(moduleExecutionSettings$workSubFolder, "resultsDataModelSpecification.csv"))
- doneFile <- file.path(jobContext$moduleExecutionSettings$resultsSubFolder, "schema.creation")
+ doneFile <- .formatAndNormalizeFilePathForScript(file.path(jobContext$moduleExecutionSettings$resultsSubFolder, "schema.creation"))
if (file.exists(doneFile)) {
unlink(doneFile)
}
@@ -200,7 +209,7 @@ runSchemaCreation <- function(analysisSpecifications, keyringSettings, moduleInd
if (is.function(createDataModelSchema)) {
# If the keyring is locked, unlock it, set the value and then re-lock it
keyringName <- jobContext$keyringSettings$keyringName
- keyringLocked <- Strategus::unlockKeyring(keyringName = keyringName)
+ keyringLocked <- unlockKeyring(keyringName = keyringName)
resultsConnectionDetails <- keyring::key_get(jobContext$moduleExecutionSettings$resultsConnectionDetailsReference, keyring = keyringName)
resultsConnectionDetails <- ParallelLogger::convertJsonToSettings(resultsConnectionDetails)
diff --git a/R/ResultsUpload.R b/R/ResultsUpload.R
index 0a3ad60a..9bd5f8de 100644
--- a/R/ResultsUpload.R
+++ b/R/ResultsUpload.R
@@ -1,4 +1,4 @@
-# Copyright 2023 Observational Health Data Sciences and Informatics
+# Copyright 2024 Observational Health Data Sciences and Informatics
#
# This file is part of Strategus
#
@@ -24,12 +24,16 @@ runResultsUpload <- function(analysisSpecifications, keyringSettings, moduleInde
version <- moduleSpecification$version
remoteRepo <- moduleSpecification$remoteRepo
remoteUsername <- moduleSpecification$remoteUsername
- moduleFolder <- ensureModuleInstantiated(module, version, remoteRepo, remoteUsername)
+ moduleInstallation <- verifyModuleInstallation(module, version, silent = TRUE)
+ moduleFolder <- moduleInstallation$moduleFolder
+ if (isFALSE(moduleInstallation$moduleInstalled)) {
+ stop("Stopping since module is not properly installed!")
+ }
# Create job context
moduleExecutionSettings <- executionSettings
- moduleExecutionSettings$workSubFolder <- file.path(executionSettings$workFolder, sprintf("%s_%d", module, moduleIndex))
- moduleExecutionSettings$resultsSubFolder <- file.path(executionSettings$resultsFolder, sprintf("%s_%d", module, moduleIndex))
+ moduleExecutionSettings$workSubFolder <- normalizePath(file.path(executionSettings$workFolder, sprintf("%s_%d", module, moduleIndex)), mustWork = F)
+ moduleExecutionSettings$resultsSubFolder <- normalizePath(file.path(executionSettings$resultsFolder, sprintf("%s_%d", module, moduleIndex)), mustWork = F)
if (!is(executionSettings, "CdmExecutionSettings")) {
stop("Unhandled executionSettings class! Must be CdmExecutionSettings instance")
@@ -44,11 +48,11 @@ runResultsUpload <- function(analysisSpecifications, keyringSettings, moduleInde
moduleExecutionSettings = moduleExecutionSettings,
keyringSettings = keyringSettings
)
- jobContextFileName <- file.path(moduleExecutionSettings$workSubFolder, "jobContext.rds") # gsub("\\\\", "/", tempfile(fileext = ".rds"))
+ jobContextFileName <- .formatAndNormalizeFilePathForScript(file.path(moduleExecutionSettings$workSubFolder, "jobContext.rds"))
saveRDS(jobContext, jobContextFileName)
- dataModelExportPath <- file.path(moduleExecutionSettings$workSubFolder, "resultsDataModelSpecification.csv")
+ dataModelExportPath <- .formatAndNormalizeFilePathForScript(file.path(moduleExecutionSettings$workSubFolder, "resultsDataModelSpecification.csv"))
- doneFile <- file.path(jobContext$moduleExecutionSettings$resultsSubFolder, "results.uploaded")
+ doneFile <- .formatAndNormalizeFilePathForScript(file.path(jobContext$moduleExecutionSettings$resultsSubFolder, "results.uploaded"))
if (file.exists(doneFile)) {
unlink(doneFile)
}
@@ -90,7 +94,7 @@ runResultsUpload <- function(analysisSpecifications, keyringSettings, moduleInde
# If the keyring is locked, unlock it, set the value and then re-lock it
ParallelLogger::logInfo("-- Getting result database credentials")
keyringName <- jobContext$keyringSettings$keyringName
- keyringLocked <- Strategus::unlockKeyring(keyringName = keyringName)
+ keyringLocked <- unlockKeyring(keyringName = keyringName)
resultsConnectionDetails <- keyring::key_get(jobContext$moduleExecutionSettings$resultsConnectionDetailsReference, keyring = keyringName)
resultsConnectionDetails <- ParallelLogger::convertJsonToSettings(resultsConnectionDetails)
resultsConnectionDetails <- do.call(DatabaseConnector::createConnectionDetails, resultsConnectionDetails)
diff --git a/R/RunModule.R b/R/RunModule.R
index d7087afb..7485efc3 100644
--- a/R/RunModule.R
+++ b/R/RunModule.R
@@ -1,4 +1,4 @@
-# Copyright 2023 Observational Health Data Sciences and Informatics
+# Copyright 2024 Observational Health Data Sciences and Informatics
#
# This file is part of Strategus
#
@@ -28,7 +28,11 @@ runModule <- function(analysisSpecifications, keyringSettings, moduleIndex, exec
version <- moduleSpecification$version
remoteRepo <- moduleSpecification$remoteRepo
remoteUsername <- moduleSpecification$remoteUsername
- moduleFolder <- ensureModuleInstantiated(module, version, remoteRepo, remoteUsername)
+ moduleInstallation <- verifyModuleInstallation(module, version)
+ moduleFolder <- moduleInstallation$moduleFolder
+ if (isFALSE(moduleInstallation$moduleInstalled)) {
+ stop(paste0("Stopping since module is not properly installed! Module folder: ", moduleInstallation$moduleFolder))
+ }
# Create job context
moduleExecutionSettings <- executionSettings
@@ -47,11 +51,11 @@ runModule <- function(analysisSpecifications, keyringSettings, moduleIndex, exec
moduleExecutionSettings = moduleExecutionSettings,
keyringSettings = keyringSettings
)
- jobContextFileName <- file.path(moduleExecutionSettings$workSubFolder, "jobContext.rds") # gsub("\\\\", "/", tempfile(fileext = ".rds"))
+ jobContextFileName <- .formatAndNormalizeFilePathForScript(file.path(moduleExecutionSettings$workSubFolder, "jobContext.rds"))
saveRDS(jobContext, jobContextFileName)
- tempScriptFile <- file.path(moduleExecutionSettings$workSubFolder, "StrategusScript.R")
- doneFile <- file.path(jobContext$moduleExecutionSettings$resultsSubFolder, "done")
+ tempScriptFile <- .formatAndNormalizeFilePathForScript(file.path(moduleExecutionSettings$workSubFolder, "StrategusScript.R"))
+ doneFile <- .formatAndNormalizeFilePathForScript(file.path(jobContext$moduleExecutionSettings$resultsSubFolder, "done"))
if (file.exists(doneFile)) {
unlink(doneFile)
}
@@ -71,23 +75,15 @@ runModule <- function(analysisSpecifications, keyringSettings, moduleIndex, exec
source("Main.R")
jobContext <- readRDS(jobContextFileName)
- unlockKeyring <- function(keyringName) {
- # If the keyring is locked, unlock it, set the value and then re-lock it
- keyringLocked <- keyring::keyring_is_locked(keyring = keyringName)
- if (keyringLocked) {
- keyring::keyring_unlock(keyring = keyringName, password = Sys.getenv("STRATEGUS_KEYRING_PASSWORD"))
- }
- return(keyringLocked)
- }
-
keyringName <- jobContext$keyringSettings$keyringName
+ # unlockKeyring will be injected automatically
keyringLocked <- unlockKeyring(keyringName = keyringName)
ParallelLogger::addDefaultFileLogger(file.path(jobContext$moduleExecutionSettings$resultsSubFolder, "log.txt"))
ParallelLogger::addDefaultErrorReportLogger(file.path(jobContext$moduleExecutionSettings$resultsSubFolder, "errorReport.R"))
options(andromedaTempFolder = file.path(jobContext$moduleExecutionSettings$workFolder, "andromedaTemp"))
- options(tempEmulationSchema = jobContext$moduleExecutionSettings$tempEmulationSchema)
+ options(sqlRenderTempEmulationSchema = jobContext$moduleExecutionSettings$tempEmulationSchema)
options(databaseConnectorIntegerAsNumeric = jobContext$moduleExecutionSettings$integerAsNumeric)
options(databaseConnectorInteger64AsNumeric = jobContext$moduleExecutionSettings$integer64AsNumeric)
@@ -95,15 +91,16 @@ runModule <- function(analysisSpecifications, keyringSettings, moduleIndex, exec
renv::use(lockfile = "renv.lock")
}
- # NOTE injected variable isResultsExecution - will look strange outside of Strategus definition
+ # NOTE: injected variable isResultsExecution - will look strange outside of Strategus definition
+ # NOTE: retrieveConnectionDetails function is injected by withModuleRenv
if (isCdmExecution) {
- connectionDetails <- Strategus::retrieveConnectionDetails(
+ connectionDetails <- retrieveConnectionDetails(
connectionDetailsReference = jobContext$moduleExecutionSettings$connectionDetailsReference,
keyringName = keyringName
)
jobContext$moduleExecutionSettings$connectionDetails <- connectionDetails
} else {
- resultsConnectionDetails <- Strategus::retrieveConnectionDetails(
+ resultsConnectionDetails <- retrieveConnectionDetails(
connectionDetailsReference = jobContext$moduleExecutionSettings$resultsConnectionDetailsReference,
keyringName = keyringName
)
diff --git a/R/Settings.R b/R/Settings.R
index fe2a72f3..e3463f36 100644
--- a/R/Settings.R
+++ b/R/Settings.R
@@ -1,4 +1,4 @@
-# Copyright 2023 Observational Health Data Sciences and Informatics
+# Copyright 2024 Observational Health Data Sciences and Informatics
#
# This file is part of Strategus
#
@@ -128,6 +128,10 @@ createCdmExecutionSettings <- function(connectionDetailsReference,
checkmate::assertCharacter(resultsDatabaseSchema, null.ok = TRUE, add = errorMessages)
checkmate::reportAssertions(collection = errorMessages)
+ # Normalize paths to convert relative paths to absolute paths
+ workFolder <- normalizePath(workFolder, mustWork = F)
+ resultsFolder <- normalizePath(resultsFolder, mustWork = F)
+
executionSettings <- list(
connectionDetailsReference = connectionDetailsReference,
workDatabaseSchema = workDatabaseSchema,
@@ -179,6 +183,10 @@ createResultsExecutionSettings <- function(resultsConnectionDetailsReference,
checkmate::assertLogical(integer64AsNumeric, max.len = 1, add = errorMessages)
checkmate::reportAssertions(collection = errorMessages)
+ # Normalize paths to convert relative paths to absolute paths
+ workFolder <- normalizePath(workFolder, mustWork = F)
+ resultsFolder <- normalizePath(resultsFolder, mustWork = F)
+
executionSettings <- list(
resultsConnectionDetailsReference = resultsConnectionDetailsReference,
resultsDatabaseSchema = resultsDatabaseSchema,
@@ -269,6 +277,10 @@ retrieveConnectionDetails <- function(connectionDetailsReference, keyringName =
checkmate::assertLogical(x = (is.null(keyringName) || keyringName %in% keyringList$keyring), add = errorMessages)
checkmate::reportAssertions(collection = errorMessages)
+ if (!connectionDetailsReference %in% keyring::key_list(keyring = keyringName)$service) {
+ stop("Connection details with connectionDetailsReference = \"", connectionDetailsReference, "\" were not found in your keyring. Please check that you have used the Strategus storeConnectionDetails function to save your connection details with this connectionDetailsReference name.")
+ }
+
# If the keyring is locked, unlock it, set the value and then re-lock it
keyringLocked <- unlockKeyring(keyringName = keyringName)
@@ -340,16 +352,19 @@ unlockKeyring <- function(keyringName) {
# If the keyring is locked, unlock it, set the value and then re-lock it
keyringLocked <- keyring::keyring_is_locked(keyring = keyringName)
if (keyringLocked) {
- assertKeyringPassword(x = Sys.getenv("STRATEGUS_KEYRING_PASSWORD"), keyringName = keyringName)
+ x <- Sys.getenv("STRATEGUS_KEYRING_PASSWORD")
+ if (length(x) == 0 || x == "") {
+ stop(paste0("STRATEGUS_KEYRING_PASSWORD NOT FOUND. STRATEGUS_KEYRING_PASSWORD must be set using Sys.setenv(STRATEGUS_KEYRING_PASSWORD = \"\") to unlock the keyring: ", keyringName))
+ }
keyring::keyring_unlock(keyring = keyringName, password = Sys.getenv("STRATEGUS_KEYRING_PASSWORD"))
}
return(keyringLocked)
}
#' @keywords internal
-.checkKeyringPasswordSet <- function(x, keyringName = NULL) {
+.checkModuleFolderSetting <- function(x) {
if (length(x) == 0 || x == "") {
- return(paste0("STRATEGUS_KEYRING_PASSWORD NOT FOUND. STRATEGUS_KEYRING_PASSWORD must be set using Sys.setenv(STRATEGUS_KEYRING_PASSWORD = \"\") to unlock the keyring: ", keyringName))
+ return(paste0("INSTANTIATED_MODULES_FOLDER environment variable has not been set. INSTANTIATED_MODULES_FOLDER must be set using Sys.setenv(INSTANTIATED_MODULES_FOLDER = \"/somepath\")"))
} else {
return(TRUE)
}
diff --git a/R/Strategus.R b/R/Strategus.R
index 5f8c93f6..c3315edc 100644
--- a/R/Strategus.R
+++ b/R/Strategus.R
@@ -1,4 +1,4 @@
-# Copyright 2023 Observational Health Data Sciences and Informatics
+# Copyright 2024 Observational Health Data Sciences and Informatics
#
# This file is part of Strategus
#
@@ -24,5 +24,4 @@
#' @importFrom methods is
NULL
-# Add custom asssertions
-assertKeyringPassword <- checkmate::makeAssertionFunction(.checkKeyringPasswordSet)
+assertModulesFolderSetting <- checkmate::makeAssertionFunction(.checkModuleFolderSetting)
diff --git a/docs/404.html b/docs/404.html
index 09410908..c6d3a44b 100644
--- a/docs/404.html
+++ b/docs/404.html
@@ -32,7 +32,7 @@
Strategus
- 0.1.0
+ 0.2.0
diff --git a/docs/articles/CreatingAnalysisSpecification.html b/docs/articles/CreatingAnalysisSpecification.html
index f2e5a14d..549f2723 100644
--- a/docs/articles/CreatingAnalysisSpecification.html
+++ b/docs/articles/CreatingAnalysisSpecification.html
@@ -33,7 +33,7 @@
Strategus
- 0.1.0
+ 0.2.0
@@ -94,7 +94,7 @@ Creating Analysis Specification
Anthony G.
Sena
- 2023-10-04
+ 2024-01-26
Source: vignettes/CreatingAnalysisSpecification.Rmd
CreatingAnalysisSpecification.Rmd
@@ -120,13 +120,13 @@
Add shared resources to analysis specifications
+
+ compareLockFiles()
+
+ Compare two renv.lock files
createCdmExecutionSettings()
@@ -120,10 +124,23 @@ All functions storeConnectionDetails()
Store connection details in a secure location
+
+ syncLockFile()
+
+ Synchronize renv.lock files and overwrite the target file
+(read the description)
unlockKeyring()
Helper function to unlock a keyring
+
+ validateLockFile()
+
+ Validate an renv.lock file to ensure it is ready for use by Strategus
+
+ verifyModuleInstallation()
+
+ Verify a module is properly installed
withModuleRenv()
diff --git a/docs/reference/lockFileToDataFrame.html b/docs/reference/lockFileToDataFrame.html
new file mode 100644
index 00000000..62ecc9aa
--- /dev/null
+++ b/docs/reference/lockFileToDataFrame.html
@@ -0,0 +1,105 @@
+
+Convert a lock file to a data.frame — lockFileToDataFrame • Strategus
+
+
+
+
+
+
+
+
+
Convert a lock file to a data.frame
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/reference/mandatoryPackages.html b/docs/reference/mandatoryPackages.html
new file mode 100644
index 00000000..2ddcf91c
--- /dev/null
+++ b/docs/reference/mandatoryPackages.html
@@ -0,0 +1,105 @@
+
+List of mandatory packages for a Strategus module — mandatoryPackages • Strategus
+
+
+
+
+
+
+
+
+
List of mandatory packages for a Strategus module
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/reference/retrieveConnectionDetails.html b/docs/reference/retrieveConnectionDetails.html
index e33a6c79..f080424a 100644
--- a/docs/reference/retrieveConnectionDetails.html
+++ b/docs/reference/retrieveConnectionDetails.html
@@ -17,7 +17,7 @@
Strategus
- 0.1.0
+ 0.2.0
diff --git a/docs/reference/runSchemaCreation.html b/docs/reference/runSchemaCreation.html
index 46f53794..87839bbc 100644
--- a/docs/reference/runSchemaCreation.html
+++ b/docs/reference/runSchemaCreation.html
@@ -22,7 +22,7 @@
Strategus
- 0.1.0
+ 0.2.0
diff --git a/docs/reference/storeConnectionDetails.html b/docs/reference/storeConnectionDetails.html
index 1a6467bd..7a0a965f 100644
--- a/docs/reference/storeConnectionDetails.html
+++ b/docs/reference/storeConnectionDetails.html
@@ -17,7 +17,7 @@
Strategus
- 0.1.0
+ 0.2.0
diff --git a/docs/reference/suggestedPacakges.html b/docs/reference/suggestedPacakges.html
new file mode 100644
index 00000000..c627aff5
--- /dev/null
+++ b/docs/reference/suggestedPacakges.html
@@ -0,0 +1,105 @@
+
+List of suggested packages for a Strategus module — suggestedPacakges • Strategus
+
+
+
+
+
+
+
+
+
List of suggested packages for a Strategus module
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/reference/syncLockFile.html b/docs/reference/syncLockFile.html
new file mode 100644
index 00000000..249ac3f1
--- /dev/null
+++ b/docs/reference/syncLockFile.html
@@ -0,0 +1,141 @@
+
+Synchronize renv.lock files and overwrite the target file
+(read the description) — syncLockFile • Strategus
+
+
+
+
+
+
+
+
+
Used to synchronize the values from the "source of truth" renv.lock file to
+the target renv.lock file. Packages are compared (by name) and if the version
+of the package in the "source of truth" is greater the one found in the
+target, the target renv.lock file will be updated. This function will
+automatically update the target file.
+
Version comparison is handled by the semver
package and since most packages
+use semantic versioning. When a package does not use semantic versioning,
+a warning is provided so the user can review.
+
+
+
+
syncLockFile ( sourceOfTruthLockFileName , targetLockFileName )
+
+
+
+
Arguments
+
sourceOfTruthLockFileName
+The renv.lock file to use as the source of
+truth
+
+
+targetLockFileName
+The target renv.lock file that will be synced with
+the source of truth
+
+
+
+
Value
+
+
+
A data.frame containing the different packages and their version that
+were involved in the synchronization process
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/reference/unlockKeyring.html b/docs/reference/unlockKeyring.html
index 1b5a5a5c..c249db6c 100644
--- a/docs/reference/unlockKeyring.html
+++ b/docs/reference/unlockKeyring.html
@@ -19,7 +19,7 @@
Strategus
- 0.1.0
+ 0.2.0
diff --git a/docs/reference/validateLockFile.html b/docs/reference/validateLockFile.html
new file mode 100644
index 00000000..72dbdf4e
--- /dev/null
+++ b/docs/reference/validateLockFile.html
@@ -0,0 +1,117 @@
+
+Validate an renv.lock file to ensure it is ready for use by Strategus — validateLockFile • Strategus
+
+
+
+
+
+
+
+
+
Will check an renv.lock file for a module to verify that it only references
+tagged packages and includes the packages required by Strategus. It will
+also check for suggested packages that are useful for testing, such as
+RSQLite.
+
+
+
+
validateLockFile ( filename )
+
+
+
+
Arguments
+
filename
+The renv.lock file to validate
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/reference/verifyModuleInstallation.html b/docs/reference/verifyModuleInstallation.html
new file mode 100644
index 00000000..233b25dd
--- /dev/null
+++ b/docs/reference/verifyModuleInstallation.html
@@ -0,0 +1,162 @@
+
+Verify a module is properly installed — verifyModuleInstallation • Strategus
+
+
+
+
+
+
+
+
+
In some instances a module may fail to instantiate and install due to problems
+when calling renv::restore for the module's renv.lock file. This function
+will allow you to surface inconsistencies between the module renv.lock file
+and the module's renv project library. This function will check to that a
+module has been properly installed using internal functions of the renv
+package. If a module is verified to work via this function, the hash of
+the module's renv.lock file will be written to a text file in the module
+directory to indicate that it is ready for use. This will allow subsequent
+calls to work faster since the initial verification process can take some
+time.It is possible to re-run the verification of a module
+by using the forceVerification
parameter.
+
To fix issues with a module, you will need to open the module's .Rproj in
+RStudio instance and debug the issues when calling renv::restore().
+
+
+
+
verifyModuleInstallation (
+ module ,
+ version ,
+ silent = FALSE ,
+ forceVerification = FALSE
+)
+
+
+
+
Arguments
+
module
+The name of the module to verify (i.e. "CohortGeneratorModule")
+
+
+version
+The version of the module to verify (i.e. "0.2.1")
+
+
+silent
+When TRUE output of this verification process is suppressed
+
+
+forceVerification
+When set to TRUE, the verification process is forced
+to re-evaluate if a module is properly installed. The default is FALSE
+since if a module is successfully validated, the module will contain
+the hash value of the module's renv.lock file in the file system so it can
+by-pass running this check every time.
+
+
+
+
Value
+
+
+
A list with the output of the consistency check
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/reference/withModuleRenv.html b/docs/reference/withModuleRenv.html
index 8a44317d..e93bab0b 100644
--- a/docs/reference/withModuleRenv.html
+++ b/docs/reference/withModuleRenv.html
@@ -20,7 +20,7 @@
Strategus
- 0.1.0
+ 0.2.0
@@ -85,7 +85,6 @@ Load module execution space inside and renv
moduleFolder ,
injectVars = list ( ) ,
tempScriptFile = tempfile ( fileext = ".R" ) ,
- useLocalStrategusLibrary = TRUE ,
job = FALSE ,
processName = paste ( moduleFolder , "_renv_run" )
)
@@ -110,11 +109,6 @@ Arguments
tempFile to write script to
-useLocalStrategusLibrary
-Use the locally installed Strategus library? TRUE will use the Strategus
-installation from the calling R process.
-
-
job
run as rstudio job
diff --git a/docs/sitemap.xml b/docs/sitemap.xml
index 6891d7ea..b7a53311 100644
--- a/docs/sitemap.xml
+++ b/docs/sitemap.xml
@@ -36,6 +36,9 @@
/reference/addSharedResources.html
+
+ /reference/compareLockFiles.html
+
/reference/createCdmExecutionSettings.html
@@ -66,6 +69,12 @@
/reference/index.html
+
+ /reference/lockFileToDataFrame.html
+
+
+ /reference/mandatoryPackages.html
+
/reference/retrieveConnectionDetails.html
@@ -78,9 +87,21 @@
/reference/Strategus-package.html
+
+ /reference/suggestedPacakges.html
+
+
+ /reference/syncLockFile.html
+
/reference/unlockKeyring.html
+
+ /reference/validateLockFile.html
+
+
+ /reference/verifyModuleInstallation.html
+
/reference/withModuleRenv.html
diff --git a/extras/ExecuteStrategusOnEunomia.R b/extras/ExecuteStrategusOnEunomia.R
index ff17b7bb..2e23fdf9 100644
--- a/extras/ExecuteStrategusOnEunomia.R
+++ b/extras/ExecuteStrategusOnEunomia.R
@@ -26,14 +26,33 @@ connectionDetails <- Eunomia::getEunomiaConnectionDetails(
Strategus::storeConnectionDetails(connectionDetails = connectionDetails,
connectionDetailsReference = "eunomia")
+# Set the working directory to studyFolder
+# and use relative paths to test
+setwd(studyFolder)
+
+# Execute the study ---------
+analysisSpecifications <- ParallelLogger::loadSettingsFromJson(
+ fileName = system.file("testdata/analysisSpecification.json",
+ package = "Strategus")
+)
+
+resultsExecutionSettings <- Strategus::createResultsExecutionSettings(
+ resultsConnectionDetailsReference = "eunomia",
+ resultsDatabaseSchema = "main",
+ workFolder = file.path("schema_creation", "work_folder"),
+ resultsFolder = file.path("schema_creation", "results_folder")
+)
+
executionSettings <- Strategus::createCdmExecutionSettings(
connectionDetailsReference = "eunomia",
workDatabaseSchema = "main",
cdmDatabaseSchema = "main",
cohortTableNames = CohortGenerator::getCohortTableNames(),
- workFolder = file.path(studyFolder, "work_folder"),
- resultsFolder = file.path(studyFolder, "results_folder"),
- minCellCount = 5
+ workFolder = "work_folder",
+ resultsFolder = "results_folder",
+ minCellCount = 5,
+ resultsConnectionDetailsReference = "eunomia",
+ resultsDatabaseSchema = "main"
)
ParallelLogger::saveSettingsToJson(
@@ -41,16 +60,20 @@ ParallelLogger::saveSettingsToJson(
file.path(studyFolder, "eunomiaExecutionSettings.json")
)
-# Execute the study ---------
-analysisSpecifications <- ParallelLogger::loadSettingsFromJson(
- fileName = system.file("testdata/analysisSpecification.json",
- package = "Strategus")
-)
-
executionSettings <- ParallelLogger::loadSettingsFromJson(
fileName = file.path(studyFolder, "eunomiaExecutionSettings.json")
)
+Strategus::storeConnectionDetails(
+ connectionDetails,
+ resultsConnectionDetailsReference
+)
+
+Strategus::createResultDataModels(
+ analysisSpecifications = analysisSpecifications,
+ executionSettings = resultsExecutionSettings
+)
+
Strategus::execute(
analysisSpecifications = analysisSpecifications,
executionSettings = executionSettings,
diff --git a/extras/PackageMaintenance.R b/extras/PackageMaintenance.R
index c2f4b45d..60ebf2ca 100644
--- a/extras/PackageMaintenance.R
+++ b/extras/PackageMaintenance.R
@@ -1,4 +1,4 @@
-# Copyright 2023 Observational Health Data Sciences and Informatics
+# Copyright 2024 Observational Health Data Sciences and Informatics
#
# This file is part of Strategus
#
@@ -127,7 +127,8 @@ testModuleFilesToRemove <- c(
)
testModuleDirToRemove <- c(
file.path(testModuleRootFolder, ".Rproj.user"),
- file.path(testModuleRootFolder, "renv/library")
+ file.path(testModuleRootFolder, "renv/library"),
+ file.path(testModuleRootFolder, "renv/profiles/dev/renv/library")
)
unlink(testModuleFilesToRemove)
unlink(testModuleDirToRemove, recursive = TRUE)
diff --git a/extras/Strategus.pdf b/extras/Strategus.pdf
index eb5e4ce4..0c6e3306 100644
Binary files a/extras/Strategus.pdf and b/extras/Strategus.pdf differ
diff --git a/extras/TestModule1-0.0.1/.renvignore b/extras/TestModule1-0.0.1/.renvignore
index 04d099ca..8b4af754 100644
--- a/extras/TestModule1-0.0.1/.renvignore
+++ b/extras/TestModule1-0.0.1/.renvignore
@@ -1,3 +1,4 @@
SettingsFunctions.R
extras/
+/tests/
diff --git a/extras/TestModule1-0.0.1/Main.R b/extras/TestModule1-0.0.1/Main.R
index c50a38a0..f4b95422 100644
--- a/extras/TestModule1-0.0.1/Main.R
+++ b/extras/TestModule1-0.0.1/Main.R
@@ -1,4 +1,4 @@
-# Copyright 2023 Observational Health Data Sciences and Informatics
+# Copyright 2024 Observational Health Data Sciences and Informatics
#
# This file is part of Strategus
#
@@ -14,6 +14,16 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+# Adding library references that are required for Strategus
+library(CohortGenerator)
+library(DatabaseConnector)
+library(keyring)
+library(ParallelLogger)
+library(SqlRender)
+
+# Adding RSQLite so that we can test modules with Eunomia
+library(RSQLite)
+
execute <- function(jobContext) {
rlang::inform("Validating inputs")
checkmate::assert_list(x = jobContext)
@@ -66,7 +76,7 @@ execute <- function(jobContext) {
message("Exporting data")
moduleInfo <- getModuleInfo()
resultsFolder <- jobContext$moduleExecutionSettings$resultsSubFolder
- fileName <- file.path(resultsFolder, paste0(moduleInfo$TablePrefix, "data.csv"))
+ fileName <- file.path(resultsFolder, paste0(moduleInfo$TablePrefix, "unit_test.csv"))
readr::write_csv(data, fileName)
# Set the table names in resultsDataModelSpecification.csv
diff --git a/extras/TestModule1-0.0.1/extras/ModuleMaintenance.R b/extras/TestModule1-0.0.1/extras/ModuleMaintenance.R
new file mode 100644
index 00000000..7b05233d
--- /dev/null
+++ b/extras/TestModule1-0.0.1/extras/ModuleMaintenance.R
@@ -0,0 +1,241 @@
+# Copyright 2024 Observational Health Data Sciences and Informatics
+#
+# This file is part of CohortGeneratorModule
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Format and check code:
+styler::style_dir()
+OhdsiRTools::updateCopyrightYearFolder(path = ".", recursive = F)
+OhdsiRTools::updateCopyrightYearFolder(path = "./extras", recursive = F)
+OhdsiRTools::findNonAsciiStringsInFolder()
+
+# Generate renv lock file for default & dev profiles ------------
+# updatedPackages and updatedDevPackages are those packages that either
+# 1. Cannot be synced between the HADES-wide lock file and the project lock files
+# since they are not in semver format
+# 2. Updates to HADES packages
+# NOTE: Mandatory Strategus dependencies:
+# CohortGenerator
+# DatabaseConnector
+# keyring
+# ParallelLogger
+# SqlRender
+# are explicitly included in Main.R as library calls to allow renv's init()
+# function to find them and include them even if they are not used in the
+# module code.
+
+updatedPackages <- list(
+ list(
+ Package = "askpass",
+ Version = "1.2.0",
+ Source = "Repository",
+ Repository = "CRAN"
+ ),
+ "OHDSI/CohortGenerator@v0.8.1",
+ "OHDSI/ResultModelManager@v0.5.6"
+)
+updatedDevPackages <- list(
+ list(
+ Package = "evaluate",
+ Version = "0.22",
+ Source = "Repository",
+ Repository = "CRAN"
+ ),
+ "OHDSI/Eunomia@v1.0.2"
+)
+
+# Deactivates and cleans the project to remove any/all old references
+renv::deactivate(clean = TRUE)
+
+# Initialize the default profile ---------
+renv::activate(profile = NULL)
+# Use the implicit option so renv crawls the full project.
+renv::init(settings = renv::settings$snapshot.type("implicit"))
+# Record the explicit package versions mentioned above
+renv::record(updatedPackages)
+# Force a restore for the default profile
+renv::restore(prompt = FALSE)
+
+# Initialize the dev profile ------------
+renv::activate(profile = "dev") # Creates a new profile called "dev" for development
+
+# Remove the "tests" directory from the .renvignore
+# so the test dependencies are included in the dev lock file
+file.copy(".renvignore", ".renvignore-backup", overwrite = TRUE)
+ignoreFileContents <- readLines(".renvignore")
+ignoreFileContents <- ignoreFileContents[!grepl("/tests/", ignoreFileContents)]
+writeLines(ignoreFileContents, ".renvignore")
+
+# Capture the dependencies
+renv::init(profile = "dev") # Init the 'dev' profile renv.lock with the explicit DESCRIPTION references
+
+# Record the updated packages
+renv::record(c(updatedPackages, updatedDevPackages), lockfile = "renv/profiles/dev/renv.lock")
+
+# Force a restore for the dev profile
+renv::restore(prompt = FALSE)
+
+# Restore the original .renvignore
+unlink(".renvignore")
+file.rename(".renvignore-backup", ".renvignore")
+
+# Re-activate the default profile - the dev profile is only used for unit tests
+renv::activate(profile = NULL) # Sets the default profile as the default for the project
+
+# Sync lock files with HADES-wide lock file --------------
+hadesWideLockFileName <- normalizePath("hades-wide.lock")
+unlink(hadesWideLockFileName)
+utils::download.file(
+ url = "https://raw.githubusercontent.com/OHDSI/Hades/main/hadesWideReleases/2023Q3/renv.lock",
+ destfile = hadesWideLockFileName
+)
+# Verify the package versions across lock files
+compareLockFiles <- function(filename1, filename2) {
+ # Read the lock files
+ lockfile1 <- renv::lockfile_read(
+ file = filename1
+ )
+ print(normalizePath(filename2))
+ lockfile2 <- renv::lockfile_read(
+ file = filename2
+ )
+ # internal function to read lock file into data frame
+ lockFileToDataFrame <- function(lf) {
+ df <- data.frame()
+ for (i in 1:length(lf$Packages)) {
+ df <- rbind(
+ df,
+ data.frame(
+ Name = lf$Packages[[i]]$Package,
+ Version = lf$Packages[[i]]$Version,
+ RemoteRef = ifelse(is.null(lf$Packages[[i]]$RemoteRef), yes = NA, no = lf$Packages[[i]]$RemoteRef)
+ )
+ )
+ }
+ return(df)
+ }
+ lockfile1Packages <- lockFileToDataFrame(lockfile1)
+ names(lockfile1Packages) <- paste0("lockfile1", names(lockfile1Packages))
+ lockfile2Packages <- lockFileToDataFrame(lockfile2)
+ names(lockfile2Packages) <- paste0("lockfile2", names(lockfile2Packages))
+ mergedLockFilePackages <- merge(
+ x = lockfile1Packages,
+ y = lockfile2Packages,
+ by.x = "lockfile1Name",
+ by.y = "lockfile2Name",
+ all = TRUE
+ )
+ return(mergedLockFilePackages)
+}
+
+# Compare HADES-wide lock file to the dev lock file
+hwVsProjDevLockFile <- compareLockFiles(
+ filename1 = hadesWideLockFileName,
+ filename2 = "renv/profiles/dev/renv.lock"
+)
+hwVsProjDevLockFile[!is.na(hwVsProjDevLockFile$lockfile2Version) & hwVsProjDevLockFile$lockfile1Version != hwVsProjDevLockFile$lockfile2Version, ]
+
+# Compare project default lock file to the dev lock file
+projDevVsProjLockFile <- compareLockFiles(
+ filename1 = "renv/profiles/dev/renv.lock",
+ filename2 = "renv.lock"
+)
+projDevVsProjLockFile[!is.na(projDevVsProjLockFile$lockfile2Version) & projDevVsProjLockFile$lockfile1Version != projDevVsProjLockFile$lockfile2Version, ]
+
+# Given a source of truth lock file, update the target
+# lock file. Only replace the version in the target
+# lock file if the version is newer. Provide a warning
+# for those packages that could not be evaluated by
+# version #
+renv::install("semver")
+syncLockFile <- function(sourceOfTruthLockFileName, targetLockFileName) {
+ findPackageByName <- function(list, packageName) {
+ index <- which(sapply(list, function(x) x$Package == packageName))
+ return(index)
+ }
+
+ # Read the lock files
+ sourceOfTruthLockFile <- renv::lockfile_read(
+ file = sourceOfTruthLockFileName
+ )
+ targetLockFile <- renv::lockfile_read(
+ file = targetLockFileName
+ )
+
+ # Compare the lock files to get the differences in package versions
+ comparedLockFiles <- compareLockFiles(
+ filename1 = sourceOfTruthLockFileName,
+ filename2 = targetLockFileName
+ )
+ verDiffs <- comparedLockFiles[!is.na(comparedLockFiles$lockfile2Version) &
+ comparedLockFiles$lockfile1Version != comparedLockFiles$lockfile2Version, ]
+ verDiffs <- verDiffs[!is.na(verDiffs$lockfile1Name), ]
+
+ if (nrow(verDiffs) == 0) {
+ rlang::inform("Lock files are already in sync.")
+ return(invisible(NULL))
+ }
+
+ # Update the target lock file based on the source of truth
+ for (i in 1:nrow(verDiffs)) {
+ index <- findPackageByName(targetLockFile$Packages, verDiffs[i, ]$lockfile1Name)
+ # Can we detect if the version is greater
+ tryCatch(expr = {
+ semverPattern <- "^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?(?:\\+[0-9A-Za-z-]+)?$"
+ sourceOfTruthVersion <- verDiffs[i, ]$lockfile1Version
+ targetVersion <- targetLockFile$Packages[[index]]$Version
+ if (grepl(semverPattern, sourceOfTruthVersion) && grepl(semverPattern, targetVersion)) {
+ sourceOfTruthVersion <- semver::parse_version(sourceOfTruthVersion)
+ targetVersion <- semver::parse_version(targetVersion)
+ if (sourceOfTruthVersion > targetVersion) {
+ rlang::inform(
+ message = paste(verDiffs[i, ]$lockfile1Name, "[", targetVersion, "->", sourceOfTruthVersion, "]")
+ )
+ targetLockFile$Packages[[index]]$Version <- verDiffs[i, ]$lockfile1Version
+ if (!is.na(verDiffs[i, ]$lockfile1RemoteRef)) {
+ targetLockFile$Packages[[index]]$RemoteRef <- verDiffs[i, ]$lockfile1RemoteRef
+ }
+ } else {
+ rlang::inform(
+ message = paste(verDiffs[i, ]$lockfile1Name, "[ SKIPPING - ", targetVersion, ">", sourceOfTruthVersion, "]")
+ )
+ }
+ } else {
+ rlang::warn(paste0("Package: [", verDiffs[i, ]$lockfile1Name, "] - version number could not be parsed. Please inspect manually as it may require an upgrade."))
+ }
+ }, error = function(err) {
+ rlang::inform("An error occurred:", str(err), "\n")
+ })
+ }
+
+ # Save the updated lock file
+ renv::lockfile_write(
+ lockfile = targetLockFile,
+ file = targetLockFileName
+ )
+}
+
+syncLockFile(
+ sourceOfTruthLockFileName = hadesWideLockFileName,
+ targetLockFileName = "renv/profiles/dev/renv.lock"
+)
+
+syncLockFile(
+ sourceOfTruthLockFileName = "renv/profiles/dev/renv.lock",
+ targetLockFileName = "renv.lock"
+)
+
+# NOTE: Use the compare functions above to verify the files are in sync
+# and add any dependencies that could not be synced automatically to the
+# updatedPackages and updatedDevPackages respectively.
diff --git a/extras/TestModule1-0.0.1/hades-wide.lock b/extras/TestModule1-0.0.1/hades-wide.lock
new file mode 100644
index 00000000..089d5ad4
--- /dev/null
+++ b/extras/TestModule1-0.0.1/hades-wide.lock
@@ -0,0 +1,1565 @@
+{
+ "R" : {
+ "Version" : "4.2.3",
+ "Repositories" : [
+ {
+ "Name" : "CRAN",
+ "URL" : "https://cloud.r-project.org"
+ }
+ ]
+ },
+ "Packages" : {
+ "cli" : {
+ "Package" : "cli",
+ "Version" : "3.6.1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "glue" : {
+ "Package" : "glue",
+ "Version" : "1.6.2",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "rlang" : {
+ "Package" : "rlang",
+ "Version" : "1.1.1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "lifecycle" : {
+ "Package" : "lifecycle",
+ "Version" : "1.0.3",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "fansi" : {
+ "Package" : "fansi",
+ "Version" : "1.0.4",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "ps" : {
+ "Package" : "ps",
+ "Version" : "1.7.5",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "R6" : {
+ "Package" : "R6",
+ "Version" : "2.5.1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "utf8" : {
+ "Package" : "utf8",
+ "Version" : "1.2.3",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "vctrs" : {
+ "Package" : "vctrs",
+ "Version" : "0.6.3",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "base64enc" : {
+ "Package" : "base64enc",
+ "Version" : "0.1-3",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "digest" : {
+ "Package" : "digest",
+ "Version" : "0.6.33",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "ellipsis" : {
+ "Package" : "ellipsis",
+ "Version" : "0.3.2",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "fastmap" : {
+ "Package" : "fastmap",
+ "Version" : "1.1.1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "magrittr" : {
+ "Package" : "magrittr",
+ "Version" : "2.0.3",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "pillar" : {
+ "Package" : "pillar",
+ "Version" : "1.9.0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "pkgconfig" : {
+ "Package" : "pkgconfig",
+ "Version" : "2.0.3",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "processx" : {
+ "Package" : "processx",
+ "Version" : "3.8.2",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "rprojroot" : {
+ "Package" : "rprojroot",
+ "Version" : "2.0.3",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "withr" : {
+ "Package" : "withr",
+ "Version" : "2.5.1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "bit" : {
+ "Package" : "bit",
+ "Version" : "4.0.5",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "cachem" : {
+ "Package" : "cachem",
+ "Version" : "1.0.8",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "callr" : {
+ "Package" : "callr",
+ "Version" : "3.7.3",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "cpp11" : {
+ "Package" : "cpp11",
+ "Version" : "0.4.6",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "crayon" : {
+ "Package" : "crayon",
+ "Version" : "1.5.2",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "desc" : {
+ "Package" : "desc",
+ "Version" : "1.4.2",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "fs" : {
+ "Package" : "fs",
+ "Version" : "1.6.3",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "generics" : {
+ "Package" : "generics",
+ "Version" : "0.1.3",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "hms" : {
+ "Package" : "hms",
+ "Version" : "1.1.3",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "htmltools" : {
+ "Package" : "htmltools",
+ "Version" : "0.5.6",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "prettyunits" : {
+ "Package" : "prettyunits",
+ "Version" : "1.2.0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "rappdirs" : {
+ "Package" : "rappdirs",
+ "Version" : "0.3.3",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "Rcpp" : {
+ "Package" : "Rcpp",
+ "Version" : "1.0.11",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "stringi" : {
+ "Package" : "stringi",
+ "Version" : "1.7.12",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "tibble" : {
+ "Package" : "tibble",
+ "Version" : "3.2.1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "tidyselect" : {
+ "Package" : "tidyselect",
+ "Version" : "1.2.0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "xfun" : {
+ "Package" : "xfun",
+ "Version" : "0.40",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "backports" : {
+ "Package" : "backports",
+ "Version" : "1.4.1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "bit64" : {
+ "Package" : "bit64",
+ "Version" : "4.0.5",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "colorspace" : {
+ "Package" : "colorspace",
+ "Version" : "2.1-0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "diffobj" : {
+ "Package" : "diffobj",
+ "Version" : "0.3.5",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "dplyr" : {
+ "Package" : "dplyr",
+ "Version" : "1.1.3",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "evaluate" : {
+ "Package" : "evaluate",
+ "Version" : "0.22",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "highr" : {
+ "Package" : "highr",
+ "Version" : "0.10",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "jquerylib" : {
+ "Package" : "jquerylib",
+ "Version" : "0.1.4",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "jsonlite" : {
+ "Package" : "jsonlite",
+ "Version" : "1.8.7",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "later" : {
+ "Package" : "later",
+ "Version" : "1.3.1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "lattice" : {
+ "Package" : "lattice",
+ "Version" : "0.20-45",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "memoise" : {
+ "Package" : "memoise",
+ "Version" : "2.0.1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "mime" : {
+ "Package" : "mime",
+ "Version" : "0.12",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "pkgbuild" : {
+ "Package" : "pkgbuild",
+ "Version" : "1.4.2",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "progress" : {
+ "Package" : "progress",
+ "Version" : "1.2.2",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "purrr" : {
+ "Package" : "purrr",
+ "Version" : "1.0.2",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "rematch2" : {
+ "Package" : "rematch2",
+ "Version" : "2.1.2",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "sass" : {
+ "Package" : "sass",
+ "Version" : "0.4.7",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "stringr" : {
+ "Package" : "stringr",
+ "Version" : "1.5.0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "sys" : {
+ "Package" : "sys",
+ "Version" : "3.4.2",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "tzdb" : {
+ "Package" : "tzdb",
+ "Version" : "0.4.0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "yaml" : {
+ "Package" : "yaml",
+ "Version" : "2.3.7",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "askpass" : {
+ "Package" : "askpass",
+ "Version" : "1.2.0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "blob" : {
+ "Package" : "blob",
+ "Version" : "1.2.4",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "brio" : {
+ "Package" : "brio",
+ "Version" : "1.1.3",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "bslib" : {
+ "Package" : "bslib",
+ "Version" : "0.5.1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "checkmate" : {
+ "Package" : "checkmate",
+ "Version" : "2.2.0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "clipr" : {
+ "Package" : "clipr",
+ "Version" : "0.8.0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "DBI" : {
+ "Package" : "DBI",
+ "Version" : "1.1.3",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "farver" : {
+ "Package" : "farver",
+ "Version" : "2.1.1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "fontawesome" : {
+ "Package" : "fontawesome",
+ "Version" : "0.5.2",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "knitr" : {
+ "Package" : "knitr",
+ "Version" : "1.44",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "labeling" : {
+ "Package" : "labeling",
+ "Version" : "0.4.3",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "Matrix" : {
+ "Package" : "Matrix",
+ "Version" : "1.6-0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "munsell" : {
+ "Package" : "munsell",
+ "Version" : "0.5.0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "nlme" : {
+ "Package" : "nlme",
+ "Version" : "3.1-162",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "pkgload" : {
+ "Package" : "pkgload",
+ "Version" : "1.3.3",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "plogr" : {
+ "Package" : "plogr",
+ "Version" : "0.2.0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "praise" : {
+ "Package" : "praise",
+ "Version" : "1.0.0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "promises" : {
+ "Package" : "promises",
+ "Version" : "1.2.1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "RColorBrewer" : {
+ "Package" : "RColorBrewer",
+ "Version" : "1.1-3",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "rJava" : {
+ "Package" : "rJava",
+ "Version" : "1.0-6",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "tidyr" : {
+ "Package" : "tidyr",
+ "Version" : "1.3.0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "tinytex" : {
+ "Package" : "tinytex",
+ "Version" : "0.47",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "triebeard" : {
+ "Package" : "triebeard",
+ "Version" : "0.4.1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "viridisLite" : {
+ "Package" : "viridisLite",
+ "Version" : "0.4.2",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "vroom" : {
+ "Package" : "vroom",
+ "Version" : "1.6.3",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "waldo" : {
+ "Package" : "waldo",
+ "Version" : "0.5.1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "zoo" : {
+ "Package" : "zoo",
+ "Version" : "1.8-12",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "BH" : {
+ "Package" : "BH",
+ "Version" : "1.81.0-1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "commonmark" : {
+ "Package" : "commonmark",
+ "Version" : "1.9.0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "curl" : {
+ "Package" : "curl",
+ "Version" : "5.1.0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "dbplyr" : {
+ "Package" : "dbplyr",
+ "Version" : "2.3.4",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "gtable" : {
+ "Package" : "gtable",
+ "Version" : "0.3.4",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "httpuv" : {
+ "Package" : "httpuv",
+ "Version" : "1.6.11",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "isoband" : {
+ "Package" : "isoband",
+ "Version" : "0.2.7",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "lazyeval" : {
+ "Package" : "lazyeval",
+ "Version" : "0.2.2",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "MASS" : {
+ "Package" : "MASS",
+ "Version" : "7.3-58.2",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "mathjaxr" : {
+ "Package" : "mathjaxr",
+ "Version" : "1.6-0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "mgcv" : {
+ "Package" : "mgcv",
+ "Version" : "1.8-42",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "openssl" : {
+ "Package" : "openssl",
+ "Version" : "2.1.1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "readr" : {
+ "Package" : "readr",
+ "Version" : "2.1.4",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "rmarkdown" : {
+ "Package" : "rmarkdown",
+ "Version" : "2.25",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "RSQLite" : {
+ "Package" : "RSQLite",
+ "Version" : "2.3.1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "scales" : {
+ "Package" : "scales",
+ "Version" : "1.2.1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "snow" : {
+ "Package" : "snow",
+ "Version" : "0.4-4",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "sourcetools" : {
+ "Package" : "sourcetools",
+ "Version" : "0.1.7-1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "SqlRender" : {
+ "Package" : "SqlRender",
+ "Version" : "1.16.1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "testthat" : {
+ "Package" : "testthat",
+ "Version" : "3.1.10",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "urltools" : {
+ "Package" : "urltools",
+ "Version" : "1.7.3",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "xml2" : {
+ "Package" : "xml2",
+ "Version" : "1.3.5",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "xtable" : {
+ "Package" : "xtable",
+ "Version" : "1.8-4",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "xts" : {
+ "Package" : "xts",
+ "Version" : "0.13.1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "zip" : {
+ "Package" : "zip",
+ "Version" : "2.3.0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "Andromeda" : {
+ "Package" : "Andromeda",
+ "Version" : "0.6.3",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "anytime" : {
+ "Package" : "anytime",
+ "Version" : "0.3.9",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "boot" : {
+ "Package" : "boot",
+ "Version" : "1.3-28.1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "crosstalk" : {
+ "Package" : "crosstalk",
+ "Version" : "1.2.0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "data.table" : {
+ "Package" : "data.table",
+ "Version" : "1.14.8",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "DatabaseConnector" : {
+ "Package" : "DatabaseConnector",
+ "Version" : "6.2.4",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "formatR" : {
+ "Package" : "formatR",
+ "Version" : "1.14",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "ggplot2" : {
+ "Package" : "ggplot2",
+ "Version" : "3.4.3",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "here" : {
+ "Package" : "here",
+ "Version" : "1.0.1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "htmlwidgets" : {
+ "Package" : "htmlwidgets",
+ "Version" : "1.6.2",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "httr" : {
+ "Package" : "httr",
+ "Version" : "1.4.7",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "metadat" : {
+ "Package" : "metadat",
+ "Version" : "1.2-0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "minqa" : {
+ "Package" : "minqa",
+ "Version" : "1.2.6",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "nloptr" : {
+ "Package" : "nloptr",
+ "Version" : "2.0.3",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "numDeriv" : {
+ "Package" : "numDeriv",
+ "Version" : "2016.8-1.1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "ParallelLogger" : {
+ "Package" : "ParallelLogger",
+ "Version" : "3.3.0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "pbapply" : {
+ "Package" : "pbapply",
+ "Version" : "1.7-2",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "plyr" : {
+ "Package" : "plyr",
+ "Version" : "1.8.9",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "png" : {
+ "Package" : "png",
+ "Version" : "0.1-8",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "RcppEigen" : {
+ "Package" : "RcppEigen",
+ "Version" : "0.3.3.9.3",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "RcppTOML" : {
+ "Package" : "RcppTOML",
+ "Version" : "0.2.2",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "reactR" : {
+ "Package" : "reactR",
+ "Version" : "0.4.4",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "RJSONIO" : {
+ "Package" : "RJSONIO",
+ "Version" : "1.3-1.8",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "shiny" : {
+ "Package" : "shiny",
+ "Version" : "1.7.5",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "survival" : {
+ "Package" : "survival",
+ "Version" : "3.5-3",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "timechange" : {
+ "Package" : "timechange",
+ "Version" : "0.2.0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "TTR" : {
+ "Package" : "TTR",
+ "Version" : "0.24.3",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "assertthat" : {
+ "Package" : "assertthat",
+ "Version" : "0.2.1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "CompQuadForm" : {
+ "Package" : "CompQuadForm",
+ "Version" : "1.4.3",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "cowplot" : {
+ "Package" : "cowplot",
+ "Version" : "1.1.1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "Cyclops" : {
+ "Package" : "Cyclops",
+ "Version" : "3.3.1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "distributional" : {
+ "Package" : "distributional",
+ "Version" : "0.3.2",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "DT" : {
+ "Package" : "DT",
+ "Version" : "0.30",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "filelock" : {
+ "Package" : "filelock",
+ "Version" : "1.0.2",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "futile.options" : {
+ "Package" : "futile.options",
+ "Version" : "1.0.1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "gridExtra" : {
+ "Package" : "gridExtra",
+ "Version" : "2.3",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "lambda.r" : {
+ "Package" : "lambda.r",
+ "Version" : "1.2.4",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "lme4" : {
+ "Package" : "lme4",
+ "Version" : "1.1-34",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "lubridate" : {
+ "Package" : "lubridate",
+ "Version" : "1.9.3",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "markdown" : {
+ "Package" : "markdown",
+ "Version" : "1.9",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "memuse" : {
+ "Package" : "memuse",
+ "Version" : "4.2-3",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "metafor" : {
+ "Package" : "metafor",
+ "Version" : "4.4-0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "plotly" : {
+ "Package" : "plotly",
+ "Version" : "4.10.2",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "polspline" : {
+ "Package" : "polspline",
+ "Version" : "1.1.23",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "pool" : {
+ "Package" : "pool",
+ "Version" : "1.0.1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "pROC" : {
+ "Package" : "pROC",
+ "Version" : "1.18.4",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "PRROC" : {
+ "Package" : "PRROC",
+ "Version" : "1.3.1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "quadprog" : {
+ "Package" : "quadprog",
+ "Version" : "1.5-8",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "quantmod" : {
+ "Package" : "quantmod",
+ "Version" : "0.4.25",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "reactable" : {
+ "Package" : "reactable",
+ "Version" : "0.4.4",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "reticulate" : {
+ "Package" : "reticulate",
+ "Version" : "1.32.0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "shinycssloaders" : {
+ "Package" : "shinycssloaders",
+ "Version" : "1.0.0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "shinydashboard" : {
+ "Package" : "shinydashboard",
+ "Version" : "0.7.2",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "shinyWidgets" : {
+ "Package" : "shinyWidgets",
+ "Version" : "0.8.0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "sodium" : {
+ "Package" : "sodium",
+ "Version" : "1.3.0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "tippy" : {
+ "Package" : "tippy",
+ "Version" : "0.1.0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "BeastJar" : {
+ "Package" : "BeastJar",
+ "Version" : "1.10.6",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "clock" : {
+ "Package" : "clock",
+ "Version" : "0.7.0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "coda" : {
+ "Package" : "coda",
+ "Version" : "0.19-4",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "EmpiricalCalibration" : {
+ "Package" : "EmpiricalCalibration",
+ "Version" : "3.1.1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "futile.logger" : {
+ "Package" : "futile.logger",
+ "Version" : "1.4.3",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "ggdist" : {
+ "Package" : "ggdist",
+ "Version" : "3.3.0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "HDInterval" : {
+ "Package" : "HDInterval",
+ "Version" : "0.2.4",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "keyring" : {
+ "Package" : "keyring",
+ "Version" : "1.3.1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "meta" : {
+ "Package" : "meta",
+ "Version" : "6.5-0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "openxlsx" : {
+ "Package" : "openxlsx",
+ "Version" : "4.2.5.2",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "rateratio.test" : {
+ "Package" : "rateratio.test",
+ "Version" : "1.1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "remotes" : {
+ "Package" : "remotes",
+ "Version" : "2.4.2.1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "tseries" : {
+ "Package" : "tseries",
+ "Version" : "0.10-54",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "Achilles" : {
+ "Package" : "Achilles",
+ "Version" : "1.7.2",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "BrokenAdaptiveRidge" : {
+ "Package" : "BrokenAdaptiveRidge",
+ "Version" : "1.0.0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "CohortExplorer" : {
+ "Package" : "CohortExplorer",
+ "Version" : "0.0.17",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "EvidenceSynthesis" : {
+ "Package" : "EvidenceSynthesis",
+ "Version" : "0.5.0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "IterativeHardThresholding" : {
+ "Package" : "IterativeHardThresholding",
+ "Version" : "1.0.2",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "lightgbm" : {
+ "Package" : "lightgbm",
+ "Version" : "3.3.5",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "broom" : {
+ "Package" : "broom",
+ "Version" : "1.0.5",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "MatrixModels" : {
+ "Package" : "MatrixModels",
+ "Version" : "0.5-2",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "SparseM" : {
+ "Package" : "SparseM",
+ "Version" : "1.81",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "abind" : {
+ "Package" : "abind",
+ "Version" : "1.4-5",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "carData" : {
+ "Package" : "carData",
+ "Version" : "3.0-5",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "nnet" : {
+ "Package" : "nnet",
+ "Version" : "7.3-18",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "pbkrtest" : {
+ "Package" : "pbkrtest",
+ "Version" : "0.5.2",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "quantreg" : {
+ "Package" : "quantreg",
+ "Version" : "5.97",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "car" : {
+ "Package" : "car",
+ "Version" : "3.1-2",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "corrplot" : {
+ "Package" : "corrplot",
+ "Version" : "0.92",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "jpeg" : {
+ "Package" : "jpeg",
+ "Version" : "0.1-10",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "exactRankTests" : {
+ "Package" : "exactRankTests",
+ "Version" : "0.8-35",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "ggrepel" : {
+ "Package" : "ggrepel",
+ "Version" : "0.9.3",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "ggsci" : {
+ "Package" : "ggsci",
+ "Version" : "3.0.0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "ggsignif" : {
+ "Package" : "ggsignif",
+ "Version" : "0.6.4",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "gridtext" : {
+ "Package" : "gridtext",
+ "Version" : "0.1.5",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "km.ci" : {
+ "Package" : "km.ci",
+ "Version" : "0.5-6",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "KMsurv" : {
+ "Package" : "KMsurv",
+ "Version" : "0.1-5",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "mvtnorm" : {
+ "Package" : "mvtnorm",
+ "Version" : "1.2-3",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "polynom" : {
+ "Package" : "polynom",
+ "Version" : "1.4-1",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "rstatix" : {
+ "Package" : "rstatix",
+ "Version" : "0.7.2",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "ggpubr" : {
+ "Package" : "ggpubr",
+ "Version" : "0.6.0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "ggtext" : {
+ "Package" : "ggtext",
+ "Version" : "0.1.2",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "maxstat" : {
+ "Package" : "maxstat",
+ "Version" : "0.7-25",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "survMisc" : {
+ "Package" : "survMisc",
+ "Version" : "0.5.6",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "survminer" : {
+ "Package" : "survminer",
+ "Version" : "0.4.9",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "aws.signature" : {
+ "Package" : "aws.signature",
+ "Version" : "0.6.0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "aws.s3" : {
+ "Package" : "aws.s3",
+ "Version" : "0.3.21",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "R.methodsS3" : {
+ "Package" : "R.methodsS3",
+ "Version" : "1.8.2",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "R.oo" : {
+ "Package" : "R.oo",
+ "Version" : "1.25.0",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "R.utils" : {
+ "Package" : "R.utils",
+ "Version" : "2.12.2",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "renv" : {
+ "Package" : "renv",
+ "Version" : "1.0.3",
+ "Source" : "Repository",
+ "Repository" : "CRAN"
+ },
+ "CirceR" : {
+ "Package" : "CirceR",
+ "Version" : "1.3.1",
+ "Source" : "GitHub",
+ "RemoteType" : "github",
+ "RemoteHost" : "api.github.com",
+ "RemoteRepo" : "CirceR",
+ "RemoteUsername" : "ohdsi",
+ "RemoteRef" : "v1.3.1"
+ },
+ "FeatureExtraction" : {
+ "Package" : "FeatureExtraction",
+ "Version" : "3.3.1",
+ "Source" : "GitHub",
+ "RemoteType" : "github",
+ "RemoteHost" : "api.github.com",
+ "RemoteRepo" : "FeatureExtraction",
+ "RemoteUsername" : "ohdsi",
+ "RemoteRef" : "v3.3.1"
+ },
+ "CohortGenerator" : {
+ "Package" : "CohortGenerator",
+ "Version" : "0.8.0",
+ "Source" : "GitHub",
+ "RemoteType" : "github",
+ "RemoteHost" : "api.github.com",
+ "RemoteRepo" : "CohortGenerator",
+ "RemoteUsername" : "ohdsi",
+ "RemoteRef" : "v0.8.0"
+ },
+ "OhdsiShinyModules" : {
+ "Package" : "OhdsiShinyModules",
+ "Version" : "1.1.0",
+ "Source" : "GitHub",
+ "RemoteType" : "github",
+ "RemoteHost" : "api.github.com",
+ "RemoteRepo" : "OhdsiShinyModules",
+ "RemoteUsername" : "ohdsi",
+ "RemoteRef" : "v1.1.0"
+ },
+ "PatientLevelPrediction" : {
+ "Package" : "PatientLevelPrediction",
+ "Version" : "6.3.5",
+ "Source" : "GitHub",
+ "RemoteType" : "github",
+ "RemoteHost" : "api.github.com",
+ "RemoteRepo" : "PatientLevelPrediction",
+ "RemoteUsername" : "ohdsi",
+ "RemoteRef" : "v6.3.5"
+ },
+ "ResultModelManager" : {
+ "Package" : "ResultModelManager",
+ "Version" : "0.5.1",
+ "Source" : "GitHub",
+ "RemoteType" : "github",
+ "RemoteHost" : "api.github.com",
+ "RemoteRepo" : "ResultModelManager",
+ "RemoteUsername" : "ohdsi",
+ "RemoteRef" : "v0.5.1"
+ },
+ "BigKnn" : {
+ "Package" : "BigKnn",
+ "Version" : "1.0.2",
+ "Source" : "GitHub",
+ "RemoteType" : "github",
+ "RemoteHost" : "api.github.com",
+ "RemoteRepo" : "BigKnn",
+ "RemoteUsername" : "ohdsi",
+ "RemoteRef" : "v1.0.2"
+ },
+ "Capr" : {
+ "Package" : "Capr",
+ "Version" : "2.0.7",
+ "Source" : "GitHub",
+ "RemoteType" : "github",
+ "RemoteHost" : "api.github.com",
+ "RemoteRepo" : "Capr",
+ "RemoteUsername" : "ohdsi",
+ "RemoteRef" : "v2.0.7"
+ },
+ "Characterization" : {
+ "Package" : "Characterization",
+ "Version" : "0.1.1",
+ "Source" : "GitHub",
+ "RemoteType" : "github",
+ "RemoteHost" : "api.github.com",
+ "RemoteRepo" : "Characterization",
+ "RemoteUsername" : "ohdsi",
+ "RemoteRef" : "v0.1.1"
+ },
+ "CohortDiagnostics" : {
+ "Package" : "CohortDiagnostics",
+ "Version" : "3.2.4",
+ "Source" : "GitHub",
+ "RemoteType" : "github",
+ "RemoteHost" : "api.github.com",
+ "RemoteRepo" : "CohortDiagnostics",
+ "RemoteUsername" : "ohdsi",
+ "RemoteRef" : "v3.2.4"
+ },
+ "CohortMethod" : {
+ "Package" : "CohortMethod",
+ "Version" : "5.1.0",
+ "Source" : "GitHub",
+ "RemoteType" : "github",
+ "RemoteHost" : "api.github.com",
+ "RemoteRepo" : "CohortMethod",
+ "RemoteUsername" : "ohdsi",
+ "RemoteRef" : "v5.1.0"
+ },
+ "DataQualityDashboard" : {
+ "Package" : "DataQualityDashboard",
+ "Version" : "2.4.0",
+ "Source" : "GitHub",
+ "RemoteType" : "github",
+ "RemoteHost" : "api.github.com",
+ "RemoteRepo" : "DataQualityDashboard",
+ "RemoteUsername" : "ohdsi",
+ "RemoteRef" : "v2.4.0"
+ },
+ "DeepPatientLevelPrediction" : {
+ "Package" : "DeepPatientLevelPrediction",
+ "Version" : "2.0.0",
+ "Source" : "GitHub",
+ "RemoteType" : "github",
+ "RemoteHost" : "api.github.com",
+ "RemoteRepo" : "DeepPatientLevelPrediction",
+ "RemoteUsername" : "ohdsi",
+ "RemoteRef" : "v2.0.0"
+ },
+ "EnsemblePatientLevelPrediction" : {
+ "Package" : "EnsemblePatientLevelPrediction",
+ "Version" : "1.0.2",
+ "Source" : "GitHub",
+ "RemoteType" : "github",
+ "RemoteHost" : "api.github.com",
+ "RemoteRepo" : "EnsemblePatientLevelPrediction",
+ "RemoteUsername" : "ohdsi",
+ "RemoteRef" : "v1.0.2"
+ },
+ "Eunomia" : {
+ "Package" : "Eunomia",
+ "Version" : "1.0.2",
+ "Source" : "GitHub",
+ "RemoteType" : "github",
+ "RemoteHost" : "api.github.com",
+ "RemoteRepo" : "Eunomia",
+ "RemoteUsername" : "ohdsi",
+ "RemoteRef" : "v1.0.2"
+ },
+ "Hydra" : {
+ "Package" : "Hydra",
+ "Version" : "0.4.0",
+ "Source" : "GitHub",
+ "RemoteType" : "github",
+ "RemoteHost" : "api.github.com",
+ "RemoteRepo" : "Hydra",
+ "RemoteUsername" : "ohdsi",
+ "RemoteRef" : "v0.4.0"
+ },
+ "MethodEvaluation" : {
+ "Package" : "MethodEvaluation",
+ "Version" : "2.3.0",
+ "Source" : "GitHub",
+ "RemoteType" : "github",
+ "RemoteHost" : "api.github.com",
+ "RemoteRepo" : "MethodEvaluation",
+ "RemoteUsername" : "ohdsi",
+ "RemoteRef" : "v2.3.0"
+ },
+ "OhdsiSharing" : {
+ "Package" : "OhdsiSharing",
+ "Version" : "0.2.2",
+ "Source" : "GitHub",
+ "RemoteType" : "github",
+ "RemoteHost" : "api.github.com",
+ "RemoteRepo" : "OhdsiSharing",
+ "RemoteUsername" : "ohdsi",
+ "RemoteRef" : "v0.2.2"
+ },
+ "PhenotypeLibrary" : {
+ "Package" : "PhenotypeLibrary",
+ "Version" : "3.25.0",
+ "Source" : "GitHub",
+ "RemoteType" : "github",
+ "RemoteHost" : "api.github.com",
+ "RemoteRepo" : "PhenotypeLibrary",
+ "RemoteUsername" : "ohdsi",
+ "RemoteRef" : "v3.25.0"
+ },
+ "PheValuator" : {
+ "Package" : "PheValuator",
+ "Version" : "2.2.10",
+ "Source" : "GitHub",
+ "RemoteType" : "github",
+ "RemoteHost" : "api.github.com",
+ "RemoteRepo" : "PheValuator",
+ "RemoteUsername" : "ohdsi",
+ "RemoteRef" : "v2.2.10"
+ },
+ "ROhdsiWebApi" : {
+ "Package" : "ROhdsiWebApi",
+ "Version" : "1.3.3",
+ "Source" : "GitHub",
+ "RemoteType" : "github",
+ "RemoteHost" : "api.github.com",
+ "RemoteRepo" : "ROhdsiWebApi",
+ "RemoteUsername" : "ohdsi",
+ "RemoteRef" : "v1.3.3"
+ },
+ "SelfControlledCaseSeries" : {
+ "Package" : "SelfControlledCaseSeries",
+ "Version" : "4.2.0",
+ "Source" : "GitHub",
+ "RemoteType" : "github",
+ "RemoteHost" : "api.github.com",
+ "RemoteRepo" : "SelfControlledCaseSeries",
+ "RemoteUsername" : "ohdsi",
+ "RemoteRef" : "v4.2.0"
+ },
+ "SelfControlledCohort" : {
+ "Package" : "SelfControlledCohort",
+ "Version" : "1.6.0",
+ "Source" : "GitHub",
+ "RemoteType" : "github",
+ "RemoteHost" : "api.github.com",
+ "RemoteRepo" : "SelfControlledCohort",
+ "RemoteUsername" : "ohdsi",
+ "RemoteRef" : "v1.6.0"
+ },
+ "ShinyAppBuilder" : {
+ "Package" : "ShinyAppBuilder",
+ "Version" : "1.1.2",
+ "Source" : "GitHub",
+ "RemoteType" : "github",
+ "RemoteHost" : "api.github.com",
+ "RemoteRepo" : "ShinyAppBuilder",
+ "RemoteUsername" : "ohdsi",
+ "RemoteRef" : "v1.1.2"
+ },
+ "Hades" : {
+ "Package" : "Hades",
+ "Version" : "1.13.0",
+ "Source" : "GitHub",
+ "RemoteType" : "github",
+ "RemoteHost" : "api.github.com",
+ "RemoteRepo" : "Hades",
+ "RemoteUsername" : "ohdsi",
+ "RemoteRef" : "v1.13.0"
+ }
+ }
+}
diff --git a/extras/TestModule1-0.0.1/renv.lock b/extras/TestModule1-0.0.1/renv.lock
index fd7ee4bf..5b9b102d 100644
--- a/extras/TestModule1-0.0.1/renv.lock
+++ b/extras/TestModule1-0.0.1/renv.lock
@@ -9,453 +9,141 @@
]
},
"Packages": {
- "Andromeda": {
- "Package": "Andromeda",
- "Version": "0.6.3",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "BH": {
- "Package": "BH",
- "Version": "1.81.0-1",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "BeastJar": {
- "Package": "BeastJar",
- "Version": "1.10.6",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "BigKnn": {
- "Package": "BigKnn",
- "Version": "1.0.2",
- "Source": "GitHub",
- "RemoteType": "github",
- "RemoteHost": "api.github.com",
- "RemoteRepo": "BigKnn",
- "RemoteUsername": "ohdsi",
- "RemoteRef": "v1.0.2"
- },
- "Capr": {
- "Package": "Capr",
- "Version": "2.0.0",
- "Source": "GitHub",
- "RemoteType": "github",
- "RemoteHost": "api.github.com",
- "RemoteRepo": "Capr",
- "RemoteUsername": "ohdsi",
- "RemoteRef": "v2.0.0"
- },
- "Characterization": {
- "Package": "Characterization",
- "Version": "0.1.1",
- "Source": "GitHub",
- "RemoteType": "github",
- "RemoteHost": "api.github.com",
- "RemoteRepo": "Characterization",
- "RemoteUsername": "ohdsi",
- "RemoteRef": "v0.1.1"
- },
- "CirceR": {
- "Package": "CirceR",
- "Version": "1.3.0",
- "Source": "GitHub",
- "RemoteType": "github",
- "RemoteHost": "api.github.com",
- "RemoteRepo": "CirceR",
- "RemoteUsername": "ohdsi",
- "RemoteRef": "v1.3.0"
- },
- "CohortDiagnostics": {
- "Package": "CohortDiagnostics",
- "Version": "3.2.3",
- "Source": "GitHub",
- "RemoteType": "github",
- "RemoteHost": "api.github.com",
- "RemoteRepo": "CohortDiagnostics",
- "RemoteUsername": "ohdsi",
- "RemoteRef": "v3.2.3"
- },
- "CohortExplorer": {
- "Package": "CohortExplorer",
- "Version": "0.0.11",
- "Source": "GitHub",
- "RemoteType": "github",
- "RemoteHost": "api.github.com",
- "RemoteRepo": "CohortExplorer",
- "RemoteUsername": "ohdsi",
- "RemoteRef": "v0.0.11"
- },
"CohortGenerator": {
"Package": "CohortGenerator",
- "Version": "0.8.0",
+ "Version": "0.8.1",
"Source": "GitHub",
"RemoteType": "github",
"RemoteHost": "api.github.com",
+ "RemoteUsername": "OHDSI",
"RemoteRepo": "CohortGenerator",
- "RemoteUsername": "ohdsi",
- "RemoteRef": "v0.8.0"
- },
- "CohortIncidence": {
- "Package": "CohortIncidence",
- "Version": "3.1.5",
- "Source": "GitHub",
- "RemoteType": "github",
- "RemoteHost": "api.github.com",
- "RemoteRepo": "CohortIncidence",
- "RemoteUsername": "ohdsi",
- "RemoteRef": "v3.1.5"
- },
- "CohortMethod": {
- "Package": "CohortMethod",
- "Version": "5.1.0",
- "Source": "GitHub",
- "RemoteType": "github",
- "RemoteHost": "api.github.com",
- "RemoteRepo": "CohortMethod",
- "RemoteUsername": "ohdsi",
- "RemoteRef": "v5.1.0"
- },
- "CompQuadForm": {
- "Package": "CompQuadForm",
- "Version": "1.4.3",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "Cyclops": {
- "Package": "Cyclops",
- "Version": "3.2.1",
- "Source": "Repository",
- "Repository": "CRAN"
+ "RemoteRef": "v0.8.1",
+ "RemoteSha": "78757f1b191a395cf9dcff0d5bbe2b9fa4aa163e"
},
"DBI": {
"Package": "DBI",
"Version": "1.1.3",
"Source": "Repository",
- "Repository": "CRAN"
- },
- "DT": {
- "Package": "DT",
- "Version": "0.27",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "DataQualityDashboard": {
- "Package": "DataQualityDashboard",
- "Version": "2.1.2",
- "Source": "GitHub",
- "RemoteType": "github",
- "RemoteHost": "api.github.com",
- "RemoteRepo": "DataQualityDashboard",
- "RemoteUsername": "ohdsi",
- "RemoteRef": "v2.1.2"
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "methods"
+ ],
+ "Hash": "b2866e62bab9378c3cc9476a1954226b"
},
"DatabaseConnector": {
"Package": "DatabaseConnector",
- "Version": "6.2.3",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "DeepPatientLevelPrediction": {
- "Package": "DeepPatientLevelPrediction",
- "Version": "1.1.2",
- "Source": "GitHub",
- "RemoteType": "github",
- "RemoteHost": "api.github.com",
- "RemoteRepo": "DeepPatientLevelPrediction",
- "RemoteUsername": "ohdsi",
- "RemoteRef": "v1.1.2"
- },
- "EmpiricalCalibration": {
- "Package": "EmpiricalCalibration",
- "Version": "3.1.1",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "EnsemblePatientLevelPrediction": {
- "Package": "EnsemblePatientLevelPrediction",
- "Version": "1.0.2",
- "Source": "GitHub",
- "RemoteType": "github",
- "RemoteHost": "api.github.com",
- "RemoteRepo": "EnsemblePatientLevelPrediction",
- "RemoteUsername": "ohdsi",
- "RemoteRef": "v1.0.2"
- },
- "Eunomia": {
- "Package": "Eunomia",
- "Version": "1.0.2",
- "Source": "GitHub",
- "RemoteType": "github",
- "RemoteHost": "api.github.com",
- "RemoteRepo": "Eunomia",
- "RemoteUsername": "ohdsi",
- "RemoteRef": "v1.0.2"
- },
- "EvidenceSynthesis": {
- "Package": "EvidenceSynthesis",
- "Version": "0.5.0",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "FeatureExtraction": {
- "Package": "FeatureExtraction",
- "Version": "3.3.0",
- "Source": "GitHub",
- "RemoteType": "github",
- "RemoteHost": "api.github.com",
- "RemoteRepo": "FeatureExtraction",
- "RemoteUsername": "ohdsi",
- "RemoteRef": "v3.3.0"
- },
- "HDInterval": {
- "Package": "HDInterval",
- "Version": "0.2.4",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "Hades": {
- "Package": "Hades",
- "Version": "1.11.0",
- "Source": "GitHub",
- "RemoteType": "github",
- "RemoteHost": "api.github.com",
- "RemoteRepo": "Hades",
- "RemoteUsername": "ohdsi",
- "RemoteRef": "v1.11.0"
- },
- "Hydra": {
- "Package": "Hydra",
- "Version": "0.4.0",
- "Source": "GitHub",
- "RemoteType": "github",
- "RemoteHost": "api.github.com",
- "RemoteRepo": "Hydra",
- "RemoteUsername": "ohdsi",
- "RemoteRef": "v0.4.0"
- },
- "IterativeHardThresholding": {
- "Package": "IterativeHardThresholding",
- "Version": "1.0.2",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "KMsurv": {
- "Package": "KMsurv",
- "Version": "0.1-5",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "MASS": {
- "Package": "MASS",
- "Version": "7.3-58.2",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "Matrix": {
- "Package": "Matrix",
- "Version": "1.5-3",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "MatrixModels": {
- "Package": "MatrixModels",
- "Version": "0.5-1",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "MethodEvaluation": {
- "Package": "MethodEvaluation",
- "Version": "2.2.0",
- "Source": "GitHub",
- "RemoteType": "github",
- "RemoteHost": "api.github.com",
- "RemoteRepo": "MethodEvaluation",
- "RemoteUsername": "ohdsi",
- "RemoteRef": "v2.2.0"
- },
- "OhdsiSharing": {
- "Package": "OhdsiSharing",
- "Version": "0.2.2",
- "Source": "GitHub",
- "RemoteType": "github",
- "RemoteHost": "api.github.com",
- "RemoteRepo": "OhdsiSharing",
- "RemoteUsername": "ohdsi",
- "RemoteRef": "v0.2.2"
- },
- "OhdsiShinyModules": {
- "Package": "OhdsiShinyModules",
- "Version": "1.1.0",
- "Source": "GitHub",
- "RemoteType": "github",
- "RemoteHost": "api.github.com",
- "RemoteRepo": "OhdsiShinyModules",
- "RemoteUsername": "ohdsi",
- "RemoteRef": "v1.1.0"
- },
- "PRROC": {
- "Package": "PRROC",
- "Version": "1.3.1",
- "Source": "Repository",
- "Repository": "CRAN"
+ "Version": "6.3.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "DBI",
+ "R",
+ "SqlRender",
+ "bit64",
+ "checkmate",
+ "dbplyr",
+ "digest",
+ "methods",
+ "rJava",
+ "readr",
+ "rlang",
+ "stringr",
+ "urltools",
+ "utils"
+ ],
+ "Hash": "1ef65614602c6534a6c666e872c3b647"
},
"ParallelLogger": {
"Package": "ParallelLogger",
- "Version": "3.1.0",
+ "Version": "3.3.0",
"Source": "Repository",
- "Repository": "CRAN"
- },
- "PatientLevelPrediction": {
- "Package": "PatientLevelPrediction",
- "Version": "6.3.4",
- "Source": "GitHub",
- "RemoteType": "github",
- "RemoteHost": "api.github.com",
- "RemoteRepo": "PatientLevelPrediction",
- "RemoteUsername": "ohdsi",
- "RemoteRef": "v6.3.4"
- },
- "PheValuator": {
- "Package": "PheValuator",
- "Version": "2.2.2",
- "Source": "GitHub",
- "RemoteType": "github",
- "RemoteHost": "api.github.com",
- "RemoteRepo": "PheValuator",
- "RemoteUsername": "ohdsi",
- "RemoteRef": "v2.2.2"
- },
- "PhenotypeLibrary": {
- "Package": "PhenotypeLibrary",
- "Version": "3.12.0",
- "Source": "GitHub",
- "RemoteType": "github",
- "RemoteHost": "api.github.com",
- "RemoteRepo": "PhenotypeLibrary",
- "RemoteUsername": "ohdsi",
- "RemoteRef": "v3.12.0"
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "jsonlite",
+ "methods",
+ "snow",
+ "utils",
+ "xml2"
+ ],
+ "Hash": "8d893bed8c8bfe21217464dd3f9ec3e9"
},
"R6": {
"Package": "R6",
"Version": "2.5.1",
"Source": "Repository",
- "Repository": "CRAN"
- },
- "RColorBrewer": {
- "Package": "RColorBrewer",
- "Version": "1.1-3",
- "Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "470851b6d5d0ac559e9d01bb352b4021"
},
"RJSONIO": {
"Package": "RJSONIO",
"Version": "1.3-1.8",
"Source": "Repository",
- "Repository": "CRAN"
- },
- "ROhdsiWebApi": {
- "Package": "ROhdsiWebApi",
- "Version": "1.3.3",
- "Source": "GitHub",
- "RemoteType": "github",
- "RemoteHost": "api.github.com",
- "RemoteRepo": "ROhdsiWebApi",
- "RemoteUsername": "ohdsi",
- "RemoteRef": "v1.3.3"
+ "Repository": "CRAN",
+ "Requirements": [
+ "methods"
+ ],
+ "Hash": "cd79d1874fb20217463451f8c310c526"
},
"RSQLite": {
"Package": "RSQLite",
- "Version": "2.3.0",
- "Source": "Repository",
- "Repository": "CRAN"
+ "Version": "2.3.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "DBI",
+ "R",
+ "bit64",
+ "blob",
+ "cpp11",
+ "memoise",
+ "methods",
+ "pkgconfig",
+ "plogr"
+ ],
+ "Hash": "207c90cd5438a1f596da2cd54c606fee"
},
"Rcpp": {
"Package": "Rcpp",
- "Version": "1.0.10",
+ "Version": "1.0.11",
"Source": "Repository",
- "Repository": "CRAN"
- },
- "RcppEigen": {
- "Package": "RcppEigen",
- "Version": "0.3.3.9.3",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "RcppTOML": {
- "Package": "RcppTOML",
- "Version": "0.2.2",
- "Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "methods",
+ "utils"
+ ],
+ "Hash": "e749cae40fa9ef469b6050959517453c"
},
"ResultModelManager": {
"Package": "ResultModelManager",
- "Version": "0.4.0",
+ "Version": "0.5.6",
"Source": "GitHub",
"RemoteType": "github",
"RemoteHost": "api.github.com",
+ "RemoteUsername": "OHDSI",
"RemoteRepo": "ResultModelManager",
- "RemoteUsername": "ohdsi",
- "RemoteRef": "v0.4.0"
- },
- "SelfControlledCaseSeries": {
- "Package": "SelfControlledCaseSeries",
- "Version": "4.2.0",
- "Source": "GitHub",
- "RemoteType": "github",
- "RemoteHost": "api.github.com",
- "RemoteRepo": "SelfControlledCaseSeries",
- "RemoteUsername": "ohdsi",
- "RemoteRef": "v4.2.0"
- },
- "SelfControlledCohort": {
- "Package": "SelfControlledCohort",
- "Version": "1.6.0",
- "Source": "GitHub",
- "RemoteType": "github",
- "RemoteHost": "api.github.com",
- "RemoteRepo": "SelfControlledCohort",
- "RemoteUsername": "ohdsi",
- "RemoteRef": "v1.6.0"
- },
- "ShinyAppBuilder": {
- "Package": "ShinyAppBuilder",
- "Version": "1.1.1",
- "Source": "GitHub",
- "RemoteType": "github",
- "RemoteHost": "api.github.com",
- "RemoteRepo": "ShinyAppBuilder",
- "RemoteUsername": "ohdsi",
- "RemoteRef": "v1.1.1"
- },
- "SparseM": {
- "Package": "SparseM",
- "Version": "1.81",
- "Source": "Repository",
- "Repository": "CRAN"
+ "RemoteRef": "v0.5.6",
+ "RemoteSha": "3033804e5af77b8b8dacda67c4d6853731e3641b"
},
"SqlRender": {
"Package": "SqlRender",
- "Version": "1.15.2",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "abind": {
- "Package": "abind",
- "Version": "1.4-5",
+ "Version": "1.16.1",
"Source": "Repository",
- "Repository": "CRAN"
- },
- "anytime": {
- "Package": "anytime",
- "Version": "0.3.9",
- "Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "checkmate",
+ "rJava",
+ "rlang"
+ ],
+ "Hash": "94d9cae91bbd8aed211bea82aff7cf77"
},
"askpass": {
"Package": "askpass",
- "Version": "1.1",
+ "Version": "1.2.0",
"Source": "Repository",
"Repository": "CRAN"
},
@@ -463,1020 +151,737 @@
"Package": "assertthat",
"Version": "0.2.1",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "tools"
+ ],
+ "Hash": "50c838a310445e954bc13f26f26a6ecf"
},
"backports": {
"Package": "backports",
"Version": "1.4.1",
"Source": "Repository",
- "Repository": "CRAN"
- },
- "base64enc": {
- "Package": "base64enc",
- "Version": "0.1-3",
- "Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "c39fbec8a30d23e721980b8afb31984c"
},
"bit": {
"Package": "bit",
"Version": "4.0.5",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "d242abec29412ce988848d0294b208fd"
},
"bit64": {
"Package": "bit64",
"Version": "4.0.5",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "bit",
+ "methods",
+ "stats",
+ "utils"
+ ],
+ "Hash": "9fe98599ca456d6552421db0d6772d8f"
},
"blob": {
"Package": "blob",
"Version": "1.2.4",
"Source": "Repository",
- "Repository": "CRAN"
- },
- "boot": {
- "Package": "boot",
- "Version": "1.3-28.1",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "brio": {
- "Package": "brio",
- "Version": "1.1.3",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "broom": {
- "Package": "broom",
- "Version": "1.0.4",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "bslib": {
- "Package": "bslib",
- "Version": "0.4.2",
- "Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "RSPM",
+ "Requirements": [
+ "methods",
+ "rlang",
+ "vctrs"
+ ],
+ "Hash": "40415719b5a479b87949f3aa0aee737c"
},
"cachem": {
"Package": "cachem",
- "Version": "1.0.7",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "callr": {
- "Package": "callr",
- "Version": "3.7.3",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "car": {
- "Package": "car",
- "Version": "3.1-2",
+ "Version": "1.0.8",
"Source": "Repository",
- "Repository": "CRAN"
- },
- "carData": {
- "Package": "carData",
- "Version": "3.0-5",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "checkmate": {
- "Package": "checkmate",
- "Version": "2.1.0",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "cli": {
- "Package": "cli",
- "Version": "3.6.1",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "clipr": {
- "Package": "clipr",
- "Version": "0.8.0",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "clock": {
- "Package": "clock",
- "Version": "0.6.1",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "coda": {
- "Package": "coda",
- "Version": "0.19-4",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "colorspace": {
- "Package": "colorspace",
- "Version": "2.1-0",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "commonmark": {
- "Package": "commonmark",
- "Version": "1.9.0",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "coro": {
- "Package": "coro",
- "Version": "1.0.3",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "corrplot": {
- "Package": "corrplot",
- "Version": "0.92",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "covr": {
- "Package": "covr",
- "Version": "3.6.2",
- "Source": "Repository"
- },
- "cowplot": {
- "Package": "cowplot",
- "Version": "1.1.1",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "cpp11": {
- "Package": "cpp11",
- "Version": "0.4.3",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "crayon": {
- "Package": "crayon",
- "Version": "1.5.2",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "crosstalk": {
- "Package": "crosstalk",
- "Version": "1.2.0",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "curl": {
- "Package": "curl",
- "Version": "5.0.0",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "data.table": {
- "Package": "data.table",
- "Version": "1.14.8",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "dbplyr": {
- "Package": "dbplyr",
- "Version": "2.3.2",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "desc": {
- "Package": "desc",
- "Version": "1.4.2",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "diffobj": {
- "Package": "diffobj",
- "Version": "0.3.5",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "digest": {
- "Package": "digest",
- "Version": "0.6.31",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "dplyr": {
- "Package": "dplyr",
- "Version": "1.1.1",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "ellipsis": {
- "Package": "ellipsis",
- "Version": "0.3.2",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "evaluate": {
- "Package": "evaluate",
- "Version": "0.20",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "exactRankTests": {
- "Package": "exactRankTests",
- "Version": "0.8-35",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "fansi": {
- "Package": "fansi",
- "Version": "1.0.4",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "farver": {
- "Package": "farver",
- "Version": "2.1.1",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "fastmap": {
- "Package": "fastmap",
- "Version": "1.1.1",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "filelock": {
- "Package": "filelock",
- "Version": "1.0.2",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "fontawesome": {
- "Package": "fontawesome",
- "Version": "0.5.0",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "fs": {
- "Package": "fs",
- "Version": "1.6.1",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "generics": {
- "Package": "generics",
- "Version": "0.1.3",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "ggplot2": {
- "Package": "ggplot2",
- "Version": "3.4.1",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "ggpubr": {
- "Package": "ggpubr",
- "Version": "0.6.0",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "ggrepel": {
- "Package": "ggrepel",
- "Version": "0.9.3",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "ggsci": {
- "Package": "ggsci",
- "Version": "3.0.0",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "ggsignif": {
- "Package": "ggsignif",
- "Version": "0.6.4",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "ggtext": {
- "Package": "ggtext",
- "Version": "0.1.2",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "glue": {
- "Package": "glue",
- "Version": "1.6.2",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "gridExtra": {
- "Package": "gridExtra",
- "Version": "2.3",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "gridtext": {
- "Package": "gridtext",
- "Version": "0.1.5",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "gtable": {
- "Package": "gtable",
- "Version": "0.3.3",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "here": {
- "Package": "here",
- "Version": "1.0.1",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "highr": {
- "Package": "highr",
- "Version": "0.10",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "hms": {
- "Package": "hms",
- "Version": "1.1.3",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "htmltools": {
- "Package": "htmltools",
- "Version": "0.5.5",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "htmlwidgets": {
- "Package": "htmlwidgets",
- "Version": "1.6.2",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "httpuv": {
- "Package": "httpuv",
- "Version": "1.6.9",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "httr": {
- "Package": "httr",
- "Version": "1.4.5",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "isoband": {
- "Package": "isoband",
- "Version": "0.2.7",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "jpeg": {
- "Package": "jpeg",
- "Version": "0.1-10",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "jquerylib": {
- "Package": "jquerylib",
- "Version": "0.1.4",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "jsonlite": {
- "Package": "jsonlite",
- "Version": "1.8.4",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "keyring": {
- "Package": "keyring",
- "Version": "1.3.1",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "km.ci": {
- "Package": "km.ci",
- "Version": "0.5-6",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "knitr": {
- "Package": "knitr",
- "Version": "1.42",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "labeling": {
- "Package": "labeling",
- "Version": "0.4.2",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "later": {
- "Package": "later",
- "Version": "1.3.0",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "lattice": {
- "Package": "lattice",
- "Version": "0.20-45",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "lazyeval": {
- "Package": "lazyeval",
- "Version": "0.2.2",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "lifecycle": {
- "Package": "lifecycle",
- "Version": "1.0.3",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "lightgbm": {
- "Package": "lightgbm",
- "Version": "3.3.5",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "lme4": {
- "Package": "lme4",
- "Version": "1.1-32",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "lubridate": {
- "Package": "lubridate",
- "Version": "1.9.2",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "magrittr": {
- "Package": "magrittr",
- "Version": "2.0.3",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "markdown": {
- "Package": "markdown",
- "Version": "1.5",
- "Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "fastmap",
+ "rlang"
+ ],
+ "Hash": "cda74447c42f529de601fe4d4050daef"
},
- "mathjaxr": {
- "Package": "mathjaxr",
- "Version": "1.6-0",
+ "checkmate": {
+ "Package": "checkmate",
+ "Version": "2.3.0",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "backports",
+ "utils"
+ ],
+ "Hash": "ed4275b13c6ab74b89a31def0b6bf835"
},
- "maxstat": {
- "Package": "maxstat",
- "Version": "0.7-25",
+ "cli": {
+ "Package": "cli",
+ "Version": "3.6.1",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "RSPM",
+ "Requirements": [
+ "R",
+ "utils"
+ ],
+ "Hash": "89e6d8219950eac806ae0c489052048a"
},
- "memoise": {
- "Package": "memoise",
- "Version": "2.0.1",
+ "clipr": {
+ "Package": "clipr",
+ "Version": "0.8.0",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "utils"
+ ],
+ "Hash": "3f038e5ac7f41d4ac41ce658c85e3042"
},
- "memuse": {
- "Package": "memuse",
- "Version": "4.2-3",
+ "cpp11": {
+ "Package": "cpp11",
+ "Version": "0.4.6",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Hash": "ed588261931ee3be2c700d22e94a29ab"
},
- "meta": {
- "Package": "meta",
- "Version": "6.2-1",
+ "crayon": {
+ "Package": "crayon",
+ "Version": "1.5.2",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "grDevices",
+ "methods",
+ "utils"
+ ],
+ "Hash": "e8a1e41acf02548751f45c718d55aa6a"
+ },
+ "dbplyr": {
+ "Package": "dbplyr",
+ "Version": "2.3.4",
+ "Source": "Repository",
+ "Repository": "RSPM",
+ "Requirements": [
+ "DBI",
+ "R",
+ "R6",
+ "blob",
+ "cli",
+ "dplyr",
+ "glue",
+ "lifecycle",
+ "magrittr",
+ "methods",
+ "pillar",
+ "purrr",
+ "rlang",
+ "tibble",
+ "tidyr",
+ "tidyselect",
+ "utils",
+ "vctrs",
+ "withr"
+ ],
+ "Hash": "d24305b92db333726aed162a2c23a147"
},
- "metadat": {
- "Package": "metadat",
- "Version": "1.2-0",
+ "digest": {
+ "Package": "digest",
+ "Version": "0.6.33",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "utils"
+ ],
+ "Hash": "8b708f296afd9ae69f450f9640be8990"
},
- "metafor": {
- "Package": "metafor",
- "Version": "4.0-0",
+ "dplyr": {
+ "Package": "dplyr",
+ "Version": "1.1.3",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "RSPM",
+ "Requirements": [
+ "R",
+ "R6",
+ "cli",
+ "generics",
+ "glue",
+ "lifecycle",
+ "magrittr",
+ "methods",
+ "pillar",
+ "rlang",
+ "tibble",
+ "tidyselect",
+ "utils",
+ "vctrs"
+ ],
+ "Hash": "eb5742d256a0d9306d85ea68756d8187"
},
- "mgcv": {
- "Package": "mgcv",
- "Version": "1.8-42",
+ "fansi": {
+ "Package": "fansi",
+ "Version": "1.0.4",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "grDevices",
+ "utils"
+ ],
+ "Hash": "1d9e7ad3c8312a192dea7d3db0274fde"
},
- "mime": {
- "Package": "mime",
- "Version": "0.12",
+ "fastmap": {
+ "Package": "fastmap",
+ "Version": "1.1.1",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Hash": "f7736a18de97dea803bde0a2daaafb27"
},
- "minqa": {
- "Package": "minqa",
- "Version": "1.2.5",
+ "filelock": {
+ "Package": "filelock",
+ "Version": "1.0.2",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Hash": "38ec653c2613bed60052ba3787bd8a2c"
},
- "munsell": {
- "Package": "munsell",
- "Version": "0.5.0",
+ "generics": {
+ "Package": "generics",
+ "Version": "0.1.3",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "methods"
+ ],
+ "Hash": "15e9634c0fcd294799e9b2e929ed1b86"
},
- "mvtnorm": {
- "Package": "mvtnorm",
- "Version": "1.1-3",
+ "glue": {
+ "Package": "glue",
+ "Version": "1.6.2",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "methods"
+ ],
+ "Hash": "4f2596dfb05dac67b9dc558e5c6fba2e"
},
- "nlme": {
- "Package": "nlme",
- "Version": "3.1-162",
+ "hms": {
+ "Package": "hms",
+ "Version": "1.1.3",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "RSPM",
+ "Requirements": [
+ "lifecycle",
+ "methods",
+ "pkgconfig",
+ "rlang",
+ "vctrs"
+ ],
+ "Hash": "b59377caa7ed00fa41808342002138f9"
},
- "nloptr": {
- "Package": "nloptr",
- "Version": "2.0.3",
+ "jsonlite": {
+ "Package": "jsonlite",
+ "Version": "1.8.7",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "methods"
+ ],
+ "Hash": "a4269a09a9b865579b2635c77e572374"
},
- "nnet": {
- "Package": "nnet",
- "Version": "7.3-18",
+ "keyring": {
+ "Package": "keyring",
+ "Version": "1.3.1",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "R6",
+ "askpass",
+ "assertthat",
+ "filelock",
+ "openssl",
+ "rappdirs",
+ "sodium",
+ "tools",
+ "utils",
+ "yaml"
+ ],
+ "Hash": "b7880ebefe188d62b099673bbc04afac"
},
- "numDeriv": {
- "Package": "numDeriv",
- "Version": "2016.8-1.1",
+ "later": {
+ "Package": "later",
+ "Version": "1.3.1",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "Rcpp",
+ "rlang"
+ ],
+ "Hash": "7e7b457d7766bc47f2a5f21cc2984f8e"
},
- "openssl": {
- "Package": "openssl",
- "Version": "2.0.6",
+ "lifecycle": {
+ "Package": "lifecycle",
+ "Version": "1.0.3",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "glue",
+ "rlang"
+ ],
+ "Hash": "001cecbeac1cff9301bdc3775ee46a86"
},
- "openxlsx": {
- "Package": "openxlsx",
- "Version": "4.2.5.2",
+ "lubridate": {
+ "Package": "lubridate",
+ "Version": "1.9.3",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "generics",
+ "methods",
+ "timechange"
+ ],
+ "Hash": "e25f18436e3efd42c7c590a1c4c15390"
},
- "pROC": {
- "Package": "pROC",
- "Version": "1.18.0",
+ "magrittr": {
+ "Package": "magrittr",
+ "Version": "2.0.3",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "7ce2733a9826b3aeb1775d56fd305472"
},
- "pbapply": {
- "Package": "pbapply",
- "Version": "1.7-0",
+ "memoise": {
+ "Package": "memoise",
+ "Version": "2.0.1",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "cachem",
+ "rlang"
+ ],
+ "Hash": "e2817ccf4a065c5d9d7f2cfbe7c1d78c"
},
- "pbkrtest": {
- "Package": "pbkrtest",
- "Version": "0.5.2",
+ "openssl": {
+ "Package": "openssl",
+ "Version": "2.1.1",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "askpass"
+ ],
+ "Hash": "0f7cd2962e3044bb940cca4f4b5cecbe"
},
"pillar": {
"Package": "pillar",
"Version": "1.9.0",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "RSPM",
+ "Requirements": [
+ "cli",
+ "fansi",
+ "glue",
+ "lifecycle",
+ "rlang",
+ "utf8",
+ "utils",
+ "vctrs"
+ ],
+ "Hash": "15da5a8412f317beeee6175fbc76f4bb"
},
"pkgconfig": {
"Package": "pkgconfig",
"Version": "2.0.3",
"Source": "Repository",
- "Repository": "CRAN"
- },
- "pkgload": {
- "Package": "pkgload",
- "Version": "1.3.2",
- "Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "utils"
+ ],
+ "Hash": "01f28d4278f15c76cddbea05899c5d6f"
},
"plogr": {
"Package": "plogr",
"Version": "0.2.0",
"Source": "Repository",
- "Repository": "CRAN"
- },
- "plotly": {
- "Package": "plotly",
- "Version": "4.10.1",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "plyr": {
- "Package": "plyr",
- "Version": "1.8.8",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "png": {
- "Package": "png",
- "Version": "0.1-8",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "polspline": {
- "Package": "polspline",
- "Version": "1.1.22",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "polynom": {
- "Package": "polynom",
- "Version": "1.4-1",
- "Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Hash": "09eb987710984fc2905c7129c7d85e65"
},
"pool": {
"Package": "pool",
"Version": "1.0.1",
"Source": "Repository",
- "Repository": "CRAN"
- },
- "praise": {
- "Package": "praise",
- "Version": "1.0.0",
- "Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "DBI",
+ "R",
+ "R6",
+ "later",
+ "methods",
+ "rlang",
+ "withr"
+ ],
+ "Hash": "52d086ff1a2ccccbae6d462cb0773835"
},
"prettyunits": {
"Package": "prettyunits",
- "Version": "1.1.1",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "processx": {
- "Package": "processx",
- "Version": "3.8.0",
+ "Version": "1.2.0",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Hash": "95ef9167b75dde9d2ccc3c7528393e7e"
},
"progress": {
"Package": "progress",
"Version": "1.2.2",
"Source": "Repository",
- "Repository": "CRAN"
- },
- "promises": {
- "Package": "promises",
- "Version": "1.2.0.1",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "ps": {
- "Package": "ps",
- "Version": "1.7.3",
- "Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "R6",
+ "crayon",
+ "hms",
+ "prettyunits"
+ ],
+ "Hash": "14dc9f7a3c91ebb14ec5bb9208a07061"
},
"purrr": {
"Package": "purrr",
- "Version": "1.0.1",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "quantreg": {
- "Package": "quantreg",
- "Version": "5.94",
+ "Version": "1.0.2",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "lifecycle",
+ "magrittr",
+ "rlang",
+ "vctrs"
+ ],
+ "Hash": "d71c815267c640f17ddbf7f16144b4bb"
},
"rJava": {
"Package": "rJava",
"Version": "1.0-6",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "methods"
+ ],
+ "Hash": "0415819f6baa75d86d52483f7292b623"
},
"rappdirs": {
"Package": "rappdirs",
"Version": "0.3.3",
"Source": "Repository",
- "Repository": "CRAN"
- },
- "rateratio.test": {
- "Package": "rateratio.test",
- "Version": "1.1",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "reactR": {
- "Package": "reactR",
- "Version": "0.4.4",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "reactable": {
- "Package": "reactable",
- "Version": "0.4.4",
- "Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "5e3c5dc0b071b21fa128676560dbe94d"
},
"readr": {
"Package": "readr",
"Version": "2.1.4",
"Source": "Repository",
- "Repository": "CRAN"
- },
- "rematch2": {
- "Package": "rematch2",
- "Version": "2.1.2",
- "Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "R6",
+ "cli",
+ "clipr",
+ "cpp11",
+ "crayon",
+ "hms",
+ "lifecycle",
+ "methods",
+ "rlang",
+ "tibble",
+ "tzdb",
+ "utils",
+ "vroom"
+ ],
+ "Hash": "b5047343b3825f37ad9d3b5d89aa1078"
},
"renv": {
"Package": "renv",
- "Version": "1.0.2",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "reticulate": {
- "Package": "reticulate",
- "Version": "1.31",
+ "Version": "1.0.3",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "utils"
+ ],
+ "Hash": "41b847654f567341725473431dd0d5ab"
},
"rlang": {
"Package": "rlang",
- "Version": "1.1.0",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "rmarkdown": {
- "Package": "rmarkdown",
- "Version": "2.21",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "rprojroot": {
- "Package": "rprojroot",
- "Version": "2.0.3",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "rstatix": {
- "Package": "rstatix",
- "Version": "0.7.2",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "sass": {
- "Package": "sass",
- "Version": "0.4.5",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "scales": {
- "Package": "scales",
- "Version": "1.2.1",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "shiny": {
- "Package": "shiny",
- "Version": "1.7.4",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "shinyWidgets": {
- "Package": "shinyWidgets",
- "Version": "0.7.6",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "shinycssloaders": {
- "Package": "shinycssloaders",
- "Version": "1.0.0",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "shinydashboard": {
- "Package": "shinydashboard",
- "Version": "0.7.2",
+ "Version": "1.1.1",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "RSPM",
+ "Requirements": [
+ "R",
+ "utils"
+ ],
+ "Hash": "dc079ccd156cde8647360f473c1fa718"
},
"snow": {
"Package": "snow",
"Version": "0.4-4",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "utils"
+ ],
+ "Hash": "40b74690debd20c57d93d8c246b305d4"
},
"sodium": {
"Package": "sodium",
- "Version": "1.2.1",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "sourcetools": {
- "Package": "sourcetools",
- "Version": "0.1.7-1",
+ "Version": "1.3.0",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Hash": "3606bb09e0914edd4fc8313b500dcd5e"
},
"stringi": {
"Package": "stringi",
"Version": "1.7.12",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "stats",
+ "tools",
+ "utils"
+ ],
+ "Hash": "ca8bd84263c77310739d2cf64d84d7c9"
},
"stringr": {
"Package": "stringr",
"Version": "1.5.0",
"Source": "Repository",
- "Repository": "CRAN"
- },
- "survMisc": {
- "Package": "survMisc",
- "Version": "0.5.6",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "survival": {
- "Package": "survival",
- "Version": "3.5-3",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "survminer": {
- "Package": "survminer",
- "Version": "0.4.9",
- "Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "glue",
+ "lifecycle",
+ "magrittr",
+ "rlang",
+ "stringi",
+ "vctrs"
+ ],
+ "Hash": "671a4d384ae9d32fc47a14e98bfa3dc8"
},
"sys": {
"Package": "sys",
- "Version": "3.4.1",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "testthat": {
- "Package": "testthat",
- "Version": "3.1.7",
+ "Version": "3.4.2",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Hash": "34c16f1ef796057bfa06d3f4ff818a5d"
},
"tibble": {
"Package": "tibble",
"Version": "3.2.1",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "RSPM",
+ "Requirements": [
+ "R",
+ "fansi",
+ "lifecycle",
+ "magrittr",
+ "methods",
+ "pillar",
+ "pkgconfig",
+ "rlang",
+ "utils",
+ "vctrs"
+ ],
+ "Hash": "a84e2cc86d07289b3b6f5069df7a004c"
},
"tidyr": {
"Package": "tidyr",
"Version": "1.3.0",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "cpp11",
+ "dplyr",
+ "glue",
+ "lifecycle",
+ "magrittr",
+ "purrr",
+ "rlang",
+ "stringr",
+ "tibble",
+ "tidyselect",
+ "utils",
+ "vctrs"
+ ],
+ "Hash": "e47debdc7ce599b070c8e78e8ac0cfcf"
},
"tidyselect": {
"Package": "tidyselect",
"Version": "1.2.0",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "glue",
+ "lifecycle",
+ "rlang",
+ "vctrs",
+ "withr"
+ ],
+ "Hash": "79540e5fcd9e0435af547d885f184fd5"
},
"timechange": {
"Package": "timechange",
"Version": "0.2.0",
"Source": "Repository",
- "Repository": "CRAN"
- },
- "tinytex": {
- "Package": "tinytex",
- "Version": "0.44",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "tippy": {
- "Package": "tippy",
- "Version": "0.1.0",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "torch": {
- "Package": "torch",
- "Version": "0.9.1",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "torchopt": {
- "Package": "torchopt",
- "Version": "0.1.3",
- "Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cpp11"
+ ],
+ "Hash": "8548b44f79a35ba1791308b61e6012d7"
},
"triebeard": {
"Package": "triebeard",
"Version": "0.4.1",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "Rcpp"
+ ],
+ "Hash": "642507a148b0dd9b5620177e0a044413"
},
"tzdb": {
"Package": "tzdb",
- "Version": "0.3.0",
+ "Version": "0.4.0",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cpp11"
+ ],
+ "Hash": "b2e1cbce7c903eaf23ec05c58e59fb5e"
},
"urltools": {
"Package": "urltools",
"Version": "1.7.3",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "Rcpp",
+ "methods",
+ "triebeard"
+ ],
+ "Hash": "e86a704261a105f4703f653e05defa3e"
},
"utf8": {
"Package": "utf8",
"Version": "1.2.3",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "1fe17157424bb09c48a8b3b550c753bc"
},
"vctrs": {
"Package": "vctrs",
- "Version": "0.6.1",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "viridisLite": {
- "Package": "viridisLite",
- "Version": "0.4.1",
+ "Version": "0.6.3",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "RSPM",
+ "Requirements": [
+ "R",
+ "cli",
+ "glue",
+ "lifecycle",
+ "rlang"
+ ],
+ "Hash": "06eceb3a5d716fd0654cc23ca3d71a99"
},
"vroom": {
"Package": "vroom",
- "Version": "1.6.1",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "waldo": {
- "Package": "waldo",
- "Version": "0.4.0",
- "Source": "Repository",
- "Repository": "CRAN"
+ "Version": "1.6.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "bit64",
+ "cli",
+ "cpp11",
+ "crayon",
+ "glue",
+ "hms",
+ "lifecycle",
+ "methods",
+ "progress",
+ "rlang",
+ "stats",
+ "tibble",
+ "tidyselect",
+ "tzdb",
+ "vctrs",
+ "withr"
+ ],
+ "Hash": "7015a74373b83ffaef64023f4a0f5033"
},
"withr": {
"Package": "withr",
- "Version": "2.5.0",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "xfun": {
- "Package": "xfun",
- "Version": "0.38",
+ "Version": "2.5.1",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "grDevices",
+ "graphics",
+ "stats"
+ ],
+ "Hash": "c0e49a9760983e81e55cdd9be92e7182"
},
"xml2": {
"Package": "xml2",
- "Version": "1.3.3",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "xtable": {
- "Package": "xtable",
- "Version": "1.8-4",
+ "Version": "1.3.5",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "methods"
+ ],
+ "Hash": "40682ed6a969ea5abfd351eb67833adc"
},
"yaml": {
"Package": "yaml",
"Version": "2.3.7",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Hash": "0d0056cc5383fbc240ccd0cb584bf436"
},
"zip": {
"Package": "zip",
- "Version": "2.2.2",
- "Source": "Repository",
- "Repository": "CRAN"
- },
- "zoo": {
- "Package": "zoo",
- "Version": "1.8-11",
+ "Version": "2.3.0",
"Source": "Repository",
- "Repository": "CRAN"
+ "Repository": "CRAN",
+ "Hash": "d98c94dacb7e0efcf83b0a133a705504"
}
}
}
diff --git a/extras/TestModule1-0.0.1/renv/.gitignore b/extras/TestModule1-0.0.1/renv/.gitignore
index 22a0d01d..0ec0cbba 100644
--- a/extras/TestModule1-0.0.1/renv/.gitignore
+++ b/extras/TestModule1-0.0.1/renv/.gitignore
@@ -1,7 +1,7 @@
-sandbox/
library/
local/
cellar/
lock/
python/
+sandbox/
staging/
diff --git a/extras/TestModule1-0.0.1/renv/activate.R b/extras/TestModule1-0.0.1/renv/activate.R
index 2969c732..cb5401f9 100644
--- a/extras/TestModule1-0.0.1/renv/activate.R
+++ b/extras/TestModule1-0.0.1/renv/activate.R
@@ -2,7 +2,7 @@
local({
# the requested version of renv
- version <- "1.0.2"
+ version <- "1.0.3"
attr(version, "sha") <- NULL
# the project directory
@@ -1034,19 +1034,6 @@ local({
}
-
- renv_bootstrap_in_rstudio <- function() {
- commandArgs()[[1]] == "RStudio"
- }
-
- # Used to work around buglet in RStudio if hook uses readline
- renv_bootstrap_flush_console <- function() {
- tryCatch({
- tools <- as.environment("tools:rstudio")
- tools$.rs.api.sendToConsole("", echo = FALSE, focus = FALSE)
- }, error = function(cnd) {})
- }
-
renv_json_read <- function(file = NULL, text = NULL) {
jlerr <- NULL
@@ -1185,16 +1172,8 @@ local({
# construct full libpath
libpath <- file.path(root, prefix)
- if (renv_bootstrap_in_rstudio()) {
- # RStudio only updates console once .Rprofile is finished, so
- # instead run code on sessionInit
- setHook("rstudio.sessionInit", function(...) {
- renv_bootstrap_exec(project, libpath, version)
- renv_bootstrap_flush_console()
- })
- } else {
- renv_bootstrap_exec(project, libpath, version)
- }
+ # run bootstrap code
+ renv_bootstrap_exec(project, libpath, version)
invisible()
diff --git a/extras/TestModule1-0.0.1/renv/profiles/dev/renv.lock b/extras/TestModule1-0.0.1/renv/profiles/dev/renv.lock
new file mode 100644
index 00000000..aeb3539a
--- /dev/null
+++ b/extras/TestModule1-0.0.1/renv/profiles/dev/renv.lock
@@ -0,0 +1,1093 @@
+{
+ "R": {
+ "Version": "4.2.3",
+ "Repositories": [
+ {
+ "Name": "CRAN",
+ "URL": "https://packagemanager.posit.co/cran/latest"
+ }
+ ]
+ },
+ "Packages": {
+ "CohortGenerator": {
+ "Package": "CohortGenerator",
+ "Version": "0.8.1",
+ "Source": "GitHub",
+ "RemoteType": "github",
+ "RemoteHost": "api.github.com",
+ "RemoteUsername": "OHDSI",
+ "RemoteRepo": "CohortGenerator",
+ "RemoteRef": "v0.8.1",
+ "RemoteSha": "78757f1b191a395cf9dcff0d5bbe2b9fa4aa163e"
+ },
+ "DBI": {
+ "Package": "DBI",
+ "Version": "1.1.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "methods"
+ ],
+ "Hash": "b2866e62bab9378c3cc9476a1954226b"
+ },
+ "DatabaseConnector": {
+ "Package": "DatabaseConnector",
+ "Version": "6.3.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "DBI",
+ "R",
+ "SqlRender",
+ "bit64",
+ "checkmate",
+ "dbplyr",
+ "digest",
+ "methods",
+ "rJava",
+ "readr",
+ "rlang",
+ "stringr",
+ "urltools",
+ "utils"
+ ],
+ "Hash": "1ef65614602c6534a6c666e872c3b647"
+ },
+ "Eunomia": {
+ "Package": "Eunomia",
+ "Version": "1.0.2",
+ "Source": "GitHub",
+ "RemoteType": "github",
+ "RemoteHost": "api.github.com",
+ "RemoteUsername": "OHDSI",
+ "RemoteRepo": "Eunomia",
+ "RemoteRef": "v1.0.2",
+ "RemoteSha": "e330860e581bcb33896ef1dbac29549224e0990c"
+ },
+ "ParallelLogger": {
+ "Package": "ParallelLogger",
+ "Version": "3.3.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "jsonlite",
+ "methods",
+ "snow",
+ "utils",
+ "xml2"
+ ],
+ "Hash": "8d893bed8c8bfe21217464dd3f9ec3e9"
+ },
+ "R6": {
+ "Package": "R6",
+ "Version": "2.5.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "470851b6d5d0ac559e9d01bb352b4021"
+ },
+ "RJSONIO": {
+ "Package": "RJSONIO",
+ "Version": "1.3-1.8",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "methods"
+ ],
+ "Hash": "cd79d1874fb20217463451f8c310c526"
+ },
+ "RSQLite": {
+ "Package": "RSQLite",
+ "Version": "2.3.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "DBI",
+ "R",
+ "bit64",
+ "blob",
+ "cpp11",
+ "memoise",
+ "methods",
+ "pkgconfig",
+ "plogr"
+ ],
+ "Hash": "207c90cd5438a1f596da2cd54c606fee"
+ },
+ "Rcpp": {
+ "Package": "Rcpp",
+ "Version": "1.0.11",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "methods",
+ "utils"
+ ],
+ "Hash": "e749cae40fa9ef469b6050959517453c"
+ },
+ "ResultModelManager": {
+ "Package": "ResultModelManager",
+ "Version": "0.5.6",
+ "Source": "GitHub",
+ "RemoteType": "github",
+ "RemoteHost": "api.github.com",
+ "RemoteUsername": "OHDSI",
+ "RemoteRepo": "ResultModelManager",
+ "RemoteRef": "v0.5.6",
+ "RemoteSha": "3033804e5af77b8b8dacda67c4d6853731e3641b"
+ },
+ "SqlRender": {
+ "Package": "SqlRender",
+ "Version": "1.16.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "checkmate",
+ "rJava",
+ "rlang"
+ ],
+ "Hash": "94d9cae91bbd8aed211bea82aff7cf77"
+ },
+ "askpass": {
+ "Package": "askpass",
+ "Version": "1.2.0",
+ "Source": "Repository",
+ "Repository": "CRAN"
+ },
+ "assertthat": {
+ "Package": "assertthat",
+ "Version": "0.2.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "tools"
+ ],
+ "Hash": "50c838a310445e954bc13f26f26a6ecf"
+ },
+ "backports": {
+ "Package": "backports",
+ "Version": "1.4.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "c39fbec8a30d23e721980b8afb31984c"
+ },
+ "bit": {
+ "Package": "bit",
+ "Version": "4.0.5",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "d242abec29412ce988848d0294b208fd"
+ },
+ "bit64": {
+ "Package": "bit64",
+ "Version": "4.0.5",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "bit",
+ "methods",
+ "stats",
+ "utils"
+ ],
+ "Hash": "9fe98599ca456d6552421db0d6772d8f"
+ },
+ "blob": {
+ "Package": "blob",
+ "Version": "1.2.4",
+ "Source": "Repository",
+ "Repository": "RSPM",
+ "Requirements": [
+ "methods",
+ "rlang",
+ "vctrs"
+ ],
+ "Hash": "40415719b5a479b87949f3aa0aee737c"
+ },
+ "brio": {
+ "Package": "brio",
+ "Version": "1.1.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Hash": "976cf154dfb043c012d87cddd8bca363"
+ },
+ "cachem": {
+ "Package": "cachem",
+ "Version": "1.0.8",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "fastmap",
+ "rlang"
+ ],
+ "Hash": "cda74447c42f529de601fe4d4050daef"
+ },
+ "callr": {
+ "Package": "callr",
+ "Version": "3.7.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "R6",
+ "processx",
+ "utils"
+ ],
+ "Hash": "9b2191ede20fa29828139b9900922e51"
+ },
+ "checkmate": {
+ "Package": "checkmate",
+ "Version": "2.3.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "backports",
+ "utils"
+ ],
+ "Hash": "ed4275b13c6ab74b89a31def0b6bf835"
+ },
+ "cli": {
+ "Package": "cli",
+ "Version": "3.6.1",
+ "Source": "Repository",
+ "Repository": "RSPM",
+ "Requirements": [
+ "R",
+ "utils"
+ ],
+ "Hash": "89e6d8219950eac806ae0c489052048a"
+ },
+ "clipr": {
+ "Package": "clipr",
+ "Version": "0.8.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "utils"
+ ],
+ "Hash": "3f038e5ac7f41d4ac41ce658c85e3042"
+ },
+ "cpp11": {
+ "Package": "cpp11",
+ "Version": "0.4.6",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Hash": "ed588261931ee3be2c700d22e94a29ab"
+ },
+ "crayon": {
+ "Package": "crayon",
+ "Version": "1.5.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "grDevices",
+ "methods",
+ "utils"
+ ],
+ "Hash": "e8a1e41acf02548751f45c718d55aa6a"
+ },
+ "dbplyr": {
+ "Package": "dbplyr",
+ "Version": "2.3.4",
+ "Source": "Repository",
+ "Repository": "RSPM",
+ "Requirements": [
+ "DBI",
+ "R",
+ "R6",
+ "blob",
+ "cli",
+ "dplyr",
+ "glue",
+ "lifecycle",
+ "magrittr",
+ "methods",
+ "pillar",
+ "purrr",
+ "rlang",
+ "tibble",
+ "tidyr",
+ "tidyselect",
+ "utils",
+ "vctrs",
+ "withr"
+ ],
+ "Hash": "d24305b92db333726aed162a2c23a147"
+ },
+ "desc": {
+ "Package": "desc",
+ "Version": "1.4.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "R6",
+ "cli",
+ "rprojroot",
+ "utils"
+ ],
+ "Hash": "6b9602c7ebbe87101a9c8edb6e8b6d21"
+ },
+ "diffobj": {
+ "Package": "diffobj",
+ "Version": "0.3.5",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "crayon",
+ "methods",
+ "stats",
+ "tools",
+ "utils"
+ ],
+ "Hash": "bcaa8b95f8d7d01a5dedfd959ce88ab8"
+ },
+ "digest": {
+ "Package": "digest",
+ "Version": "0.6.33",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "utils"
+ ],
+ "Hash": "8b708f296afd9ae69f450f9640be8990"
+ },
+ "dplyr": {
+ "Package": "dplyr",
+ "Version": "1.1.3",
+ "Source": "Repository",
+ "Repository": "RSPM",
+ "Requirements": [
+ "R",
+ "R6",
+ "cli",
+ "generics",
+ "glue",
+ "lifecycle",
+ "magrittr",
+ "methods",
+ "pillar",
+ "rlang",
+ "tibble",
+ "tidyselect",
+ "utils",
+ "vctrs"
+ ],
+ "Hash": "eb5742d256a0d9306d85ea68756d8187"
+ },
+ "ellipsis": {
+ "Package": "ellipsis",
+ "Version": "0.3.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "rlang"
+ ],
+ "Hash": "bb0eec2fe32e88d9e2836c2f73ea2077"
+ },
+ "evaluate": {
+ "Package": "evaluate",
+ "Version": "0.22",
+ "Source": "Repository",
+ "Repository": "CRAN"
+ },
+ "fansi": {
+ "Package": "fansi",
+ "Version": "1.0.4",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "grDevices",
+ "utils"
+ ],
+ "Hash": "1d9e7ad3c8312a192dea7d3db0274fde"
+ },
+ "fastmap": {
+ "Package": "fastmap",
+ "Version": "1.1.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Hash": "f7736a18de97dea803bde0a2daaafb27"
+ },
+ "filelock": {
+ "Package": "filelock",
+ "Version": "1.0.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Hash": "38ec653c2613bed60052ba3787bd8a2c"
+ },
+ "fs": {
+ "Package": "fs",
+ "Version": "1.6.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "methods"
+ ],
+ "Hash": "f4dcd23b67e33d851d2079f703e8b985"
+ },
+ "generics": {
+ "Package": "generics",
+ "Version": "0.1.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "methods"
+ ],
+ "Hash": "15e9634c0fcd294799e9b2e929ed1b86"
+ },
+ "glue": {
+ "Package": "glue",
+ "Version": "1.6.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "methods"
+ ],
+ "Hash": "4f2596dfb05dac67b9dc558e5c6fba2e"
+ },
+ "hms": {
+ "Package": "hms",
+ "Version": "1.1.3",
+ "Source": "Repository",
+ "Repository": "RSPM",
+ "Requirements": [
+ "lifecycle",
+ "methods",
+ "pkgconfig",
+ "rlang",
+ "vctrs"
+ ],
+ "Hash": "b59377caa7ed00fa41808342002138f9"
+ },
+ "jsonlite": {
+ "Package": "jsonlite",
+ "Version": "1.8.7",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "methods"
+ ],
+ "Hash": "a4269a09a9b865579b2635c77e572374"
+ },
+ "keyring": {
+ "Package": "keyring",
+ "Version": "1.3.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R6",
+ "askpass",
+ "assertthat",
+ "filelock",
+ "openssl",
+ "rappdirs",
+ "sodium",
+ "tools",
+ "utils",
+ "yaml"
+ ],
+ "Hash": "b7880ebefe188d62b099673bbc04afac"
+ },
+ "later": {
+ "Package": "later",
+ "Version": "1.3.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "Rcpp",
+ "rlang"
+ ],
+ "Hash": "7e7b457d7766bc47f2a5f21cc2984f8e"
+ },
+ "lifecycle": {
+ "Package": "lifecycle",
+ "Version": "1.0.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "glue",
+ "rlang"
+ ],
+ "Hash": "001cecbeac1cff9301bdc3775ee46a86"
+ },
+ "lubridate": {
+ "Package": "lubridate",
+ "Version": "1.9.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "generics",
+ "methods",
+ "timechange"
+ ],
+ "Hash": "e25f18436e3efd42c7c590a1c4c15390"
+ },
+ "magrittr": {
+ "Package": "magrittr",
+ "Version": "2.0.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "7ce2733a9826b3aeb1775d56fd305472"
+ },
+ "memoise": {
+ "Package": "memoise",
+ "Version": "2.0.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "cachem",
+ "rlang"
+ ],
+ "Hash": "e2817ccf4a065c5d9d7f2cfbe7c1d78c"
+ },
+ "openssl": {
+ "Package": "openssl",
+ "Version": "2.1.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "askpass"
+ ],
+ "Hash": "0f7cd2962e3044bb940cca4f4b5cecbe"
+ },
+ "pillar": {
+ "Package": "pillar",
+ "Version": "1.9.0",
+ "Source": "Repository",
+ "Repository": "RSPM",
+ "Requirements": [
+ "cli",
+ "fansi",
+ "glue",
+ "lifecycle",
+ "rlang",
+ "utf8",
+ "utils",
+ "vctrs"
+ ],
+ "Hash": "15da5a8412f317beeee6175fbc76f4bb"
+ },
+ "pkgconfig": {
+ "Package": "pkgconfig",
+ "Version": "2.0.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "utils"
+ ],
+ "Hash": "01f28d4278f15c76cddbea05899c5d6f"
+ },
+ "pkgload": {
+ "Package": "pkgload",
+ "Version": "1.3.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "crayon",
+ "desc",
+ "fs",
+ "glue",
+ "methods",
+ "rlang",
+ "rprojroot",
+ "utils",
+ "withr"
+ ],
+ "Hash": "6b0c222c5071efe0f3baf3dae9aa40e2"
+ },
+ "plogr": {
+ "Package": "plogr",
+ "Version": "0.2.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Hash": "09eb987710984fc2905c7129c7d85e65"
+ },
+ "pool": {
+ "Package": "pool",
+ "Version": "1.0.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "DBI",
+ "R",
+ "R6",
+ "later",
+ "methods",
+ "rlang",
+ "withr"
+ ],
+ "Hash": "52d086ff1a2ccccbae6d462cb0773835"
+ },
+ "praise": {
+ "Package": "praise",
+ "Version": "1.0.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Hash": "a555924add98c99d2f411e37e7d25e9f"
+ },
+ "prettyunits": {
+ "Package": "prettyunits",
+ "Version": "1.2.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Hash": "95ef9167b75dde9d2ccc3c7528393e7e"
+ },
+ "processx": {
+ "Package": "processx",
+ "Version": "3.8.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "R6",
+ "ps",
+ "utils"
+ ],
+ "Hash": "a33ee2d9bf07564efb888ad98410da84"
+ },
+ "progress": {
+ "Package": "progress",
+ "Version": "1.2.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R6",
+ "crayon",
+ "hms",
+ "prettyunits"
+ ],
+ "Hash": "14dc9f7a3c91ebb14ec5bb9208a07061"
+ },
+ "ps": {
+ "Package": "ps",
+ "Version": "1.7.5",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "utils"
+ ],
+ "Hash": "d88be14c6790aa6fd7b27a2079a45a85"
+ },
+ "purrr": {
+ "Package": "purrr",
+ "Version": "1.0.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "lifecycle",
+ "magrittr",
+ "rlang",
+ "vctrs"
+ ],
+ "Hash": "d71c815267c640f17ddbf7f16144b4bb"
+ },
+ "rJava": {
+ "Package": "rJava",
+ "Version": "1.0-6",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "methods"
+ ],
+ "Hash": "0415819f6baa75d86d52483f7292b623"
+ },
+ "rappdirs": {
+ "Package": "rappdirs",
+ "Version": "0.3.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "5e3c5dc0b071b21fa128676560dbe94d"
+ },
+ "readr": {
+ "Package": "readr",
+ "Version": "2.1.4",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "R6",
+ "cli",
+ "clipr",
+ "cpp11",
+ "crayon",
+ "hms",
+ "lifecycle",
+ "methods",
+ "rlang",
+ "tibble",
+ "tzdb",
+ "utils",
+ "vroom"
+ ],
+ "Hash": "b5047343b3825f37ad9d3b5d89aa1078"
+ },
+ "rematch2": {
+ "Package": "rematch2",
+ "Version": "2.1.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "tibble"
+ ],
+ "Hash": "76c9e04c712a05848ae7a23d2f170a40"
+ },
+ "renv": {
+ "Package": "renv",
+ "Version": "1.0.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "utils"
+ ],
+ "Hash": "41b847654f567341725473431dd0d5ab"
+ },
+ "rlang": {
+ "Package": "rlang",
+ "Version": "1.1.1",
+ "Source": "Repository",
+ "Repository": "RSPM",
+ "Requirements": [
+ "R",
+ "utils"
+ ],
+ "Hash": "dc079ccd156cde8647360f473c1fa718"
+ },
+ "rprojroot": {
+ "Package": "rprojroot",
+ "Version": "2.0.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "1de7ab598047a87bba48434ba35d497d"
+ },
+ "snow": {
+ "Package": "snow",
+ "Version": "0.4-4",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "utils"
+ ],
+ "Hash": "40b74690debd20c57d93d8c246b305d4"
+ },
+ "sodium": {
+ "Package": "sodium",
+ "Version": "1.3.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Hash": "3606bb09e0914edd4fc8313b500dcd5e"
+ },
+ "stringi": {
+ "Package": "stringi",
+ "Version": "1.7.12",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "stats",
+ "tools",
+ "utils"
+ ],
+ "Hash": "ca8bd84263c77310739d2cf64d84d7c9"
+ },
+ "stringr": {
+ "Package": "stringr",
+ "Version": "1.5.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "glue",
+ "lifecycle",
+ "magrittr",
+ "rlang",
+ "stringi",
+ "vctrs"
+ ],
+ "Hash": "671a4d384ae9d32fc47a14e98bfa3dc8"
+ },
+ "sys": {
+ "Package": "sys",
+ "Version": "3.4.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Hash": "34c16f1ef796057bfa06d3f4ff818a5d"
+ },
+ "testthat": {
+ "Package": "testthat",
+ "Version": "3.1.10",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "R6",
+ "brio",
+ "callr",
+ "cli",
+ "desc",
+ "digest",
+ "ellipsis",
+ "evaluate",
+ "jsonlite",
+ "lifecycle",
+ "magrittr",
+ "methods",
+ "pkgload",
+ "praise",
+ "processx",
+ "ps",
+ "rlang",
+ "utils",
+ "waldo",
+ "withr"
+ ],
+ "Hash": "7eb5fd202a61d2fb78af5869b6c08998"
+ },
+ "tibble": {
+ "Package": "tibble",
+ "Version": "3.2.1",
+ "Source": "Repository",
+ "Repository": "RSPM",
+ "Requirements": [
+ "R",
+ "fansi",
+ "lifecycle",
+ "magrittr",
+ "methods",
+ "pillar",
+ "pkgconfig",
+ "rlang",
+ "utils",
+ "vctrs"
+ ],
+ "Hash": "a84e2cc86d07289b3b6f5069df7a004c"
+ },
+ "tidyr": {
+ "Package": "tidyr",
+ "Version": "1.3.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "cpp11",
+ "dplyr",
+ "glue",
+ "lifecycle",
+ "magrittr",
+ "purrr",
+ "rlang",
+ "stringr",
+ "tibble",
+ "tidyselect",
+ "utils",
+ "vctrs"
+ ],
+ "Hash": "e47debdc7ce599b070c8e78e8ac0cfcf"
+ },
+ "tidyselect": {
+ "Package": "tidyselect",
+ "Version": "1.2.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "glue",
+ "lifecycle",
+ "rlang",
+ "vctrs",
+ "withr"
+ ],
+ "Hash": "79540e5fcd9e0435af547d885f184fd5"
+ },
+ "timechange": {
+ "Package": "timechange",
+ "Version": "0.2.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cpp11"
+ ],
+ "Hash": "8548b44f79a35ba1791308b61e6012d7"
+ },
+ "triebeard": {
+ "Package": "triebeard",
+ "Version": "0.4.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "Rcpp"
+ ],
+ "Hash": "642507a148b0dd9b5620177e0a044413"
+ },
+ "tzdb": {
+ "Package": "tzdb",
+ "Version": "0.4.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cpp11"
+ ],
+ "Hash": "b2e1cbce7c903eaf23ec05c58e59fb5e"
+ },
+ "urltools": {
+ "Package": "urltools",
+ "Version": "1.7.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "Rcpp",
+ "methods",
+ "triebeard"
+ ],
+ "Hash": "e86a704261a105f4703f653e05defa3e"
+ },
+ "utf8": {
+ "Package": "utf8",
+ "Version": "1.2.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "1fe17157424bb09c48a8b3b550c753bc"
+ },
+ "vctrs": {
+ "Package": "vctrs",
+ "Version": "0.6.3",
+ "Source": "Repository",
+ "Repository": "RSPM",
+ "Requirements": [
+ "R",
+ "cli",
+ "glue",
+ "lifecycle",
+ "rlang"
+ ],
+ "Hash": "06eceb3a5d716fd0654cc23ca3d71a99"
+ },
+ "vroom": {
+ "Package": "vroom",
+ "Version": "1.6.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "bit64",
+ "cli",
+ "cpp11",
+ "crayon",
+ "glue",
+ "hms",
+ "lifecycle",
+ "methods",
+ "progress",
+ "rlang",
+ "stats",
+ "tibble",
+ "tidyselect",
+ "tzdb",
+ "vctrs",
+ "withr"
+ ],
+ "Hash": "7015a74373b83ffaef64023f4a0f5033"
+ },
+ "waldo": {
+ "Package": "waldo",
+ "Version": "0.5.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "cli",
+ "diffobj",
+ "fansi",
+ "glue",
+ "methods",
+ "rematch2",
+ "rlang",
+ "tibble"
+ ],
+ "Hash": "035fba89d0c86e2113120f93301b98ad"
+ },
+ "withr": {
+ "Package": "withr",
+ "Version": "2.5.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "grDevices",
+ "graphics",
+ "stats"
+ ],
+ "Hash": "c0e49a9760983e81e55cdd9be92e7182"
+ },
+ "xml2": {
+ "Package": "xml2",
+ "Version": "1.3.5",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "methods"
+ ],
+ "Hash": "40682ed6a969ea5abfd351eb67833adc"
+ },
+ "yaml": {
+ "Package": "yaml",
+ "Version": "2.3.7",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Hash": "0d0056cc5383fbc240ccd0cb584bf436"
+ },
+ "zip": {
+ "Package": "zip",
+ "Version": "2.3.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Hash": "d98c94dacb7e0efcf83b0a133a705504"
+ }
+ }
+}
diff --git a/extras/TestModule1-0.0.1/renv/profiles/dev/renv/.gitignore b/extras/TestModule1-0.0.1/renv/profiles/dev/renv/.gitignore
new file mode 100644
index 00000000..0ec0cbba
--- /dev/null
+++ b/extras/TestModule1-0.0.1/renv/profiles/dev/renv/.gitignore
@@ -0,0 +1,7 @@
+library/
+local/
+cellar/
+lock/
+python/
+sandbox/
+staging/
diff --git a/extras/TestModule1-0.0.1/renv/profiles/dev/renv/settings.json b/extras/TestModule1-0.0.1/renv/profiles/dev/renv/settings.json
new file mode 100644
index 00000000..ffdbb320
--- /dev/null
+++ b/extras/TestModule1-0.0.1/renv/profiles/dev/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": null,
+ "snapshot.type": "implicit",
+ "use.cache": true,
+ "vcs.ignore.cellar": true,
+ "vcs.ignore.library": true,
+ "vcs.ignore.local": true,
+ "vcs.manage.ignores": true
+}
diff --git a/extras/TestModule1-0.0.1/renv/settings.dcf b/extras/TestModule1-0.0.1/renv/settings.dcf
deleted file mode 100644
index 169d82f1..00000000
--- a/extras/TestModule1-0.0.1/renv/settings.dcf
+++ /dev/null
@@ -1,10 +0,0 @@
-bioconductor.version:
-external.libraries:
-ignored.packages:
-package.dependency.fields: Imports, Depends, LinkingTo
-r.version:
-snapshot.type: implicit
-use.cache: TRUE
-vcs.ignore.cellar: TRUE
-vcs.ignore.library: TRUE
-vcs.ignore.local: TRUE
diff --git a/extras/TestModule1-0.0.1/tests/test-eunomia.R b/extras/TestModule1-0.0.1/tests/test-eunomia.R
index c303aa2e..852af8ca 100644
--- a/extras/TestModule1-0.0.1/tests/test-eunomia.R
+++ b/extras/TestModule1-0.0.1/tests/test-eunomia.R
@@ -1,3 +1,6 @@
+# Use this profile when testing
+#Sys.setenv(RENV_PROFILE = "dev")
+#renv::restore(prompt = FALSE)
library(testthat)
library(Eunomia)
connectionDetails <- getEunomiaConnectionDetails()
@@ -33,7 +36,7 @@ test_that("Run module", {
source("Main.R")
execute(jobContext)
resultsFiles <- list.files(resultsfolder)
- expect_true("tm1_data.csv" %in% resultsFiles)
+ expect_true("tm1_unit_test.csv" %in% resultsFiles)
})
unlink(workFolder)
diff --git a/extras/ValidateModuleLockFiles.R b/extras/ValidateModuleLockFiles.R
new file mode 100644
index 00000000..f0033b2a
--- /dev/null
+++ b/extras/ValidateModuleLockFiles.R
@@ -0,0 +1,24 @@
+rootDir <- "C:/git/OHDSI"
+moduleList <- c(
+ "Characterization",
+ "CohortDiagnostics",
+ "CohortGenerator",
+ "CohortIncidence",
+ "CohortMethod",
+ "EvidenceSynthesis",
+ "PatientLevelPrediction",
+ "SelfControlledCaseSeries"
+)
+
+for (i in seq_along(moduleList)) {
+ repoPath <- file.path(rootDir, paste0(moduleList[i], "Module"))
+ if (dir.exists(repoPath)) {
+ cat("Checking ", repoPath, "\n")
+ cat(" -- Checking renv.lock file\n")
+ Strategus::validateLockFile(filename = file.path(repoPath, "renv.lock"))
+ cat(" -- Checking dev/renv.lock file\n")
+ Strategus::validateLockFile(filename = file.path(repoPath, "renv/profiles/dev/renv.lock"))
+ } else {
+ warning(paste0(repoPath, "NOT FOUND!!"))
+ }
+}
diff --git a/inst/csv/modules.csv b/inst/csv/modules.csv
index 1aca1995..8198d685 100644
--- a/inst/csv/modules.csv
+++ b/inst/csv/modules.csv
@@ -1,9 +1,9 @@
module,version,remote_repo,remote_username,module_type,main_package,main_package_tag
-CharacterizationModule,v0.4.0,github.com,OHDSI,cdm,Characterization,v0.1.1
-CohortDiagnosticsModule,v0.1.0,github.com,OHDSI,cdm,CohortDiagnostics,v3.2.3
-CohortGeneratorModule,v0.2.0,github.com,OHDSI,cdm,CohortGenerator,v0.8.0
-CohortIncidenceModule,v0.2.0,github.com,OHDSI,cdm,CohortIncidence,v3.2.0
-CohortMethodModule,v0.2.0,github.com,OHDSI,cdm,CohortMethod,v5.1.0
-PatientLevelPredictionModule,v0.2.0,github.com,OHDSI,cdm,PatientLevelPrediction,v6.3.4
-SelfControlledCaseSeriesModule,v0.2.0,github.com,OHDSI,cdm,SelfControlledCaseSeries,v4.2.0
-EvidenceSynthesisModule,v0.2.1,github.com,OHDSI,results,EvidenceSynthesis,v0.5.0
+CharacterizationModule,v0.5.0,github.com,OHDSI,cdm,Characterization,v0.1.3
+CohortDiagnosticsModule,v0.2.0,github.com,OHDSI,cdm,CohortDiagnostics,v3.2.5
+CohortGeneratorModule,v0.3.0,github.com,OHDSI,cdm,CohortGenerator,v0.8.1
+CohortIncidenceModule,v0.4.0,github.com,OHDSI,cdm,CohortIncidence,v3.3.0
+CohortMethodModule,v0.3.0,github.com,OHDSI,cdm,CohortMethod,v5.2.0
+PatientLevelPredictionModule,v0.3.0,github.com,OHDSI,cdm,PatientLevelPrediction,v6.3.6
+SelfControlledCaseSeriesModule,v0.4.0,github.com,OHDSI,cdm,SelfControlledCaseSeries,v5.1.0
+EvidenceSynthesisModule,v0.6.0,github.com,OHDSI,results,EvidenceSynthesis,v0.5.0
diff --git a/inst/doc/CreatingAnalysisSpecification.pdf b/inst/doc/CreatingAnalysisSpecification.pdf
index 89b77506..22471ddf 100644
Binary files a/inst/doc/CreatingAnalysisSpecification.pdf and b/inst/doc/CreatingAnalysisSpecification.pdf differ
diff --git a/inst/doc/CreatingModules.pdf b/inst/doc/CreatingModules.pdf
index 397d9e9f..ae691b5c 100644
Binary files a/inst/doc/CreatingModules.pdf and b/inst/doc/CreatingModules.pdf differ
diff --git a/inst/doc/ExecuteStrategus.pdf b/inst/doc/ExecuteStrategus.pdf
index 3f7b82b0..ef8d8425 100644
Binary files a/inst/doc/ExecuteStrategus.pdf and b/inst/doc/ExecuteStrategus.pdf differ
diff --git a/inst/doc/IntroductionToStrategus.pdf b/inst/doc/IntroductionToStrategus.pdf
index a26acad3..978b632d 100644
Binary files a/inst/doc/IntroductionToStrategus.pdf and b/inst/doc/IntroductionToStrategus.pdf differ
diff --git a/inst/testdata/TestModule1_0.0.1.zip b/inst/testdata/TestModule1_0.0.1.zip
index de3a2b70..e93236a0 100644
Binary files a/inst/testdata/TestModule1_0.0.1.zip and b/inst/testdata/TestModule1_0.0.1.zip differ
diff --git a/inst/testdata/analysisSpecification.json b/inst/testdata/analysisSpecification.json
index 4ecb641d..bd4d6cb9 100644
--- a/inst/testdata/analysisSpecification.json
+++ b/inst/testdata/analysisSpecification.json
@@ -223,7 +223,7 @@
"moduleSpecifications": [
{
"module": "CohortGeneratorModule",
- "version": "0.2.0",
+ "version": "0.3.0",
"remoteRepo": "github.com",
"remoteUsername": "ohdsi",
"settings": {
@@ -234,7 +234,7 @@
},
{
"module": "CohortDiagnosticsModule",
- "version": "0.1.0",
+ "version": "0.2.0",
"remoteRepo": "github.com",
"remoteUsername": "ohdsi",
"settings": {
@@ -286,13 +286,14 @@
"attr_fun": "getDbDefaultCovariateData"
},
"minCharacterizationMean": 0.01,
+ "irWashoutPeriod": 0,
"incremental": false
},
"attr_class": ["CohortDiagnosticsModuleSpecifications", "ModuleSpecifications"]
},
{
"module": "CohortIncidenceModule",
- "version": "0.1.0",
+ "version": "0.4.0",
"remoteRepo": "github.com",
"remoteUsername": "ohdsi",
"settings": {
@@ -365,7 +366,7 @@
},
{
"module": "CharacterizationModule",
- "version": "0.4.0",
+ "version": "0.5.0",
"remoteRepo": "github.com",
"remoteUsername": "ohdsi",
"settings": {
@@ -389,6 +390,7 @@
{
"targetIds": [1, 2],
"outcomeIds": 3,
+ "minPriorObservation": 0,
"riskWindowStart": 1,
"startAnchor": "cohort start",
"riskWindowEnd": 0,
@@ -437,6 +439,7 @@
{
"targetIds": [1, 2],
"outcomeIds": 3,
+ "minPriorObservation": 0,
"riskWindowStart": 1,
"startAnchor": "cohort start",
"riskWindowEnd": 365,
@@ -489,7 +492,7 @@
},
{
"module": "CohortMethodModule",
- "version": "0.2.0",
+ "version": "0.3.0",
"remoteRepo": "github.com",
"remoteUsername": "ohdsi",
"settings": {
@@ -1333,7 +1336,7 @@
"easeThreshold": 0.25,
"sdmThreshold": 0.1,
"equipoiseThreshold": 0.2,
- "attritionFractionThreshold": 1,
+ "generalizabilitySdmThreshold": 1,
"attr_class": "CmDiagnosticThresholds"
}
},
@@ -1341,7 +1344,7 @@
},
{
"module": "SelfControlledCaseSeriesModule",
- "version": "0.2.0",
+ "version": "0.4.0",
"remoteRepo": "github.com",
"remoteUsername": "ohdsi",
"settings": {
@@ -1355,7 +1358,7 @@
"nestingCohortId": 1,
"deleteCovariatesSmallCount": 0,
"studyStartDate": "",
- "studyEndDate": "20191130",
+ "studyEndDate": "",
"maxCasesPerOutcome": 1000000,
"exposureIds": "exposureId",
"customCovariateIds": "",
@@ -1388,7 +1391,7 @@
"includeEraIds": "exposureId",
"label": "Main",
"stratifyById": false,
- "start": 1,
+ "start": 0,
"startAnchor": "era start",
"end": 0,
"endAnchor": "era end",
@@ -2360,7 +2363,7 @@
},
{
"module": "PatientLevelPredictionModule",
- "version": "0.2.0",
+ "version": "0.3.0",
"remoteRepo": "github.com",
"remoteUsername": "ohdsi",
"settings": [
@@ -2470,7 +2473,7 @@
"modelType": "logistic",
"addIntercept": true,
"useControl": true,
- "seed": 14457130,
+ "seed": 17037306,
"name": "Lasso Logistic Regression",
"threads": -1,
"tolerance": 2e-06,
@@ -2485,7 +2488,7 @@
"splitSettings": {
"test": 0.25,
"train": 0.75,
- "seed": 58440,
+ "seed": 74734,
"nfold": 3,
"attr_class": "splitSettings",
"attr_fun": "randomSplitter"
@@ -2607,7 +2610,7 @@
"modelType": "logistic",
"addIntercept": true,
"useControl": true,
- "seed": 86642490,
+ "seed": 22792170,
"name": "Lasso Logistic Regression",
"threads": -1,
"tolerance": 2e-06,
@@ -2622,7 +2625,7 @@
"splitSettings": {
"test": 0.25,
"train": 0.75,
- "seed": 84168,
+ "seed": 14402,
"nfold": 3,
"attr_class": "splitSettings",
"attr_fun": "randomSplitter"
diff --git a/inst/testdata/renv.lock b/inst/testdata/renv.lock
new file mode 100644
index 00000000..5b9b102d
--- /dev/null
+++ b/inst/testdata/renv.lock
@@ -0,0 +1,887 @@
+{
+ "R": {
+ "Version": "4.2.3",
+ "Repositories": [
+ {
+ "Name": "CRAN",
+ "URL": "https://packagemanager.posit.co/cran/latest"
+ }
+ ]
+ },
+ "Packages": {
+ "CohortGenerator": {
+ "Package": "CohortGenerator",
+ "Version": "0.8.1",
+ "Source": "GitHub",
+ "RemoteType": "github",
+ "RemoteHost": "api.github.com",
+ "RemoteUsername": "OHDSI",
+ "RemoteRepo": "CohortGenerator",
+ "RemoteRef": "v0.8.1",
+ "RemoteSha": "78757f1b191a395cf9dcff0d5bbe2b9fa4aa163e"
+ },
+ "DBI": {
+ "Package": "DBI",
+ "Version": "1.1.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "methods"
+ ],
+ "Hash": "b2866e62bab9378c3cc9476a1954226b"
+ },
+ "DatabaseConnector": {
+ "Package": "DatabaseConnector",
+ "Version": "6.3.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "DBI",
+ "R",
+ "SqlRender",
+ "bit64",
+ "checkmate",
+ "dbplyr",
+ "digest",
+ "methods",
+ "rJava",
+ "readr",
+ "rlang",
+ "stringr",
+ "urltools",
+ "utils"
+ ],
+ "Hash": "1ef65614602c6534a6c666e872c3b647"
+ },
+ "ParallelLogger": {
+ "Package": "ParallelLogger",
+ "Version": "3.3.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "jsonlite",
+ "methods",
+ "snow",
+ "utils",
+ "xml2"
+ ],
+ "Hash": "8d893bed8c8bfe21217464dd3f9ec3e9"
+ },
+ "R6": {
+ "Package": "R6",
+ "Version": "2.5.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "470851b6d5d0ac559e9d01bb352b4021"
+ },
+ "RJSONIO": {
+ "Package": "RJSONIO",
+ "Version": "1.3-1.8",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "methods"
+ ],
+ "Hash": "cd79d1874fb20217463451f8c310c526"
+ },
+ "RSQLite": {
+ "Package": "RSQLite",
+ "Version": "2.3.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "DBI",
+ "R",
+ "bit64",
+ "blob",
+ "cpp11",
+ "memoise",
+ "methods",
+ "pkgconfig",
+ "plogr"
+ ],
+ "Hash": "207c90cd5438a1f596da2cd54c606fee"
+ },
+ "Rcpp": {
+ "Package": "Rcpp",
+ "Version": "1.0.11",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "methods",
+ "utils"
+ ],
+ "Hash": "e749cae40fa9ef469b6050959517453c"
+ },
+ "ResultModelManager": {
+ "Package": "ResultModelManager",
+ "Version": "0.5.6",
+ "Source": "GitHub",
+ "RemoteType": "github",
+ "RemoteHost": "api.github.com",
+ "RemoteUsername": "OHDSI",
+ "RemoteRepo": "ResultModelManager",
+ "RemoteRef": "v0.5.6",
+ "RemoteSha": "3033804e5af77b8b8dacda67c4d6853731e3641b"
+ },
+ "SqlRender": {
+ "Package": "SqlRender",
+ "Version": "1.16.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "checkmate",
+ "rJava",
+ "rlang"
+ ],
+ "Hash": "94d9cae91bbd8aed211bea82aff7cf77"
+ },
+ "askpass": {
+ "Package": "askpass",
+ "Version": "1.2.0",
+ "Source": "Repository",
+ "Repository": "CRAN"
+ },
+ "assertthat": {
+ "Package": "assertthat",
+ "Version": "0.2.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "tools"
+ ],
+ "Hash": "50c838a310445e954bc13f26f26a6ecf"
+ },
+ "backports": {
+ "Package": "backports",
+ "Version": "1.4.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "c39fbec8a30d23e721980b8afb31984c"
+ },
+ "bit": {
+ "Package": "bit",
+ "Version": "4.0.5",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "d242abec29412ce988848d0294b208fd"
+ },
+ "bit64": {
+ "Package": "bit64",
+ "Version": "4.0.5",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "bit",
+ "methods",
+ "stats",
+ "utils"
+ ],
+ "Hash": "9fe98599ca456d6552421db0d6772d8f"
+ },
+ "blob": {
+ "Package": "blob",
+ "Version": "1.2.4",
+ "Source": "Repository",
+ "Repository": "RSPM",
+ "Requirements": [
+ "methods",
+ "rlang",
+ "vctrs"
+ ],
+ "Hash": "40415719b5a479b87949f3aa0aee737c"
+ },
+ "cachem": {
+ "Package": "cachem",
+ "Version": "1.0.8",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "fastmap",
+ "rlang"
+ ],
+ "Hash": "cda74447c42f529de601fe4d4050daef"
+ },
+ "checkmate": {
+ "Package": "checkmate",
+ "Version": "2.3.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "backports",
+ "utils"
+ ],
+ "Hash": "ed4275b13c6ab74b89a31def0b6bf835"
+ },
+ "cli": {
+ "Package": "cli",
+ "Version": "3.6.1",
+ "Source": "Repository",
+ "Repository": "RSPM",
+ "Requirements": [
+ "R",
+ "utils"
+ ],
+ "Hash": "89e6d8219950eac806ae0c489052048a"
+ },
+ "clipr": {
+ "Package": "clipr",
+ "Version": "0.8.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "utils"
+ ],
+ "Hash": "3f038e5ac7f41d4ac41ce658c85e3042"
+ },
+ "cpp11": {
+ "Package": "cpp11",
+ "Version": "0.4.6",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Hash": "ed588261931ee3be2c700d22e94a29ab"
+ },
+ "crayon": {
+ "Package": "crayon",
+ "Version": "1.5.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "grDevices",
+ "methods",
+ "utils"
+ ],
+ "Hash": "e8a1e41acf02548751f45c718d55aa6a"
+ },
+ "dbplyr": {
+ "Package": "dbplyr",
+ "Version": "2.3.4",
+ "Source": "Repository",
+ "Repository": "RSPM",
+ "Requirements": [
+ "DBI",
+ "R",
+ "R6",
+ "blob",
+ "cli",
+ "dplyr",
+ "glue",
+ "lifecycle",
+ "magrittr",
+ "methods",
+ "pillar",
+ "purrr",
+ "rlang",
+ "tibble",
+ "tidyr",
+ "tidyselect",
+ "utils",
+ "vctrs",
+ "withr"
+ ],
+ "Hash": "d24305b92db333726aed162a2c23a147"
+ },
+ "digest": {
+ "Package": "digest",
+ "Version": "0.6.33",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "utils"
+ ],
+ "Hash": "8b708f296afd9ae69f450f9640be8990"
+ },
+ "dplyr": {
+ "Package": "dplyr",
+ "Version": "1.1.3",
+ "Source": "Repository",
+ "Repository": "RSPM",
+ "Requirements": [
+ "R",
+ "R6",
+ "cli",
+ "generics",
+ "glue",
+ "lifecycle",
+ "magrittr",
+ "methods",
+ "pillar",
+ "rlang",
+ "tibble",
+ "tidyselect",
+ "utils",
+ "vctrs"
+ ],
+ "Hash": "eb5742d256a0d9306d85ea68756d8187"
+ },
+ "fansi": {
+ "Package": "fansi",
+ "Version": "1.0.4",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "grDevices",
+ "utils"
+ ],
+ "Hash": "1d9e7ad3c8312a192dea7d3db0274fde"
+ },
+ "fastmap": {
+ "Package": "fastmap",
+ "Version": "1.1.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Hash": "f7736a18de97dea803bde0a2daaafb27"
+ },
+ "filelock": {
+ "Package": "filelock",
+ "Version": "1.0.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Hash": "38ec653c2613bed60052ba3787bd8a2c"
+ },
+ "generics": {
+ "Package": "generics",
+ "Version": "0.1.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "methods"
+ ],
+ "Hash": "15e9634c0fcd294799e9b2e929ed1b86"
+ },
+ "glue": {
+ "Package": "glue",
+ "Version": "1.6.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "methods"
+ ],
+ "Hash": "4f2596dfb05dac67b9dc558e5c6fba2e"
+ },
+ "hms": {
+ "Package": "hms",
+ "Version": "1.1.3",
+ "Source": "Repository",
+ "Repository": "RSPM",
+ "Requirements": [
+ "lifecycle",
+ "methods",
+ "pkgconfig",
+ "rlang",
+ "vctrs"
+ ],
+ "Hash": "b59377caa7ed00fa41808342002138f9"
+ },
+ "jsonlite": {
+ "Package": "jsonlite",
+ "Version": "1.8.7",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "methods"
+ ],
+ "Hash": "a4269a09a9b865579b2635c77e572374"
+ },
+ "keyring": {
+ "Package": "keyring",
+ "Version": "1.3.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R6",
+ "askpass",
+ "assertthat",
+ "filelock",
+ "openssl",
+ "rappdirs",
+ "sodium",
+ "tools",
+ "utils",
+ "yaml"
+ ],
+ "Hash": "b7880ebefe188d62b099673bbc04afac"
+ },
+ "later": {
+ "Package": "later",
+ "Version": "1.3.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "Rcpp",
+ "rlang"
+ ],
+ "Hash": "7e7b457d7766bc47f2a5f21cc2984f8e"
+ },
+ "lifecycle": {
+ "Package": "lifecycle",
+ "Version": "1.0.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "glue",
+ "rlang"
+ ],
+ "Hash": "001cecbeac1cff9301bdc3775ee46a86"
+ },
+ "lubridate": {
+ "Package": "lubridate",
+ "Version": "1.9.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "generics",
+ "methods",
+ "timechange"
+ ],
+ "Hash": "e25f18436e3efd42c7c590a1c4c15390"
+ },
+ "magrittr": {
+ "Package": "magrittr",
+ "Version": "2.0.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "7ce2733a9826b3aeb1775d56fd305472"
+ },
+ "memoise": {
+ "Package": "memoise",
+ "Version": "2.0.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "cachem",
+ "rlang"
+ ],
+ "Hash": "e2817ccf4a065c5d9d7f2cfbe7c1d78c"
+ },
+ "openssl": {
+ "Package": "openssl",
+ "Version": "2.1.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "askpass"
+ ],
+ "Hash": "0f7cd2962e3044bb940cca4f4b5cecbe"
+ },
+ "pillar": {
+ "Package": "pillar",
+ "Version": "1.9.0",
+ "Source": "Repository",
+ "Repository": "RSPM",
+ "Requirements": [
+ "cli",
+ "fansi",
+ "glue",
+ "lifecycle",
+ "rlang",
+ "utf8",
+ "utils",
+ "vctrs"
+ ],
+ "Hash": "15da5a8412f317beeee6175fbc76f4bb"
+ },
+ "pkgconfig": {
+ "Package": "pkgconfig",
+ "Version": "2.0.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "utils"
+ ],
+ "Hash": "01f28d4278f15c76cddbea05899c5d6f"
+ },
+ "plogr": {
+ "Package": "plogr",
+ "Version": "0.2.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Hash": "09eb987710984fc2905c7129c7d85e65"
+ },
+ "pool": {
+ "Package": "pool",
+ "Version": "1.0.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "DBI",
+ "R",
+ "R6",
+ "later",
+ "methods",
+ "rlang",
+ "withr"
+ ],
+ "Hash": "52d086ff1a2ccccbae6d462cb0773835"
+ },
+ "prettyunits": {
+ "Package": "prettyunits",
+ "Version": "1.2.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Hash": "95ef9167b75dde9d2ccc3c7528393e7e"
+ },
+ "progress": {
+ "Package": "progress",
+ "Version": "1.2.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R6",
+ "crayon",
+ "hms",
+ "prettyunits"
+ ],
+ "Hash": "14dc9f7a3c91ebb14ec5bb9208a07061"
+ },
+ "purrr": {
+ "Package": "purrr",
+ "Version": "1.0.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "lifecycle",
+ "magrittr",
+ "rlang",
+ "vctrs"
+ ],
+ "Hash": "d71c815267c640f17ddbf7f16144b4bb"
+ },
+ "rJava": {
+ "Package": "rJava",
+ "Version": "1.0-6",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "methods"
+ ],
+ "Hash": "0415819f6baa75d86d52483f7292b623"
+ },
+ "rappdirs": {
+ "Package": "rappdirs",
+ "Version": "0.3.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "5e3c5dc0b071b21fa128676560dbe94d"
+ },
+ "readr": {
+ "Package": "readr",
+ "Version": "2.1.4",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "R6",
+ "cli",
+ "clipr",
+ "cpp11",
+ "crayon",
+ "hms",
+ "lifecycle",
+ "methods",
+ "rlang",
+ "tibble",
+ "tzdb",
+ "utils",
+ "vroom"
+ ],
+ "Hash": "b5047343b3825f37ad9d3b5d89aa1078"
+ },
+ "renv": {
+ "Package": "renv",
+ "Version": "1.0.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "utils"
+ ],
+ "Hash": "41b847654f567341725473431dd0d5ab"
+ },
+ "rlang": {
+ "Package": "rlang",
+ "Version": "1.1.1",
+ "Source": "Repository",
+ "Repository": "RSPM",
+ "Requirements": [
+ "R",
+ "utils"
+ ],
+ "Hash": "dc079ccd156cde8647360f473c1fa718"
+ },
+ "snow": {
+ "Package": "snow",
+ "Version": "0.4-4",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "utils"
+ ],
+ "Hash": "40b74690debd20c57d93d8c246b305d4"
+ },
+ "sodium": {
+ "Package": "sodium",
+ "Version": "1.3.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Hash": "3606bb09e0914edd4fc8313b500dcd5e"
+ },
+ "stringi": {
+ "Package": "stringi",
+ "Version": "1.7.12",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "stats",
+ "tools",
+ "utils"
+ ],
+ "Hash": "ca8bd84263c77310739d2cf64d84d7c9"
+ },
+ "stringr": {
+ "Package": "stringr",
+ "Version": "1.5.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "glue",
+ "lifecycle",
+ "magrittr",
+ "rlang",
+ "stringi",
+ "vctrs"
+ ],
+ "Hash": "671a4d384ae9d32fc47a14e98bfa3dc8"
+ },
+ "sys": {
+ "Package": "sys",
+ "Version": "3.4.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Hash": "34c16f1ef796057bfa06d3f4ff818a5d"
+ },
+ "tibble": {
+ "Package": "tibble",
+ "Version": "3.2.1",
+ "Source": "Repository",
+ "Repository": "RSPM",
+ "Requirements": [
+ "R",
+ "fansi",
+ "lifecycle",
+ "magrittr",
+ "methods",
+ "pillar",
+ "pkgconfig",
+ "rlang",
+ "utils",
+ "vctrs"
+ ],
+ "Hash": "a84e2cc86d07289b3b6f5069df7a004c"
+ },
+ "tidyr": {
+ "Package": "tidyr",
+ "Version": "1.3.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "cpp11",
+ "dplyr",
+ "glue",
+ "lifecycle",
+ "magrittr",
+ "purrr",
+ "rlang",
+ "stringr",
+ "tibble",
+ "tidyselect",
+ "utils",
+ "vctrs"
+ ],
+ "Hash": "e47debdc7ce599b070c8e78e8ac0cfcf"
+ },
+ "tidyselect": {
+ "Package": "tidyselect",
+ "Version": "1.2.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "glue",
+ "lifecycle",
+ "rlang",
+ "vctrs",
+ "withr"
+ ],
+ "Hash": "79540e5fcd9e0435af547d885f184fd5"
+ },
+ "timechange": {
+ "Package": "timechange",
+ "Version": "0.2.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cpp11"
+ ],
+ "Hash": "8548b44f79a35ba1791308b61e6012d7"
+ },
+ "triebeard": {
+ "Package": "triebeard",
+ "Version": "0.4.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "Rcpp"
+ ],
+ "Hash": "642507a148b0dd9b5620177e0a044413"
+ },
+ "tzdb": {
+ "Package": "tzdb",
+ "Version": "0.4.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cpp11"
+ ],
+ "Hash": "b2e1cbce7c903eaf23ec05c58e59fb5e"
+ },
+ "urltools": {
+ "Package": "urltools",
+ "Version": "1.7.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "Rcpp",
+ "methods",
+ "triebeard"
+ ],
+ "Hash": "e86a704261a105f4703f653e05defa3e"
+ },
+ "utf8": {
+ "Package": "utf8",
+ "Version": "1.2.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "1fe17157424bb09c48a8b3b550c753bc"
+ },
+ "vctrs": {
+ "Package": "vctrs",
+ "Version": "0.6.3",
+ "Source": "Repository",
+ "Repository": "RSPM",
+ "Requirements": [
+ "R",
+ "cli",
+ "glue",
+ "lifecycle",
+ "rlang"
+ ],
+ "Hash": "06eceb3a5d716fd0654cc23ca3d71a99"
+ },
+ "vroom": {
+ "Package": "vroom",
+ "Version": "1.6.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "bit64",
+ "cli",
+ "cpp11",
+ "crayon",
+ "glue",
+ "hms",
+ "lifecycle",
+ "methods",
+ "progress",
+ "rlang",
+ "stats",
+ "tibble",
+ "tidyselect",
+ "tzdb",
+ "vctrs",
+ "withr"
+ ],
+ "Hash": "7015a74373b83ffaef64023f4a0f5033"
+ },
+ "withr": {
+ "Package": "withr",
+ "Version": "2.5.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "grDevices",
+ "graphics",
+ "stats"
+ ],
+ "Hash": "c0e49a9760983e81e55cdd9be92e7182"
+ },
+ "xml2": {
+ "Package": "xml2",
+ "Version": "1.3.5",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "methods"
+ ],
+ "Hash": "40682ed6a969ea5abfd351eb67833adc"
+ },
+ "yaml": {
+ "Package": "yaml",
+ "Version": "2.3.7",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Hash": "0d0056cc5383fbc240ccd0cb584bf436"
+ },
+ "zip": {
+ "Package": "zip",
+ "Version": "2.3.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Hash": "d98c94dacb7e0efcf83b0a133a705504"
+ }
+ }
+}
diff --git a/man-roxygen/forceVerification.R b/man-roxygen/forceVerification.R
new file mode 100644
index 00000000..540cf869
--- /dev/null
+++ b/man-roxygen/forceVerification.R
@@ -0,0 +1,5 @@
+#' @param forceVerification When set to TRUE, the verification process is forced
+#' to re-evaluate if a module is properly installed. The default is FALSE
+#' since if a module is successfully validated, the module will contain
+#' the hash value of the module's renv.lock file in the file system so it can
+#' by-pass running this check every time.
diff --git a/man/compareLockFiles.Rd b/man/compareLockFiles.Rd
new file mode 100644
index 00000000..9dca734f
--- /dev/null
+++ b/man/compareLockFiles.Rd
@@ -0,0 +1,21 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/RenvHelpers.R
+\name{compareLockFiles}
+\alias{compareLockFiles}
+\title{Compare two renv.lock files}
+\usage{
+compareLockFiles(filename1, filename2)
+}
+\arguments{
+\item{filename1}{The first renv.lock file name}
+
+\item{filename2}{The second renv.lock file name}
+}
+\value{
+A data.frame with the comparison of the rev.lock files
+}
+\description{
+Used to compare renv.lock files and return the results in a data.frame.
+The return value will include a "full join" representation of the packages
+across the two lock files.
+}
diff --git a/man/ensureAllModulesInstantiated.Rd b/man/ensureAllModulesInstantiated.Rd
index e672a528..7d9e2ff9 100644
--- a/man/ensureAllModulesInstantiated.Rd
+++ b/man/ensureAllModulesInstantiated.Rd
@@ -4,14 +4,22 @@
\alias{ensureAllModulesInstantiated}
\title{Ensure all modules are instantiated}
\usage{
-ensureAllModulesInstantiated(analysisSpecifications)
+ensureAllModulesInstantiated(analysisSpecifications, forceVerification = FALSE)
}
\arguments{
\item{analysisSpecifications}{An object of type \code{AnalysisSpecifications} as created
by \code{\link[=createEmptyAnalysisSpecificiations]{createEmptyAnalysisSpecificiations()}}.}
+
+\item{forceVerification}{When set to TRUE, the verification process is forced
+to re-evaluate if a module is properly installed. The default is FALSE
+since if a module is successfully validated, the module will contain
+the hash value of the module's renv.lock file in the file system so it can
+by-pass running this check every time.}
}
\value{
-A tibble listing the instantiated modules.
+A list containing the install status of all modules
+(TRUE if all are installed properly) and a tibble listing
+the instantiated modules.
}
\description{
Ensure that all modules referenced in the analysis specifications are instantiated
diff --git a/man/lockFileToDataFrame.Rd b/man/lockFileToDataFrame.Rd
new file mode 100644
index 00000000..e5569b87
--- /dev/null
+++ b/man/lockFileToDataFrame.Rd
@@ -0,0 +1,12 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/RenvHelpers.R
+\name{lockFileToDataFrame}
+\alias{lockFileToDataFrame}
+\title{Convert a lock file to a data.frame}
+\usage{
+lockFileToDataFrame(lf)
+}
+\description{
+Convert a lock file to a data.frame
+}
+\keyword{internal}
diff --git a/man/mandatoryPackages.Rd b/man/mandatoryPackages.Rd
new file mode 100644
index 00000000..3c0c9f7e
--- /dev/null
+++ b/man/mandatoryPackages.Rd
@@ -0,0 +1,12 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/RenvHelpers.R
+\name{mandatoryPackages}
+\alias{mandatoryPackages}
+\title{List of mandatory packages for a Strategus module}
+\usage{
+mandatoryPackages()
+}
+\description{
+List of mandatory packages for a Strategus module
+}
+\keyword{internal}
diff --git a/man/suggestedPacakges.Rd b/man/suggestedPacakges.Rd
new file mode 100644
index 00000000..e1ed2d31
--- /dev/null
+++ b/man/suggestedPacakges.Rd
@@ -0,0 +1,12 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/RenvHelpers.R
+\name{suggestedPacakges}
+\alias{suggestedPacakges}
+\title{List of suggested packages for a Strategus module}
+\usage{
+suggestedPacakges()
+}
+\description{
+List of suggested packages for a Strategus module
+}
+\keyword{internal}
diff --git a/man/syncLockFile.Rd b/man/syncLockFile.Rd
new file mode 100644
index 00000000..66dd8bff
--- /dev/null
+++ b/man/syncLockFile.Rd
@@ -0,0 +1,31 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/RenvHelpers.R
+\name{syncLockFile}
+\alias{syncLockFile}
+\title{Synchronize renv.lock files and overwrite the target file
+(read the description)}
+\usage{
+syncLockFile(sourceOfTruthLockFileName, targetLockFileName)
+}
+\arguments{
+\item{sourceOfTruthLockFileName}{The renv.lock file to use as the source of
+truth}
+
+\item{targetLockFileName}{The target renv.lock file that will be synced with
+the source of truth}
+}
+\value{
+A data.frame containing the different packages and their version that
+were involved in the synchronization process
+}
+\description{
+Used to synchronize the values from the "source of truth" renv.lock file to
+the target renv.lock file. Packages are compared (by name) and if the version
+of the package in the "source of truth" is greater the one found in the
+target, the target renv.lock file will be updated. This function will
+automatically update the target file.
+
+Version comparison is handled by the \code{semver} package and since most packages
+use semantic versioning. When a package does not use semantic versioning,
+a warning is provided so the user can review.
+}
diff --git a/man/validateLockFile.Rd b/man/validateLockFile.Rd
new file mode 100644
index 00000000..42d79be0
--- /dev/null
+++ b/man/validateLockFile.Rd
@@ -0,0 +1,17 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/RenvHelpers.R
+\name{validateLockFile}
+\alias{validateLockFile}
+\title{Validate an renv.lock file to ensure it is ready for use by Strategus}
+\usage{
+validateLockFile(filename)
+}
+\arguments{
+\item{filename}{The renv.lock file to validate}
+}
+\description{
+Will check an renv.lock file for a module to verify that it only references
+tagged packages and includes the packages required by Strategus. It will
+also check for suggested packages that are useful for testing, such as
+RSQLite.
+}
diff --git a/man/verifyModuleInstallation.Rd b/man/verifyModuleInstallation.Rd
new file mode 100644
index 00000000..d0b96c1b
--- /dev/null
+++ b/man/verifyModuleInstallation.Rd
@@ -0,0 +1,45 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/ModuleInstantiation.R
+\name{verifyModuleInstallation}
+\alias{verifyModuleInstallation}
+\title{Verify a module is properly installed}
+\usage{
+verifyModuleInstallation(
+ module,
+ version,
+ silent = FALSE,
+ forceVerification = FALSE
+)
+}
+\arguments{
+\item{module}{The name of the module to verify (i.e. "CohortGeneratorModule")}
+
+\item{version}{The version of the module to verify (i.e. "0.2.1")}
+
+\item{silent}{When TRUE output of this verification process is suppressed}
+
+\item{forceVerification}{When set to TRUE, the verification process is forced
+to re-evaluate if a module is properly installed. The default is FALSE
+since if a module is successfully validated, the module will contain
+the hash value of the module's renv.lock file in the file system so it can
+by-pass running this check every time.}
+}
+\value{
+A list with the output of the consistency check
+}
+\description{
+In some instances a module may fail to instantiate and install due to problems
+when calling renv::restore for the module's renv.lock file. This function
+will allow you to surface inconsistencies between the module renv.lock file
+and the module's renv project library. This function will check to that a
+module has been properly installed using internal functions of the \code{renv}
+package. If a module is verified to work via this function, the hash of
+the module's renv.lock file will be written to a text file in the module
+directory to indicate that it is ready for use. This will allow subsequent
+calls to work faster since the initial verification process can take some
+time.It is possible to re-run the verification of a module
+by using the \code{forceVerification} parameter.
+
+To fix issues with a module, you will need to open the module's .Rproj in
+RStudio instance and debug the issues when calling renv::restore().
+}
diff --git a/man/withModuleRenv.Rd b/man/withModuleRenv.Rd
index 61407a23..dd61f4e0 100644
--- a/man/withModuleRenv.Rd
+++ b/man/withModuleRenv.Rd
@@ -10,7 +10,6 @@ withModuleRenv(
moduleFolder,
injectVars = list(),
tempScriptFile = tempfile(fileext = ".R"),
- useLocalStrategusLibrary = TRUE,
job = FALSE,
processName = paste(moduleFolder, "_renv_run")
)
@@ -25,9 +24,6 @@ find the pattern foo and replace it with the string some string - be careful!}
\item{tempScriptFile}{tempFile to write script to}
-\item{useLocalStrategusLibrary}{Use the locally installed Strategus library? TRUE will use the Strategus
-installation from the calling R process.}
-
\item{job}{run as rstudio job}
\item{processName}{String name for process}
diff --git a/tests/testthat/setup.R b/tests/testthat/setup.R
index a8b35c1b..9d0a2c45 100644
--- a/tests/testthat/setup.R
+++ b/tests/testthat/setup.R
@@ -16,7 +16,7 @@ withr::defer(
if (dir.exists(Sys.getenv("DATABASECONNECTOR_JAR_FOLDER"))) {
jdbcDriverFolder <- Sys.getenv("DATABASECONNECTOR_JAR_FOLDER")
} else {
- jdbcDriverFolder <- "~/.jdbcDrivers"
+ jdbcDriverFolder <- "~/jdbcDrivers"
dir.create(jdbcDriverFolder, showWarnings = FALSE)
baseDatabaseConnectorJarFolder <- Sys.getenv("DATABASECONNECTOR_JAR_FOLDER")
Sys.setenv("DATABASECONNECTOR_JAR_FOLDER" = jdbcDriverFolder)
@@ -29,19 +29,21 @@ if (dir.exists(Sys.getenv("DATABASECONNECTOR_JAR_FOLDER"))) {
)
}
-
# Create a unique ID for the table identifiers
tableSuffix <- paste0(substr(.Platform$OS.type, 1, 3), format(Sys.time(), "%y%m%d%H%M%S"), sample(1:100, 1))
tableSuffix <- abs(digest::digest2int(tableSuffix))
-tempDir <- tempfile() # "D:"
+usingTempDir <- Sys.getenv("STRATEGUS_UNIT_TEST_FOLDER") == ""
+tempDir <- ifelse(usingTempDir, tempfile(), Sys.getenv("STRATEGUS_UNIT_TEST_FOLDER"))
tempDir <- gsub("\\\\", "/", tempDir) # Correct windows path
renvCachePath <- file.path(tempDir, "strategus/renv")
moduleFolder <- file.path(tempDir, "strategus/modules")
Sys.setenv("INSTANTIATED_MODULES_FOLDER" = moduleFolder)
withr::defer(
{
- unlink(c(tempDir, renvCachePath, moduleFolder), recursive = TRUE, force = TRUE)
+ if (usingTempDir) {
+ unlink(c(tempDir, renvCachePath, moduleFolder), recursive = TRUE, force = TRUE)
+ }
},
testthat::teardown_env()
)
@@ -66,7 +68,7 @@ withr::defer(
cdmDatabaseSchema <- "main"
workDatabaseSchema <- "main"
vocabularyDatabaseSchema <- workDatabaseSchema
-cohortTable <- "cohort"
+cohortTableNames <- CohortGenerator::getCohortTableNames(cohortTable = paste0("s", tableSuffix))
tempEmulationSchema <- NULL
connectionDetailsList[[length(connectionDetailsList) + 1]] <- list(
@@ -74,7 +76,7 @@ connectionDetailsList[[length(connectionDetailsList) + 1]] <- list(
cdmDatabaseSchema = "main",
workDatabaseSchema = "main",
vocabularyDatabaseSchema = "main",
- cohortTable = "cohort",
+ cohortTableNames = cohortTableNames,
tempEmulationSchema = NULL
)
@@ -92,12 +94,12 @@ if (!(Sys.getenv("CDM5_POSTGRESQL_USER") == "" &
password = URLdecode(Sys.getenv("CDM5_POSTGRESQL_PASSWORD")),
server = Sys.getenv("CDM5_POSTGRESQL_SERVER"),
port = 5432,
- pathToDriver = jdbcDriverFolder
+ pathToDriver = Sys.getenv("DATABASECONNECTOR_JAR_FOLDER")
),
cdmDatabaseSchema = Sys.getenv("CDM5_POSTGRESQL_CDM_SCHEMA"),
workDatabaseSchema = Sys.getenv("CDM5_POSTGRESQL_OHDSI_SCHEMA"),
vocabularyDatabaseSchema = Sys.getenv("CDM5_POSTGRESQL_CDM_SCHEMA"),
- cohortTable = "cohort",
+ cohortTableNames = cohortTableNames,
tempEmulationSchema = NULL
)
}
@@ -116,12 +118,12 @@ if (!(Sys.getenv("CDM5_ORACLE_USER") == "" &
password = URLdecode(Sys.getenv("CDM5_ORACLE_PASSWORD")),
server = Sys.getenv("CDM5_ORACLE_SERVER"),
port = 1521,
- pathToDriver = jdbcDriverFolder
+ pathToDriver = Sys.getenv("DATABASECONNECTOR_JAR_FOLDER")
),
cdmDatabaseSchema = Sys.getenv("CDM5_ORACLE_CDM_SCHEMA"),
workDatabaseSchema = Sys.getenv("CDM5_ORACLE_OHDSI_SCHEMA"),
vocabularyDatabaseSchema = Sys.getenv("CDM5_ORACLE_CDM_SCHEMA"),
- cohortTable = "cohort",
+ cohortTableNames = cohortTableNames,
tempEmulationSchema = Sys.getenv("CDM5_ORACLE_OHDSI_SCHEMA")
)
}
@@ -140,12 +142,12 @@ if (!(Sys.getenv("CDM5_REDSHIFT_USER") == "" &
password = URLdecode(Sys.getenv("CDM5_REDSHIFT_PASSWORD")),
server = Sys.getenv("CDM5_REDSHIFT_SERVER"),
port = 5439,
- pathToDriver = jdbcDriverFolder
+ pathToDriver = Sys.getenv("DATABASECONNECTOR_JAR_FOLDER")
),
cdmDatabaseSchema = Sys.getenv("CDM5_REDSHIFT_CDM_SCHEMA"),
workDatabaseSchema = Sys.getenv("CDM5_REDSHIFT_OHDSI_SCHEMA"),
vocabularyDatabaseSchema = Sys.getenv("CDM5_REDSHIFT_CDM_SCHEMA"),
- cohortTable = "cohort",
+ cohortTableNames = cohortTableNames,
tempEmulationSchema = NULL
)
}
@@ -164,12 +166,12 @@ if (!(Sys.getenv("CDM5_SQL_SERVER_USER") == "" &
password = URLdecode(Sys.getenv("CDM5_SQL_SERVER_PASSWORD")),
server = Sys.getenv("CDM5_SQL_SERVER_SERVER"),
port = 1433,
- pathToDriver = jdbcDriverFolder
+ pathToDriver = Sys.getenv("DATABASECONNECTOR_JAR_FOLDER")
),
cdmDatabaseSchema = Sys.getenv("CDM5_SQL_SERVER_CDM_SCHEMA"),
workDatabaseSchema = Sys.getenv("CDM5_SQL_SERVER_OHDSI_SCHEMA"),
vocabularyDatabaseSchema = Sys.getenv("CDM5_SQL_SERVER_CDM_SCHEMA"),
- cohortTable = "cohort",
+ cohortTableNames = cohortTableNames,
tempEmulationSchema = NULL
)
}
diff --git a/tests/testthat/test-RenvHelpers.R b/tests/testthat/test-RenvHelpers.R
new file mode 100644
index 00000000..01b89043
--- /dev/null
+++ b/tests/testthat/test-RenvHelpers.R
@@ -0,0 +1,103 @@
+test_that("Check renv.lock compare", {
+ compare <- Strategus::compareLockFiles(
+ filename1 = system.file("testdata/renv.lock", package = "Strategus"),
+ filename2 = system.file("testdata/renv.lock", package = "Strategus")
+ )
+ expect_true(nrow(compare) > 0)
+ expect_true(nrow(compare[compare$lockfile1Version != compare$lockfile1Version, ]) == 0)
+})
+
+test_that("Check renv.lock sync detects no changes", {
+ expect_null(
+ Strategus::syncLockFile(
+ sourceOfTruthLockFileName = system.file("testdata/renv.lock", package = "Strategus"),
+ targetLockFileName = system.file("testdata/renv.lock", package = "Strategus")
+ )
+ )
+})
+
+test_that("Check renv.lock sync works", {
+ tempDir <- tempdir()
+ tempLockFile <- file.path(tempDir, "renv.lock")
+ on.exit(unlink(tempLockFile))
+ file.copy(
+ from = system.file("testdata/renv.lock", package = "Strategus"),
+ to = file.path(tempDir, "renv.lock")
+ )
+ # Get the expected value
+ lf <- renv::lockfile_read(
+ file = system.file("testdata/renv.lock", package = "Strategus")
+ )
+ expectedVersion <- lf$Packages$zip$Version
+ oldVersion <- "0.0.1"
+ renv::record(
+ records = paste0("zip@", oldVersion),
+ lockfile = tempLockFile
+ )
+
+ # Confirm the update ahead of the test worked
+ tempLf <- renv::lockfile_read(
+ file = tempLockFile
+ )
+ expect_equal(tempLf$Packages$zip$Version, oldVersion)
+
+ # Perform the sync
+ Strategus::syncLockFile(
+ sourceOfTruthLockFileName = system.file("testdata/renv.lock", package = "Strategus"),
+ targetLockFileName = tempLockFile
+ )
+
+ # Confirm that the newer version from the source of truth was applied
+ tempLf <- renv::lockfile_read(
+ file = tempLockFile
+ )
+ expect_equal(tempLf$Packages$zip$Version, expectedVersion)
+})
+
+test_that("Test renv.lock validation", {
+ tmp <- tempfile()
+ on.exit(unlink(tmp))
+ file.copy(
+ from = system.file("testdata/renv.lock", package = "Strategus"),
+ to = tmp
+ )
+
+ # All tests must pass on our internal lock file
+ expect_message(
+ object = Strategus::validateLockFile(
+ filename = tmp
+ ),
+ regexp = "PASSED"
+ )
+
+ # Remove the mandatory dependency
+ tmpLockFile <- renv::lockfile_read(file = tmp)
+ tmpLockFile$Packages$renv <- NULL
+ invisible(renv::lockfile_write(lockfile = tmpLockFile, file = tmp))
+ expect_message(
+ object = Strategus::validateLockFile(
+ filename = tmp
+ ),
+ regexp = "FAILED"
+ )
+
+ # Remove suggested packages
+ tmpLockFile$Packages$RSQLite <- NULL
+ invisible(renv::lockfile_write(lockfile = tmpLockFile, file = tmp))
+ expect_message(
+ object = Strategus::validateLockFile(
+ filename = tmp
+ ),
+ regexp = "FAILED"
+ )
+
+ # Mess up the CohortGenerator package to use a "HEAD" ref
+ tmpLockFile$Packages$CohortGenerator$RemoteRef <- "HEAD"
+ invisible(renv::lockfile_write(lockfile = tmpLockFile, file = tmp))
+ invisible(expect_message(
+ object = Strategus::validateLockFile(
+ filename = tmp
+ ),
+ regexp = "FAILED"
+ ))
+})
diff --git a/tests/testthat/test-Settings.R b/tests/testthat/test-Settings.R
index be23755e..d5f8362d 100644
--- a/tests/testthat/test-Settings.R
+++ b/tests/testthat/test-Settings.R
@@ -91,6 +91,14 @@ test_that("Store and retrieve connection details", {
connFromKeyring <- DatabaseConnector::connect(
connectionDetailsFromKeyring
)
- DatabaseConnector::disconnect(connFromKeyring)
+ expect_silent(DatabaseConnector::disconnect(connFromKeyring))
}
})
+
+test_that("Retrieve connection details that do not exists throws informative error", {
+ # Setup keyring for the test
+ Sys.setenv("STRATEGUS_KEYRING_PASSWORD" = keyringPassword)
+ createKeyringForUnitTest(selectedKeyring = keyringName, selectedKeyringPassword = keyringPassword)
+ on.exit(deleteKeyringForUnitTest())
+ expect_error(retrieveConnectionDetails(connectionDetailsReference = "does-not-exist", keyringName = keyringName))
+})
diff --git a/tests/testthat/test-Strategus.R b/tests/testthat/test-Strategus.R
index 312637d3..fbd25d33 100644
--- a/tests/testthat/test-Strategus.R
+++ b/tests/testthat/test-Strategus.R
@@ -15,7 +15,9 @@ test_that("Run unit test study", {
withr::defer(
{
- unlink(file.path(tempDir, "EunomiaTestStudy"), recursive = TRUE, force = TRUE)
+ if (usingTempDir) {
+ unlink(file.path(tempDir, "EunomiaTestStudy"), recursive = TRUE, force = TRUE)
+ }
},
testthat::teardown_env()
)
@@ -26,6 +28,7 @@ test_that("Run unit test study", {
workDatabaseSchema <- connectionDetailsList[[i]]$workDatabaseSchema
cdmDatabaseSchema <- connectionDetailsList[[i]]$cdmDatabaseSchema
tempEmulationSchema <- connectionDetailsList[[i]]$tempEmulationSchema
+ cohortTableNames <- connectionDetailsList[[i]]$cohortTableNames
studyRootFolder <- file.path(tempDir, "EunomiaTestStudy", dbms)
workFolder <- file.path(studyRootFolder, "work_folder")
resultsFolder <- file.path(studyRootFolder, "results_folder")
@@ -70,7 +73,7 @@ test_that("Run unit test study", {
workDatabaseSchema = workDatabaseSchema,
cdmDatabaseSchema = cdmDatabaseSchema,
tempEmulationSchema = tempEmulationSchema,
- cohortTableNames = CohortGenerator::getCohortTableNames(cohortTable = paste0("s", tableSuffix)),
+ cohortTableNames = cohortTableNames,
workFolder = workFolder,
resultsFolder = resultsFolder,
minCellCount = 5,
@@ -100,3 +103,45 @@ test_that("Run unit test study", {
expect_true(file.exists(file.path(resultsFolder, "TestModule1_1", "done")))
}
})
+
+test_that("Execute on Oracle stops if table names exceed length limit", {
+ sqlRenderTempEmulationSchema <- getOption("sqlRenderTempEmulationSchema", default = "")
+ options(sqlRenderTempEmulationSchema = "some_schema")
+ on.exit(options(sqlRenderTempEmulationSchema = sqlRenderTempEmulationSchema))
+
+ Sys.setenv("STRATEGUS_KEYRING_PASSWORD" = keyringPassword)
+ createKeyringForUnitTest(selectedKeyring = keyringName, selectedKeyringPassword = keyringPassword)
+ on.exit(deleteKeyringForUnitTest())
+
+ connectionDetails <- DatabaseConnector::createConnectionDetails(
+ dbms = "oracle"
+ )
+ Strategus::storeConnectionDetails(
+ connectionDetails = connectionDetails,
+ connectionDetailsReference = "oracle-test",
+ keyringName = keyringName
+ )
+ executionSettings <- Strategus::createCdmExecutionSettings(
+ connectionDetailsReference = "oracle-test",
+ workDatabaseSchema = "does_not_matter",
+ cdmDatabaseSchema = "does_not_matter",
+ cohortTableNames = CohortGenerator::getCohortTableNames("some_really_long_table_name_for_testing_that_oracle_throws_a_warning"),
+ workFolder = file.path(tempDir, "work_folder"),
+ resultsFolder = file.path(tempDir, "results_folder"),
+ minCellCount = 5
+ )
+
+ analysisSpecifications <- ParallelLogger::loadSettingsFromJson(
+ fileName = system.file("testdata/unitTestAnalysisSpecification.json",
+ package = "Strategus"
+ )
+ )
+
+ expect_error(
+ Strategus::execute(
+ analysisSpecifications = analysisSpecifications,
+ executionSettings = executionSettings,
+ keyringName = keyringName
+ )
+ )
+})
diff --git a/vignettes/CreatingAnalysisSpecification.Rmd b/vignettes/CreatingAnalysisSpecification.Rmd
index 77846e53..bd8d0f1a 100644
--- a/vignettes/CreatingAnalysisSpecification.Rmd
+++ b/vignettes/CreatingAnalysisSpecification.Rmd
@@ -10,7 +10,7 @@ output:
number_sections: yes
toc: yes
params:
- analysisSettingsPath: "C:/git/OHDSI/Strategus/inst/testdata"
+ analysisSettingsPath: "D:/git/OHDSI/Strategus/inst/testdata"
analysisSettingsFileName: "analysisSpecification.json"
vignette: >
%\VignetteEngine{knitr::rmarkdown}
@@ -42,13 +42,13 @@ To start, we must install the [HADES](https://ohdsi.github.io/Hades/) libraries
```{r, eval=FALSE}
# Install correct versions of HADES packages
-remotes::install_github("ohdsi/CohortGenerator", ref = "v0.8.0")
-remotes::install_github("ohdsi/CohortDiagnostics", ref = "v3.2.3")
-remotes::install_github("ohdsi/Characterization", ref = "v0.1.1")
-remotes::install_github("ohdsi/CohortIncidence", ref = "v3.1.5")
-remotes::install_github("ohdsi/CohortMethod", ref = "v5.1.0")
-remotes::install_github("ohdsi/SelfControlledCaseSeries", ref = "v4.2.0")
-remotes::install_github("ohdsi/PatientLevelPrediction", ref = "v6.3.4")
+remotes::install_github("ohdsi/CohortGenerator", ref = "v0.8.1")
+remotes::install_github("ohdsi/CohortDiagnostics", ref = "v3.2.5")
+remotes::install_github("ohdsi/Characterization", ref = "v0.1.3")
+remotes::install_github("ohdsi/CohortIncidence", ref = "v3.3.0")
+remotes::install_github("ohdsi/CohortMethod", ref = "v5.2.0")
+remotes::install_github("ohdsi/SelfControlledCaseSeries", ref = "v5.1.0")
+remotes::install_github("ohdsi/PatientLevelPrediction", ref = "v6.3.6")
```
## Cohorts for the study
@@ -96,7 +96,7 @@ The building blocks of the `Strategus` analysis specification are HADES modules.
The following code downloads the settings functions from the `CohortGeneratorModule` which then activates some additional functions we can use for creating the analysis specification. In the analysis specification, we will add the cohort definitions and negative control outcomes to the `sharedResources` section since these elements may be used by any of the HADES modules. To do this, we will use the `createCohortSharedResourceSpecifications` and `createNegativeControlOutcomeCohortSharedResourceSpecifications` functions respectively. In addition, we will use the `cohortGeneratorModuleSpecifications` function to specify the cohort generation settings.
```{r eval=FALSE}
-source("https://raw.githubusercontent.com/OHDSI/CohortGeneratorModule/v0.1.0/SettingsFunctions.R")
+source("https://raw.githubusercontent.com/OHDSI/CohortGeneratorModule/v0.3.0/SettingsFunctions.R")
# Create the cohort definition shared resource element for the analysis specification
cohortDefinitionSharedResource <- createCohortSharedResourceSpecifications(
@@ -122,7 +122,7 @@ cohortGeneratorModuleSpecifications <- createCohortGeneratorModuleSpecifications
The following code creates the `cohortDiagnosticsModuleSpecifications` to run cohort diagnostics on the cohorts in the study.
```{r eval=FALSE}
-source("https://raw.githubusercontent.com/OHDSI/CohortDiagnosticsModule/v0.1.0/SettingsFunctions.R")
+source("https://raw.githubusercontent.com/OHDSI/CohortDiagnosticsModule/v0.2.0/SettingsFunctions.R")
cohortDiagnosticsModuleSpecifications <- createCohortDiagnosticsModuleSpecifications(
runInclusionStatistics = TRUE,
runIncludedSourceConcepts = TRUE,
@@ -142,7 +142,7 @@ cohortDiagnosticsModuleSpecifications <- createCohortDiagnosticsModuleSpecificat
The following code creates the `cohortIncidenceModuleSpecifications` to perform an incidence rate analysis for the target cohorts and outcome in this study.
```{r eval=FALSE}
-source("https://raw.githubusercontent.com/OHDSI/CohortIncidenceModule/v0.2.0/SettingsFunctions.R")
+source("https://raw.githubusercontent.com/OHDSI/CohortIncidenceModule/v0.4.0/SettingsFunctions.R")
library(CohortIncidence)
targets <- list(
createCohortRef(id = 1, name = "Celecoxib"),
@@ -184,7 +184,7 @@ The following code creates the `characterizationModuleSpecifications` to perform
```{r eval=FALSE}
-source("https://raw.githubusercontent.com/OHDSI/CharacterizationModule/v0.4.0/SettingsFunctions.R")
+source("https://raw.githubusercontent.com/OHDSI/CharacterizationModule/v0.5.0/SettingsFunctions.R")
characterizationModuleSpecifications <- createCharacterizationModuleSpecifications(
targetIds = c(1, 2),
outcomeIds = 3,
@@ -207,7 +207,7 @@ The following code creates the `cohortMethodModuleSpecifications` to perform a c
```{r eval=FALSE}
library(CohortMethod)
-source("https://raw.githubusercontent.com/OHDSI/CohortMethodModule/v0.2.0/SettingsFunctions.R")
+source("https://raw.githubusercontent.com/OHDSI/CohortMethodModule/v0.3.0/SettingsFunctions.R")
negativeControlOutcomes <- lapply(
X = ncoCohortSet$cohortId,
FUN = createOutcome,
@@ -310,7 +310,7 @@ The following code creates the `cohortMethodModuleSpecifications` to perform a c
```{r eval=FALSE}
library(SelfControlledCaseSeries)
-source("https://raw.githubusercontent.com/OHDSI/SelfControlledCaseSeriesModule/v0.2.0/SettingsFunctions.R")
+source("https://raw.githubusercontent.com/OHDSI/SelfControlledCaseSeriesModule/v0.4.0/SettingsFunctions.R")
# Exposures-outcomes -----------------------------------------------------------
negativeControlOutcomeIds <- ncoCohortSet$cohortId
@@ -336,7 +336,7 @@ for (exposureOfInterestId in exposureOfInterestIds) {
# Analysis settings ------------------------------------------------------------
getDbSccsDataArgs <- SelfControlledCaseSeries::createGetDbSccsDataArgs(
studyStartDate = "",
- studyEndDate = "20191130",
+ studyEndDate = "",
maxCasesPerOutcome = 1e6,
useNestingCohort = TRUE,
nestingCohortId = 1,
@@ -359,7 +359,7 @@ covarPreExp <- SelfControlledCaseSeries::createEraCovariateSettings(
covarExposureOfInt <- SelfControlledCaseSeries::createEraCovariateSettings(
label = "Main",
includeEraIds = "exposureId",
- start = 1,
+ start = 0,
startAnchor = "era start",
end = 0,
endAnchor = "era end",
@@ -421,7 +421,7 @@ sccsModuleSpecifications <- creatSelfControlledCaseSeriesModuleSpecifications(
The following code creates the `plpModuleSpecifications` to perform a self-controlled case series analysis for this study.
```{r eval=FALSE}
-source("https://raw.githubusercontent.com/OHDSI/PatientLevelPredictionModule/v0.2.0/SettingsFunctions.R")
+source("https://raw.githubusercontent.com/OHDSI/PatientLevelPredictionModule/v0.3.0/SettingsFunctions.R")
makeModelDesignSettings <- function(targetId, outcomeId, popSettings, covarSettings) {
invisible(PatientLevelPrediction::createModelDesign(