Skip to content

Commit

Permalink
add 'getMode'
Browse files Browse the repository at this point in the history
  • Loading branch information
kevinushey committed Oct 16, 2024
1 parent d5d5a22 commit 3bd91a6
Show file tree
Hide file tree
Showing 5 changed files with 83 additions and 62 deletions.
1 change: 1 addition & 0 deletions NAMESPACE
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ export(getActiveDocumentContext)
export(getActiveProject)
export(getConsoleEditorContext)
export(getDelegatedAzureToken)
export(getMode)
export(getPersistentValue)
export(getRStudioPackageDependencies)
export(getSourceEditorContext)
Expand Down
3 changes: 3 additions & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@

# rstudioapi (under development)

* Added `getMode()`, which can be used to differentiate between Desktop
and Server installations of RStudio. (#280)

# rstudioapi 0.16.0

* `restartSession()` gains the `clean` argument, for RStudio 2024.04
Expand Down
107 changes: 58 additions & 49 deletions R/code.R
Original file line number Diff line number Diff line change
@@ -1,38 +1,38 @@
#' Check if RStudio is running
#'
#'
#' Check if RStudio is running.
#'
#'
#' @aliases isAvailable verifyAvailable
#'
#'
#' @param version_needed An optional version specification. If supplied, ensures
#' that RStudio is at least that version.
#'
#'
#' @param child_ok Boolean; check if the current R process is a child process of
#' the main RStudio session? This can be useful for e.g. RStudio Jobs, where
#' you'd like to communicate back with the main R session from a child process
#' through \code{rstudioapi}.
#'
#'
#' @return \code{isAvailable} a boolean; \code{verifyAvailable} an error message
#' if RStudio is not running
#'
#'
#' @examples
#'
#'
#' rstudioapi::isAvailable()
#' \dontrun{rstudioapi::verifyAvailable()}
#'
#'
#' @export
isAvailable <- function(version_needed = NULL, child_ok = FALSE) {

if (child_ok && isJob())
return(callRemote(sys.call(), parent.frame()))

identical(.Platform$GUI, "RStudio") && version_ok(version_needed)

}

version_ok <- function(version = NULL) {
if (is.null(version)) return(TRUE)

getVersion() >= version
}

Expand All @@ -41,87 +41,96 @@ version_ok <- function(version = NULL) {
verifyAvailable <- function(version_needed = NULL) {
if (!isAvailable()) stop("RStudio not running", call. = FALSE)
if (!version_ok(version_needed)) {
stop("Need at least version ", version_needed, " of RStudio. ",
stop("Need at least version ", version_needed, " of RStudio. ",
"Currently running ", getVersion(), call. = FALSE)
}
invisible(TRUE)
invisible(TRUE)
}



#' Return the current version of the RStudio API
#' Determine the version of RStudio
#'
#' Use `getVersion()` to determine the current version of RStudio.
#' This can be useful for \R packages which need to gate certain functionality
#' based on the version of RStudio currently available.
#'
#' @returns A `"numeric_version"` object, giving the version of RStudio in use.
#'
#' Return the current version of the RStudio API
#'
#'
#' @return A \code{\link{numeric_version}} which you can compare to a string
#' and get correct results.
#' @examples
#'
#' \dontrun{
#' if (rstudioapi::getVersion() < "0.98.100") {
#' message("Your version of RStudio is quite old")
#' }
#' }
#'
#' @export getVersion
#' @export
getVersion <- function() {
verifyAvailable()
callFun("versionInfo")$version

base <- .BaseNamespaceEnv
version <- base$.Call("rs_rstudioVersion", PACKAGE = "(embedding)")
package_version(version)
}


#' Report whether RStudio Desktop or RStudio Server is in use
#'
#' Use `getMode()` if you need to differentiate between server
#' and desktop installations of RStudio.
#'
#' @returns "desktop" for RStudio Desktop installations, and
#' "server" for RStudio Server / RStudio Workbench installations.
#'
#' @export
getMode <- function() {
verifyAvailable()
rstudio <- as.environment("tools:rstudio")
if (rstudio$.rs.isDesktop()) "desktop" else "server"
}


#' Call an RStudio API function
#'
#'
#' This function will return an error if RStudio is not running, or the
#' function is not available. If you want to fall back to different behavior,
#' use \code{\link{hasFun}}.
#'
#'
#'
#'
#' @param fname name of the RStudio function to call.
#' @param ... Other arguments passed on to the function
#' @examples
#'
#'
#' if (rstudioapi::isAvailable()) {
#' rstudioapi::callFun("versionInfo")
#' }
#'
#'
#' @export callFun
callFun <- function(fname, ...) {

if (isJob())
return(callRemote(sys.call(), parent.frame()))

verifyAvailable()

# get reference to RStudio function
f <- tryCatch(findFun(fname, mode = "function"), error = identity)
if (inherits(f, "error"))
stop("Function ", fname, " not found in RStudio", call. = FALSE)

# drop arguments that aren't accepted by RStudio
# (ensure backwards-compatibility with older versions of RStudio)
args <- list(...)
if (!"..." %in% names(formals(f)))
if (length(args) > length(formals(f)))
length(args) <- length(formals(f))

# invoke the function
do.call(f, args)

}



#' Exists/get for RStudio functions
#'
#'
#' These are specialized versions of \code{\link[base]{get}} and
#' \code{\link[base]{exists}} that look in the rstudio package namespace. If
#' RStudio is not running, \code{hasFun} will return \code{FALSE}.
#'
#'
#'
#'
#' @aliases hasFun findFun
#' @param name name of object to look for
#' @param version_needed An optional version specification. If supplied,
Expand All @@ -130,20 +139,20 @@ callFun <- function(fname, ...) {
#' @param ... other arguments passed on to \code{\link[base]{exists}} and
#' \code{\link[base]{get}}
#' @examples
#'
#'
#' rstudioapi::hasFun("viewer")
#'
#'
#' @export hasFun
hasFun <- function(name, version_needed = NULL, ...) {

if (!isAvailable(version_needed))
return(FALSE)

if (usingTools())
return(exists(toolsName(name), toolsEnv(), ...))

exists(name, envir = asNamespace("rstudio"), ...)

}

#' @export
Expand Down
16 changes: 16 additions & 0 deletions man/getMode.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

18 changes: 5 additions & 13 deletions man/getVersion.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 3bd91a6

Please sign in to comment.