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
         |