Module: Validate

Extended by:
Validate
Included in:
Validate
Defined in:
lib/validate/validate.rb,
lib/validate/controls/no_validator.rb,
lib/validate/controls/validator/state.rb,
lib/validate/controls/validator/default.rb,
lib/validate/controls/validator/scenario.rb,
lib/validate/controls/validator/scenarios.rb,
lib/validate/controls/no_scenario_accessor.rb,
lib/validate/controls/validator/not_boolean_result.rb

Defined Under Namespace

Modules: Controls Classes: Error

Instance Method Summary collapse

Instance Method Details

#assure_scenario(validator, scenario) ⇒ Object



83
84
85
86
87
# File 'lib/validate/validate.rb', line 83

def assure_scenario(validator, scenario)
  unless scenario_method?(validator, scenario)
    raise Error, "#{validator.name} doesn't have a `#{scenario}' scenario method"
  end
end

#assure_validator(subject_const) ⇒ Object



64
65
66
67
68
# File 'lib/validate/validate.rb', line 64

def assure_validator(subject_const)
  unless validator_const?(subject_const)
    raise Error, "#{subject_const.name} doesn't have a `Validator' namespace"
  end
end

#call(subject, state = nil, scenario: nil, scenarios: nil) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
18
19
# File 'lib/validate/validate.rb', line 6

def call(subject, state=nil, scenario: nil, scenarios: nil)
  validator = validator(subject)

  if scenarios.nil?
    scenarios = scenario
  end
  scenarios = Array(scenarios)

  if scenarios.empty?
    validate(validator, subject, state)
  else
    validate_scenarios(validator, subject, state, scenarios)
  end
end

#get_scenario(validator, scenario) ⇒ Object



93
94
95
# File 'lib/validate/validate.rb', line 93

def get_scenario(validator, scenario)
  validator.public_send(scenario)
end

#get_validator(subject_const) ⇒ Object



74
75
76
# File 'lib/validate/validate.rb', line 74

def get_validator(subject_const)
  subject_const.const_get(:Validator)
end

#scenario(validator, scenario) ⇒ Object



78
79
80
81
# File 'lib/validate/validate.rb', line 78

def scenario(validator, scenario)
  assure_scenario(validator, scenario)
  get_scenario(validator, scenario)
end

#scenario_method?(validator, scenario) ⇒ Boolean

Returns:

  • (Boolean)


89
90
91
# File 'lib/validate/validate.rb', line 89

def scenario_method?(validator, scenario)
  validator.respond_to?(scenario)
end

#subject_const(subject) ⇒ Object



60
61
62
# File 'lib/validate/validate.rb', line 60

def subject_const(subject)
  [Module, Class].include?(subject.class) ? subject : subject.class
end

#validate(validator, subject, state) ⇒ Object



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

def validate(validator, subject, state)
  method = validator.method(:call)

  result = nil
  case method.parameters.length
  when 1
    if !state.nil?
      raise Error, "State argument was supplied but the validator does not provide a state parameter (Validator: #{validator})"
    end

    result = validator.public_send :call, subject
  when 2
    result = validator.public_send :call, subject, state
  end

  unless result.is_a?(TrueClass) || result.is_a?(FalseClass)
    raise Error, "Result must be boolean. The result is a #{result.class}. (Validator: #{validator})"
  end

  result
end

#validate_scenarios(validator, subject, state, scenarios) ⇒ Object



21
22
23
24
25
26
27
28
29
# File 'lib/validate/validate.rb', line 21

def validate_scenarios(validator, subject, state, scenarios)
  result = true
  scenarios.each do |scenario|
    scenario_validator = scenario(validator, scenario)
    result = result & validate(scenario_validator, subject, state)
  end

  result
end

#validator(subject) ⇒ Object



53
54
55
56
57
58
# File 'lib/validate/validate.rb', line 53

def validator(subject)
  subject_const = subject_const(subject)

  assure_validator(subject_const)
  get_validator(subject_const)
end

#validator_const?(subject_const) ⇒ Boolean

Returns:

  • (Boolean)


70
71
72
# File 'lib/validate/validate.rb', line 70

def validator_const?(subject_const)
  subject_const.const_defined?(:Validator)
end