Class: VCR::Cassette

Inherits:
Object
  • Object
show all
Includes:
Logger::Mixin
Defined in:
lib/vcr/cassette.rb,
lib/vcr/cassette/migrator.rb,
lib/vcr/cassette/persisters.rb,
lib/vcr/cassette/serializers.rb,
lib/vcr/cassette/erb_renderer.rb,
lib/vcr/cassette/serializers/json.rb,
lib/vcr/cassette/serializers/syck.rb,
lib/vcr/cassette/serializers/yaml.rb,
lib/vcr/cassette/serializers/psych.rb,
lib/vcr/cassette/http_interaction_list.rb,
lib/vcr/cassette/persisters/file_system.rb

Overview

The media VCR uses to store HTTP interactions for later re-use.

Defined Under Namespace

Modules: EncodingErrorHandling Classes: ERBRenderer, HTTPInteractionList, Migrator, Persisters, Serializers

Constant Summary collapse

VALID_RECORD_MODES =

The supported record modes.

* :all -- Record every HTTP interactions; do not play any back.
* :none -- Do not record any HTTP interactions; play them back.
* :new_episodes -- Playback previously recorded HTTP interactions and record new ones.
* :once -- Record the HTTP interactions if the cassette has not already been recorded;
           otherwise, playback the HTTP interactions.
[:all, :none, :new_episodes, :once]

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Logger::Mixin

#log, #response_summary

Constructor Details

#initialize(name, options = {}) ⇒ Cassette

Returns a new instance of Cassette.

Parameters:

  • name (#to_s)

    The name of the cassette. VCR will sanitize this to ensure it is a valid file name.

  • options (Hash) (defaults to: {})

    The cassette options. The given options will be merged with the configured default_cassette_options.

See Also:



45
46
47
48
49
50
51
52
53
54
# File 'lib/vcr/cassette.rb', line 45

def initialize(name, options = {})
  @name    = name
  @options = VCR.configuration.default_cassette_options.merge(options)

  assert_valid_options!
  extract_options
  raise_error_unless_valid_record_mode

  log "Initialized with options: #{@options.inspect}"
end

Instance Attribute Details

#erbBoolean, Hash (readonly)

Returns The cassette’s ERB option. The file will be treated as an ERB template if this has a truthy value. A hash, if provided, will be used as local variables for the ERB template.

Returns:

  • (Boolean, Hash)

    The cassette’s ERB option. The file will be treated as an ERB template if this has a truthy value. A hash, if provided, will be used as local variables for the ERB template.



34
35
36
# File 'lib/vcr/cassette.rb', line 34

def erb
  @erb
end

#match_requests_onArray<Symbol, #call> (readonly)

Returns List of request matchers. Used to find a response from an existing HTTP interaction to play back.

Returns:

  • (Array<Symbol, #call>)

    List of request matchers. Used to find a response from an existing HTTP interaction to play back.



29
30
31
# File 'lib/vcr/cassette.rb', line 29

def match_requests_on
  @match_requests_on
end

#name#to_s (readonly)

Returns The name of the cassette. Used to determine the cassette’s file name.

Returns:

  • (#to_s)

    The name of the cassette. Used to determine the cassette’s file name.

See Also:



21
22
23
# File 'lib/vcr/cassette.rb', line 21

def name
  @name
end

#re_record_intervalInteger? (readonly)

Returns How frequently (in seconds) the cassette should be re-recorded.

Returns:

  • (Integer, nil)

    How frequently (in seconds) the cassette should be re-recorded.



37
38
39
# File 'lib/vcr/cassette.rb', line 37

def re_record_interval
  @re_record_interval
end

#record_modeSymbol (readonly)

Returns The record mode. Determines whether the cassette records HTTP interactions, plays them back, or does both.

Returns:

  • (Symbol)

    The record mode. Determines whether the cassette records HTTP interactions, plays them back, or does both.



25
26
27
# File 'lib/vcr/cassette.rb', line 25

def record_mode
  @record_mode
end

#tagsArray<Symbol> (readonly)

Returns If set, VCR::Configuration#before_record and VCR::Configuration#before_playback hooks with a corresponding tag will apply.

Returns:



41
42
43
# File 'lib/vcr/cassette.rb', line 41

def tags
  @tags
end

Class Method Details

.const_missing(const) ⇒ Object



17
18
19
20
21
# File 'lib/vcr/deprecations.rb', line 17

def Cassette.const_missing(const)
  return super unless const == :MissingERBVariableError
  warn "WARNING: `VCR::Cassette::MissingERBVariableError` is deprecated.  Use `VCR::Errors::MissingERBVariableError` instead."
  Errors::MissingERBVariableError
end

Instance Method Details

#eject(options = {}) ⇒ Object

Note:

This is not intended to be called directly. Use ‘VCR.eject_cassette` instead.

Ejects the current cassette. The cassette will no longer be used. In addition, any newly recorded HTTP interactions will be written to disk.

See Also:



64
65
66
67
68
69
70
# File 'lib/vcr/cassette.rb', line 64

def eject(options = {})
  write_recorded_interactions_to_disk

  if should_assert_no_unused_interactions? && !options[:skip_no_unused_interactions_assertion]
    http_interactions.assert_no_unused_interactions!
  end
end

#fileString

Note:

VCR will take care of sanitizing the cassette name to make it a valid file name.

Returns The file for this cassette.

Returns:

  • (String)

    The file for this cassette.

Raises:

  • (NotImplementedError)

    if the configured cassette persister does not support resolving file paths.



97
98
99
100
101
102
# File 'lib/vcr/cassette.rb', line 97

def file
  unless @persister.respond_to?(:absolute_path_to_file)
    raise NotImplementedError, "The configured cassette persister does not support resolving file paths"
  end
  @persister.absolute_path_to_file(storage_key)
end

#http_interactionsObject



73
74
75
76
77
78
79
80
# File 'lib/vcr/cassette.rb', line 73

def http_interactions
  @http_interactions ||= HTTPInteractionList.new \
    should_stub_requests? ? previously_recorded_interactions : [],
    match_requests_on,
    @allow_playback_repeats,
    @parent_list,
    log_prefix
end

#new_recorded_interactionsObject



89
90
91
# File 'lib/vcr/cassette.rb', line 89

def new_recorded_interactions
  @new_recorded_interactions ||= []
end

#originally_recorded_atTime?

Returns The ‘recorded_at` time of the first HTTP interaction or nil if the cassette has no prior HTTP interactions.

Examples:


VCR.use_cassette("some cassette") do |cassette|
  Timecop.freeze(cassette.originally_recorded_at || Time.now) do
    # ...
  end
end

Returns:

  • (Time, nil)

    The ‘recorded_at` time of the first HTTP interaction or nil if the cassette has no prior HTTP interactions.



131
132
133
# File 'lib/vcr/cassette.rb', line 131

def originally_recorded_at
  @originally_recorded_at ||= previously_recorded_interactions.map(&:recorded_at).min
end

#record_http_interaction(interaction) ⇒ Object



83
84
85
86
# File 'lib/vcr/cassette.rb', line 83

def record_http_interaction(interaction)
  log "Recorded HTTP interaction #{request_summary(interaction.request)} => #{response_summary(interaction.response)}"
  new_recorded_interactions << interaction
end

#recording?Boolean

Returns Whether or not the cassette is recording.

Returns:

  • (Boolean)

    Whether or not the cassette is recording.



105
106
107
108
109
110
111
# File 'lib/vcr/cassette.rb', line 105

def recording?
  case record_mode
    when :none; false
    when :once; raw_cassette_bytes.to_s.empty?
    else true
  end
end

#serializable_hashHash

Returns The hash that will be serialized when the cassette is written to disk.

Returns:

  • (Hash)

    The hash that will be serialized when the cassette is written to disk.



114
115
116
117
118
119
# File 'lib/vcr/cassette.rb', line 114

def serializable_hash
  {
    "http_interactions" => interactions_to_record.map(&:to_hash),
    "recorded_with"     => "VCR #{VCR.version}"
  }
end