module Contracts::Validators

Constants

DEFAULT_VALIDATOR_STRATEGIES

Public Instance Methods

clean_memoized_validators() click to toggle source

@private

# File lib/contracts/validators.rb, line 135
def clean_memoized_validators
  @_memoized_validators = {}
end
make_validator(contract) click to toggle source
# File lib/contracts/validators.rb, line 103
def make_validator(contract)
  contract_id = Support.contract_id(contract)

  if memoized_validators.key?(contract_id)
    return memoized_validators[contract_id]
  end

  memoized_validators[contract_id] = make_validator!(contract)
end
make_validator!(contract) click to toggle source

This is a little weird. For each contract we pre-make a proc to validate it so we don't have to go through this decision tree every time. Seems silly but it saves us a bunch of time (4.3sec vs 5.2sec)

# File lib/contracts/validators.rb, line 86
def make_validator!(contract)
  klass = contract.class
  key = if validator_strategies.key?(klass)
          klass
        else
          if contract.respond_to? :valid?
            :valid
          elsif klass == Class || klass == Module
            :class
          else
            :default
          end
        end

  validator_strategies[key].call(contract)
end
memoized_validators() click to toggle source

@private

# File lib/contracts/validators.rb, line 130
def memoized_validators
  @_memoized_validators ||= clean_memoized_validators
end
override_validator(name, &block) click to toggle source

Allows to override validator with custom one. Example:

Contract.override_validator(Array) do |contract|
  lambda do |arg|
    # .. implementation for Array contract ..
  end
end

Contract.override_validator(:class) do |contract|
  lambda do |arg|
    arg.is_a?(contract) || arg.is_a?(RSpec::Mocks::Double)
  end
end
# File lib/contracts/validators.rb, line 78
def override_validator(name, &block)
  validator_strategies[name] = block
end
reset_validators() click to toggle source

@private

# File lib/contracts/validators.rb, line 114
def reset_validators
  clean_memoized_validators
  restore_validators
end
restore_validators() click to toggle source

@private

# File lib/contracts/validators.rb, line 125
def restore_validators
  @_validator_strategies = DEFAULT_VALIDATOR_STRATEGIES.dup
end
validator_strategies() click to toggle source

@private

# File lib/contracts/validators.rb, line 120
def validator_strategies
  @_validator_strategies ||= restore_validators
end