shoulda-matchers 4.1.0 → 4.1.1
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
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: f55ad44dc8280d7bb9598c809562c5d4b4bd174e78bdc8323898bdb7a3e8665a
         | 
| 4 | 
            +
              data.tar.gz: 80ddb4b8e6c0ab63c4b9225a1a75789d058d1e664c1b2248680469868072e724
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: b912596ee8e4a25b1cbd98bca2878ac52cc19b54ab6014bbff0952b7449294e26a6d82b21a6d871b897eb23b26fb82bbc7b328d4de28bb73191fccf53e4e9c1b
         | 
| 7 | 
            +
              data.tar.gz: 168c002e0ed67d1a2dfde0465e2f48c2fcd4177810479f9c4d5970949f4fbec7db7cb5c71c33b7a341174d5c97fbbfb0782b18ada9f30695048bf25c64777875
         | 
    
        data/README.md
    CHANGED
    
    | @@ -19,7 +19,7 @@ complex, and error-prone. | |
| 19 19 |  | 
| 20 20 | 
             
            ## Quick links
         | 
| 21 21 |  | 
| 22 | 
            -
            📖 **[Read the documentation for the latest version (4.1. | 
| 22 | 
            +
            📖 **[Read the documentation for the latest version (4.1.1)][rubydocs].**  
         | 
| 23 23 | 
             
            📢 **[See what's changed in a recent version][news].**
         | 
| 24 24 |  | 
| 25 25 | 
             
            [rubydocs]: http://matchers.shoulda.io/docs
         | 
| @@ -170,7 +170,7 @@ module Shoulda | |
| 170 170 | 
             
                          allows_and_double_checks_value_of!(value)
         | 
| 171 171 | 
             
                        end
         | 
| 172 172 | 
             
                      else
         | 
| 173 | 
            -
                        (expects_to_allow_nil? &&  | 
| 173 | 
            +
                        (expects_to_allow_nil? && disallows_value_of(nil)) ||
         | 
| 174 174 | 
             
                          disallowed_values.any? do |value|
         | 
| 175 175 | 
             
                            allows_original_or_typecast_value?(value)
         | 
| 176 176 | 
             
                          end
         | 
| @@ -234,12 +234,14 @@ validation for you? Instead of using `validate_presence_of`, try | |
| 234 234 | 
             
                    end
         | 
| 235 235 |  | 
| 236 236 | 
             
                    def disallowed_values
         | 
| 237 | 
            -
                      if  | 
| 237 | 
            +
                      if collection_association?
         | 
| 238 238 | 
             
                        [Array.new]
         | 
| 239 | 
            +
                      elsif attachment?
         | 
| 240 | 
            +
                        [nil]
         | 
| 239 241 | 
             
                      else
         | 
| 240 242 | 
             
                        values = []
         | 
| 241 243 |  | 
| 242 | 
            -
                        if  | 
| 244 | 
            +
                        if attribute_accepts_string_values?
         | 
| 243 245 | 
             
                          values << ''
         | 
| 244 246 | 
             
                        end
         | 
| 245 247 |  | 
| @@ -251,16 +253,6 @@ validation for you? Instead of using `validate_presence_of`, try | |
| 251 253 | 
             
                      end
         | 
| 252 254 | 
             
                    end
         | 
| 253 255 |  | 
| 254 | 
            -
                    def collection?
         | 
| 255 | 
            -
                      if association_reflection
         | 
| 256 | 
            -
                        [:has_many, :has_and_belongs_to_many].include?(
         | 
| 257 | 
            -
                          association_reflection.macro,
         | 
| 258 | 
            -
                        )
         | 
| 259 | 
            -
                      else
         | 
| 260 | 
            -
                        false
         | 
| 261 | 
            -
                      end
         | 
| 262 | 
            -
                    end
         | 
| 263 | 
            -
             | 
| 264 256 | 
             
                    def should_add_footnote_about_belongs_to?
         | 
| 265 257 | 
             
                      belongs_to_association_being_validated? &&
         | 
| 266 258 | 
             
                        presence_validation_exists_on_attribute?
         | 
| @@ -316,12 +308,33 @@ validation for you? Instead of using `validate_presence_of`, try | |
| 316 308 | 
             
                    end
         | 
| 317 309 |  | 
| 318 310 | 
             
                    def belongs_to_association_being_validated?
         | 
| 319 | 
            -
                       | 
| 320 | 
            -
             | 
| 311 | 
            +
                      association? && association_reflection.macro == :belongs_to
         | 
| 312 | 
            +
                    end
         | 
| 313 | 
            +
             | 
| 314 | 
            +
                    def attribute_accepts_string_values?
         | 
| 315 | 
            +
                      if association?
         | 
| 316 | 
            +
                        false
         | 
| 317 | 
            +
                      elsif attribute_serializer
         | 
| 318 | 
            +
                        attribute_serializer.object_class == String
         | 
| 319 | 
            +
                      else
         | 
| 320 | 
            +
                        attribute_type.try(:type) == :string
         | 
| 321 | 
            +
                      end
         | 
| 322 | 
            +
                    end
         | 
| 323 | 
            +
             | 
| 324 | 
            +
                    def association?
         | 
| 325 | 
            +
                      association_reflection.present?
         | 
| 321 326 | 
             
                    end
         | 
| 322 327 |  | 
| 323 | 
            -
                    def  | 
| 324 | 
            -
                       | 
| 328 | 
            +
                    def collection_association?
         | 
| 329 | 
            +
                      association? && association_reflection.macro.in?(
         | 
| 330 | 
            +
                        [:has_many, :has_and_belongs_to_many],
         | 
| 331 | 
            +
                      )
         | 
| 332 | 
            +
                    end
         | 
| 333 | 
            +
             | 
| 334 | 
            +
                    def attachment?
         | 
| 335 | 
            +
                      model_has_associations?(
         | 
| 336 | 
            +
                        ["#{@attribute}_attachment", "#{@attribute}_attachments"],
         | 
| 337 | 
            +
                      )
         | 
| 325 338 | 
             
                    end
         | 
| 326 339 |  | 
| 327 340 | 
             
                    def association_name
         | 
| @@ -333,8 +346,25 @@ validation for you? Instead of using `validate_presence_of`, try | |
| 333 346 | 
             
                    end
         | 
| 334 347 |  | 
| 335 348 | 
             
                    def association_reflection
         | 
| 336 | 
            -
                      model. | 
| 337 | 
            -
             | 
| 349 | 
            +
                      model.try(:reflect_on_association, @attribute)
         | 
| 350 | 
            +
                    end
         | 
| 351 | 
            +
             | 
| 352 | 
            +
                    def model_has_associations?(associations)
         | 
| 353 | 
            +
                      associations.any? do |association|
         | 
| 354 | 
            +
                        !!model.try(:reflect_on_association, association)
         | 
| 355 | 
            +
                      end
         | 
| 356 | 
            +
                    end
         | 
| 357 | 
            +
             | 
| 358 | 
            +
                    def attribute_serializer
         | 
| 359 | 
            +
                      if attribute_type.respond_to?(:coder)
         | 
| 360 | 
            +
                        attribute_type.coder
         | 
| 361 | 
            +
                      else
         | 
| 362 | 
            +
                        nil
         | 
| 363 | 
            +
                      end
         | 
| 364 | 
            +
                    end
         | 
| 365 | 
            +
             | 
| 366 | 
            +
                    def attribute_type
         | 
| 367 | 
            +
                      RailsShim.attribute_type_for(model, @attribute)
         | 
| 338 368 | 
             
                    end
         | 
| 339 369 |  | 
| 340 370 | 
             
                    def presence_validation_exists_on_attribute?
         | 
| @@ -2,7 +2,7 @@ module Shoulda | |
| 2 2 | 
             
              module Matchers
         | 
| 3 3 | 
             
                module ActiveRecord
         | 
| 4 4 | 
             
                  # The `define_enum_for` matcher is used to test that the `enum` macro has
         | 
| 5 | 
            -
                  # been used to decorate an attribute with enum  | 
| 5 | 
            +
                  # been used to decorate an attribute with enum capabilities.
         | 
| 6 6 | 
             
                  #
         | 
| 7 7 | 
             
                  #     class Process < ActiveRecord::Base
         | 
| 8 8 | 
             
                  #       enum status: [:running, :stopped, :suspended]
         | 
| @@ -22,8 +22,8 @@ module Shoulda | |
| 22 22 | 
             
                  #
         | 
| 23 23 | 
             
                  # ##### with_values
         | 
| 24 24 | 
             
                  #
         | 
| 25 | 
            -
                  # Use `with_values` to test that the attribute  | 
| 26 | 
            -
                  #  | 
| 25 | 
            +
                  # Use `with_values` to test that the attribute can only receive a certain
         | 
| 26 | 
            +
                  # set of possible values.
         | 
| 27 27 | 
             
                  #
         | 
| 28 28 | 
             
                  #     class Process < ActiveRecord::Base
         | 
| 29 29 | 
             
                  #       enum status: [:running, :stopped, :suspended]
         | 
| @@ -43,10 +43,37 @@ module Shoulda | |
| 43 43 | 
             
                  #         with_values([:running, :stopped, :suspended])
         | 
| 44 44 | 
             
                  #     end
         | 
| 45 45 | 
             
                  #
         | 
| 46 | 
            +
                  # If the values backing your enum attribute are arbitrary instead of a
         | 
| 47 | 
            +
                  # series of integers starting from 0, pass a hash to `with_values` instead
         | 
| 48 | 
            +
                  # of an array:
         | 
| 49 | 
            +
                  #
         | 
| 50 | 
            +
                  #     class Process < ActiveRecord::Base
         | 
| 51 | 
            +
                  #       enum status: {
         | 
| 52 | 
            +
                  #         running: 0,
         | 
| 53 | 
            +
                  #         stopped: 1,
         | 
| 54 | 
            +
                  #         suspended: 3,
         | 
| 55 | 
            +
                  #         other: 99
         | 
| 56 | 
            +
                  #       }
         | 
| 57 | 
            +
                  #     end
         | 
| 58 | 
            +
                  #
         | 
| 59 | 
            +
                  #     # RSpec
         | 
| 60 | 
            +
                  #     RSpec.describe Process, type: :model do
         | 
| 61 | 
            +
                  #       it do
         | 
| 62 | 
            +
                  #         should define_enum_for(:status).
         | 
| 63 | 
            +
                  #           with_values(running: 0, stopped: 1, suspended: 3, other: 99)
         | 
| 64 | 
            +
                  #       end
         | 
| 65 | 
            +
                  #     end
         | 
| 66 | 
            +
                  #
         | 
| 67 | 
            +
                  #     # Minitest (Shoulda)
         | 
| 68 | 
            +
                  #     class ProcessTest < ActiveSupport::TestCase
         | 
| 69 | 
            +
                  #       should define_enum_for(:status).
         | 
| 70 | 
            +
                  #         with_values(running: 0, stopped: 1, suspended: 3, other: 99)
         | 
| 71 | 
            +
                  #     end
         | 
| 72 | 
            +
                  #
         | 
| 46 73 | 
             
                  # ##### backed_by_column_of_type
         | 
| 47 74 | 
             
                  #
         | 
| 48 | 
            -
                  # Use `backed_by_column_of_type`  | 
| 49 | 
            -
                  #  | 
| 75 | 
            +
                  # Use `backed_by_column_of_type` when the column backing your column type
         | 
| 76 | 
            +
                  # is a string instead of an integer:
         | 
| 50 77 | 
             
                  #
         | 
| 51 78 | 
             
                  #     class LoanApplication < ActiveRecord::Base
         | 
| 52 79 | 
             
                  #       enum status: {
         | 
| @@ -156,6 +156,14 @@ module Shoulda | |
| 156 156 | 
             
                      nil
         | 
| 157 157 | 
             
                    end
         | 
| 158 158 |  | 
| 159 | 
            +
                    def attribute_type_for(model, attribute_name)
         | 
| 160 | 
            +
                      if supports_full_attributes_api?(model)
         | 
| 161 | 
            +
                        model.attribute_types[attribute_name.to_s]
         | 
| 162 | 
            +
                      else
         | 
| 163 | 
            +
                        LegacyAttributeType.new(model, attribute_name)
         | 
| 164 | 
            +
                      end
         | 
| 165 | 
            +
                    end
         | 
| 166 | 
            +
             | 
| 159 167 | 
             
                    private
         | 
| 160 168 |  | 
| 161 169 | 
             
                    def simply_generate_validation_message(
         | 
| @@ -179,6 +187,30 @@ module Shoulda | |
| 179 187 | 
             
                        { default: default_translation_keys }.merge(options)
         | 
| 180 188 | 
             
                      I18n.translate(primary_translation_key, translate_options)
         | 
| 181 189 | 
             
                    end
         | 
| 190 | 
            +
             | 
| 191 | 
            +
                    def supports_full_attributes_api?(model)
         | 
| 192 | 
            +
                      defined?(::ActiveModel::Attributes) &&
         | 
| 193 | 
            +
                        model.respond_to?(:attribute_types)
         | 
| 194 | 
            +
                    end
         | 
| 195 | 
            +
             | 
| 196 | 
            +
                    class LegacyAttributeType
         | 
| 197 | 
            +
                      def initialize(model, attribute_name)
         | 
| 198 | 
            +
                        @model = model
         | 
| 199 | 
            +
                        @attribute_name = attribute_name
         | 
| 200 | 
            +
                      end
         | 
| 201 | 
            +
             | 
| 202 | 
            +
                      def coder
         | 
| 203 | 
            +
                        if model.respond_to?(:serialized_attributes)
         | 
| 204 | 
            +
                          ActiveSupport::Deprecation.silence do
         | 
| 205 | 
            +
                            model.serialized_attributes[attribute_name.to_s]
         | 
| 206 | 
            +
                          end
         | 
| 207 | 
            +
                        end
         | 
| 208 | 
            +
                      end
         | 
| 209 | 
            +
             | 
| 210 | 
            +
                      private
         | 
| 211 | 
            +
             | 
| 212 | 
            +
                      attr_reader :model, :attribute_name
         | 
| 213 | 
            +
                    end
         | 
| 182 214 | 
             
                  end
         | 
| 183 215 | 
             
                end
         | 
| 184 216 | 
             
              end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: shoulda-matchers
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 4.1. | 
| 4 | 
            +
              version: 4.1.1
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Tammer Saleh
         | 
| @@ -14,7 +14,7 @@ authors: | |
| 14 14 | 
             
            autorequire: 
         | 
| 15 15 | 
             
            bindir: bin
         | 
| 16 16 | 
             
            cert_chain: []
         | 
| 17 | 
            -
            date: 2019- | 
| 17 | 
            +
            date: 2019-07-15 00:00:00.000000000 Z
         | 
| 18 18 | 
             
            dependencies:
         | 
| 19 19 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 20 20 | 
             
              name: activesupport
         |