Module: Stretchy::Utils::Contract

Included in:
Boosts::Base, Filters::Base, Queries::Base, Types::Base
Defined in:
lib/stretchy/utils/contract.rb

Defined Under Namespace

Modules: ClassMethods

Constant Summary collapse

ASSERTIONS =
[:type, :responds_to, :in, :matches, :required]
DISTANCE_FORMAT =
/^(\d+)(km|mi)$/
DECAY_FUNCTIONS =
[:gauss, :linear, :exp]

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



9
10
11
# File 'lib/stretchy/utils/contract.rb', line 9

def self.included(base)
  base.send(:extend, ClassMethods)
end

Instance Method Details

#require_one(options = {}) ⇒ Object



34
35
36
37
38
# File 'lib/stretchy/utils/contract.rb', line 34

def require_one(options = {})
  if options.values.all?{|v| self.class.is_empty?(v) }
    raise Stretchy::Errors::ContractError.new("One of #{options.keys.join(', ')} must be present, found: #{options}")
  end
end

#validate!Object



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/stretchy/utils/contract.rb', line 13

def validate!
  self.class.contracts.each do |name, options|
    value = instance_variable_get("@#{name}")
    next if value.nil? && !options[:required]
    
    if options[:array]
      self.class.assert_type(name, value, type: Array)
      self.class.assert_required(name, value, {}) if options[:required]
    end

    ASSERTIONS.each do |assertion|
      assertion_method = "assert_#{assertion}"
      if options[:array]
        value.each {|v| self.class.send(assertion_method, name, v, options) } unless options[assertion].nil?
      else
        self.class.send(assertion_method, name, value, options) unless options[assertion].nil?
      end
    end
  end
end