module Camcorder

Provides similar functionality as the VCR gem but works on arbitrary objects. This is useful for things like Net::IMAP and Net::SMTP which cannot be captured by VCR.

Constants

VERSION

Attributes

klass[R]
recorder[R]

Public Class Methods

_new(*args)
Also aliased as: new
Alias for: new
config() click to toggle source
# File lib/camcorder.rb, line 22
def self.config
  @config ||= Configuration.new
end
default_recorder() click to toggle source
# File lib/camcorder.rb, line 14
def self.default_recorder
  @default_recorder
end
default_recorder=(value) click to toggle source
# File lib/camcorder.rb, line 18
def self.default_recorder=(value)
  @default_recorder = value
end
deintercept_constructor(klass) click to toggle source
# File lib/camcorder.rb, line 67
def self.deintercept_constructor(klass)
  klass.class_eval do
    class << self
      alias_method :new, :_new
      remove_method :_new
    end
  end
end
intercept_constructor(klass, recorder=nil, &block) click to toggle source

Rewrites the `new` method on the passed in class to always return proxies.

# File lib/camcorder.rb, line 48
def self.intercept_constructor(klass, recorder=nil, &block)
  proxy_class = self.proxy_class(klass, recorder) do
    def _initialize
      @instance ||= klass._new(*@init_args)
    end
    self.class_eval &block if block
  end
  
  klass.class_eval do
    @proxy_class = proxy_class
    class << self
      alias_method :_new, :new
      def new(*args)
        @proxy_class.new(*args)
      end
    end
  end
end
new(*args) click to toggle source
Calls superclass method
# File lib/camcorder.rb, line 37
def initialize(*args)
  recorder = self.class.recorder || Camcorder.default_recorder
  super(recorder, self.class.klass, *args)
end
Also aliased as: _new
new(*args) click to toggle source
# File lib/camcorder.rb, line 60
def new(*args)
  @proxy_class.new(*args)
end
proxy_class(klass, recorder=nil, &block) click to toggle source

Creates a proxy subclass for the particular class

# File lib/camcorder.rb, line 29
def self.proxy_class(klass, recorder=nil, &block)
  Class.new(Proxy) do
    class << self
      attr_reader :klass
      attr_reader :recorder
    end
    @klass = klass
    @recorder = recorder
    def initialize(*args)
      recorder = self.class.recorder || Camcorder.default_recorder
      super(recorder, self.class.klass, *args)
    end
    self.class_eval &block if block
  end
end
use_recordings(klass, name) { || ... } click to toggle source

Similar to `VCR.use_cassette`

# File lib/camcorder.rb, line 79
def self.use_recordings(klass, name, &block)
  recorder = Recorder.new(File.join(self.config.recordings_dir, "#{name}.yaml"))
  begin
    self.intercept_constructor(klass, recorder)
  
    recorder.transaction do
      yield
    end
  ensure
    self.deintercept_constructor(klass)
  end
end

Public Instance Methods

_initialize() click to toggle source
# File lib/camcorder.rb, line 50
def _initialize
  @instance ||= klass._new(*@init_args)
end