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 @@ -120,13 +120,13 @@

Setting up your R environment
 # 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 @@ -190,7 +190,7 @@

CohortGenerator Module SettingscohortGeneratorModuleSpecifications function to specify the cohort generation settings.

-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(
@@ -217,7 +217,7 @@ 

CohortDiagnostics Module SettingscohortDiagnosticsModuleSpecifications to run cohort diagnostics on the cohorts in the study.

-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,
@@ -238,7 +238,7 @@ 

CohortIncidence Module SettingscohortIncidenceModuleSpecifications to perform an incidence rate analysis for the target cohorts and outcome in this study.

-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"),
@@ -281,7 +281,7 @@ 

Characterization Module Settings
-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,
@@ -304,7 +304,7 @@ 

CohortMethod Module Settings
 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,
@@ -407,7 +407,7 @@ 

SelfControlledCaseSeries Modul cohort analysis for this study.

 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
@@ -433,7 +433,7 @@ 

SelfControlledCaseSeries Modul # Analysis settings ------------------------------------------------------------ getDbSccsDataArgs <- SelfControlledCaseSeries::createGetDbSccsDataArgs( studyStartDate = "", - studyEndDate = "20191130", + studyEndDate = "", maxCasesPerOutcome = 1e6, useNestingCohort = TRUE, nestingCohortId = 1, @@ -456,7 +456,7 @@

SelfControlledCaseSeries Modul covarExposureOfInt <- SelfControlledCaseSeries::createEraCovariateSettings( label = "Main", includeEraIds = "exposureId", - start = 1, + start = 0, startAnchor = "era start", end = 0, endAnchor = "era end", @@ -518,7 +518,7 @@

PatientLevelPrediction Module Se

The following code creates the plpModuleSpecifications to perform a self-controlled case series analysis for this study.

-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(
diff --git a/docs/articles/CreatingModules.html b/docs/articles/CreatingModules.html
index c8118ce2..d6feff31 100644
--- a/docs/articles/CreatingModules.html
+++ b/docs/articles/CreatingModules.html
@@ -33,7 +33,7 @@
       
       
         Strategus
-        0.1.0
+        0.2.0
       
     
@@ -94,7 +94,7 @@

Creating Strategus Modules

Anthony G. Sena

-

2023-10-04

+

2024-01-26

Source: vignettes/CreatingModules.Rmd diff --git a/docs/articles/ExecuteStrategus.html b/docs/articles/ExecuteStrategus.html index c4ee685d..aa60c340 100644 --- a/docs/articles/ExecuteStrategus.html +++ b/docs/articles/ExecuteStrategus.html @@ -33,7 +33,7 @@ Strategus - 0.1.0 + 0.2.0

@@ -94,7 +94,7 @@

Execute Strategus

Anthony G. Sena

-

2023-10-04

+

2024-01-26

Source: vignettes/ExecuteStrategus.Rmd diff --git a/docs/articles/IntroductionToStrategus.html b/docs/articles/IntroductionToStrategus.html index 687ba698..3178368b 100644 --- a/docs/articles/IntroductionToStrategus.html +++ b/docs/articles/IntroductionToStrategus.html @@ -33,7 +33,7 @@ Strategus - 0.1.0 + 0.2.0

@@ -94,7 +94,7 @@

Introduction to Strategus

Anthony G. Sena

-

2023-10-04

+

2024-01-26

Source: vignettes/IntroductionToStrategus.Rmd diff --git a/docs/articles/index.html b/docs/articles/index.html index 438349c0..0f50f0d8 100644 --- a/docs/articles/index.html +++ b/docs/articles/index.html @@ -17,7 +17,7 @@ Strategus - 0.1.0 + 0.2.0

diff --git a/docs/authors.html b/docs/authors.html index 09be551c..aa212655 100644 --- a/docs/authors.html +++ b/docs/authors.html @@ -17,7 +17,7 @@ Strategus - 0.1.0 + 0.2.0

@@ -95,14 +95,14 @@

Citation

-

Schuemie M, Sena A, Gilbert J (2023). +

Schuemie M, Sena A, Gilbert J (2024). Strategus: Coordinating and Executing Analytics Using HADES Modules. https://ohdsi.github.io/Strategus, https://github.com/OHDSI/Strategus.

@Manual{,
   title = {Strategus: Coordinating and Executing Analytics Using HADES Modules},
   author = {Martijn Schuemie and Anthony Sena and Jamie Gilbert},
-  year = {2023},
+  year = {2024},
   note = {https://ohdsi.github.io/Strategus, https://github.com/OHDSI/Strategus},
 }
diff --git a/docs/index.html b/docs/index.html index ce7fe7f4..311f4453 100644 --- a/docs/index.html +++ b/docs/index.html @@ -33,7 +33,7 @@ Strategus - 0.1.0 + 0.2.0

@@ -93,7 +93,7 @@
-

Build Status codecov.io

+

Build Status codecov.io

Introduction diff --git a/docs/news/index.html b/docs/news/index.html index 656bc51f..affd7d35 100644 --- a/docs/news/index.html +++ b/docs/news/index.html @@ -17,7 +17,7 @@ Strategus - 0.1.0 + 0.2.0

@@ -69,6 +69,17 @@

Changelog

Source: NEWS.md +
+ +
  • 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)
  • +
  • Adds an initial implementation for uploading results to a results database (#72)
  • diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml index 6cfb522f..a7811836 100644 --- a/docs/pkgdown.yml +++ b/docs/pkgdown.yml @@ -6,5 +6,5 @@ articles: CreatingModules: CreatingModules.html ExecuteStrategus: ExecuteStrategus.html IntroductionToStrategus: IntroductionToStrategus.html -last_built: 2023-10-04T19:26Z +last_built: 2024-01-26T22:27Z diff --git a/docs/pull_request_template.html b/docs/pull_request_template.html index a4d0ba5f..c47c3877 100644 --- a/docs/pull_request_template.html +++ b/docs/pull_request_template.html @@ -17,7 +17,7 @@ Strategus - 0.1.0 + 0.2.0
diff --git a/docs/reference/Strategus-package.html b/docs/reference/Strategus-package.html index 956bac9e..a93984a3 100644 --- a/docs/reference/Strategus-package.html +++ b/docs/reference/Strategus-package.html @@ -17,7 +17,7 @@ Strategus - 0.1.0 + 0.2.0 diff --git a/docs/reference/addModuleSpecifications.html b/docs/reference/addModuleSpecifications.html index 3be5db15..161cdc53 100644 --- a/docs/reference/addModuleSpecifications.html +++ b/docs/reference/addModuleSpecifications.html @@ -17,7 +17,7 @@ Strategus - 0.1.0 + 0.2.0 diff --git a/docs/reference/addSharedResources.html b/docs/reference/addSharedResources.html index 7baf4640..aeb109f4 100644 --- a/docs/reference/addSharedResources.html +++ b/docs/reference/addSharedResources.html @@ -17,7 +17,7 @@ Strategus - 0.1.0 + 0.2.0 diff --git a/docs/reference/compareLockFiles.html b/docs/reference/compareLockFiles.html new file mode 100644 index 00000000..2c80398d --- /dev/null +++ b/docs/reference/compareLockFiles.html @@ -0,0 +1,125 @@ + +Compare two renv.lock files — compareLockFiles • Strategus + + +
+
+ + + +
+
+ + +
+

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.

+
+ +
+
compareLockFiles(filename1, filename2)
+
+ +
+

Arguments

+
filename1
+

The first renv.lock file name

+ + +
filename2
+

The second renv.lock file name

+ +
+
+

Value

+ + +

A data.frame with the comparison of the rev.lock files

+
+ +
+ +
+ + +
+ +
+

Site built with pkgdown 2.0.7.

+
+ +
+ + + + + + + + diff --git a/docs/reference/createCdmExecutionSettings.html b/docs/reference/createCdmExecutionSettings.html index dd20fcf3..f94a811d 100644 --- a/docs/reference/createCdmExecutionSettings.html +++ b/docs/reference/createCdmExecutionSettings.html @@ -17,7 +17,7 @@ Strategus - 0.1.0 + 0.2.0 diff --git a/docs/reference/createEmptyAnalysisSpecificiations.html b/docs/reference/createEmptyAnalysisSpecificiations.html index 176a0602..4ecd5bf1 100644 --- a/docs/reference/createEmptyAnalysisSpecificiations.html +++ b/docs/reference/createEmptyAnalysisSpecificiations.html @@ -17,7 +17,7 @@ Strategus - 0.1.0 + 0.2.0 diff --git a/docs/reference/createResultDataModels.html b/docs/reference/createResultDataModels.html index 7ecd01b4..02dc382b 100644 --- a/docs/reference/createResultDataModels.html +++ b/docs/reference/createResultDataModels.html @@ -19,7 +19,7 @@ Strategus - 0.1.0 + 0.2.0 diff --git a/docs/reference/createResultsExecutionSettings.html b/docs/reference/createResultsExecutionSettings.html index 64f83f3e..6ea8638c 100644 --- a/docs/reference/createResultsExecutionSettings.html +++ b/docs/reference/createResultsExecutionSettings.html @@ -17,7 +17,7 @@ Strategus - 0.1.0 + 0.2.0 diff --git a/docs/reference/dot-nullList.html b/docs/reference/dot-nullList.html index bb36aae7..6c69ccbc 100644 --- a/docs/reference/dot-nullList.html +++ b/docs/reference/dot-nullList.html @@ -17,7 +17,7 @@ Strategus - 0.1.0 + 0.2.0 diff --git a/docs/reference/ensureAllModulesInstantiated.html b/docs/reference/ensureAllModulesInstantiated.html index 91a0437e..f7b5ac10 100644 --- a/docs/reference/ensureAllModulesInstantiated.html +++ b/docs/reference/ensureAllModulesInstantiated.html @@ -23,7 +23,7 @@ Strategus - 0.1.0 + 0.2.0 @@ -87,7 +87,7 @@

Ensure all modules are instantiated

-
ensureAllModulesInstantiated(analysisSpecifications)
+
ensureAllModulesInstantiated(analysisSpecifications, forceVerification = FALSE)
@@ -96,12 +96,22 @@

Arguments

An object of type AnalysisSpecifications as created by createEmptyAnalysisSpecificiations().

+ +
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.

diff --git a/docs/reference/execute.html b/docs/reference/execute.html index 832cc83e..205a0598 100644 --- a/docs/reference/execute.html +++ b/docs/reference/execute.html @@ -17,7 +17,7 @@ Strategus - 0.1.0 + 0.2.0 diff --git a/docs/reference/getModuleList.html b/docs/reference/getModuleList.html index 5e7f3418..b5f753f6 100644 --- a/docs/reference/getModuleList.html +++ b/docs/reference/getModuleList.html @@ -18,7 +18,7 @@ Strategus - 0.1.0 + 0.2.0 diff --git a/docs/reference/index.html b/docs/reference/index.html index 6ce8d939..80523ba2 100644 --- a/docs/reference/index.html +++ b/docs/reference/index.html @@ -17,7 +17,7 @@ Strategus - 0.1.0 + 0.2.0 @@ -80,6 +80,10 @@

All functions addSharedResources()

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

+
+ +
+
lockFileToDataFrame(lf)
+
+ + +
+ +
+ + +
+ +
+

Site built with pkgdown 2.0.7.

+
+ +
+ + + + + + + + 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

+
+ +
+
mandatoryPackages()
+
+ + +
+ +
+ + +
+ +
+

Site built with pkgdown 2.0.7.

+
+ +
+ + + + + + + + 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

+
+ +
+
suggestedPacakges()
+
+ + +
+ +
+ + +
+ +
+

Site built with pkgdown 2.0.7.

+
+ +
+ + + + + + + + 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

+
+ +
+ +
+ + +
+ +
+

Site built with pkgdown 2.0.7.

+
+ +
+ + + + + + + + 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

+ +
+ +
+ +
+ + +
+ +
+

Site built with pkgdown 2.0.7.

+
+ +
+ + + + + + + + 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

+
+ +
+ +
+ + +
+ +
+

Site built with pkgdown 2.0.7.

+
+ +
+ + + + + + + + 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(