anodator 1.0.0.pre1 → 1.0.0.pre2
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.
- checksums.yaml +5 -5
- data/.codeclimate.yml +3 -0
- data/.gitignore +3 -0
- data/.travis.yml +11 -0
- data/Gemfile +2 -2
- data/README.md +9 -4
- data/Rakefile +3 -3
- data/anodator.gemspec +17 -14
- data/bin/console +3 -3
- data/bin/console-on-docker +4 -0
- data/bin/docker-console +2 -0
- data/bin/docker-prompt +2 -0
- data/bin/prompt-on-docker +4 -0
- data/bin/setup +0 -0
- data/example/example_01.rb +88 -61
- data/lib/anodator.rb +3 -2
- data/lib/anodator/anodator_error.rb +1 -1
- data/lib/anodator/check_result.rb +7 -7
- data/lib/anodator/checker.rb +33 -26
- data/lib/anodator/common.rb +15 -0
- data/lib/anodator/data_source.rb +87 -0
- data/lib/anodator/data_source_set.rb +36 -0
- data/lib/anodator/input_spec.rb +105 -111
- data/lib/anodator/input_spec_item.rb +8 -8
- data/lib/anodator/message.rb +14 -14
- data/lib/anodator/output_spec.rb +40 -43
- data/lib/anodator/rule.rb +26 -32
- data/lib/anodator/rule_set.rb +6 -12
- data/lib/anodator/utils.rb +36 -42
- data/lib/anodator/validator.rb +9 -9
- data/lib/anodator/validator/base.rb +44 -27
- data/lib/anodator/validator/blank_validator.rb +2 -2
- data/lib/anodator/validator/complex_validator.rb +12 -12
- data/lib/anodator/validator/configuration_error.rb +1 -2
- data/lib/anodator/validator/date_validator.rb +93 -103
- data/lib/anodator/validator/format_validator.rb +8 -11
- data/lib/anodator/validator/inclusion_validator.rb +3 -3
- data/lib/anodator/validator/length_validator.rb +6 -6
- data/lib/anodator/validator/numeric_validator.rb +13 -13
- data/lib/anodator/validator/presence_validator.rb +2 -2
- data/lib/anodator/validator/value_proxy.rb +31 -9
- data/lib/anodator/version.rb +1 -1
- metadata +41 -6
- data/VERSION +0 -1
@@ -1,20 +1,20 @@
|
|
1
1
|
module Anodator
|
2
2
|
class InputSpecItem
|
3
|
-
TYPE_STRING =
|
4
|
-
TYPE_NUMERIC =
|
5
|
-
TYPE_DATE =
|
3
|
+
TYPE_STRING = 'STRING'.freeze
|
4
|
+
TYPE_NUMERIC = 'NUMERIC'.freeze
|
5
|
+
TYPE_DATE = 'DATE'.freeze
|
6
6
|
|
7
7
|
attr_reader :number, :name, :type
|
8
8
|
|
9
9
|
def initialize(number, name, type = TYPE_STRING)
|
10
10
|
if number.nil? || number.to_s.split(//).size.zero?
|
11
|
-
raise ArgumentError
|
11
|
+
raise ArgumentError, 'number cannot be blank'
|
12
12
|
end
|
13
13
|
if name.nil? || name.to_s.split(//).size.zero?
|
14
|
-
raise ArgumentError
|
14
|
+
raise ArgumentError, 'name cannot be blank'
|
15
15
|
end
|
16
16
|
unless [TYPE_STRING, TYPE_NUMERIC, TYPE_DATE].include?(type)
|
17
|
-
raise ArgumentError
|
17
|
+
raise ArgumentError, "unknown data type '#{type}'"
|
18
18
|
end
|
19
19
|
|
20
20
|
@number = number
|
@@ -24,9 +24,9 @@ module Anodator
|
|
24
24
|
|
25
25
|
def ==(other)
|
26
26
|
if other.is_a? InputSpecItem
|
27
|
-
|
27
|
+
number == other.number
|
28
28
|
else
|
29
|
-
|
29
|
+
false
|
30
30
|
end
|
31
31
|
end
|
32
32
|
end
|
data/lib/anodator/message.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
require
|
1
|
+
require 'anodator/anodator_error'
|
2
2
|
|
3
3
|
module Anodator
|
4
|
-
class UnknownMessageAttributeError < AnodatorError
|
4
|
+
class UnknownMessageAttributeError < AnodatorError; end
|
5
5
|
|
6
6
|
# Message is error message builder.
|
7
7
|
#
|
@@ -15,7 +15,7 @@ module Anodator
|
|
15
15
|
@template = template_message.to_s
|
16
16
|
|
17
17
|
if @template.split(//).size.zero?
|
18
|
-
raise ArgumentError
|
18
|
+
raise ArgumentError, 'template_message cannot be blank'
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
@@ -31,29 +31,29 @@ module Anodator
|
|
31
31
|
# - value: target actual data
|
32
32
|
def expand(data_provider)
|
33
33
|
@template.gsub(/\[\[([^:]+)::([^\]]+)\]\]/) do
|
34
|
-
spec_item = data_provider.spec_item_by_expression(
|
35
|
-
case
|
36
|
-
when
|
34
|
+
spec_item = data_provider.spec_item_by_expression(Regexp.last_match(1))
|
35
|
+
case Regexp.last_match(2)
|
36
|
+
when 'name'
|
37
37
|
spec_item.name
|
38
|
-
when
|
38
|
+
when 'number'
|
39
39
|
spec_item.number
|
40
|
-
when
|
41
|
-
data_provider[
|
40
|
+
when 'value'
|
41
|
+
data_provider[Regexp.last_match(1)]
|
42
42
|
else
|
43
|
-
raise UnknownMessageAttributeError
|
43
|
+
raise UnknownMessageAttributeError, "Unknown message attribute '#{Regexp.last_match(2)}'"
|
44
44
|
end
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
48
|
def validate_configuration
|
49
49
|
@template.gsub(/\[\[([^:]+)::([^\]]+)\]\]/) do
|
50
|
-
Validator::Base.values.spec_item_by_expression(
|
51
|
-
unless %
|
52
|
-
raise UnknownMessageAttributeError
|
50
|
+
Validator::Base.values.spec_item_by_expression(Regexp.last_match(1))
|
51
|
+
unless %w[name number value].include?(Regexp.last_match(2))
|
52
|
+
raise UnknownMessageAttributeError, "Unknown message attribute '#{Regexp.last_match(2)}'"
|
53
53
|
end
|
54
54
|
end
|
55
55
|
rescue UnknownTargetExpressionError, UnknownMessageAttributeError => e
|
56
|
-
raise InvalidConfiguration
|
56
|
+
raise InvalidConfiguration, e.to_s
|
57
57
|
end
|
58
58
|
end
|
59
59
|
end
|
data/lib/anodator/output_spec.rb
CHANGED
@@ -1,28 +1,28 @@
|
|
1
1
|
module Anodator
|
2
2
|
class OutputSpec
|
3
|
-
TARGET_DATA =
|
4
|
-
TARGET_ERROR =
|
3
|
+
TARGET_DATA = 'DATA'.freeze
|
4
|
+
TARGET_ERROR = 'ERROR'.freeze
|
5
5
|
|
6
|
-
VALID_SYMBOL_ITEMS = [
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
6
|
+
VALID_SYMBOL_ITEMS = %i[
|
7
|
+
target_numbers
|
8
|
+
target_names
|
9
|
+
target_values
|
10
|
+
error_message
|
11
|
+
error_level
|
12
|
+
error_count
|
13
|
+
warning_count
|
14
|
+
error_and_warning_count
|
15
|
+
].freeze
|
16
16
|
|
17
17
|
attr_reader :items, :target, :include_no_error
|
18
18
|
attr_accessor :separator, :value_separator
|
19
19
|
|
20
|
-
def initialize(items = [], options = {
|
20
|
+
def initialize(items = [], options = {})
|
21
21
|
@items = items.to_a
|
22
22
|
@target = TARGET_ERROR
|
23
23
|
@include_no_error = false
|
24
|
-
@separator =
|
25
|
-
@value_separator =
|
24
|
+
@separator = ' '
|
25
|
+
@value_separator = ''
|
26
26
|
|
27
27
|
options.each do |key, opt|
|
28
28
|
case key
|
@@ -33,12 +33,12 @@ module Anodator
|
|
33
33
|
when :separator, :value_separator
|
34
34
|
@separator = opt.to_s
|
35
35
|
else
|
36
|
-
raise ArgumentError
|
36
|
+
raise ArgumentError, "unknown option #{key}."
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
40
|
unless [TARGET_DATA, TARGET_ERROR].include?(@target)
|
41
|
-
raise ArgumentError
|
41
|
+
raise ArgumentError, "unknown target option value #{@target}."
|
42
42
|
end
|
43
43
|
|
44
44
|
check_items
|
@@ -46,20 +46,17 @@ module Anodator
|
|
46
46
|
|
47
47
|
def validate_configuration
|
48
48
|
@items.each do |item|
|
49
|
-
if item.is_a? String
|
50
|
-
Validator::Base.values.spec_item_at_by_number(item)
|
51
|
-
end
|
49
|
+
Validator::Base.values.spec_item_at_by_number(item) if item.is_a? String
|
52
50
|
end
|
53
51
|
rescue UnknownTargetExpressionError => e
|
54
|
-
raise InvalidConfiguration
|
52
|
+
raise InvalidConfiguration, e.to_s
|
55
53
|
end
|
56
54
|
|
57
55
|
def check_items
|
58
56
|
@items.each do |item|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
end
|
57
|
+
next unless item.is_a? Symbol
|
58
|
+
unless VALID_SYMBOL_ITEMS.include?(item)
|
59
|
+
raise ArgumentError, "unknown item symbol #{item}"
|
63
60
|
end
|
64
61
|
end
|
65
62
|
end
|
@@ -79,24 +76,24 @@ module Anodator
|
|
79
76
|
if item.is_a? Symbol
|
80
77
|
case item
|
81
78
|
when :error_count
|
82
|
-
next check_results.map
|
79
|
+
next check_results.map do |result|
|
83
80
|
result.error? ? true : nil
|
84
|
-
|
81
|
+
end.compact.size.to_s
|
85
82
|
when :warning_count
|
86
|
-
next check_results.map
|
83
|
+
next check_results.map do |result|
|
87
84
|
result.warning? ? true : nil
|
88
|
-
|
85
|
+
end.compact.size.to_s
|
89
86
|
when :error_and_warning_count
|
90
87
|
next check_results.size.to_s
|
91
88
|
else
|
92
|
-
next
|
89
|
+
next ''
|
93
90
|
end
|
94
91
|
else # data
|
95
92
|
next input_spec_with_values[item]
|
96
93
|
end
|
97
94
|
end
|
98
95
|
|
99
|
-
|
96
|
+
buf
|
100
97
|
end
|
101
98
|
private :generate_data
|
102
99
|
|
@@ -109,9 +106,9 @@ module Anodator
|
|
109
106
|
if item.is_a? Symbol
|
110
107
|
case item
|
111
108
|
when :error_count, :warning_count, :error_and_warning_count
|
112
|
-
next
|
109
|
+
next '0'
|
113
110
|
else
|
114
|
-
next
|
111
|
+
next ''
|
115
112
|
end
|
116
113
|
else # data
|
117
114
|
next input_spec_with_values[item]
|
@@ -126,29 +123,29 @@ module Anodator
|
|
126
123
|
when :target_numbers
|
127
124
|
next check_result.target_numbers.join(@separator)
|
128
125
|
when :target_names
|
129
|
-
next check_result.target_numbers.map
|
126
|
+
next check_result.target_numbers.map do |number|
|
130
127
|
input_spec_with_values.spec_item_at_by_number(number).name
|
131
|
-
|
128
|
+
end.join(@separator)
|
132
129
|
when :target_values
|
133
|
-
next check_result.target_numbers.map
|
130
|
+
next check_result.target_numbers.map do |number|
|
134
131
|
input_spec_with_values[number]
|
135
|
-
|
132
|
+
end.join(@value_separator)
|
136
133
|
when :error_message
|
137
134
|
next check_result.message
|
138
135
|
when :error_level
|
139
136
|
next check_result.level.to_s
|
140
137
|
when :error_count
|
141
|
-
next check_results.map
|
138
|
+
next check_results.map do |result|
|
142
139
|
result.error? ? true : nil
|
143
|
-
|
140
|
+
end.compact.size.to_s
|
144
141
|
when :warning_count
|
145
|
-
next check_results.map
|
142
|
+
next check_results.map do |result|
|
146
143
|
result.warning? ? true : nil
|
147
|
-
|
144
|
+
end.compact.size.to_s
|
148
145
|
when :error_and_warning_count
|
149
146
|
next check_results.size.to_s
|
150
147
|
else
|
151
|
-
next
|
148
|
+
next ''
|
152
149
|
end
|
153
150
|
else # data
|
154
151
|
next input_spec_with_values[item]
|
@@ -157,7 +154,7 @@ module Anodator
|
|
157
154
|
end
|
158
155
|
end
|
159
156
|
|
160
|
-
|
157
|
+
buf
|
161
158
|
end
|
162
159
|
private :generate_error
|
163
160
|
end
|
data/lib/anodator/rule.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require 'anodator/message'
|
2
|
+
require 'anodator/validator'
|
3
|
+
require 'anodator/check_result'
|
4
4
|
|
5
5
|
module Anodator
|
6
6
|
# Check rule
|
@@ -13,30 +13,30 @@ module Anodator
|
|
13
13
|
# default levels are error and warning.
|
14
14
|
# You can add any levels.
|
15
15
|
ERROR_LEVELS = {
|
16
|
-
:
|
17
|
-
:
|
16
|
+
error: 2, # ERROR
|
17
|
+
warning: 1, # WARNING
|
18
18
|
}
|
19
19
|
|
20
20
|
# Check level names
|
21
21
|
#
|
22
22
|
# Check level name labels
|
23
23
|
ERROR_LEVEL_NAMES = {
|
24
|
-
:
|
25
|
-
:
|
24
|
+
error: 'ERROR',
|
25
|
+
warning: 'WARNING'
|
26
26
|
}
|
27
27
|
|
28
28
|
attr_reader :target_expressions, :message, :validator, :prerequisite, :level, :description
|
29
29
|
|
30
30
|
def self.add_error_level(value, symbol, label)
|
31
31
|
# value check
|
32
|
-
raise
|
33
|
-
raise
|
32
|
+
raise 'Error level value must be Integer' unless value.is_a? Integer
|
33
|
+
raise 'Error level value must be greater than zero' unless value > 0
|
34
34
|
raise "Error level value #{value} already exists" if ERROR_LEVELS.values.include?(value)
|
35
35
|
# symbol check
|
36
|
-
raise
|
36
|
+
raise 'Error level symbol must be symbol' unless symbol.is_a? Symbol
|
37
37
|
raise "Error level symbol #{symbol} already exists" if ERROR_LEVELS.keys.include?(symbol)
|
38
38
|
# label check
|
39
|
-
raise
|
39
|
+
raise 'Error level label must be string' unless label.is_a? String
|
40
40
|
raise "Error level label #{label} already exists" if ERROR_LEVEL_NAMES.values.include?(label)
|
41
41
|
|
42
42
|
# check OK
|
@@ -48,7 +48,7 @@ module Anodator
|
|
48
48
|
# symbol check
|
49
49
|
raise "Unknown rror level symbol #{symbol}" unless ERROR_LEVELS.keys.include?(symbol)
|
50
50
|
# count check
|
51
|
-
raise
|
51
|
+
raise 'Error levels must be atleast one value' if ERROR_LEVELS.size == 1
|
52
52
|
|
53
53
|
# check OK
|
54
54
|
ERROR_LEVELS.delete(symbol)
|
@@ -64,19 +64,15 @@ module Anodator
|
|
64
64
|
@description = description
|
65
65
|
|
66
66
|
if @target_expressions.size.zero?
|
67
|
-
raise ArgumentError
|
68
|
-
end
|
69
|
-
if @message.nil?
|
70
|
-
raise ArgumentError.new("message cannot be blank")
|
71
|
-
end
|
72
|
-
if @validator.nil?
|
73
|
-
raise ArgumentError.new("validator cannot be blank")
|
67
|
+
raise ArgumentError, 'target expressions cannot be blank'
|
74
68
|
end
|
69
|
+
raise ArgumentError, 'message cannot be blank' if @message.nil?
|
70
|
+
raise ArgumentError, 'validator cannot be blank' if @validator.nil?
|
75
71
|
unless ERROR_LEVELS.values.include?(@level)
|
76
|
-
raise ArgumentError
|
72
|
+
raise ArgumentError, "level must be #{ERROR_LEVEL_NAMES.join(', ')}."
|
77
73
|
end
|
78
74
|
if @prerequisite.is_a? Array
|
79
|
-
@prerequisite = Validator::ComplexValidator.new(:
|
75
|
+
@prerequisite = Validator::ComplexValidator.new(validators: @prerequisite)
|
80
76
|
end
|
81
77
|
end
|
82
78
|
|
@@ -86,9 +82,7 @@ module Anodator
|
|
86
82
|
# return nil.
|
87
83
|
def check
|
88
84
|
unless @prerequisite.nil?
|
89
|
-
unless @prerequisite.valid?
|
90
|
-
return nil
|
91
|
-
end
|
85
|
+
return nil unless @prerequisite.valid?
|
92
86
|
end
|
93
87
|
|
94
88
|
if @validator.valid?
|
@@ -112,11 +106,11 @@ module Anodator
|
|
112
106
|
@validator.validate_configuration
|
113
107
|
@prerequisite.validate_configuration unless @prerequisite.nil?
|
114
108
|
rescue UnknownTargetExpressionError => e
|
115
|
-
raise InvalidConfiguration
|
109
|
+
raise InvalidConfiguration, e.to_s
|
116
110
|
end
|
117
111
|
|
118
112
|
def level_expression
|
119
|
-
|
113
|
+
Rule.level_expression(@level)
|
120
114
|
end
|
121
115
|
|
122
116
|
def self.level_expression(level)
|
@@ -124,20 +118,20 @@ module Anodator
|
|
124
118
|
return ERROR_LEVEL_NAMES[ERROR_LEVELS.key(level)]
|
125
119
|
end
|
126
120
|
|
127
|
-
|
121
|
+
nil
|
128
122
|
end
|
129
123
|
|
130
124
|
def to_s
|
131
|
-
target_names = @target_expressions.map { |te| Validator::Base.values.spec_item_by_expression(te).name }.join(
|
132
|
-
buf
|
133
|
-
Description: #{@description.nil? ?
|
125
|
+
target_names = @target_expressions.map { |te| Validator::Base.values.spec_item_by_expression(te).name }.join(',')
|
126
|
+
buf = <<_EOD_
|
127
|
+
Description: #{@description.nil? ? 'None.' : @description}
|
134
128
|
Targets: #{target_names}
|
135
129
|
Message: #{@message.template}
|
136
130
|
Level: #{level_expression}
|
137
131
|
Validator:
|
138
|
-
#{@validator
|
132
|
+
#{@validator}
|
139
133
|
Prerequisite:
|
140
|
-
#{@prerequisite.nil? ?
|
134
|
+
#{@prerequisite.nil? ? ' - (None)' : @prerequisite.to_s}
|
141
135
|
_EOD_
|
142
136
|
end
|
143
137
|
end
|
data/lib/anodator/rule_set.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'anodator/rule'
|
2
2
|
|
3
3
|
module Anodator
|
4
4
|
class RuleSet
|
@@ -11,11 +11,11 @@ module Anodator
|
|
11
11
|
if rule.is_a? Rule
|
12
12
|
@rules << rule
|
13
13
|
else
|
14
|
-
raise ArgumentError
|
14
|
+
raise ArgumentError, 'rule must be Anodator::Rule object'
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
|
18
|
+
alias << add_rule
|
19
19
|
|
20
20
|
def check_all
|
21
21
|
@results = []
|
@@ -33,20 +33,14 @@ module Anodator
|
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
-
|
37
|
-
return @results
|
38
|
-
end
|
36
|
+
attr_reader :results
|
39
37
|
|
40
38
|
def validate_configuration
|
41
|
-
@rules.each
|
42
|
-
rule.validate_configuration
|
43
|
-
end
|
39
|
+
@rules.each(&:validate_configuration)
|
44
40
|
end
|
45
41
|
|
46
42
|
def to_s
|
47
|
-
@rules.map
|
48
|
-
rule.to_s
|
49
|
-
}.join("\n")
|
43
|
+
@rules.map(&:to_s).join("\n")
|
50
44
|
end
|
51
45
|
end
|
52
46
|
end
|
data/lib/anodator/utils.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'csv'
|
2
2
|
|
3
3
|
module Anodator
|
4
4
|
module Utils
|
@@ -24,10 +24,10 @@ module Anodator
|
|
24
24
|
first = false
|
25
25
|
next
|
26
26
|
end
|
27
|
-
spec << { :
|
27
|
+
spec << { number: row[0], name: row[1], type: row[2] }
|
28
28
|
end
|
29
29
|
|
30
|
-
|
30
|
+
InputSpec.new(spec)
|
31
31
|
end
|
32
32
|
|
33
33
|
# load output_spec from csv file
|
@@ -56,8 +56,8 @@ module Anodator
|
|
56
56
|
# Return:
|
57
57
|
# OutputSpec instance
|
58
58
|
def self.load_output_spec_from_csv_file(file_path,
|
59
|
-
|
60
|
-
|
59
|
+
target = Anodator::OutputSpec::TARGET_ERROR,
|
60
|
+
include_no_error = false)
|
61
61
|
first = true
|
62
62
|
header = nil
|
63
63
|
spec = []
|
@@ -68,14 +68,14 @@ module Anodator
|
|
68
68
|
first = false
|
69
69
|
next
|
70
70
|
end
|
71
|
-
if row.first.nil? || row.first.split(//).length.zero?
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
71
|
+
spec << if row.first.nil? || row.first.split(//).length.zero?
|
72
|
+
row.last.to_sym
|
73
|
+
else
|
74
|
+
row.first.to_s
|
75
|
+
end
|
76
76
|
end
|
77
77
|
|
78
|
-
|
78
|
+
Anodator::OutputSpec.new(spec, target: target, include_no_error: include_no_error)
|
79
79
|
end
|
80
80
|
|
81
81
|
# options reader for option values for validator specs
|
@@ -89,13 +89,13 @@ module Anodator
|
|
89
89
|
# - options_index_from: index for option column be started on row(default: 4)
|
90
90
|
# Return:
|
91
91
|
# Hash
|
92
|
-
def self.options_reader(row, options = {
|
92
|
+
def self.options_reader(row, options = {}, options_index_from = 4)
|
93
93
|
if row.size > options_index_from
|
94
94
|
row[options_index_from..-1].each do |column|
|
95
95
|
next if column.nil?
|
96
|
-
key, value = column.split(
|
96
|
+
key, value = column.split(':', 2)
|
97
97
|
case value
|
98
|
-
when
|
98
|
+
when 'true', 'false'
|
99
99
|
options[key.to_sym] = eval(value)
|
100
100
|
else
|
101
101
|
options[key.to_sym] = value
|
@@ -103,7 +103,7 @@ module Anodator
|
|
103
103
|
end
|
104
104
|
end
|
105
105
|
|
106
|
-
|
106
|
+
options
|
107
107
|
end
|
108
108
|
|
109
109
|
# load validators from csv file
|
@@ -120,7 +120,7 @@ module Anodator
|
|
120
120
|
def self.load_validators_from_csv_file(file_path)
|
121
121
|
first = true
|
122
122
|
header = nil
|
123
|
-
validators = {
|
123
|
+
validators = {}
|
124
124
|
|
125
125
|
CSV.read(file_path).each do |row|
|
126
126
|
# skip header
|
@@ -131,46 +131,42 @@ module Anodator
|
|
131
131
|
end
|
132
132
|
|
133
133
|
if validators.keys.include?(row[0])
|
134
|
-
raise ArgumentError
|
134
|
+
raise ArgumentError, "Duplicated validator number '#{row[0]}'!"
|
135
135
|
end
|
136
136
|
|
137
|
-
options = options_reader(row,
|
137
|
+
options = options_reader(row, description: row[1])
|
138
138
|
|
139
139
|
validator = nil
|
140
140
|
|
141
141
|
case row[2]
|
142
|
-
when
|
142
|
+
when 'presence'
|
143
143
|
validator = Validator::PresenceValidator
|
144
|
-
when
|
144
|
+
when 'blank'
|
145
145
|
validator = Validator::BlankValidator
|
146
|
-
when
|
146
|
+
when 'date'
|
147
147
|
validator = Validator::DateValidator
|
148
|
-
when
|
148
|
+
when 'format'
|
149
149
|
validator = Validator::FormatValidator
|
150
|
-
when
|
150
|
+
when 'inclusion'
|
151
151
|
validator = Validator::InclusionValidator
|
152
|
-
unless options[:in].nil?
|
153
|
-
|
154
|
-
end
|
155
|
-
when "length"
|
152
|
+
options[:in] = options[:in].split(',') unless options[:in].nil?
|
153
|
+
when 'length'
|
156
154
|
validator = Validator::LengthValidator
|
157
|
-
when
|
155
|
+
when 'numeric'
|
158
156
|
validator = Validator::NumericValidator
|
159
|
-
when
|
160
|
-
options[:validators] = row[3].split(
|
157
|
+
when 'complex'
|
158
|
+
options[:validators] = row[3].split(',').map do |validator_number|
|
161
159
|
validators[validator_number]
|
162
160
|
end
|
163
161
|
validators[row[0]] = Validator::ComplexValidator.new(options)
|
164
162
|
else
|
165
|
-
raise ArgumentError
|
163
|
+
raise ArgumentError, "Unknown validator type '#{row[2]}'!"
|
166
164
|
end
|
167
165
|
|
168
|
-
if validator
|
169
|
-
validators[row[0]] = validator.new(row[3], options)
|
170
|
-
end
|
166
|
+
validators[row[0]] = validator.new(row[3], options) if validator
|
171
167
|
end
|
172
168
|
|
173
|
-
|
169
|
+
validators
|
174
170
|
end
|
175
171
|
|
176
172
|
# load rule_set from csv file
|
@@ -200,19 +196,17 @@ module Anodator
|
|
200
196
|
end
|
201
197
|
|
202
198
|
description = row[1]
|
203
|
-
target_expression = row[2].split(
|
199
|
+
target_expression = row[2].split(',')
|
204
200
|
validator = validators[row[3]]
|
205
|
-
if !row[4].nil? && row[4].include?(
|
206
|
-
prerequisite = row[4].split(
|
201
|
+
if !row[4].nil? && row[4].include?(',')
|
202
|
+
prerequisite = row[4].split(',').map do |validator_id|
|
207
203
|
raise "Unknown validator identifier '#{validator_id}'" if validators[validator_id].nil?
|
208
204
|
next validators[validator_id]
|
209
205
|
end
|
210
206
|
else
|
211
207
|
prerequisite = validators[row[4]]
|
212
208
|
end
|
213
|
-
if validator.nil?
|
214
|
-
raise "Unknown validator identifier '#{row[3]}'"
|
215
|
-
end
|
209
|
+
raise "Unknown validator identifier '#{row[3]}'" if validator.nil?
|
216
210
|
if !row[4].nil? && prerequisite.nil?
|
217
211
|
raise "Unknown validator identifier '#{row[4]}'"
|
218
212
|
end
|
@@ -232,7 +226,7 @@ module Anodator
|
|
232
226
|
description)
|
233
227
|
end
|
234
228
|
|
235
|
-
|
229
|
+
rule_set
|
236
230
|
end
|
237
231
|
end
|
238
232
|
end
|