Title: | Record 'HTTP' Calls to Disk |
---|---|
Description: | Record test suite 'HTTP' requests and replays them during future runs. A port of the Ruby gem of the same name (<https://github.com/vcr/vcr/>). Works by recording real 'HTTP' requests/responses on disk in 'cassettes', and then replaying matching responses on subsequent requests. |
Authors: | Scott Chamberlain [aut, cre] (ORCID: <https://orcid.org/0000-0003-1444-9135>), Aaron Wolen [aut] (ORCID: <https://orcid.org/0000-0003-2542-2202>), Maëlle Salmon [aut] (ORCID: <https://orcid.org/0000-0002-2815-0399>), Daniel Possenriede [aut] (ORCID: <https://orcid.org/0000-0002-6738-9845>), Hadley Wickham [aut], rOpenSci [fnd] (ROR: <https://ror.org/019jywm96>) |
Maintainer: | Scott Chamberlain <[email protected]> |
License: | MIT + file LICENSE |
Version: | 2.0.0 |
Built: | 2025-08-27 07:08:59 UTC |
Source: | https://github.com/ropensci/vcr |
List cassettes, get current cassette, etc.
cassettes() current_cassette() current_cassette_recording() current_cassette_replaying() cassette_path()
cassettes() current_cassette() current_cassette_recording() current_cassette_replaying() cassette_path()
cassettes()
: returns all active cassettes in the current
session.
current_cassette()
: returns NULL
when no cassettes are in use;
returns the current cassette (a Cassette
object) when one is in use
currrent_cassette_recording()
and current_cassette_replaying()
:
tell you if the current cassette is recording and/or replaying. They
both return FALSE
if there is no cassette in use.
cassette_path()
: returns the current directory path where cassettes
will be stored
vcr_configure(dir = tempdir()) # list all cassettes cassettes() # list the currently active cassette insert_cassette("stuffthings") current_cassette() cassettes() eject_cassette() cassettes() # list the path to cassettes cassette_path() vcr_configure(dir = file.path(tempdir(), "foo")) cassette_path() vcr_configure_reset()
vcr_configure(dir = tempdir()) # list all cassettes cassettes() # list the currently active cassette insert_cassette("stuffthings") current_cassette() cassettes() eject_cassette() cassettes() # list the path to cassettes cassette_path() vcr_configure(dir = file.path(tempdir(), "foo")) cassette_path() vcr_configure_reset()
insert_example_cassette()
is a wrapper around insert_cassette()
that
stores cassettes in inst/_vcr/
. Call it in the first line of your examples
(typically wrapped in \dontshow{}
), and call eject_cassette()
on the
last line.
Run the example manually once to record the vignettte, then it will be
replayed during R CMD check
, ensuring that your example no longer uses
the internet.
insert_example_cassette( name, package, record = NULL, match_requests_on = NULL, serialize_with = NULL, preserve_exact_body_bytes = NULL, re_record_interval = NULL )
insert_example_cassette( name, package, record = NULL, match_requests_on = NULL, serialize_with = NULL, preserve_exact_body_bytes = NULL, re_record_interval = NULL )
name |
The name of the cassette. This is used to name a file on disk, so it must be valid file name. |
package |
Package name. |
record |
Record mode. This will be To re-record all cassettes, you can delete |
match_requests_on |
Character vector of request matchers used to
determine which recorded HTTP interaction to replay. The default matches
on the The full set of possible values are:
If more than one is specified, all components must match in order for the
request to match. If not supplied, defaults to Note that the request header and body will only be included in the
cassette if |
serialize_with |
(string) Which serializer to use:
|
preserve_exact_body_bytes |
(logical) Force a binary (base64)
representation of the request and response bodies? By default, vcr
will look at the |
re_record_interval |
(integer) How frequently (in seconds) the
cassette should be re-recorded. Default: |
# In this example I'm showing the insert and eject commands, but you'd # usually wrap these in \dontshow{} so the user doesn't see them and # think that they're something they need to copy. insert_example_cassette("httpbin-get", package = "vcr") req <- httr2::request("https://hb.cran.dev/get") resp <- httr2::req_perform(req) str(httr2::resp_body_json(resp)) eject_cassette()
# In this example I'm showing the insert and eject commands, but you'd # usually wrap these in \dontshow{} so the user doesn't see them and # think that they're something they need to copy. insert_example_cassette("httpbin-get", package = "vcr") req <- httr2::request("https://hb.cran.dev/get") resp <- httr2::req_perform(req) str(httr2::resp_body_json(resp)) eject_cassette()
local_cassette()
and use_cassette()
set the VCR_IS_RECORDING
and VCR_IS_REPLAYING
environment variables to make it easy to determine
vcr state without taking a dependency on vcr. These functions show you
how to use them; we expect you to copy and paste these functions into your
own package
is_recording() is_replaying()
is_recording() is_replaying()
TRUE
or FALSE
.
turn_on()
and turn_off()
turn on and off for the whole session.
turned_off(code)
temporarily turns off while code
is running,
guaranteeing that you make a real HTTP request.
turned_on()
reports on if vcr is turned on or not.
skip_if_vcr_off()
skips a test if vcr is turned off. This is
occasionally useful if you're using a cassette to simulate a faked
request, or if the real request would return different values (e.g.
you're testing date parsing and the request returns the current date).
You can also control the default behaviour in a new session by setting the following environment variables before R starts:
Use VCR_TURN_OFF=true
to suppress all vcr usage, ignoring all
cassettes. This is useful for CI/CD workflows where you want to ensure
the test suite is run against the live API.
Set VCR_TURNED_OFF=true
to turn off vcr, but still use cassettes.
turn_on() turn_off(ignore_cassettes = FALSE) turned_off(code, ignore_cassettes = FALSE) turned_on() skip_if_vcr_off()
turn_on() turn_off(ignore_cassettes = FALSE) turned_off(code, ignore_cassettes = FALSE) turned_on() skip_if_vcr_off()
ignore_cassettes |
(logical) Controls what happens when a cassette is
inserted while vcr is turned off. If |
code |
Any block of code to run, presumably an HTTP request. |
# By default, vcr is turned on turned_on() # you can turn off for the rest of the session turn_off() turned_on() # turn on again turn_on() # or just turn it on turn off temporarily turned_off({ # some HTTP requests here turned_on() })
# By default, vcr is turned on turned_on() # you can turn off for the rest of the session turn_off() turned_on() # turn on again turn_on() # or just turn it on turn off temporarily turned_off({ # some HTTP requests here turned_on() })
setup_knitr()
registers a knitr hook to make it easy to use vcr inside a
vignette. First call setup_knitr()
in your setup chunk (or other chunk
early in the document):
```{r setup} #| include: false vcr::setup_knitr() ```
Then, in a chunk where you want to use a cassette, set the cassette
chunk
option to the name of the cassette:
```{r} #| cassette: name req <- httr2::request("http://r-project.org") resp <- httr2::req_perform(req) ```
Or if you have labelled the chunk, you can use cassette: true
to use the
chunk label as the cassette name:
```{r} #| label: cassette-name #| cassette: true req <- httr2::request("http://r-project.org") resp <- httr2::req_perform(req) ```
You can build your vignettes however you usually do (from the command line, with pkgdown, with RStudio/Positron, etc).
setup_knitr(prefix = NULL, dir = "_vcr", ...)
setup_knitr(prefix = NULL, dir = "_vcr", ...)
prefix |
An prefix for the cassette name to make cassettes unique across vignettes. Defaults to the file name (without extension) of the currently executing vignette. |
dir |
Directory where to create the cassette file. Default: '"_vcr"“. |
... |
Other arguments passed on to |
use_cassette(...)
uses a cassette for the code in ...
;
local_cassette()
uses a cassette for the current function scope (e.g.
for one test). Learn more in vignette("vcr")
.
Note that defaults for most arguments are controlled by vcr_configure()
,
so you may want to use that instead if you are changing the defaults for
all cassettes.
use_cassette( name, ..., dir = NULL, record = NULL, match_requests_on = NULL, serialize_with = NULL, preserve_exact_body_bytes = NULL, re_record_interval = NULL, warn_on_empty = NULL ) local_cassette( name, dir = NULL, record = NULL, match_requests_on = NULL, serialize_with = NULL, preserve_exact_body_bytes = NULL, re_record_interval = NULL, warn_on_empty = NULL, frame = parent.frame() )
use_cassette( name, ..., dir = NULL, record = NULL, match_requests_on = NULL, serialize_with = NULL, preserve_exact_body_bytes = NULL, re_record_interval = NULL, warn_on_empty = NULL ) local_cassette( name, dir = NULL, record = NULL, match_requests_on = NULL, serialize_with = NULL, preserve_exact_body_bytes = NULL, re_record_interval = NULL, warn_on_empty = NULL, frame = parent.frame() )
name |
The name of the cassette. This is used to name a file on disk, so it must be valid file name. |
... |
a block of code containing one or more requests (required). Use
curly braces to encapsulate multi-line code blocks. If you can't pass a code
block use |
dir |
The directory where the cassette will be stored. Defaults to
|
record |
Record mode that dictates how HTTP requests/responses are recorded. Possible values are:
|
match_requests_on |
Character vector of request matchers used to
determine which recorded HTTP interaction to replay. The default matches
on the The full set of possible values are:
If more than one is specified, all components must match in order for the
request to match. If not supplied, defaults to Note that the request header and body will only be included in the
cassette if |
serialize_with |
(string) Which serializer to use:
|
preserve_exact_body_bytes |
(logical) Force a binary (base64)
representation of the request and response bodies? By default, vcr
will look at the |
re_record_interval |
(integer) How frequently (in seconds) the
cassette should be re-recorded. Default: |
warn_on_empty |
(logical) Warn if the cassette is ejected but no interactions
have been recorded. Default: |
frame |
Attach exit handlers to this environment. Typically, this
should be either the current environment or a parent frame (accessed
through |
insert_cassette()
and eject_cassette()
for the underlying
functions.
Configurable options that define vcr's default behavior.
vcr_configure( dir, record, match_requests_on, serialize_with, json_pretty, ignore_hosts, ignore_localhost, preserve_exact_body_bytes, turned_off, re_record_interval, log, log_opts, filter_sensitive_data, filter_sensitive_data_regex, filter_request_headers, filter_response_headers, filter_query_parameters, write_disk_path, warn_on_empty_cassette ) local_vcr_configure(..., .frame = parent.frame()) vcr_configure_reset() vcr_configuration() vcr_config_defaults()
vcr_configure( dir, record, match_requests_on, serialize_with, json_pretty, ignore_hosts, ignore_localhost, preserve_exact_body_bytes, turned_off, re_record_interval, log, log_opts, filter_sensitive_data, filter_sensitive_data_regex, filter_request_headers, filter_response_headers, filter_query_parameters, write_disk_path, warn_on_empty_cassette ) local_vcr_configure(..., .frame = parent.frame()) vcr_configure_reset() vcr_configuration() vcr_config_defaults()
dir |
Directory where cassettes are stored. |
record |
Record mode that dictates how HTTP requests/responses are recorded. Possible values are:
|
match_requests_on |
Character vector of request matchers used to
determine which recorded HTTP interaction to replay. The default matches
on the The full set of possible values are:
If more than one is specified, all components must match in order for the
request to match. If not supplied, defaults to Note that the request header and body will only be included in the
cassette if |
serialize_with |
(string) Which serializer to use:
|
json_pretty |
(logical) want JSON to be newline separated to be easier
to read? Or remove newlines to save disk space? default: |
ignore_hosts |
(character) Vector of hosts to ignore. e.g.,
|
ignore_localhost |
(logical) Default: |
preserve_exact_body_bytes |
(logical) Force a binary (base64)
representation of the request and response bodies? By default, vcr
will look at the |
turned_off |
(logical) VCR is turned on by default. Default:
|
re_record_interval |
(integer) How frequently (in seconds) the
cassette should be re-recorded. Default: |
log , log_opts
|
See |
filter_sensitive_data , filter_sensitive_data_regex
|
Transform header and/or body in the request and response.
Named list of substitutions to apply to the headers and body of the
request and response. Format is |
filter_request_headers , filter_response_headers
|
Filter request or response headers. Should be a list:
unnamed components are removed, and named components are transformed.
For example, httr2's redacted headers are automatically removed. |
filter_query_parameters |
Filter query parameters in the request. A list where unnamed components
are removed, and named components are transformed. For example,
|
write_disk_path |
(character) path to write files to
for any requests that write responses to disk. By default this will be
|
warn_on_empty_cassette |
(logical) Should a warning be thrown when an
empty cassette is detected? Empty cassettes are cleaned up (deleted) either
way. This option only determines whether a warning is thrown or not.
Default: |
... |
Configuration settings used to override defaults. |
.frame |
Attach exit handlers to this environment. Typically, this
should be either the current environment or a parent frame (accessed
through |
vcr_configure(dir = tempdir()) vcr_configure(dir = tempdir(), record = "all") vcr_configuration() vcr_config_defaults() vcr_configure(dir = tempdir(), ignore_hosts = "google.com") vcr_configure(dir = tempdir(), ignore_localhost = TRUE) # filter sensitive data vcr_configure(dir = tempdir(), filter_sensitive_data = list(foo = "<bar>") ) vcr_configure(dir = tempdir(), filter_sensitive_data = list(foo = "<bar>", hello = "<world>") )
vcr_configure(dir = tempdir()) vcr_configure(dir = tempdir(), record = "all") vcr_configuration() vcr_config_defaults() vcr_configure(dir = tempdir(), ignore_hosts = "google.com") vcr_configure(dir = tempdir(), ignore_localhost = TRUE) # filter sensitive data vcr_configure(dir = tempdir(), filter_sensitive_data = list(foo = "<bar>") ) vcr_configure(dir = tempdir(), filter_sensitive_data = list(foo = "<bar>", hello = "<world>") )
By default, logging is disabled, but you can easily enable for the
entire session with vcr_configure_log()
or for just one test with
local_vcr_configure_log()
.
vcr_configure_log( log = TRUE, file = stderr(), include_date = NULL, log_prefix = "Cassette" ) local_vcr_configure_log( log = TRUE, file = stderr(), include_date = NULL, log_prefix = "Cassette", frame = parent.frame() )
vcr_configure_log( log = TRUE, file = stderr(), include_date = NULL, log_prefix = "Cassette" ) local_vcr_configure_log( log = TRUE, file = stderr(), include_date = NULL, log_prefix = "Cassette", frame = parent.frame() )
log |
Should we log important vcr things? |
file |
A path or connection to log to |
include_date |
(boolean) Include date and time in each log entry. |
log_prefix |
"Cassette". We insert the cassette name after this prefix, followed by the rest of the message. |
frame |
Attach exit handlers to this environment. Typically, this
should be either the current environment or a parent frame (accessed
through |
# The default logs to stderr() vcr_configure_log() # But you might want to log to a file vcr_configure_log(file = file.path(tempdir(), "vcr.log"))
# The default logs to stderr() vcr_configure_log() # But you might want to log to a file vcr_configure_log(file = file.path(tempdir(), "vcr.log"))
When debugging, it's often useful to see the last request and response
respectively. These functions give you what would have been recorded to disk
or replayed from disk. If the last request wasn't recorded, and there was
no matching request, vcr_last_response
will return NULL
.
vcr_last_request() vcr_last_response()
vcr_last_request() vcr_last_response()
This function, similar to testthat::test_path()
, is designed to work both
interactively and during tests, locating files in the tests/
directory.
vcr_test_path(...)
vcr_test_path(...)
... |
Character vectors giving path components. Each character string
gets added to the path, e.g., |
A character vector giving the path
vcr_test_path()
assumes you are using testthat for your unit tests.
if (interactive()) { vcr_test_path("fixtures") }
if (interactive()) { vcr_test_path("fixtures") }