validation_profiler 0.2.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. checksums.yaml +4 -4
  2. data/lib/validation_profiler/exceptions/field_not_found.rb +16 -0
  3. data/lib/validation_profiler/exceptions/invalid_field_type.rb +18 -0
  4. data/lib/validation_profiler/exceptions/invalid_validation_rule_attributes.rb +18 -0
  5. data/lib/validation_profiler/exceptions/invalid_validation_rule_type.rb +16 -0
  6. data/lib/validation_profiler/exceptions/validation_rule_already_exists.rb +16 -0
  7. data/lib/validation_profiler/exceptions/validation_rule_not_found.rb +16 -0
  8. data/lib/validation_profiler/exceptions.rb +6 -0
  9. data/lib/validation_profiler/rules/child_validation_rule.rb +54 -0
  10. data/lib/validation_profiler/rules/condition_validation_rule.rb +93 -0
  11. data/lib/validation_profiler/rules/email_validation_rule.rb +44 -0
  12. data/lib/validation_profiler/rules/length_validation_rule.rb +66 -0
  13. data/lib/validation_profiler/rules/list_validation_rule.rb +50 -0
  14. data/lib/validation_profiler/rules/match_validation_rule.rb +46 -0
  15. data/lib/validation_profiler/rules/max_validation_rule.rb +52 -0
  16. data/lib/validation_profiler/rules/min_validation_rule.rb +52 -0
  17. data/lib/validation_profiler/rules/not_allowed_validation_rule.rb +37 -0
  18. data/lib/validation_profiler/rules/regex_validation_rule.rb +47 -0
  19. data/lib/validation_profiler/rules/required_validation_rule.rb +41 -0
  20. data/lib/validation_profiler/rules/validation_rule.rb +43 -0
  21. data/lib/validation_profiler/rules/validation_rule_manager.rb +71 -106
  22. data/lib/validation_profiler/rules.rb +23 -0
  23. data/lib/validation_profiler/version.rb +1 -1
  24. data/lib/validation_profiler.rb +40 -38
  25. metadata +22 -3
  26. data/lib/validation_profiler/rules/rules.rb +0 -632
@@ -0,0 +1,46 @@
1
+ module ValidationProfiler
2
+ module Rules
3
+ class MatchValidationRule < ValidationProfiler::Rules::ValidationRule
4
+
5
+ def error_message(field, attributes, parent = nil)
6
+
7
+ field_name = field.to_s
8
+ if parent != nil
9
+ field_name = "#{parent.to_s}.#{field.to_s}"
10
+ end
11
+
12
+ match_field = attributes[:field]
13
+
14
+ #check if a custom error message has been specified in the attributes
15
+ if attributes[:message] == nil
16
+ #no custom error message has been specified so create the default message.
17
+ "#{field_name} does not match #{match_field}"
18
+ else
19
+ attributes[:message]
20
+ end
21
+ end
22
+
23
+
24
+ def validate(obj, field, attributes, parent = nil)
25
+
26
+ #attempt to get the field value from the object
27
+ field_value = get_field_value(obj, field)
28
+
29
+ match_field = attributes[:field]
30
+ if match_field == nil
31
+ raise ValidationProfiler::Exceptions::InvalidValidationRuleAttributes.new(ValidationProfiler::Rules::MatchValidationRule, field)
32
+ end
33
+
34
+ if !is_required?(field_value, attributes)
35
+ return true
36
+ end
37
+
38
+ match_field_value = get_field_value(obj, match_field)
39
+
40
+ return field_value == match_field_value
41
+
42
+ end
43
+
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,52 @@
1
+ module ValidationProfiler
2
+ module Rules
3
+ class MaxValidationRule < ValidationProfiler::Rules::ValidationRule
4
+
5
+ def error_message(field, attributes, parent = nil)
6
+
7
+ field_name = field.to_s
8
+ if parent != nil
9
+ field_name = "#{parent.to_s}.#{field.to_s}"
10
+ end
11
+
12
+ #check if a custom error message has been specified in the attributes
13
+ if attributes[:message] == nil
14
+ #no custom error message has been specified so create the default message.
15
+ max = attributes[:value]
16
+ "#{field_name} must not have a value greater than #{max}"
17
+ else
18
+ attributes[:message]
19
+ end
20
+ end
21
+
22
+ def validate(obj, field, attributes, parent = nil)
23
+
24
+ max = attributes[:value]
25
+
26
+ #verify the expected attributes have been specified.
27
+ if max == nil
28
+ raise ValidationProfiler::Exceptions::InvalidValidationRuleAttributes.new(ValidationProfiler::Rules::MaxValidationRule, field)
29
+ end
30
+
31
+ #attempt to get the field value from the object
32
+ field_value = get_field_value(obj, field)
33
+
34
+ if !is_required?(field_value, attributes)
35
+ return true
36
+ end
37
+
38
+ if field_value == nil
39
+ return false
40
+ end
41
+
42
+ if field_value.is_a?(DateTime) || field_value.is_a?(Numeric)
43
+ field_value <= max
44
+ else
45
+ raise ValidationProfiler::Exceptions::InvalidFieldType.new(ValidationProfiler::Rules::MaxValidationRule, field)
46
+ end
47
+
48
+ end
49
+
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,52 @@
1
+ module ValidationProfiler
2
+ module Rules
3
+ class MinValidationRule < ValidationProfiler::Rules::ValidationRule
4
+
5
+ def error_message(field, attributes, parent = nil)
6
+
7
+ field_name = field.to_s
8
+ if parent != nil
9
+ field_name = "#{parent.to_s}.#{field.to_s}"
10
+ end
11
+
12
+ #check if a custom error message has been specified in the attributes
13
+ if attributes[:message] == nil
14
+ #no custom error message has been specified so create the default message.
15
+ min = attributes[:value]
16
+ "#{field_name} must have a minimum value of #{min}"
17
+ else
18
+ attributes[:message]
19
+ end
20
+ end
21
+
22
+ def validate(obj, field, attributes, parent = nil)
23
+
24
+ min = attributes[:value]
25
+
26
+ #verify the expected attributes have been specified.
27
+ if min == nil
28
+ raise ValidationProfiler::Exceptions::InvalidValidationRuleAttributes.new(ValidationProfiler::Rules::MinValidationRule, field)
29
+ end
30
+
31
+ #attempt to get the field value from the object
32
+ field_value = get_field_value(obj, field)
33
+
34
+ if !is_required?(field_value, attributes)
35
+ return true
36
+ end
37
+
38
+ if field_value == nil
39
+ return false
40
+ end
41
+
42
+ if field_value.is_a?(DateTime) || field_value.is_a?(Numeric)
43
+ field_value >= min
44
+ else
45
+ raise ValidationProfiler::Exceptions::InvalidFieldType.new(ValidationProfiler::Rules::MinValidationRule, field)
46
+ end
47
+
48
+ end
49
+
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,37 @@
1
+ module ValidationProfiler
2
+ module Rules
3
+ class NotAllowedValidationRule < ValidationProfiler::Rules::ValidationRule
4
+
5
+ def error_message(field, attributes = {}, parent = nil)
6
+
7
+ field_name = field.to_s
8
+ if parent != nil
9
+ field_name = "#{parent.to_s}.#{field.to_s}"
10
+ end
11
+
12
+ #check if a custom error message has been specified in the attributes
13
+ if attributes[:message] == nil
14
+ #no custom error message has been specified so create the default message.
15
+ "#{field_name} is not allowed."
16
+ else
17
+ attributes[:message]
18
+ end
19
+ end
20
+
21
+
22
+ def validate(obj, field, attributes = {}, parent = nil)
23
+
24
+ #attempt to get the field value from the object
25
+ field_value = get_field_value(obj, field)
26
+
27
+ if field_value != nil
28
+ return false
29
+ end
30
+
31
+ return true
32
+
33
+ end
34
+
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,47 @@
1
+ module ValidationProfiler
2
+ module Rules
3
+ class RegexValidationRule < ValidationProfiler::Rules::ValidationRule
4
+
5
+ def error_message(field, attributes = {}, parent = nil)
6
+
7
+ field_name = field.to_s
8
+ if parent != nil
9
+ field_name = "#{parent.to_s}.#{field.to_s}"
10
+ end
11
+
12
+ #check if a custom error message has been specified in the attributes
13
+ if attributes[:message] == nil
14
+ #no custom error message has been specified so create the default message.
15
+ "#{field_name} is not a valid"
16
+ else
17
+ attributes[:message]
18
+ end
19
+ end
20
+
21
+
22
+ def validate(obj, field, attributes, parent = nil)
23
+
24
+ #attempt to get the field value from the object
25
+ field_value = get_field_value(obj, field)
26
+
27
+ regex = attributes[:regex]
28
+ if regex == nil
29
+ raise ValidationProfiler::Exceptions::InvalidValidationRuleAttributes.new(ValidationProfiler::Rules::RegexValidationRule, field)
30
+ end
31
+
32
+ if !is_required?(field_value, attributes)
33
+ return true
34
+ end
35
+
36
+ #validate the value against the regex
37
+ if field_value =~ regex
38
+ return true
39
+ end
40
+
41
+ return false
42
+
43
+ end
44
+
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,41 @@
1
+ module ValidationProfiler
2
+ module Rules
3
+ class RequiredValidationRule < ValidationProfiler::Rules::ValidationRule
4
+
5
+ def error_message(field, attributes = {}, parent = nil)
6
+
7
+ field_name = field.to_s
8
+ if parent != nil
9
+ field_name = "#{parent.to_s}.#{field.to_s}"
10
+ end
11
+
12
+ #check if a custom error message has been specified in the attributes
13
+ if attributes[:message] == nil
14
+ #no custom error message has been specified so create the default message.
15
+ "#{field_name} is required"
16
+ else
17
+ attributes[:message]
18
+ end
19
+ end
20
+
21
+
22
+ def validate(obj, field, attributes = {}, parent = nil)
23
+
24
+ #attempt to get the field value from the object
25
+ field_value = get_field_value(obj, field)
26
+
27
+ if field_value == nil
28
+ return false
29
+ end
30
+
31
+ if field_value.is_a?(Array) || field_value.is_a?(String)
32
+ return !field_value.empty?
33
+ end
34
+
35
+ return true
36
+
37
+ end
38
+
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,43 @@
1
+ module ValidationProfiler
2
+ module Rules
3
+ class ValidationRule
4
+
5
+ def get_field_value(obj, field)
6
+ #attempt to get the field value from the object
7
+ field_value = nil
8
+ #check if the object is a hash
9
+ if obj.is_a?(Hash)
10
+ if obj.has_key?(field)
11
+ #get the field value
12
+ field_value = obj[field]
13
+ elsif obj.has_key?(field.to_s)
14
+ field_value = obj[field.to_s]
15
+ end
16
+ else
17
+ #if the object does not contain the specified field raise an exception
18
+ if !obj.respond_to?(field)
19
+ raise ValidationProfiler::Exceptions::FieldNotFound.new(field)
20
+ end
21
+
22
+ #get the field value
23
+ field_value = obj.send(field)
24
+ end
25
+ end
26
+
27
+ def is_required?(field_value, attributes = {})
28
+ required = attributes[:required]
29
+ if required == nil
30
+ required = true
31
+ end
32
+
33
+ #check if the field is required
34
+ if field_value == nil && required == false
35
+ return false
36
+ else
37
+ return true
38
+ end
39
+ end
40
+
41
+ end
42
+ end
43
+ end
@@ -1,110 +1,75 @@
1
- require_relative '../../../lib/validation_profiler/rules/rules'
1
+ require_relative '../../../lib/validation_profiler/rules/child_validation_rule'
2
+
3
+ module ValidationProfiler
4
+ module Rules
5
+ # This is the manager class that holds all registered validation rules.
6
+ class Manager
7
+
8
+ class << self
9
+ attr_accessor :instance
10
+ end
11
+
12
+ def initialize
13
+ @rules = []
14
+ ValidationProfiler::Rules::Manager.instance = self
15
+ load_rules
16
+ end
17
+
18
+ # This method is called to get a validation rule by it's registered key.
19
+ #
20
+ # @params key [Symbol] This is the key of the validation rule you want to request.
21
+ #
22
+ # @return [ValidationRule] This is the requested ValidationRule instance.
23
+ def get_rule(key)
24
+
25
+ results = @rules.select { |r| r[:key] == key }
26
+ if !results.empty?
27
+ results[0][:instance]
28
+ else
29
+ raise ValidationProfiler::Exceptions::ValidationRuleNotFound.new(key)
30
+ end
31
+ end
32
+
33
+ # This method is called to add a validation rule to the manager for use.
34
+ #
35
+ # @param key [Symbol] This is the key to register the validation rule for.
36
+ # @param rule [ClassName] This is the class name of the validation rule to register.
37
+ def add_rule(key, rule)
38
+
39
+ instance = rule.new
40
+
41
+ #verify the rule instance inherits ValidationRule
42
+ if instance == nil || !instance.is_a?(ValidationRule)
43
+ raise ValidationProfiler::Exceptions::InvalidValidationRuleType.new(instance.class)
44
+ end
45
+
46
+ #verify the rule name has not already been registered
47
+ if !@rules.select { |r| r[:key] == key }.empty?
48
+ raise ValidationProfiler::Exceptions::ValidationRuleAlreadyExists.new(key)
49
+ end
50
+
51
+ @rules.push({ key: key, instance: instance})
52
+
53
+ end
54
+
55
+ private
56
+
57
+ def load_rules
58
+
59
+ @rules.push({ key: :required, instance: ValidationProfiler::Rules::RequiredValidationRule.new })
60
+ @rules.push({ key: :length, instance: ValidationProfiler::Rules::LengthValidationRule.new })
61
+ @rules.push({ key: :min, instance: ValidationProfiler::Rules::MinValidationRule.new })
62
+ @rules.push({ key: :max, instance: ValidationProfiler::Rules::MaxValidationRule.new })
63
+ @rules.push({ key: :email, instance: ValidationProfiler::Rules::EmailValidationRule.new })
64
+ @rules.push({ key: :regex, instance: ValidationProfiler::Rules::RegexValidationRule.new })
65
+ @rules.push({ key: :match, instance: ValidationProfiler::Rules::MatchValidationRule.new })
66
+ @rules.push({ key: :condition, instance: ValidationProfiler::Rules::ConditionValidationRule.new })
67
+ @rules.push({ key: :not_allowed, instance: ValidationProfiler::Rules::NotAllowedValidationRule.new })
68
+ @rules.push({ key: :list, instance: ValidationProfiler::Rules::ListValidationRule.new })
69
+ @rules.push({ key: :child, instance: ValidationProfiler::Rules::ChildValidationRule.new })
70
+
71
+ end
2
72
 
3
- # This is the manager class that holds all registered validation rules.
4
- class ValidationRuleManager
5
-
6
- class << self
7
- attr_accessor :instance
8
- end
9
-
10
- def initialize
11
- @rules = []
12
- ValidationRuleManager.instance = self
13
- load_rules
14
- end
15
-
16
- # This method is called to get a validation rule by it's registered key.
17
- #
18
- # @params key [Symbol] This is the key of the validation rule you want to request.
19
- #
20
- # @return [ValidationRule] This is the requested ValidationRule instance.
21
- def get_rule(key)
22
-
23
- results = @rules.select { |r| r[:key] == key }
24
- if !results.empty?
25
- results[0][:instance]
26
- else
27
- raise ValidationRuleNotFound.new(key)
28
73
  end
29
74
  end
30
-
31
- # This method is called to add a validation rule to the manager for use.
32
- #
33
- # @param key [Symbol] This is the key to register the validation rule for.
34
- # @param rule [ClassName] This is the class name of the validation rule to register.
35
- def add_rule(key, rule)
36
-
37
- instance = rule.new
38
-
39
- #verify the rule instance inherits ValidationRule
40
- if instance == nil || !instance.is_a?(ValidationRule)
41
- raise InvalidRuleType.new(instance.class)
42
- end
43
-
44
- #verify the rule name has not already been registered
45
- if !@rules.select { |r| r[:key] == key }.empty?
46
- raise RuleAlreadyExists.new(key)
47
- end
48
-
49
- @rules.push({ key: key, instance: instance})
50
-
51
- end
52
-
53
- private
54
-
55
- def load_rules
56
-
57
- @rules.push({ key: :required, instance: RequiredValidationRule.new })
58
- @rules.push({ key: :length, instance: LengthValidationRule.new })
59
- @rules.push({ key: :min, instance: MinValidationRule.new })
60
- @rules.push({ key: :max, instance: MaxValidationRule.new })
61
- @rules.push({ key: :email, instance: EmailValidationRule.new })
62
- @rules.push({ key: :regex, instance: RegexValidationRule.new })
63
- @rules.push({ key: :match, instance: MatchValidationRule.new })
64
- @rules.push({ key: :condition, instance: ConditionValidationRule.new })
65
- @rules.push({ key: :not_allowed, instance: NotAllowedValidationRule.new })
66
- @rules.push({ key: :list, instance: ListValidationRule.new })
67
- @rules.push({ key: :child, instance: ChildValidationRule.new })
68
-
69
- end
70
-
71
- end
72
-
73
- class ValidationRuleNotFound < StandardError
74
-
75
- def initialize(rule)
76
- @rule = rule
77
- end
78
-
79
- def to_s
80
- rule = @rule
81
- "Validation rule: #{rule} could not be found."
82
- end
83
-
84
- end
85
-
86
- class InvalidRuleType < StandardError
87
-
88
- def initialize(rule)
89
- @rule = rule
90
- end
91
-
92
- def to_s
93
- rule = @rule
94
- "Validation rule: #{rule} is not a valid type. Rules must inherit from the ValidationRule base class."
95
- end
96
-
97
- end
98
-
99
- class RuleAlreadyExists < StandardError
100
-
101
- def initialize(key)
102
- @key = key
103
- end
104
-
105
- def to_s
106
- key = @key
107
- "A Rule has already been registered for the key: #{key}."
108
- end
109
-
110
75
  end