Class: HakumiComponents::Rails::ValidationIntrospection

Inherits:
Object
  • Object
show all
Extended by:
T::Sig
Defined in:
lib/hakumi_components/rails/validation_introspection.rb

Class Method Summary collapse

Class Method Details

.email_field?(object, attribute) ⇒ Boolean

Returns:

  • (Boolean)


95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/hakumi_components/rails/validation_introspection.rb', line 95

def email_field?(object, attribute)
  return false unless has_validators?(object)
  return true if attribute.to_s.match?(/email/i)

  format_validator = validators_for(object, attribute).find do |validator|
    validator.is_a?(ActiveModel::Validations::FormatValidator)
  end

  return false unless format_validator

  opts = format_validator.options
  regex = opts[:with]
  return false unless regex.is_a?(Regexp)

  regex.source.match?(/email|@.*\./i)
end

.maxlength(object, attribute) ⇒ Object



21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/hakumi_components/rails/validation_introspection.rb', line 21

def maxlength(object, attribute)
  return nil unless has_validators?(object)

  length_validator = validators_for(object, attribute).find do |validator|
    validator.is_a?(ActiveModel::Validations::LengthValidator)
  end

  return nil unless length_validator

  opts = length_validator.options
  value = opts[:maximum] || opts[:is]
  value.is_a?(Integer) ? value : nil
end

.minlength(object, attribute) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/hakumi_components/rails/validation_introspection.rb', line 36

def minlength(object, attribute)
  return nil unless has_validators?(object)

  length_validator = validators_for(object, attribute).find do |validator|
    validator.is_a?(ActiveModel::Validations::LengthValidator)
  end

  return nil unless length_validator

  opts = length_validator.options
  value = opts[:minimum]
  value.is_a?(Integer) ? value : nil
end

.numericality_constraints(object, attribute) ⇒ Object



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/hakumi_components/rails/validation_introspection.rb', line 68

def numericality_constraints(object, attribute)
  return {} unless has_validators?(object)

  numericality_validator = validators_for(object, attribute).find do |validator|
    validator.is_a?(ActiveModel::Validations::NumericalityValidator)
  end

  return {} unless numericality_validator

  constraints = T.let({}, T::Hash[Symbol, T.any(Integer, String)])
  opts = numericality_validator.options

  min_inclusive = opts[:greater_than_or_equal_to]
  min_exclusive = opts[:greater_than]
  max_inclusive = opts[:less_than_or_equal_to]
  max_exclusive = opts[:less_than]

  constraints[:min] = min_inclusive.to_i if min_inclusive.is_a?(Numeric)
  constraints[:min] = min_exclusive.to_i + 1 if min_exclusive.is_a?(Numeric)
  constraints[:max] = max_inclusive.to_i if max_inclusive.is_a?(Numeric)
  constraints[:max] = max_exclusive.to_i - 1 if max_exclusive.is_a?(Numeric)
  constraints[:step] = opts[:only_integer] ? 1 : "any"

  constraints
end

.pattern(object, attribute) ⇒ Object



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/hakumi_components/rails/validation_introspection.rb', line 51

def pattern(object, attribute)
  return nil unless has_validators?(object)

  format_validator = validators_for(object, attribute).find do |validator|
    validator.is_a?(ActiveModel::Validations::FormatValidator)
  end

  return nil unless format_validator

  opts = format_validator.options
  regex = opts[:with]
  return nil unless regex.is_a?(Regexp)

  regex.source.gsub(/\A(\\A|\^)|(\$|\\z)\z/, "")
end

.required?(object, attribute) ⇒ Boolean

Returns:

  • (Boolean)


11
12
13
14
15
16
17
18
# File 'lib/hakumi_components/rails/validation_introspection.rb', line 11

def required?(object, attribute)
  return false unless has_validators?(object)

  validators_for(object, attribute).any? do |validator|
    validator.is_a?(ActiveModel::Validations::PresenceValidator) ||
      (validator.is_a?(ActiveRecord::Validations::PresenceValidator) if defined?(ActiveRecord))
  end
end

.url_field?(object, attribute) ⇒ Boolean

Returns:

  • (Boolean)


113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/hakumi_components/rails/validation_introspection.rb', line 113

def url_field?(object, attribute)
  return false unless has_validators?(object)
  return true if attribute.to_s.match?(/url|website|link/i)

  format_validator = validators_for(object, attribute).find do |validator|
    validator.is_a?(ActiveModel::Validations::FormatValidator)
  end

  return false unless format_validator

  opts = format_validator.options
  regex = opts[:with]
  return false unless regex.is_a?(Regexp)

  regex.source.match?(/http|https|:\/\//i)
end