Sha256: eeb631ed90b93a0a8e28dbfdc5daf7372303719aff3eb8cd1ae7316e3632c6ac

Contents?: true

Size: 1.44 KB

Versions: 14

Compression:

Stored size: 1.44 KB

Contents

module VCR
  class Cassette
    class MissingERBVariableError < NameError; end

    class Reader
      def initialize(file_name, erb)
        @file_name, @erb = file_name, erb
      end

      def read
        return file_content unless use_erb?
        binding = binding_for_variables if erb_variables
        template.result(binding)
      rescue NameError => e
        handle_name_error(e)
      end

      private

        def handle_name_error(e)
          example_hash = (erb_variables || {}).merge(e.name => 'some value')

          raise MissingERBVariableError.new(
            "The ERB in the #{@file_name} cassette file references undefined variable #{e.name}.  " +
            "Pass it to the cassette using :erb => #{ example_hash.inspect }."
          )
        end

        def use_erb?
          !!@erb
        end

        def erb_variables
          @erb if @erb.is_a?(Hash)
        end

        def file_content
          @file_content ||= File.read(@file_name)
        end

        def template
          @template ||= ERB.new(file_content)
        end

        @@struct_cache = Hash.new do |hash, attributes|
          hash[attributes] = Struct.new(*attributes)
        end

        def variables_object
          @variables_object ||= @@struct_cache[erb_variables.keys].new(*erb_variables.values)
        end

        def binding_for_variables
          @binding_for_variables ||= variables_object.instance_eval { binding }
        end
    end
  end
end

Version data entries

14 entries across 14 versions & 1 rubygems

Version Path
vcr-1.11.3 lib/vcr/cassette/reader.rb
vcr-1.11.2 lib/vcr/cassette/reader.rb
vcr-1.11.1 lib/vcr/cassette/reader.rb
vcr-1.10.3 lib/vcr/cassette/reader.rb
vcr-1.10.2 lib/vcr/cassette/reader.rb
vcr-1.10.0 lib/vcr/cassette/reader.rb
vcr-1.9.0 lib/vcr/cassette/reader.rb
vcr-1.8.0 lib/vcr/cassette/reader.rb
vcr-1.7.2 lib/vcr/cassette/reader.rb
vcr-1.7.1 lib/vcr/cassette/reader.rb
vcr-1.7.0 lib/vcr/cassette/reader.rb
vcr-1.6.0 lib/vcr/cassette/reader.rb
vcr-1.5.1 lib/vcr/cassette/reader.rb
vcr-1.5.0 lib/vcr/cassette/reader.rb