valigator-csv 1.3.2 → 1.4.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.
- checksums.yaml +4 -4
- data/lib/valigator/csv.rb +1 -0
- data/lib/valigator/csv/row_validators.rb +7 -0
- data/lib/valigator/csv/row_validators/ragged.rb +50 -0
- data/lib/valigator/csv/validator.rb +31 -11
- data/lib/valigator/csv/version.rb +1 -1
- metadata +4 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 9790896dcecf7ab173199ebe493c2f568e0c0993
         | 
| 4 | 
            +
              data.tar.gz: c19072ad47075f87e2679797fef326aa1de06289
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 35b73a4021a28aa0f87940e5e145fbd4193df80836632285bdb707e4fe28c954d0e3c7c3848425060728fc35ca85ca874baf29d822df561179049020007025e0
         | 
| 7 | 
            +
              data.tar.gz: 763289f77dcabb13230e89563a901d8b8b43c76b3278ecb333becc062a45427d9a3459972509ecfd11227dd74e68cc259206e828380ef2625a62f3a7dda4cbd9
         | 
    
        data/lib/valigator/csv.rb
    CHANGED
    
    | @@ -5,6 +5,7 @@ module Valigator | |
| 5 5 | 
             
                autoload :ErrorsLimitReachedError, 'valigator/csv/error'
         | 
| 6 6 | 
             
                autoload :Validator, 'valigator/csv/validator'
         | 
| 7 7 | 
             
                autoload :FieldValidators, 'valigator/csv/field_validators'
         | 
| 8 | 
            +
                autoload :RowValidators, 'valigator/csv/row_validators'
         | 
| 8 9 | 
             
                autoload :Version, 'valigator/csv/version'
         | 
| 9 10 | 
             
              end
         | 
| 10 11 | 
             
            end
         | 
| @@ -0,0 +1,50 @@ | |
| 1 | 
            +
            module Valigator
         | 
| 2 | 
            +
              module CSV
         | 
| 3 | 
            +
                module RowValidators
         | 
| 4 | 
            +
                  class Ragged
         | 
| 5 | 
            +
                    attr_reader :options
         | 
| 6 | 
            +
             | 
| 7 | 
            +
             | 
| 8 | 
            +
             | 
| 9 | 
            +
                    def initialize(options = {})
         | 
| 10 | 
            +
                      @options = options
         | 
| 11 | 
            +
                    end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
             | 
| 14 | 
            +
             | 
| 15 | 
            +
                    def valid?(row)
         | 
| 16 | 
            +
                      return true unless fields
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                      row.size >= fields.size
         | 
| 19 | 
            +
                    end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
             | 
| 22 | 
            +
             | 
| 23 | 
            +
                    def error_type
         | 
| 24 | 
            +
                      'ragged_row'
         | 
| 25 | 
            +
                    end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
             | 
| 28 | 
            +
             | 
| 29 | 
            +
                    def error_message
         | 
| 30 | 
            +
                      'Ragged or empty row'
         | 
| 31 | 
            +
                    end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
             | 
| 34 | 
            +
             | 
| 35 | 
            +
                    def ==(other)
         | 
| 36 | 
            +
                      self.class == other.class && options == other.options
         | 
| 37 | 
            +
                    end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
             | 
| 40 | 
            +
             | 
| 41 | 
            +
                    private
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                    def fields
         | 
| 44 | 
            +
                      options[:fields]
         | 
| 45 | 
            +
                    end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                  end
         | 
| 48 | 
            +
                end
         | 
| 49 | 
            +
              end
         | 
| 50 | 
            +
            end
         | 
| @@ -18,8 +18,11 @@ module Valigator | |
| 18 18 | 
             
                  def validate(options = {})
         | 
| 19 19 | 
             
                    config.merge! options
         | 
| 20 20 |  | 
| 21 | 
            -
                    ::CSV.foreach( | 
| 21 | 
            +
                    ::CSV.foreach(filename, csv_options(options)) do |row|
         | 
| 22 22 | 
             
                      validate_fields row, options
         | 
| 23 | 
            +
                      validate_row row, options
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                      stop_if_error_limit_reached
         | 
| 23 26 | 
             
                    end
         | 
| 24 27 | 
             
                  rescue ErrorsLimitReachedError
         | 
| 25 28 | 
             
                  rescue ::CSV::MalformedCSVError, ArgumentError => error
         | 
| @@ -57,26 +60,43 @@ module Valigator | |
| 57 60 |  | 
| 58 61 |  | 
| 59 62 |  | 
| 60 | 
            -
                  def validate_fields(row, options={})
         | 
| 63 | 
            +
                  def validate_fields(row, options = {})
         | 
| 61 64 | 
             
                    return unless options[:fields] && options[:field_validators]
         | 
| 62 65 |  | 
| 63 66 | 
             
                    options[:fields].each_with_index do |field, index|
         | 
| 64 | 
            -
                       | 
| 65 | 
            -
             | 
| 66 | 
            -
                      if field_validator and !field_validator.valid?(row[index])
         | 
| 67 | 
            -
                        add_field_error(field, field_validator)
         | 
| 67 | 
            +
                      validator = options[:field_validators][field]
         | 
| 68 68 |  | 
| 69 | 
            -
             | 
| 70 | 
            -
             | 
| 71 | 
            -
                          raise ErrorsLimitReachedError
         | 
| 72 | 
            -
                        end
         | 
| 69 | 
            +
                      if validator && !validator.valid?(row[index])
         | 
| 70 | 
            +
                        add_error_for(validator, field)
         | 
| 73 71 | 
             
                      end
         | 
| 74 72 | 
             
                    end
         | 
| 75 73 | 
             
                  end
         | 
| 76 74 |  | 
| 77 75 |  | 
| 78 76 |  | 
| 79 | 
            -
                  def  | 
| 77 | 
            +
                  def stop_if_error_limit_reached
         | 
| 78 | 
            +
                    if config[:errors_limit] && errors.size >= config[:errors_limit]
         | 
| 79 | 
            +
                      errors << CSV::Error.new({type: 'too_many_errors', message: 'Too many errors were found'})
         | 
| 80 | 
            +
                      raise ErrorsLimitReachedError
         | 
| 81 | 
            +
                    end
         | 
| 82 | 
            +
                  end
         | 
| 83 | 
            +
             | 
| 84 | 
            +
             | 
| 85 | 
            +
             | 
| 86 | 
            +
                  def validate_row(row, options = {})
         | 
| 87 | 
            +
                    return unless options[:fields] && options[:row_validators]
         | 
| 88 | 
            +
             | 
| 89 | 
            +
                    options[:row_validators].each do |validator_class|
         | 
| 90 | 
            +
                      validator = validator_class.new(options)
         | 
| 91 | 
            +
                      next if validator.valid?(row)
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                      add_error_for validator
         | 
| 94 | 
            +
                    end
         | 
| 95 | 
            +
                  end
         | 
| 96 | 
            +
             | 
| 97 | 
            +
             | 
| 98 | 
            +
             | 
| 99 | 
            +
                  def add_error_for(validator, field = nil)
         | 
| 80 100 | 
             
                    errors << CSV::Error.new({
         | 
| 81 101 | 
             
                      type: validator.error_type,
         | 
| 82 102 | 
             
                      message: validator.error_message,
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: valigator-csv
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1. | 
| 4 | 
            +
              version: 1.4.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Daniel Nagy
         | 
| @@ -10,7 +10,7 @@ authors: | |
| 10 10 | 
             
            autorequire: 
         | 
| 11 11 | 
             
            bindir: bin
         | 
| 12 12 | 
             
            cert_chain: []
         | 
| 13 | 
            -
            date: 2015-12- | 
| 13 | 
            +
            date: 2015-12-15 00:00:00.000000000 Z
         | 
| 14 14 | 
             
            dependencies:
         | 
| 15 15 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 16 16 | 
             
              name: bundler
         | 
| @@ -80,6 +80,8 @@ files: | |
| 80 80 | 
             
            - lib/valigator/csv/field_validators/float.rb
         | 
| 81 81 | 
             
            - lib/valigator/csv/field_validators/integer.rb
         | 
| 82 82 | 
             
            - lib/valigator/csv/field_validators/mandatory.rb
         | 
| 83 | 
            +
            - lib/valigator/csv/row_validators.rb
         | 
| 84 | 
            +
            - lib/valigator/csv/row_validators/ragged.rb
         | 
| 83 85 | 
             
            - lib/valigator/csv/validator.rb
         | 
| 84 86 | 
             
            - lib/valigator/csv/version.rb
         | 
| 85 87 | 
             
            - valigator-csv.gemspec
         |