can_has_validations 0.4.3 → 0.5.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 +5 -13
- data/README.md +28 -3
- data/lib/can_has_validations.rb +1 -1
- data/lib/can_has_validations/locale/en.yml +1 -0
- data/lib/can_has_validations/validators/email_validator.rb +1 -1
- data/lib/can_has_validations/validators/grandparent_validator.rb +2 -2
- data/lib/can_has_validations/validators/hostname_validator.rb +73 -0
- data/lib/can_has_validations/validators/ordering_validator.rb +6 -6
- data/lib/can_has_validations/validators/url_validator.rb +6 -2
- data/lib/can_has_validations/validators/write_once_validator.rb +2 -2
- data/lib/can_has_validations/version.rb +1 -1
- metadata +14 -13
    
        checksums.yaml
    CHANGED
    
    | @@ -1,15 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 | 
            -
             | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
             | 
| 5 | 
            -
              data.tar.gz: !binary |-
         | 
| 6 | 
            -
                YzJiYzNiYmMyMjZmOWNlNjNlN2JkOTI2ODRhMWI5YmFlMjJhZTY0Yg==
         | 
| 2 | 
            +
            SHA1:
         | 
| 3 | 
            +
              metadata.gz: 9fedcbc24847be3ea9133d3b6fd4f46f5d702ad1
         | 
| 4 | 
            +
              data.tar.gz: 296690743c12db64dacef74b96ac251289c9b3b1
         | 
| 7 5 | 
             
            SHA512:
         | 
| 8 | 
            -
              metadata.gz:  | 
| 9 | 
            -
             | 
| 10 | 
            -
                ZjRmOWNlYjc4YTkxNjNmYThiZTkyODA4NzA0YTU4ZjhmOTVhYzhkM2Q1MWZh
         | 
| 11 | 
            -
                ZGFhNTdmNThhMjZmMDkwMTcyY2FkYzRiYWM4YTMyOThjNmZjMWM=
         | 
| 12 | 
            -
              data.tar.gz: !binary |-
         | 
| 13 | 
            -
                M2ZlYTc5OWJjODNlMGEzNDZjZjBlMzk0ZGM0NzljYzA2NjZiODg3YTNiMWY2
         | 
| 14 | 
            -
                OGIzOTAzY2Y1M2E5MTEwOWU1M2FmOTNiMjNlOTM4MTU3YzliYjVhMTYyY2U4
         | 
| 15 | 
            -
                ZDliMTUzNzFjNmM3NTRmNjgxYmZlZTY5N2EyMzcxY2JhOTE3NzE=
         | 
| 6 | 
            +
              metadata.gz: 370506abcb60fc6a0ff4f8df9b36782927604c0604e95cdd9b8fcec48368114a4bb0e8b1dbe70a97ee9a154f03ab34752e6a4d05c7f44ef7b54fd9f1fa29118f
         | 
| 7 | 
            +
              data.tar.gz: 1fccf97fd21b2c20c45f5dff224bd98325c0f7e662049489cea0c4b642be1ec858580c2aa575758f59055d33a856b47d5d00ec586fa995b55a56b09878dc0bc4
         | 
    
        data/README.md
    CHANGED
    
    | @@ -8,6 +8,7 @@ Validations provided: | |
| 8 8 | 
             
            * Email
         | 
| 9 9 | 
             
            * Existence
         | 
| 10 10 | 
             
            * Grandparent
         | 
| 11 | 
            +
            * Hostname
         | 
| 11 12 | 
             
            * Ordering
         | 
| 12 13 | 
             
            * URL
         | 
| 13 14 | 
             
            * Write Once
         | 
| @@ -103,6 +104,27 @@ or the database foreign key (`:user_id`). You can also use any other field. The | |
| 103 104 | 
             
            test is merely that they match, not that they are associations.
         | 
| 104 105 |  | 
| 105 106 |  | 
| 107 | 
            +
            ## Hostname validator ##
         | 
| 108 | 
            +
             | 
| 109 | 
            +
            Ensures an attribute is generally formatted as a hostname. It allows for any
         | 
| 110 | 
            +
            TLD, so as to not fail as ICANN continues to add TLDs.
         | 
| 111 | 
            +
             | 
| 112 | 
            +
                validates :domain, hostname: true
         | 
| 113 | 
            +
             | 
| 114 | 
            +
                # allows '*.example.com'
         | 
| 115 | 
            +
                validates :domain, hostname: {allow_wildcard: true}
         | 
| 116 | 
            +
             | 
| 117 | 
            +
                # allows '_abc.example.com'
         | 
| 118 | 
            +
                validates :domain, hostname: {allow_underscore: true}
         | 
| 119 | 
            +
             | 
| 120 | 
            +
                # allows 'a.example.com', but not 'example.com'
         | 
| 121 | 
            +
                validates :domain, hostname: {segments: 3..100}
         | 
| 122 | 
            +
             | 
| 123 | 
            +
                # allows '1.2.3.4' or 'a.example.com'
         | 
| 124 | 
            +
                validates :domain, hostname: {allow_ip: true}
         | 
| 125 | 
            +
                # use 4 or 6 for ipv4 or ipv6 only
         | 
| 126 | 
            +
             | 
| 127 | 
            +
             | 
| 106 128 | 
             
            ## Ordering validators ##
         | 
| 107 129 |  | 
| 108 130 | 
             
            Ensures two attribute values maintain a relative order to one another. This is
         | 
| @@ -125,16 +147,18 @@ Always skips over nil values; use `:presence` to validate those. | |
| 125 147 | 
             
            ## URL validator ##
         | 
| 126 148 |  | 
| 127 149 | 
             
            Ensure an attribute is generally formatted as a URL. If `addressable/uri` is
         | 
| 128 | 
            -
            already loaded, it will be used to parse IDN's.
         | 
| 150 | 
            +
            already loaded, it will be used to parse IDN's. Additionally, allowed schemes
         | 
| 151 | 
            +
            can be specified; they default to ['http','https'].
         | 
| 129 152 |  | 
| 130 153 | 
             
                validates :website, url: true
         | 
| 154 | 
            +
                validates :secure_url, url: {scheme: 'https'}
         | 
| 131 155 |  | 
| 132 156 | 
             
                # With IDN parsing:
         | 
| 133 157 | 
             
                require 'addressable/uri'
         | 
| 134 158 | 
             
                validates :website, url: true
         | 
| 135 159 |  | 
| 136 160 | 
             
                # Or, as part of your Gemfile:
         | 
| 137 | 
            -
                gem 'addressable' | 
| 161 | 
            +
                gem 'addressable'
         | 
| 138 162 | 
             
                gem 'can_has_validations'
         | 
| 139 163 |  | 
| 140 164 |  | 
| @@ -166,6 +190,7 @@ Default messages are as follows: | |
| 166 190 | 
             
                  errors:
         | 
| 167 191 | 
             
                    messages:
         | 
| 168 192 | 
             
                      invalid_email: "is an invalid email"
         | 
| 193 | 
            +
                      invalid_hostname: "is an invalid hostname"
         | 
| 169 194 | 
             
                      invalid_url: "is an invalid URL"
         | 
| 170 195 | 
             
                      unchangeable: "cannot be changed"
         | 
| 171 196 | 
             
                      before: "must be before %{attribute2}"
         | 
| @@ -174,4 +199,4 @@ Default messages are as follows: | |
| 174 199 |  | 
| 175 200 | 
             
            ## Compatibility ##
         | 
| 176 201 |  | 
| 177 | 
            -
            Tested with Ruby 2. | 
| 202 | 
            +
            Tested with Ruby 2.3-2.4 and ActiveSupport and ActiveModel 4.2-5.1.
         | 
    
        data/lib/can_has_validations.rb
    CHANGED
    
    
| @@ -1,8 +1,8 @@ | |
| 1 1 | 
             
            # Ensure two (or more) associations share a common parent
         | 
| 2 2 | 
             
            #   :allow_nil will not only allow the attribute/association to be nil, but
         | 
| 3 3 | 
             
            #     also any of the :scope's.
         | 
| 4 | 
            -
            # eg: validates :user, : | 
| 5 | 
            -
            #     validates :user, : | 
| 4 | 
            +
            # eg: validates :user, grandparent: {scope: :org, parent: :realm}
         | 
| 5 | 
            +
            #     validates :user, grandparent: {scope: [:phone, :address], parent: :account_id}
         | 
| 6 6 |  | 
| 7 7 | 
             
            module ActiveModel::Validations
         | 
| 8 8 | 
             
              class GrandparentValidator < ActiveModel::EachValidator
         | 
| @@ -0,0 +1,73 @@ | |
| 1 | 
            +
            # Ensure an attribute is generally formatted as a hostname/domain.
         | 
| 2 | 
            +
            # What's validated and not:
         | 
| 3 | 
            +
            #   max length of entire hostname is 255
         | 
| 4 | 
            +
            #   max length of each label within the hostname is 63
         | 
| 5 | 
            +
            #   characters allowed: a-z, A-Z, 0-9, hyphen
         | 
| 6 | 
            +
            #   underscore is also allowed with allow_underscore: true
         | 
| 7 | 
            +
            #   the final label must be a-z,A-Z or an IDN
         | 
| 8 | 
            +
            #   labels may not begin with a hyphen
         | 
| 9 | 
            +
            #   labels may not end with a hyphen or underscore
         | 
| 10 | 
            +
            #   labels may be entirely numeric
         | 
| 11 | 
            +
            #     note: this is more common that you think (reverse dns, etc)
         | 
| 12 | 
            +
            # If the addressable gem is present, will automatically turn unicode domains
         | 
| 13 | 
            +
            #   into their punycode (xn--) equivalent. Otherwise, unicode characters will
         | 
| 14 | 
            +
            #   cause the validation to fail.
         | 
| 15 | 
            +
            #   
         | 
| 16 | 
            +
            # eg: validates :domain, hostname: true
         | 
| 17 | 
            +
            #     validates :domain, hostname: {allow_wildcard: true}
         | 
| 18 | 
            +
            #       allows '*.example.com'
         | 
| 19 | 
            +
            #     validates :domain, hostname: {allow_underscore: true}
         | 
| 20 | 
            +
            #       allows '_abc.example.com'
         | 
| 21 | 
            +
            #     validates :domain, hostname: {segments: 3..100}
         | 
| 22 | 
            +
            #       allows 'a.example.com', but not 'example.com'
         | 
| 23 | 
            +
            #     validates :domain, hostname: {allow_ip: true}  # or 4 or 6 for ipv4 or ipv6 only
         | 
| 24 | 
            +
            #       allows '1.2.3.4' or 'a.example.com'
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            require 'resolv'
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            module ActiveModel::Validations
         | 
| 29 | 
            +
              class HostnameValidator < ActiveModel::EachValidator
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                LABEL_REGEXP = /\A([a-zA-Z0-9_]([a-zA-Z0-9_-]+)?)?[a-zA-Z0-9]\z/
         | 
| 32 | 
            +
                FINAL_LABEL_REGEXP = /\A(xn--[a-zA-Z0-9]{2,}|[a-zA-Z]{2,})\z/
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                def validate_each(record, attribute, value)
         | 
| 35 | 
            +
                  case options[:allow_ip]
         | 
| 36 | 
            +
                  when 4, '4'
         | 
| 37 | 
            +
                    return if value =~ Resolv::IPv4::Regex
         | 
| 38 | 
            +
                  when 6, '6'
         | 
| 39 | 
            +
                    return if value =~ Resolv::IPv6::Regex
         | 
| 40 | 
            +
                  when true
         | 
| 41 | 
            +
                    return if value =~ Resolv::IPv4::Regex || value =~ Resolv::IPv6::Regex
         | 
| 42 | 
            +
                  end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                  segments = options[:segments] || (2..100)
         | 
| 45 | 
            +
                  segments = segments..segments if segments.is_a?(Integer)
         | 
| 46 | 
            +
                  if defined?(Addressable::IDNA)
         | 
| 47 | 
            +
                    value &&= Addressable::IDNA.to_ascii(value)
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
                  labels = value.split('.')
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                  is_valid = true
         | 
| 52 | 
            +
                  is_valid &&= value.length <= 255
         | 
| 53 | 
            +
                  is_valid &&= value !~ /\.\./
         | 
| 54 | 
            +
                  is_valid &&= value !~ /_/ unless options[:allow_underscore]
         | 
| 55 | 
            +
                  is_valid &&= labels.size.in? segments
         | 
| 56 | 
            +
                  labels.each_with_index do |label, idx|
         | 
| 57 | 
            +
                    is_valid &&= label.length <= 63
         | 
| 58 | 
            +
                    if idx+1==labels.size
         | 
| 59 | 
            +
                      is_valid &&= label =~ FINAL_LABEL_REGEXP
         | 
| 60 | 
            +
                    elsif options[:allow_wildcard] && idx==0
         | 
| 61 | 
            +
                      is_valid &&= label=='*' || label =~ LABEL_REGEXP
         | 
| 62 | 
            +
                    else
         | 
| 63 | 
            +
                      is_valid &&= label =~ LABEL_REGEXP
         | 
| 64 | 
            +
                    end
         | 
| 65 | 
            +
                  end
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                  unless is_valid
         | 
| 68 | 
            +
                    record.errors.add(attribute, :invalid_hostname, options)
         | 
| 69 | 
            +
                  end
         | 
| 70 | 
            +
                end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
              end
         | 
| 73 | 
            +
            end
         | 
| @@ -1,10 +1,10 @@ | |
| 1 1 | 
             
            # Attribute ordering
         | 
| 2 2 | 
             
            #   Ensures one value is greater or lesser than another (set of) value(s).
         | 
| 3 3 | 
             
            #   Always skips over nil values; use :presence to validate those.
         | 
| 4 | 
            -
            # eg: validates :start_at, : | 
| 5 | 
            -
            #     validates :start_at, : | 
| 6 | 
            -
            #     validates :finish_at, : | 
| 7 | 
            -
            #     validates :finish_at, : | 
| 4 | 
            +
            # eg: validates :start_at, before: :finish_at
         | 
| 5 | 
            +
            #     validates :start_at, before: {value_of: :finish_at, if: ... }
         | 
| 6 | 
            +
            #     validates :finish_at, after: [:start_at, :alt_start_at]
         | 
| 7 | 
            +
            #     validates :finish_at, after: {values_of: [:start_at, :alt_start_at], if: ... }
         | 
| 8 8 |  | 
| 9 9 | 
             
            module ActiveModel::Validations
         | 
| 10 10 | 
             
              class BeforeValidator < ActiveModel::EachValidator
         | 
| @@ -16,7 +16,7 @@ module ActiveModel::Validations | |
| 16 16 | 
             
                    next unless value && greater
         | 
| 17 17 | 
             
                    unless value < greater
         | 
| 18 18 | 
             
                      attr2 = record.class.human_attribute_name attr_name
         | 
| 19 | 
            -
                      record.errors.add(attribute, :before, options.except(:before).merge!(: | 
| 19 | 
            +
                      record.errors.add(attribute, :before, options.except(:before).merge!(attribute2: attr2))
         | 
| 20 20 | 
             
                    end
         | 
| 21 21 | 
             
                  end
         | 
| 22 22 | 
             
                end
         | 
| @@ -30,7 +30,7 @@ module ActiveModel::Validations | |
| 30 30 | 
             
                    next unless value && lesser
         | 
| 31 31 | 
             
                    unless value > lesser
         | 
| 32 32 | 
             
                      attr2 = record.class.human_attribute_name attr_name
         | 
| 33 | 
            -
                      record.errors.add(attribute, :after, options.except(:after).merge!(: | 
| 33 | 
            +
                      record.errors.add(attribute, :after, options.except(:after).merge!(attribute2: attr2))
         | 
| 34 34 | 
             
                    end
         | 
| 35 35 | 
             
                  end
         | 
| 36 36 | 
             
                end
         | 
| @@ -1,17 +1,21 @@ | |
| 1 1 | 
             
            # Ensure an attribute is generally formatted as a URL. If addressable/uri is
         | 
| 2 2 | 
             
            #   already loaded, will use it to parse IDN's.
         | 
| 3 | 
            -
            # eg: validates :website, : | 
| 3 | 
            +
            # eg: validates :website, url: true
         | 
| 4 | 
            +
            #     validates :redis, url: {scheme: 'redis'}
         | 
| 5 | 
            +
            #     validates :database, url: {scheme: %w(postgres mysql)}
         | 
| 4 6 |  | 
| 5 7 | 
             
            module ActiveModel::Validations
         | 
| 6 8 | 
             
              class UrlValidator < ActiveModel::EachValidator
         | 
| 7 9 | 
             
                def validate_each(record, attribute, value)
         | 
| 10 | 
            +
                  allowed_schemes = Array.wrap(options[:scheme] || %w(http https))
         | 
| 11 | 
            +
                  
         | 
| 8 12 | 
             
                  if defined?(Addressable::URI)
         | 
| 9 13 | 
             
                    u = Addressable::URI.parse(value) rescue nil
         | 
| 10 14 | 
             
                    u2 = u && URI.parse(u.normalize.to_s) rescue nil
         | 
| 11 15 | 
             
                  else
         | 
| 12 16 | 
             
                    u2 = u = URI.parse(value) rescue nil
         | 
| 13 17 | 
             
                  end
         | 
| 14 | 
            -
                  if !u || !u2 || u.relative? ||  | 
| 18 | 
            +
                  if !u || !u2 || u.relative? || allowed_schemes.exclude?(u.scheme)
         | 
| 15 19 | 
             
                    record.errors.add(attribute, :invalid_url, options)
         | 
| 16 20 | 
             
                  end
         | 
| 17 21 | 
             
                end
         | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            # write-once, read-many
         | 
| 2 2 | 
             
            #   Allows a value to be set to a non-nil value once, and then makes it immutable.
         | 
| 3 | 
            -
            #   Combine with : | 
| 3 | 
            +
            #   Combine with existence: true to accomplish the same thing as attr_readonly,
         | 
| 4 4 | 
             
            #   except with error messages (instead of silently refusing to save the change).
         | 
| 5 5 | 
             
            # eg: validates :user_id, write_once: true
         | 
| 6 6 | 
             
            #   Optionally refuses changing from nil => non-nil, always making field immutable.
         | 
| @@ -8,7 +8,7 @@ | |
| 8 8 |  | 
| 9 9 | 
             
            module ActiveModel::Validations
         | 
| 10 10 | 
             
              class WriteOnceValidator < ActiveModel::EachValidator
         | 
| 11 | 
            -
                # as of ActiveModel 4, : | 
| 11 | 
            +
                # as of ActiveModel 4, allow_nil: true causes a change from a value back to
         | 
| 12 12 | 
             
                #   nil to be allowed. prevent this.
         | 
| 13 13 | 
             
                def validate(record)
         | 
| 14 14 | 
             
                  attributes.each do |attribute|
         | 
    
        metadata
    CHANGED
    
    | @@ -1,47 +1,47 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: can_has_validations
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.5.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - thomas morgan
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2017-05-13 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: rails
         | 
| 15 15 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 16 16 | 
             
                requirements:
         | 
| 17 | 
            -
                - -  | 
| 17 | 
            +
                - - ">="
         | 
| 18 18 | 
             
                  - !ruby/object:Gem::Version
         | 
| 19 19 | 
             
                    version: '3.0'
         | 
| 20 | 
            -
                - - <
         | 
| 20 | 
            +
                - - "<"
         | 
| 21 21 | 
             
                  - !ruby/object:Gem::Version
         | 
| 22 | 
            -
                    version: ' | 
| 22 | 
            +
                    version: '6'
         | 
| 23 23 | 
             
              type: :runtime
         | 
| 24 24 | 
             
              prerelease: false
         | 
| 25 25 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 26 26 | 
             
                requirements:
         | 
| 27 | 
            -
                - -  | 
| 27 | 
            +
                - - ">="
         | 
| 28 28 | 
             
                  - !ruby/object:Gem::Version
         | 
| 29 29 | 
             
                    version: '3.0'
         | 
| 30 | 
            -
                - - <
         | 
| 30 | 
            +
                - - "<"
         | 
| 31 31 | 
             
                  - !ruby/object:Gem::Version
         | 
| 32 | 
            -
                    version: ' | 
| 32 | 
            +
                    version: '6'
         | 
| 33 33 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 34 34 | 
             
              name: sqlite3
         | 
| 35 35 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 36 36 | 
             
                requirements:
         | 
| 37 | 
            -
                - -  | 
| 37 | 
            +
                - - ">="
         | 
| 38 38 | 
             
                  - !ruby/object:Gem::Version
         | 
| 39 39 | 
             
                    version: '0'
         | 
| 40 40 | 
             
              type: :development
         | 
| 41 41 | 
             
              prerelease: false
         | 
| 42 42 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 43 43 | 
             
                requirements:
         | 
| 44 | 
            -
                - -  | 
| 44 | 
            +
                - - ">="
         | 
| 45 45 | 
             
                  - !ruby/object:Gem::Version
         | 
| 46 46 | 
             
                    version: '0'
         | 
| 47 47 | 
             
            description: Assorted Rails 4.x-5.x validators.
         | 
| @@ -59,6 +59,7 @@ files: | |
| 59 59 | 
             
            - lib/can_has_validations/validators/email_validator.rb
         | 
| 60 60 | 
             
            - lib/can_has_validations/validators/existence_validator.rb
         | 
| 61 61 | 
             
            - lib/can_has_validations/validators/grandparent_validator.rb
         | 
| 62 | 
            +
            - lib/can_has_validations/validators/hostname_validator.rb
         | 
| 62 63 | 
             
            - lib/can_has_validations/validators/ordering_validator.rb
         | 
| 63 64 | 
             
            - lib/can_has_validations/validators/url_validator.rb
         | 
| 64 65 | 
             
            - lib/can_has_validations/validators/write_once_validator.rb
         | 
| @@ -103,17 +104,17 @@ require_paths: | |
| 103 104 | 
             
            - lib
         | 
| 104 105 | 
             
            required_ruby_version: !ruby/object:Gem::Requirement
         | 
| 105 106 | 
             
              requirements:
         | 
| 106 | 
            -
              - -  | 
| 107 | 
            +
              - - ">="
         | 
| 107 108 | 
             
                - !ruby/object:Gem::Version
         | 
| 108 109 | 
             
                  version: '0'
         | 
| 109 110 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 110 111 | 
             
              requirements:
         | 
| 111 | 
            -
              - -  | 
| 112 | 
            +
              - - ">="
         | 
| 112 113 | 
             
                - !ruby/object:Gem::Version
         | 
| 113 114 | 
             
                  version: '0'
         | 
| 114 115 | 
             
            requirements: []
         | 
| 115 116 | 
             
            rubyforge_project: 
         | 
| 116 | 
            -
            rubygems_version: 2. | 
| 117 | 
            +
            rubygems_version: 2.6.12
         | 
| 117 118 | 
             
            signing_key: 
         | 
| 118 119 | 
             
            specification_version: 4
         | 
| 119 120 | 
             
            summary: Assorted Rails 4.x-5.x validators
         |