lib/vcr/linked_cassette.rb
require 'delegate' require 'vcr/errors' module VCR # A Cassette wrapper for linking cassettes from another thread class LinkedCassette < SimpleDelegator # An enumerable lazily wrapping a list of cassettes that a context is using class CassetteList include Enumerable # Creates a new list of context-owned cassettes and linked cassettes # @param cassettes [Array] context-owned cassettes # @param linked_cassettes [Array] context-unowned (linked) cassettes def initialize(cassettes, linked_cassettes) @cassettes = cassettes @linked_cassettes = linked_cassettes end # Yields linked cassettes first, and then context-owned cassettes def each @linked_cassettes.each do |cassette| yield wrap(cassette) end @cassettes.each do |cassette| yield cassette end end # Provide last implementation, which is not provided by Enumerable def last cassette = @cassettes.last return cassette if cassette cassette = @linked_cassettes.last wrap(cassette) if cassette end # Provide size implementation, which is not provided by Enumerable def size @cassettes.size + @linked_cassettes.size end protected def wrap(cassette) if cassette.linked? cassette else LinkedCassette.new(cassette) end end end # Create a new CassetteList # @param cassettes [Array] context-owned cassettes # @param linked_cassettes [Array] context-unowned (linked) cassettes def self.list(cassettes, linked_cassettes) CassetteList.new(cassettes, linked_cassettes) end # Prevents cassette ejection by raising EjectLinkedCassetteError def eject(*args) raise Errors::EjectLinkedCassetteError, "cannot eject a cassette inserted by a parent thread" end # @return [Boolean] true def linked? true end end end