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