1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00
rails--rails/activesupport/CHANGELOG.md

10 KiB

  • The decorated load and require methods are now kept private.

    Fixes #17553.

    Xavier Noria

  • String#remove and String#remove! accept multiple arguments.

    Pavel Pravosud

  • TimeWithZone#strftime now delegates every directive to Time#strftime except for '%Z', it also now correctly handles escaped '%' characters placed just before time zone related directives.

    Pablo Herrero

  • Corrected Inflector#underscore handling of multiple successive acroynms.

    James Le Cuirot

  • Delegation now works with ruby reserved words passed to :to option.

    Fixes #16956.

    Agis Anastasopoulos

  • Added method #eql? to ActiveSupport::Duration, in addition to #==.

    Currently, the following returns false, contrary to expectation:

    1.minute.eql?(1.minute)
    

    Adding method #eql? will make this behave like expected. Method #eql? is just a bit stricter than #==, as it checks whether the argument is also a duration. Their parts may be different though.

    1.minute.eql?(60.seconds)  # => true
    1.minute.eql?(60)          # => false
    

    Joost Lubach

  • Time#change can now change nanoseconds (:nsec) as a higher-precision alternative to microseconds (:usec).

    Agis Anastasooulos

  • MessageVerifier.new raises an appropriate exception if the secret is nil. This prevents MessageVerifier#generate from raising a cryptic error later on.

    Kostiantyn Kahanskyi

  • Introduced new configuration option active_support.test_order for specifying the order in which test cases are executed. This option currently defaults to :sorted but will be changed to :random in Rails 5.0.

    Akira Matsuda, Godfrey Chan

  • Fixed a bug in Inflector#underscore where acroynms in nested constant names are incorrectly parsed as camelCase.

    Fixes #8015.

    Fred Wu, Matthew Draper

  • Make Time#change throw an exception if the :usec option is out of range and the time has an offset other than UTC or local.

    Agis Anastasopoulos

  • Method objects now report themselves as not duplicable?. This allows hashes and arrays containing Method objects to be deep_duped.

    Peter Jaros

  • determine_constant_from_test_name does no longer shadow NameErrors which happens during constant autoloading.

    Fixes #9933.

    Guo Xiang Tan

  • Added instance_eval version to Object#try and Object#try!, so you can do this:

    person.try { name.first }
    

    instead of:

    person.try { |person| person.name.first }
    

    DHH, Ari Pollak

  • Fix the ActiveSupport::Duration#instance_of? method to return the right value with the class itself since it was previously delegated to the internal value.

    Robin Dupret

  • Fix rounding errors with #travel_to by resetting the usec on any passed time to zero, so we only travel with per-second precision, not anything deeper than that.

    DHH

  • Fix DateTime comparison with DateTime::Infinity object.

    Rafael Mendonça França

  • Added Object#itself which returns the object itself. Useful when dealing with a chaining scenario, like Active Record scopes:

    Event.public_send(state.presence_in([ :trashed, :drafted ]) || :itself).order(:created_at)
    

    DHH

  • Object#with_options executes block in merging option context when explicit receiver in not passed.

    Pavel Pravosud

  • Fixed a compatibility issue with the Oj gem when cherry-picking the file active_support/core_ext/object/json without requiring active_support/json.

    Fixes #16131.

    Godfrey Chan

  • Make Hash#with_indifferent_access copy the default proc too.

    arthurnn, Xanders

  • Add String#truncate_words to truncate a string by a number of words.

    Mohamed Osama

  • Deprecate capture and quietly.

    These methods are not thread safe and may cause issues when used in threaded environments. To avoid problems we are deprecating them.

    Tom Meier

  • DateTime#to_f now preserves the fractional seconds instead of always rounding to .0.

    Fixes #15994.

    John Paul Ashenfelter

  • Add Hash#transform_values to simplify a common pattern where the values of a hash must change, but the keys are left the same.

    Sean Griffin

  • Always instrument ActiveSupport::Cache.

    Since ActiveSupport::Notifications only instruments items when there are attached subscribers, we don't need to disable instrumentation.

    Peter Wagenet

  • Make the apply_inflections method case-insensitive when checking whether a word is uncountable or not.

    Robin Dupret

  • Make Dependencies pass a name to NameError error.

    arthurnn

  • Fixed ActiveSupport::Cache::FileStore exploding with long paths.

    Adam Panzer, Michael Grosser

  • Fixed ActiveSupport::TimeWithZone#- so precision is not unnecessarily lost when working with objects with a nanosecond component.

    ActiveSupport::TimeWithZone#- should return the same result as if we were using Time#-:

    Time.now.end_of_day - Time.now.beginning_of_day # => 86399.999999999
    

    Before:

    Time.zone.now.end_of_day.nsec # => 999999999
    Time.zone.now.end_of_day - Time.zone.now.beginning_of_day # => 86400.0
    

    After:

    Time.zone.now.end_of_day - Time.zone.now.beginning_of_day
    # => 86399.999999999
    

    Gordon Chan

  • Fixed precision error in NumberHelper when using Rationals.

    Before:

    ActiveSupport::NumberHelper.number_to_rounded Rational(1000, 3), precision: 2
    # => "330.00"
    

    After:

    ActiveSupport::NumberHelper.number_to_rounded Rational(1000, 3), precision: 2
    # => "333.33"
    

    See #15379.

    Juanjo Bazán

  • Removed deprecated Numeric#ago and friends

    Replacements:

    5.ago   => 5.seconds.ago
    5.until => 5.seconds.until
    5.since => 5.seconds.since
    5.from_now => 5.seconds.from_now
    

    See #12389 for the history and rationale behind this.

    Godfrey Chan

  • DateTime advance now supports partial days.

    Before:

    DateTime.now.advance(days: 1, hours: 12)
    

    After:

    DateTime.now.advance(days: 1.5)
    

    Fixes #12005.

    Shay Davidson

  • Hash#deep_transform_keys and Hash#deep_transform_keys! now transform hashes in nested arrays. This change also applies to Hash#deep_stringify_keys, Hash#deep_stringify_keys!, Hash#deep_symbolize_keys and Hash#deep_symbolize_keys!.

    OZAWA Sakuro

  • Fixed confusing DelegationError in Module#delegate.

    See #15186.

    Vladimir Yarotsky

  • Fixed ActiveSupport::Subscriber so that no duplicate subscriber is created when a subscriber method is redefined.

    Dennis Schön

  • Remove deprecated string based terminators for ActiveSupport::Callbacks.

    Eileen M. Uchitelle

  • Fixed an issue when using ActiveSupport::NumberHelper::NumberToDelimitedConverter to convert a value that is an ActiveSupport::SafeBuffer introduced in 2da9d67.

    See #15064.

    Mark J. Titorenko

  • TimeZone#parse defaults the day of the month to '1' if any other date components are specified. This is more consistent with the behavior of Time#parse.

    Ulysse Carion

  • humanize strips leading underscores, if any.

    Before:

    '_id'.humanize # => ""
    

    After:

    '_id'.humanize # => "Id"
    

    Xavier Noria

  • Fixed backward compatibility issues introduced in 326e652.

    Empty Hash or Array should not be present in serialization result.

    {a: []}.to_query # => ""
    {a: {}}.to_query # => ""
    

    For more info see #14948.

    Bogdan Gusiev

  • Add Digest::UUID::uuid_v3 and Digest::UUID::uuid_v5 to support stable UUID fixtures on PostgreSQL.

    Roderick van Domburg

  • Fixed ActiveSupport::Duration#eql? so that 1.second.eql?(1.second) is true.

    This fixes the current situation of:

    1.second.eql?(1.second) # => false
    

    eql? also requires that the other object is an ActiveSupport::Duration. This requirement makes ActiveSupport::Duration's behavior consistent with the behavior of Ruby's numeric types:

    1.eql?(1.0) # => false
    1.0.eql?(1) # => false
    
    1.second.eql?(1) # => false (was true)
    1.eql?(1.second) # => false
    
    { 1 => "foo", 1.0 => "bar" }
    # => { 1 => "foo", 1.0 => "bar" }
    
    { 1 => "foo", 1.second => "bar" }
    # now => { 1 => "foo", 1.second => "bar" }
    # was => { 1 => "bar" }
    

    And though the behavior of these hasn't changed, for reference:

    1 == 1.0 # => true
    1.0 == 1 # => true
    
    1 == 1.second # => true
    1.second == 1 # => true
    

    Emily Dobervich

  • ActiveSupport::SafeBuffer#prepend acts like String#prepend and modifies instance in-place, returning self. ActiveSupport::SafeBuffer#prepend! is deprecated.

    Pavel Pravosud

  • HashWithIndifferentAccess better respects #to_hash on objects it receives. In particular, .new, #update, #merge, and #replace accept objects which respond to #to_hash, even if those objects are not hashes directly.

    Peter Jaros

  • Deprecate Class#superclass_delegating_accessor, use Class#class_attribute instead.

    Akshay Vishnoi

  • Ensure classes which include Enumerable get #to_json in addition to #as_json.

    Sammy Larbi

  • Change the signature of fetch_multi to return a hash rather than an array. This makes it consistent with the output of read_multi.

    Parker Selbert

  • Introduce Concern#class_methods as a sleek alternative to clunky module ClassMethods. Add Kernel#concern to define at the toplevel without chunky module Foo; extend ActiveSupport::Concern boilerplate.

    # app/models/concerns/authentication.rb
    concern :Authentication do
      included do
        after_create :generate_private_key
      end
    
      class_methods do
        def authenticate(credentials)
          # ...
        end
      end
    
      def generate_private_key
        # ...
      end
    end
    
    # app/models/user.rb
    class User < ActiveRecord::Base
      include Authentication
    end
    

    Jeremy Kemper

Please check 4-1-stable for previous changes.