forked from r-lib/usethis
-
Notifications
You must be signed in to change notification settings - Fork 0
/
use_import_from.R
75 lines (67 loc) · 2.13 KB
/
use_import_from.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#' Import a function from another package
#'
#' @description
#' `use_import_from()` imports a function from another package by adding the
#' roxygen2 `@importFrom` tag to the package-level documentation (which can be
#' created with [`use_package_doc()`]). Importing a function from another
#' package allows you to refer to it without a namespace (e.g., `fun()` instead
#' of `package::fun()`).
#'
#' `use_import_from()` also re-documents the NAMESPACE, and re-load the current
#' package. This ensures that `fun` is immediately available in your development
#' session.
#'
#' @param package Package name
#' @param fun A vector of function names
#' @param load Logical. Re-load with [`pkgload::load_all()`]?
#' @return
#' Invisibly, `TRUE` if the package document has changed, `FALSE` if not.
#' @export
#' @examples
#' \dontrun{
#' use_import_from("usethis", "ui_todo")
#' }
use_import_from <- function(package, fun, load = is_interactive()) {
if (!is_string(package)) {
ui_stop("{ui_code('package')} must be a single string")
}
check_is_package("use_import_from()")
check_uses_roxygen("use_import_from()")
check_installed(package)
check_has_package_doc("use_import_from()")
check_functions_exist(package, fun)
use_dependency(package, "Imports")
changed <- roxygen_ns_append(glue("@importFrom {package} {fun}"))
if (changed) {
roxygen_update_ns(load)
}
invisible(changed)
}
check_functions_exist <- function(package, fun) {
purrr::walk2(package, fun, check_fun_exists)
}
check_fun_exists <- function(package, fun) {
if (exists(fun, envir = asNamespace(package))) {
return()
}
name <- paste0(package, "::", fun, "()")
ui_stop("Can't find {ui_code(name)}")
}
check_has_package_doc <- function(whos_asking) {
if (has_package_doc()) {
return(invisible(TRUE))
}
msg <- c(
"{ui_code(whos_asking)} requires package-level documentation.",
"Would you like to add it now?"
)
if (is_interactive() && ui_yeah(msg)) {
use_package_doc()
} else {
ui_stop(c(
"{ui_code(whos_asking)} requires package docs",
"You can add it by running {ui_code('use_package_doc()')}"
))
}
invisible(TRUE)
}