module Contracts::Validators

Constants

DEFAULT_VALIDATOR_STRATEGIES

Public Instance Methods

clean_memoized_validators() click to toggle source

@private

# File lib/contracts/contract/validators.rb, line 130
def clean_memoized_validators
  @_memoized_validators = {}
end
make_validator(contract) click to toggle source
# File lib/contracts/contract/validators.rb, line 98
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/contract/validators.rb, line 86
def make_validator!(contract)
  validator_strategies[validator_key(contract)].call(contract)
end
memoized_validators() click to toggle source

@private

# File lib/contracts/contract/validators.rb, line 125
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/contract/validators.rb, line 78
def override_validator(name, &block)
  validator_strategies[name] = block
end
reset_validators() click to toggle source

@private

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

@private

# File lib/contracts/contract/validators.rb, line 120
def restore_validators
  @_validator_strategies = DEFAULT_VALIDATOR_STRATEGIES.dup
end
validator_key(contract) click to toggle source
# File lib/contracts/contract/validators.rb, line 90
def validator_key(contract)
  klass = contract.class
  return klass  if validator_strategies.key?(klass)
  return :valid if contract.respond_to? :valid?
  return :class if klass == Class || klass == Module
  :default
end
validator_strategies() click to toggle source

@private

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