lib/vcr/middleware/rack.rb in vcr-2.0.0.rc1 vs lib/vcr/middleware/rack.rb in vcr-2.0.0.rc2
- old
+ new
@@ -1,30 +1,65 @@
module VCR
module Middleware
+ # Object yielded by VCR's {Rack} middleware that allows you to configure
+ # the cassette dynamically based on the rack env.
class CassetteArguments
+ # @private
def initialize
@name = nil
@options = {}
end
+ # Sets (and gets) the cassette name.
+ #
+ # @param [#to_s] name the cassette name
+ # @return [#to_s] the cassette name
def name(name = nil)
@name = name if name
@name
end
+ # Sets (and gets) the cassette options.
+ #
+ # @param [Hash] options the cassette options
+ # @return [Hash] the cassette options
def options(options = {})
@options.merge!(options)
end
end
+ # Rack middleware that uses a VCR cassette for each incoming HTTP request.
+ #
+ # @example
+ # app = Rack::Builder.new do
+ # use VCR::Middleware::Rack do |cassette, env|
+ # cassette.name "rack/#{env['SERVER_NAME']}"
+ # cassette.options :record => :new_episodes
+ # end
+ #
+ # run MyRackApp
+ # end
+ #
+ # @note This will record/replay _outbound_ HTTP requests made by your rack app.
class Rack
include VCR::VariableArgsBlockCaller
+ # Constructs a new instance of VCR's rack middleware.
+ #
+ # @param [#call] app the rack app
+ # @yield the cassette configuration block
+ # @yieldparam [CassetteArguments] cassette the cassette configuration object
+ # @yieldparam [(optional) Hash] env the rack env hash
+ # @raise [ArgumentError] if no configuration block is provided
def initialize(app, &block)
raise ArgumentError.new("You must provide a block to set the cassette options") unless block
@app, @cassette_arguments_block, @mutex = app, block, Mutex.new
end
+ # Implements the rack middleware interface.
+ #
+ # @param [Hash] env the rack env hash
+ # @return [Array(Integer, Hash, #each)] the rack response
def call(env)
@mutex.synchronize do
VCR.use_cassette(*cassette_arguments(env)) do
@app.call(env)
end