From 1cfcbd3f5c33dd89981384c09f694a81b0c2770f Mon Sep 17 00:00:00 2001 From: hadley Date: Wed, 12 Dec 2012 07:25:11 -0500 Subject: [PATCH] Require packages in depends. Fixes #161, #178, #192 --- DESCRIPTION | 1 + NEWS | 2 ++ R/imports-env.r | 7 ++----- R/load-depends.r | 12 ++++++++++++ R/load.r | 5 +++-- inst/tests/depends/DESCRIPTION | 11 +++++++++++ inst/tests/{depend-missing => depends}/R/a.r | 0 .../{depend-missing => import-missing}/DESCRIPTION | 0 .../tests/{depend-version => import-missing}/R/a.r | 0 .../{depend-version => import-version}/DESCRIPTION | 0 .../{depend-version => import-version}/NAMESPACE | 0 inst/tests/import-version/R/a.r | 1 + .../tests/{depend-version => import-version}/R/b.r | 0 inst/tests/test-depend.r | 14 ++++++++++---- man/load_imports.Rd | 2 +- 15 files changed, 43 insertions(+), 12 deletions(-) create mode 100644 R/load-depends.r create mode 100644 inst/tests/depends/DESCRIPTION rename inst/tests/{depend-missing => depends}/R/a.r (100%) rename inst/tests/{depend-missing => import-missing}/DESCRIPTION (100%) rename inst/tests/{depend-version => import-missing}/R/a.r (100%) rename inst/tests/{depend-version => import-version}/DESCRIPTION (100%) rename inst/tests/{depend-version => import-version}/NAMESPACE (100%) create mode 100644 inst/tests/import-version/R/a.r rename inst/tests/{depend-version => import-version}/R/b.r (100%) diff --git a/DESCRIPTION b/DESCRIPTION index 6ca2e19c0..8e5c35ce7 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -82,3 +82,4 @@ Collate: 'check_devtools.r' 'rcpp-attributes.r' 'cran.r' + 'load-depends.r' diff --git a/NEWS b/NEWS index 1bcd12749..944a124d9 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,8 @@ NEW FEATURES * Rcpp attributes are now automatically compiled during build. +* Packages listed in depends are `require()`d (Fixes #161, #178, #192) + MINOR FEATURES * `check_cran` now downloads packages from cran.rstudio.com. diff --git a/R/imports-env.r b/R/imports-env.r index fc3282e94..38c06c5be 100644 --- a/R/imports-env.r +++ b/R/imports-env.r @@ -45,13 +45,11 @@ imports_env_name <- function(pkg = ".") { #' the dependency packages. #' #' @keywords internal -load_imports <- function(pkg = ".", deps = c("depends", "imports")) { +load_imports <- function(pkg = ".") { pkg <- as.package(pkg) # Get data frame of dependency names and versions - deps <- lapply(pkg[deps], parse_deps) - deps <- Reduce(rbind, deps) - + deps <- parse_deps(pkg$imports) if (is.null(deps) || nrow(deps) == 0) return(invisible()) # If we've already loaded imports, don't load again (until load_all @@ -66,7 +64,6 @@ load_imports <- function(pkg = ".", deps = c("depends", "imports")) { invisible(deps) } - # Load imported objects # The code in this function is taken from base::loadNamespace process_imports <- function(pkg = ".") { diff --git a/R/load-depends.r b/R/load-depends.r new file mode 100644 index 000000000..87bce0032 --- /dev/null +++ b/R/load-depends.r @@ -0,0 +1,12 @@ +load_depends <- function(pkg = ".") { + pkg <- as.package(pkg) + + # Get data frame of dependency names and versions + deps <- parse_deps(pkg$depends) + if (is.null(deps) || nrow(deps) == 0) return(invisible()) + + mapply(check_dep_version, deps$name, deps$version, deps$compare) + lapply(deps$name, require, character.only = TRUE) + + invisible(deps) +} diff --git a/R/load.r b/R/load.r index b5f9ea40f..d36aa0de7 100644 --- a/R/load.r +++ b/R/load.r @@ -110,7 +110,8 @@ load_all <- function(pkg = ".", reset = FALSE, recompile = FALSE, out <- list(env = ns_env(pkg)) - # Load dependencies into the imports environment + # Load dependencies + load_depends(pkg) load_imports(pkg) out$data <- load_data(pkg) @@ -126,7 +127,7 @@ load_all <- function(pkg = ".", reset = FALSE, recompile = FALSE, # Set up the exports in the namespace metadata (this must happen after # the objects are loaded) setup_ns_exports(pkg, export_all) - + # Set up the package environment ------------------------------------ # Create the package environment if needed if (!is_attached(pkg)) attach_ns(pkg) diff --git a/inst/tests/depends/DESCRIPTION b/inst/tests/depends/DESCRIPTION new file mode 100644 index 000000000..1e2a4ac42 --- /dev/null +++ b/inst/tests/depends/DESCRIPTION @@ -0,0 +1,11 @@ +Package: dependmissing +Title: Tools to make developing R code easier +License: GPL-2 +Description: +Author: Hadley +Maintainer: Hadley +Version: 0.1 +Depends: + MASS, + R +Collate: a.r b.r \ No newline at end of file diff --git a/inst/tests/depend-missing/R/a.r b/inst/tests/depends/R/a.r similarity index 100% rename from inst/tests/depend-missing/R/a.r rename to inst/tests/depends/R/a.r diff --git a/inst/tests/depend-missing/DESCRIPTION b/inst/tests/import-missing/DESCRIPTION similarity index 100% rename from inst/tests/depend-missing/DESCRIPTION rename to inst/tests/import-missing/DESCRIPTION diff --git a/inst/tests/depend-version/R/a.r b/inst/tests/import-missing/R/a.r similarity index 100% rename from inst/tests/depend-version/R/a.r rename to inst/tests/import-missing/R/a.r diff --git a/inst/tests/depend-version/DESCRIPTION b/inst/tests/import-version/DESCRIPTION similarity index 100% rename from inst/tests/depend-version/DESCRIPTION rename to inst/tests/import-version/DESCRIPTION diff --git a/inst/tests/depend-version/NAMESPACE b/inst/tests/import-version/NAMESPACE similarity index 100% rename from inst/tests/depend-version/NAMESPACE rename to inst/tests/import-version/NAMESPACE diff --git a/inst/tests/import-version/R/a.r b/inst/tests/import-version/R/a.r new file mode 100644 index 000000000..6bedc9eef --- /dev/null +++ b/inst/tests/import-version/R/a.r @@ -0,0 +1 @@ +a <- 1 diff --git a/inst/tests/depend-version/R/b.r b/inst/tests/import-version/R/b.r similarity index 100% rename from inst/tests/depend-version/R/b.r rename to inst/tests/import-version/R/b.r diff --git a/inst/tests/test-depend.r b/inst/tests/test-depend.r index b526bd953..6eee0ab44 100644 --- a/inst/tests/test-depend.r +++ b/inst/tests/test-depend.r @@ -2,8 +2,8 @@ context("Dependencies") test_that("Warned about dependency versions", { # Should give a warning about grid version - expect_warning(load_all("depend-version"), "Need grid >=") - unload("depend-version") + expect_warning(load_all("import-version"), "Need grid >=") + unload("import-version") # TODO: Add check for NOT giving a warning about compiler version # Not possible with testthat? @@ -12,12 +12,18 @@ test_that("Warned about dependency versions", { test_that("Error on missing dependencies", { # Should give a warning about grid version - expect_error(load_all("depend-missing"), "missingpackage not available") + expect_error(load_all("import-missing"), "missingpackage not available") # Loading process will be partially done; unload it - unload("depend-missing") + unload("import-missing") }) +test_that("Packages in depends are required", { + load_all("depends") + expect_true("package:MASS" %in% search()) + unload("depends") + detach("package:MASS", unload = TRUE) +}) test_that("Parse dependencies", { deps <- parse_deps("\nhttr (< 2.1),\nRCurl (>= 3),\nutils (== 2.12.1),\ntools,\nR (>= 2.10),\nmemoise") diff --git a/man/load_imports.Rd b/man/load_imports.Rd index 0b924040d..c46b1fa32 100644 --- a/man/load_imports.Rd +++ b/man/load_imports.Rd @@ -2,7 +2,7 @@ \alias{load_imports} \title{Load all of the imports for a package} \usage{ - load_imports(pkg = ".", deps = c("depends", "imports")) + load_imports(pkg = ".") } \description{ The imported objects are copied to the imports