File: lightswitch.R

package info (click to toggle)
r-cran-vcr 0.6.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 1,360 kB
  • sloc: cpp: 15; sh: 13; makefile: 2
file content (145 lines) | stat: -rw-r--r-- 4,673 bytes parent folder | download
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#' Turn vcr on and off, check on/off status, and turn off for a given http call
#'
#' @export
#' @name lightswitch
#' @param ... Any block of code to run, presumably an http request
#' @param ignore_cassettes (logical) Controls what happens when a cassette is
#' inserted while vcr is turned off. If `TRUE` is passed, the cassette
#' insertion will be ignored; otherwise an error will be raised.
#' Default: `FALSE`
#' @details
#'
#' - `turned_off()` - Turns vcr off for the duration of a block.
#' - `turn_off()` - Turns vcr off, so that it no longer handles every
#'  HTTP request
#' - `turn_on()` - turns vcr on
#' - `turned_on()` - Asks if vcr is turned on, gives a boolean
#'
#' To turn vcr off completely, for example, if you are using vcr in your
#' package, but you want to run real HTTP requests in your tests, there are
#' a few options:
#'
#' - Run `turn_off(ignore_cassettes = TRUE)` before running tests. You can
#' do this on the command line e.g.,
#' `Rscript -e 'vcr::turn_off(TRUE); devtools::test()'`, or within a running
#' R session the same way.
#' - Set an environment variable `VCR_TURN_OFF=TRUE`.
#' You can do this on the command line by setting the env var at the beginning
#' of the line like: `VCR_TURN_OFF=TRUE Rscript -e 'devtools::test()'`. Same
#' can be done within an interactive R session. You can also use this approach
#' to turn on or off vcr in CI builds like on Travis or Appveyor by setting
#' this env var in your Travis/Appveyor configuration file or in the settings
#' windows in the respective web apps
#' 
#' The full set of environment variables `vcr` uses, all of which accept only
#' `TRUE` or `FALSE`:
#' 
#' - `VCR_TURN_OFF`: turn off vcr altogether; set to `TRUE` to skip any vcr
#' usage; default: `FALSE`
#' - `VCR_TURNED_OFF`: set the `turned_off` internal package setting; this
#' does not turn off vcr completely as does `VCR_TURN_OFF` does, but rather
#' is looked at together with `VCR_IGNORE_CASSETTES`
#' - `VCR_IGNORE_CASSETTES`: set the `ignore_cassettes` internal package
#' setting; this is looked at together with `VCR_TURNED_OFF`
#' 
#' See the HTTP testing book for more details 
#' https://books.ropensci.org/http-testing/lightswitch.html
#' 
#' See `?Startup` if you're not sure how to set environment variables
#'
#' @examples \dontrun{
#' vcr_configure(dir = tempdir())
#'
#' turn_on()
#' turned_on()
#' turn_off()
#'
#' # turn off for duration of a block
#' library(crul)
#' turned_off({
#'  res <- HttpClient$new(url = "https://eu.httpbin.org/get")$get()
#' })
#' res
#'
#' # turn completely off
#' turn_off()
#' library(webmockr)
#' crul::mock()
#' # HttpClient$new(url = "https://eu.httpbin.org/get")$get(verbose = TRUE)
#' turn_on()
#' }
turned_off <- function(..., ignore_cassettes = FALSE) {
  turn_off(ignore_cassettes = ignore_cassettes)
  on.exit(turn_on())
  force(...)
}

#' @rdname lightswitch
#' @export
turn_on <- function() {
  light_switch$turned_off <- FALSE
}

#' @rdname lightswitch
#' @export
turned_on <- function() {
  !light_switch$turned_off
}

#' @export
#' @rdname lightswitch
turn_off <- function(ignore_cassettes = FALSE) {
  cassette <- tryCatch(current_cassette(), error = function(e) e)
  if (!inherits(cassette, "error")) {
    if (length(cassette) != 0) {
      stop(
        sprintf(
          "A vcr cassette is currently in use: %s.\n  You must eject it before you can turn vcr off",
          cassette$name), call. = FALSE)
    }
  }
  light_switch$ignore_cassettes <- ignore_cassettes
  message("vcr turned off; see ?turn_on to turn vcr back on")
  light_switch$turned_off <- TRUE
}

# environment variable handlers
vcr_env_mssg <- "invalid option for env var: '%s'; see ?vcr::lightswitch"
vcr_env_handle <- function() {
  vcr_env_turn_off()
  vcr_env_turned_off()
  vcr_env_ignore_cassettes()
}
catch_error <- function(x) tryCatch(x, error = function(e) e)
vcr_env_var_check <- function(x, var) {
  if (!inherits(x, "logical") || length(x) != 1 || all(is.na(x)))
    stop(sprintf(vcr_env_mssg, var), call. = FALSE)
}
vcr_env_turn_off <- function() {
  var <- "VCR_TURN_OFF"
  x <- Sys.getenv(var, "")
  if (x != "") {
    x <- as.logical(x)
    vcr_env_var_check(x, var)
    light_switch$ignore_cassettes <- x
    light_switch$turned_off <- x
  }
}
vcr_env_turned_off <- function() {
  var <- "VCR_TURNED_OFF"
  x <- Sys.getenv(var, "")
  if (x != "") {
    x <- as.logical(x)
    vcr_env_var_check(x, var)
    light_switch$turned_off <- x
  }
}
vcr_env_ignore_cassettes <- function() {
  var <- "VCR_IGNORE_CASSETTES"
  x <- Sys.getenv(var, "")
  if (x != "") {
    x <- as.logical(x)
    vcr_env_var_check(x, var)
    light_switch$ignore_cassettes <- x
  }
}