Module: RSpecParam::ClassMethods

Included in:
RSpecParam
Defined in:
lib/rspec_param.rb

Overview

Since:

  • 1.0.0

Instance Method Summary collapse

Instance Method Details

#included(klass) ⇒ Object

Since:

  • 1.0.0



57
58
59
60
# File 'lib/rspec_param.rb', line 57

def included(klass)
  super
  klass.extend ClassMethods
end

#param(name, default = nil, accumulate: false, &block) ⇒ Object

Since:

  • 1.0.0



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/rspec_param.rb', line 32

def param(name, default=nil, accumulate: false, &block)
  raise "One of a default param or block is required" unless default || block || accumulate
  block ||= lambda { accumulate ? (default || []) : default }
  # Create the let variable.
  let(name, &block)
  # Define the helper method.
  define_singleton_method(name) do |value=nil, &inner_block|
    raise "One of a value param or block is required" unless value || inner_block
    let_block = if accumulate
      # Accumulate values into an ivar to handle multiple calls in the
      # same context level.
      ivar = "@param_context_#{name}"
      existing_values = instance_variable_get(ivar) || []
      existing_values << [value, inner_block]
      instance_variable_set(ivar, existing_values)
      lambda do
        super() + existing_values.map {|v, b|  b ? instance_eval(&b) : v }
      end
    else
      inner_block || lambda { value }
    end
    let(name, &let_block)
  end
end