diff options
Diffstat (limited to 'activemodel/lib/active_model')
| -rw-r--r-- | activemodel/lib/active_model/attribute_methods.rb | 10 | ||||
| -rw-r--r-- | activemodel/lib/active_model/callbacks.rb | 3 | ||||
| -rw-r--r-- | activemodel/lib/active_model/conversion.rb | 6 | ||||
| -rw-r--r-- | activemodel/lib/active_model/dirty.rb | 31 | ||||
| -rw-r--r-- | activemodel/lib/active_model/errors.rb | 4 | ||||
| -rw-r--r-- | activemodel/lib/active_model/gem_version.rb | 8 | ||||
| -rw-r--r-- | activemodel/lib/active_model/naming.rb | 2 | ||||
| -rw-r--r-- | activemodel/lib/active_model/secure_password.rb | 2 | ||||
| -rw-r--r-- | activemodel/lib/active_model/serializers/json.rb | 8 | ||||
| -rw-r--r-- | activemodel/lib/active_model/serializers/xml.rb | 2 | ||||
| -rw-r--r-- | activemodel/lib/active_model/validations.rb | 2 | ||||
| -rw-r--r-- | activemodel/lib/active_model/validations/absence.rb | 2 | ||||
| -rw-r--r-- | activemodel/lib/active_model/validations/callbacks.rb | 5 | ||||
| -rw-r--r-- | activemodel/lib/active_model/validations/numericality.rb | 11 | ||||
| -rw-r--r-- | activemodel/lib/active_model/validator.rb | 2 | ||||
| -rw-r--r-- | activemodel/lib/active_model/version.rb | 2 | 
16 files changed, 45 insertions, 55 deletions
| diff --git a/activemodel/lib/active_model/attribute_methods.rb b/activemodel/lib/active_model/attribute_methods.rb index ea07c5c039..96be551264 100644 --- a/activemodel/lib/active_model/attribute_methods.rb +++ b/activemodel/lib/active_model/attribute_methods.rb @@ -353,14 +353,12 @@ module ActiveModel            @attribute_method_matchers_cache ||= ThreadSafe::Cache.new(initial_capacity: 4)          end -        def attribute_method_matcher(method_name) #:nodoc: +        def attribute_method_matchers_matching(method_name) #:nodoc:            attribute_method_matchers_cache.compute_if_absent(method_name) do              # Must try to match prefixes/suffixes first, or else the matcher with no prefix/suffix              # will match every time.              matchers = attribute_method_matchers.partition(&:plain?).reverse.flatten(1) -            match = nil -            matchers.detect { |method| match = method.match(method_name) } -            match +            matchers.map { |method| method.match(method_name) }.compact            end          end @@ -469,8 +467,8 @@ module ActiveModel        # Returns a struct representing the matching attribute method.        # The struct's attributes are prefix, base and suffix.        def match_attribute_method?(method_name) -        match = self.class.send(:attribute_method_matcher, method_name) -        match if match && attribute_method?(match.attr_name) +        matches = self.class.send(:attribute_method_matchers_matching, method_name) +        matches.detect { |match| attribute_method?(match.attr_name) }        end        def missing_attribute(attr_name, stack) diff --git a/activemodel/lib/active_model/callbacks.rb b/activemodel/lib/active_model/callbacks.rb index b3d70dc515..6214802074 100644 --- a/activemodel/lib/active_model/callbacks.rb +++ b/activemodel/lib/active_model/callbacks.rb @@ -6,7 +6,7 @@ module ActiveModel    # Provides an interface for any class to have Active Record like callbacks.    #    # Like the Active Record methods, the callback chain is aborted as soon as -  # one of the methods in the chain returns +false+. +  # one of the methods throws +:abort+.    #    # First, extend ActiveModel::Callbacks from the class you are creating:    # @@ -103,7 +103,6 @@ module ActiveModel      def define_model_callbacks(*callbacks)        options = callbacks.extract_options!        options = { -        terminator: ->(_,result) { result == false },          skip_after_callbacks_if_terminated: true,          scope: [:kind, :name],          only: [:before, :around, :after] diff --git a/activemodel/lib/active_model/conversion.rb b/activemodel/lib/active_model/conversion.rb index 9c9b6f4a77..9de6ea65be 100644 --- a/activemodel/lib/active_model/conversion.rb +++ b/activemodel/lib/active_model/conversion.rb @@ -22,7 +22,7 @@ module ActiveModel    module Conversion      extend ActiveSupport::Concern -    # If your object is already designed to implement all of the Active Model +    # If your object is already designed to implement all of the \Active \Model      # you can use the default <tt>:to_model</tt> implementation, which simply      # returns +self+.      # @@ -33,9 +33,9 @@ module ActiveModel      #   person = Person.new      #   person.to_model == person # => true      # -    # If your model does not act like an Active Model object, then you should +    # If your model does not act like an \Active \Model object, then you should      # define <tt>:to_model</tt> yourself returning a proxy object that wraps -    # your object with Active Model compliant methods. +    # your object with \Active \Model compliant methods.      def to_model        self      end diff --git a/activemodel/lib/active_model/dirty.rb b/activemodel/lib/active_model/dirty.rb index 4e389c8692..afba9bab0d 100644 --- a/activemodel/lib/active_model/dirty.rb +++ b/activemodel/lib/active_model/dirty.rb @@ -1,6 +1,5 @@  require 'active_support/hash_with_indifferent_access'  require 'active_support/core_ext/object/duplicable' -require 'active_support/core_ext/string/filters'  module ActiveModel    # == Active \Model \Dirty @@ -13,7 +12,7 @@ module ActiveModel    # * <tt>include ActiveModel::Dirty</tt> in your object.    # * Call <tt>define_attribute_methods</tt> passing each method you want to    #   track. -  # * Call <tt>attr_name_will_change!</tt> before each change to the tracked +  # * Call <tt>[attr_name]_will_change!</tt> before each change to the tracked    #   attribute.    # * Call <tt>changes_applied</tt> after the changes are persisted.    # * Call <tt>clear_changes_information</tt> when you want to reset the changes @@ -102,7 +101,7 @@ module ActiveModel    #    # If an attribute is modified in-place then make use of    # +[attribute_name]_will_change!+ to mark that the attribute is changing. -  # Otherwise Active Model can't track changes to in-place attributes. Note +  # Otherwise \Active \Model can't track changes to in-place attributes. Note    # that Active Record can detect in-place modifications automatically. You do    # not need to call +[attribute_name]_will_change!+ on Active Record models.    # @@ -116,7 +115,6 @@ module ActiveModel      included do        attribute_method_suffix '_changed?', '_change', '_will_change!', '_was' -      attribute_method_affix prefix: 'reset_', suffix: '!'        attribute_method_affix prefix: 'restore_', suffix: '!'      end @@ -170,7 +168,7 @@ module ActiveModel      # Handle <tt>*_changed?</tt> for +method_missing+.      def attribute_changed?(attr, options = {}) #:nodoc: -      result = changed_attributes.include?(attr) +      result = changes_include?(attr)        result &&= options[:to] == __send__(attr) if options.key?(:to)        result &&= options[:from] == changed_attributes[attr] if options.key?(:from)        result @@ -188,6 +186,10 @@ module ActiveModel      private +      def changes_include?(attr_name) +        attributes_changed_by_setter.include?(attr_name) +      end +        # Removes current changes and makes them accessible through +previous_changes+.        def changes_applied # :doc:          @previously_changed = changes @@ -200,15 +202,6 @@ module ActiveModel          @changed_attributes = ActiveSupport::HashWithIndifferentAccess.new        end -      def reset_changes -        ActiveSupport::Deprecation.warn(<<-MSG.squish) -          `#reset_changes` is deprecated and will be removed on Rails 5. -          Please use `#clear_changes_information` instead. -        MSG - -        clear_changes_information -      end -        # Handle <tt>*_change</tt> for +method_missing+.        def attribute_change(attr)          [changed_attributes[attr], __send__(attr)] if attribute_changed?(attr) @@ -227,16 +220,6 @@ module ActiveModel          set_attribute_was(attr, value)        end -      # Handle <tt>reset_*!</tt> for +method_missing+. -      def reset_attribute!(attr) -        ActiveSupport::Deprecation.warn(<<-MSG.squish) -          `#reset_#{attr}!` is deprecated and will be removed on Rails 5. -          Please use `#restore_#{attr}!` instead. -        MSG - -        restore_attribute!(attr) -      end -        # Handle <tt>restore_*!</tt> for +method_missing+.        def restore_attribute!(attr)          if attribute_changed?(attr) diff --git a/activemodel/lib/active_model/errors.rb b/activemodel/lib/active_model/errors.rb index 9105ef5dd6..55687cb3c7 100644 --- a/activemodel/lib/active_model/errors.rb +++ b/activemodel/lib/active_model/errors.rb @@ -283,9 +283,9 @@ module ActiveModel      # ActiveModel::StrictValidationFailed instead of adding the error.      # <tt>:strict</tt> option can also be set to any other exception.      # -    #   person.errors.add(:name, nil, strict: true) +    #   person.errors.add(:name, :invalid, strict: true)      #   # => ActiveModel::StrictValidationFailed: name is invalid -    #   person.errors.add(:name, nil, strict: NameIsInvalid) +    #   person.errors.add(:name, :invalid, strict: NameIsInvalid)      #   # => NameIsInvalid: name is invalid      #      #   person.errors.messages # => {} diff --git a/activemodel/lib/active_model/gem_version.rb b/activemodel/lib/active_model/gem_version.rb index 932fe3e5a9..762f4fe939 100644 --- a/activemodel/lib/active_model/gem_version.rb +++ b/activemodel/lib/active_model/gem_version.rb @@ -1,14 +1,14 @@  module ActiveModel -  # Returns the version of the currently loaded Active Model as a <tt>Gem::Version</tt> +  # Returns the version of the currently loaded \Active \Model as a <tt>Gem::Version</tt>    def self.gem_version      Gem::Version.new VERSION::STRING    end    module VERSION -    MAJOR = 4 -    MINOR = 2 +    MAJOR = 5 +    MINOR = 0      TINY  = 0 -    PRE   = "beta4" +    PRE   = "alpha"      STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")    end diff --git a/activemodel/lib/active_model/naming.rb b/activemodel/lib/active_model/naming.rb index 4e6b02c246..1819d2403f 100644 --- a/activemodel/lib/active_model/naming.rb +++ b/activemodel/lib/active_model/naming.rb @@ -211,7 +211,7 @@ module ActiveModel    #   BookModule::BookCover.model_name.i18n_key  # => :"book_module/book_cover"    #    # Providing the functionality that ActiveModel::Naming provides in your object -  # is required to pass the Active Model Lint test. So either extending the +  # is required to pass the \Active \Model Lint test. So either extending the    # provided method below, or rolling your own is required.    module Naming      def self.extended(base) #:nodoc: diff --git a/activemodel/lib/active_model/secure_password.rb b/activemodel/lib/active_model/secure_password.rb index 8f2a069ba3..96e88f1b6c 100644 --- a/activemodel/lib/active_model/secure_password.rb +++ b/activemodel/lib/active_model/secure_password.rb @@ -99,7 +99,7 @@ module ActiveModel        #   user.authenticate('notright')      # => false        #   user.authenticate('mUc3m00RsqyRe') # => user        def authenticate(unencrypted_password) -        BCrypt::Password.new(password_digest) == unencrypted_password && self +        BCrypt::Password.new(password_digest).is_password?(unencrypted_password) && self        end        attr_reader :password diff --git a/activemodel/lib/active_model/serializers/json.rb b/activemodel/lib/active_model/serializers/json.rb index 77f2a64b11..b66dbf1afe 100644 --- a/activemodel/lib/active_model/serializers/json.rb +++ b/activemodel/lib/active_model/serializers/json.rb @@ -130,10 +130,10 @@ module ActiveModel        #        #   json = { person: { name: 'bob', age: 22, awesome:true } }.to_json        #   person = Person.new -      #   person.from_json(json) # => #<Person:0x007fec5e7a0088 @age=22, @awesome=true, @name="bob"> -      #   person.name            # => "bob" -      #   person.age             # => 22 -      #   person.awesome         # => true +      #   person.from_json(json, true) # => #<Person:0x007fec5e7a0088 @age=22, @awesome=true, @name="bob"> +      #   person.name                  # => "bob" +      #   person.age                   # => 22 +      #   person.awesome               # => true        def from_json(json, include_root=include_root_in_json)          hash = ActiveSupport::JSON.decode(json)          hash = hash.values.first if include_root diff --git a/activemodel/lib/active_model/serializers/xml.rb b/activemodel/lib/active_model/serializers/xml.rb index 3ad3bf30ad..e33c766627 100644 --- a/activemodel/lib/active_model/serializers/xml.rb +++ b/activemodel/lib/active_model/serializers/xml.rb @@ -6,7 +6,7 @@ require 'active_support/core_ext/time/acts_like'  module ActiveModel    module Serializers -    # == Active Model XML Serializer +    # == \Active \Model XML Serializer      module Xml        extend ActiveSupport::Concern        include ActiveModel::Serialization diff --git a/activemodel/lib/active_model/validations.rb b/activemodel/lib/active_model/validations.rb index c1e344b215..6a2668b8f7 100644 --- a/activemodel/lib/active_model/validations.rb +++ b/activemodel/lib/active_model/validations.rb @@ -87,7 +87,7 @@ module ActiveModel          validates_with BlockValidator, _merge_attributes(attr_names), &block        end -      VALID_OPTIONS_FOR_VALIDATE = [:on, :if, :unless].freeze +      VALID_OPTIONS_FOR_VALIDATE = [:on, :if, :unless, :prepend].freeze        # Adds a validation method or block to the class. This is useful when        # overriding the +validate+ instance method becomes too unwieldy and diff --git a/activemodel/lib/active_model/validations/absence.rb b/activemodel/lib/active_model/validations/absence.rb index 9b5416fb1d..75bf655578 100644 --- a/activemodel/lib/active_model/validations/absence.rb +++ b/activemodel/lib/active_model/validations/absence.rb @@ -1,6 +1,6 @@  module ActiveModel    module Validations -    # == Active Model Absence Validator +    # == \Active \Model Absence Validator      class AbsenceValidator < EachValidator #:nodoc:        def validate_each(record, attr_name, value)          record.errors.add(attr_name, :present, options) if value.present? diff --git a/activemodel/lib/active_model/validations/callbacks.rb b/activemodel/lib/active_model/validations/callbacks.rb index 25ccabd66b..4b58ef66e3 100644 --- a/activemodel/lib/active_model/validations/callbacks.rb +++ b/activemodel/lib/active_model/validations/callbacks.rb @@ -15,15 +15,14 @@ module ActiveModel      #     after_validation  :do_stuff_after_validation      #   end      # -    # Like other <tt>before_*</tt> callbacks if +before_validation+ returns -    # +false+ then <tt>valid?</tt> will not be called. +    # Like other <tt>before_*</tt> callbacks if +before_validation+ throws +    # +:abort+ then <tt>valid?</tt> will not be called.      module Callbacks        extend ActiveSupport::Concern        included do          include ActiveSupport::Callbacks          define_callbacks :validation, -                         terminator: ->(_,result) { result == false },                           skip_after_callbacks_if_terminated: true,                           scope: [:kind, :name]        end diff --git a/activemodel/lib/active_model/validations/numericality.rb b/activemodel/lib/active_model/validations/numericality.rb index 13d6a966c0..4ba4e3e8f7 100644 --- a/activemodel/lib/active_model/validations/numericality.rb +++ b/activemodel/lib/active_model/validations/numericality.rb @@ -23,6 +23,10 @@ module ActiveModel          raw_value = record.send(before_type_cast) if record.respond_to?(before_type_cast)          raw_value ||= value +        if record_attribute_changed_in_place?(record, attr_name) +          raw_value = value +        end +          return if options[:allow_nil] && raw_value.nil?          unless value = parse_raw_value_as_a_number(raw_value) @@ -86,6 +90,13 @@ module ActiveModel            options[:only_integer]          end        end + +      private + +      def record_attribute_changed_in_place?(record, attr_name) +        record.respond_to?(:attribute_changed_in_place?) && +          record.attribute_changed_in_place?(attr_name.to_s) +      end      end      module HelperMethods diff --git a/activemodel/lib/active_model/validator.rb b/activemodel/lib/active_model/validator.rb index 0116de68ab..ac32750946 100644 --- a/activemodel/lib/active_model/validator.rb +++ b/activemodel/lib/active_model/validator.rb @@ -127,7 +127,7 @@ module ActiveModel    # in the options hash invoking the <tt>validate_each</tt> method passing in the    # record, attribute and value.    # -  # All Active Model validations are built on top of this validator. +  # All \Active \Model validations are built on top of this validator.    class EachValidator < Validator #:nodoc:      attr_reader :attributes diff --git a/activemodel/lib/active_model/version.rb b/activemodel/lib/active_model/version.rb index b1f9082ea7..6da3b4117b 100644 --- a/activemodel/lib/active_model/version.rb +++ b/activemodel/lib/active_model/version.rb @@ -1,7 +1,7 @@  require_relative 'gem_version'  module ActiveModel -  # Returns the version of the currently loaded ActiveModel as a <tt>Gem::Version</tt> +  # Returns the version of the currently loaded \Active \Model as a <tt>Gem::Version</tt>    def self.version      gem_version    end | 
