CHANGELOG.md in activesupport-4.2.11.3 vs CHANGELOG.md in activesupport-5.0.0.beta1
- old
+ new
@@ -1,688 +1,512 @@
-## Rails 4.2.11.3 (May 15, 2020) ##
+## Rails 5.0.0.beta1 (December 18, 2015) ##
* No changes.
-## Rails 4.2.11.2 (May 15, 2020) ##
+* Add thread_m/cattr_accessor/reader/writer suite of methods for declaring class and module variables that live per-thread.
+ This makes it easy to declare per-thread globals that are encapsulated. Note: This is a sharp edge. A wild proliferation
+ of globals is A Bad Thing. But like other sharp tools, when it's right, it's right.
-* No changes.
+ Here's an example of a simple event tracking system where the object being tracked needs not pass a creator that it
+ doesn't need itself along:
+ module Current
+ thread_mattr_accessor :account
+ thread_mattr_accessor :user
+
+ def self.reset() self.account = self.user = nil end
+ end
-## Rails 4.2.11.1 (March 11, 2019) ##
+ class ApplicationController < ActiveController::Base
+ before_action :set_current
+ after_action { Current.reset }
+
+ private
+ def set_current
+ Current.account = Account.find(params[:account_id])
+ Current.user = Current.account.users.find(params[:user_id])
+ end
+ end
-* No changes.
+ class MessagesController < ApplicationController
+ def create
+ @message = Message.create!(message_params)
+ end
+ end
+ class Message < ApplicationRecord
+ has_many :events
+ after_create :track_created
+
+ private
+ def track_created
+ events.create! origin: self, action: :create
+ end
+ end
-## Rails 4.2.11 (November 27, 2018) ##
+ class Event < ApplicationRecord
+ belongs_to :creator, class_name: 'User'
+ before_validation { self.creator ||= Current.user }
+ end
-* No changes.
+ *DHH*
-## Rails 4.2.10 (September 27, 2017) ##
+* Deprecated `Module#qualified_const_` in favour of the builtin Module#const_
+ methods.
-* No changes.
+ *Genadi Samokovarov*
+* Deprecate passing string to define callback.
-## Rails 4.2.9 (June 26, 2017) ##
+ *Yuichiro Kaneko*
-* Fixed bug in `DateAndTime::Compatibility#to_time` that caused it to
- raise `RuntimeError: can't modify frozen Time` when called on any frozen `Time`.
- Properly pass through the frozen `Time` or `ActiveSupport::TimeWithZone` object
- when calling `#to_time`.
+* `ActiveSupport::Cache::Store#namespaced_key`,
+ `ActiveSupport::Cache::MemCachedStore#escape_key`, and
+ `ActiveSupport::Cache::FileStore#key_file_path`
+ are deprecated and replaced with `normalize_key` that now calls `super`.
- *Kevin McPhillips* & *Andrew White*
+ `ActiveSupport::Cache::LocaleCache#set_cache_value` is deprecated and replaced with `write_cache_value`.
-* Restore the return type of `DateTime#utc`
+ *Michael Grosser*
- In Rails 5.0 the return type of `DateTime#utc` was changed to `Time` to be
- consistent with the new `DateTime#localtime` method. When these changes were
- backported in #27553 this inadvertently changed the return type in a patcn
- release. Since `DateTime#localtime` was new in Rails 4.2.8 it's okay to
- restore the return type of `DateTime#utc` but keep `DateTime#localtime` as
- returning `Time` without breaking backwards compatibility.
+* Implements an evented file watcher to asynchronously detect changes in the
+ application source code, routes, locales, etc.
- *Andrew White*
+ This watcher is disabled by default, applications my enable it in the configuration:
-* In Core Extensions, make `MarshalWithAutoloading#load` pass through the second, optional
- argument for `Marshal#load( source [, proc] )`. This way we don't have to do
- `Marshal.method(:load).super_method.call(sourse, proc)` just to be able to pass a proc.
+ # config/environments/development.rb
+ config.file_watcher = ActiveSupport::EventedFileUpdateChecker
- *Jeff Latz*
+ This feature depends on the [listen](https://github.com/guard/listen) gem:
-* Cache `ActiveSupport::TimeWithZone#to_datetime` before freezing.
+ group :development do
+ gem 'listen', '~> 3.0.5'
+ end
- *Adam Rice*
+ *Puneet Agarwal* and *Xavier Noria*
-* `AS::Testing::TimeHelpers#travel_to` now changes `DateTime.now` as well as
- `Time.now` and `Date.today`.
+* Added `Time.days_in_year` to return the number of days in the given year, or the
+ current year if no argument is provided.
- *Yuki Nishijima*
+ *Jon Pascoe*
+* Updated `parameterize` to preserve the case of a string, optionally.
-## Rails 4.2.8 (February 21, 2017) ##
+ Example:
-* Make `getlocal` and `getutc` always return instances of `Time` for
- `ActiveSupport::TimeWithZone` and `DateTime`. This eliminates a possible
- stack level too deep error in `to_time` where `ActiveSupport::TimeWithZone`
- was wrapping a `DateTime` instance. As a consequence of this the internal
- time value in `ActiveSupport::TimeWithZone` is now always an instance of
- `Time` in the UTC timezone, whether that's as the UTC time directly or
- a representation of the local time in the timezone. There should be no
- consequences of this internal change and if there are it's a bug due to
- leaky abstractions.
+ parameterize("Donald E. Knuth", separator: '_') # => "donald_e_knuth"
+ parameterize("Donald E. Knuth", preserve_case: true) # => "Donald-E-Knuth"
- *Andrew White*
+ *Swaathi Kakarla*
-* Add `DateTime#subsec` to return the fraction of a second as a `Rational`.
+* `HashWithIndifferentAccess.new` respects the default value or proc on objects
+ that respond to `#to_hash`. `.new_from_hash_copying_default` simply invokes `.new`.
+ All calls to `.new_from_hash_copying_default` are replaced with `.new`.
- *Andrew White*
+ *Gordon Chan*
-* Add additional aliases for `DateTime#utc` to mirror the ones on
- `ActiveSupport::TimeWithZone` and `Time`.
+* Change Integer#year to return a Fixnum instead of a Float to improve
+ consistency.
- *Andrew White*
+ Integer#years returned a Float while the rest of the accompanying methods
+ (days, weeks, months, etc.) return a Fixnum.
-* Add `DateTime#localtime` to return an instance of `Time` in the system's
- local timezone. Also aliased to `getlocal`.
+ Before:
- *Andrew White*, *Yuichiro Kaneko*
+ 1.year # => 31557600.0
-* Add `Time#sec_fraction` to return the fraction of a second as a `Rational`.
+ After:
- *Andrew White*
+ 1.year # => 31557600
-* Add `ActiveSupport.to_time_preserves_timezone` config option to control
- how `to_time` handles timezones. In Ruby 2.4+ the behavior will change
- from converting to the local system timezone, to preserving the timezone
- of the receiver. This config option defaults to false so that apps made
- with earlier versions of Rails are not affected when upgrading, e.g:
+ *Konstantinos Rousis*
- >> ENV['TZ'] = 'US/Eastern'
+* Handle invalid UTF-8 strings when HTML escaping
- >> "2016-04-23T10:23:12.000Z".to_time
- => "2016-04-23T06:23:12.000-04:00"
+ Use `ActiveSupport::Multibyte::Unicode.tidy_bytes` to handle invalid UTF-8
+ strings in `ERB::Util.unwrapped_html_escape` and `ERB::Util.html_escape_once`.
+ Prevents user-entered input passed from a querystring into a form field from
+ causing invalid byte sequence errors.
- >> ActiveSupport.to_time_preserves_timezone = true
+ *Grey Baker*
- >> "2016-04-23T10:23:12.000Z".to_time
- => "2016-04-23T10:23:12.000Z"
+* Update `ActiveSupport::Multibyte::Chars#slice!` to return `nil` if the
+ arguments are out of bounds, to mirror the behavior of `String#slice!`
- Fixes #24617.
+ *Gourav Tiwari*
- *Andrew White*
+* Fix `number_to_human` so that 999999999 rounds to "1 Billion" instead of
+ "1000 Million".
-* Add `init_with` to `ActiveSupport::TimeWithZone` and `ActiveSupport::TimeZone`
+ *Max Jacobson*
- It is helpful to be able to run apps concurrently written in successive
- versions of Rails to aid migration, e.g. run Rails 4.2 and 5.0 variants
- of your application at the same time to carry out A/B testing.
+* Fix `ActiveSupport::Deprecation#deprecate_methods` to report using the
+ current deprecator instance, where applicable.
- To do this serialization formats need to be cross compatible and the
- change in 3aa26cf didn't meet this criteria because the Psych loader
- checks for the existence of `init_with` before setting the instance
- variables and the wrapping behavior of `ActiveSupport::TimeWithZone`
- tries to see if the `Time` instance responds to `init_with` before the
- `@time` variable is set.
+ *Brandon Dunne*
- To fix this we backported just the `init_with` behavior from the change
- in 3aa26cf. If the revived instance is then written out to YAML again
- it will revert to the default Rails 4.2 behavior of converting it to
- a UTC timestamp string.
+* `Cache#fetch` instrumentation marks whether it was a `:hit`.
- Fixes #26296.
+ *Robin Clowers*
- *Andrew White*
+* `assert_difference` and `assert_no_difference` now returns the result of the
+ yielded block.
-* Fix `ActiveSupport::TimeWithZone#in` across DST boundaries.
+ Example:
- Previously calls to `in` were being sent to the non-DST aware
- method `Time#since` via `method_missing`. It is now aliased to
- the DST aware `ActiveSupport::TimeWithZone#since` which handles
- transitions across DST boundaries, e.g:
+ post = assert_difference -> { Post.count }, 1 do
+ Post.create
+ end
- Time.zone = "US/Eastern"
+ *Lucas Mazza*
- t = Time.zone.local(2016,11,6,1)
- # => Sun, 06 Nov 2016 01:00:00 EDT -05:00
+* Short-circuit `blank?` on date and time values since they are never blank.
- t.in(1.hour)
- # => Sun, 06 Nov 2016 01:00:00 EST -05:00
+ Fixes #21657
- Fixes #26580.
+ *Andrew White*
- *Thomas Balthazar*
+* Replaced deprecated `ThreadSafe::Cache` with its successor `Concurrent::Map` now that
+ the thread_safe gem has been merged into concurrent-ruby.
+ *Jerry D'Antonio*
-## Rails 4.2.7 (July 12, 2016) ##
+* Updated Unicode version to 8.0.0
-* Fixed `ActiveSupport::Logger.broadcast` so that calls to `#silence` now
- properly delegate to all loggers. Silencing now properly suppresses logging
- to both the log and the console.
+ *Anshul Sharma*
- *Kevin McPhillips*
+* `number_to_currency` and `number_with_delimiter` now accept custom `delimiter_pattern` option
+ to handle placement of delimiter, to support currency formats like INR
-* Backported `ActiveSupport::LoggerThreadSafeLevel`. Assigning the
- `Rails.logger.level` is now thread safe.
+ Example:
- *Kevin McPhillips*
+ number_to_currency(1230000, delimiter_pattern: /(\d+?)(?=(\d\d)+(\d)(?!\d))/, unit: '₹', format: "%u %n")
+ # => '₹ 12,30,000.00'
-* Fixed a problem with ActiveSupport::SafeBuffer.titleize calling capitalize
- on nil.
+ *Vipul A M*
- *Brian McManus*
+* Deprecate `:prefix` option of `number_to_human_size` with no replacement.
-* Time zones: Ensure that the UTC offset reflects DST changes that occurred
- since the app started. Removes UTC offset caching, reducing performance,
- but this is still relatively quick and isn't in any hot paths.
+ *Jean Boussier*
- *Alexey Shein*
-
-* Prevent `Marshal.load` from looping infinitely when trying to autoload a constant
- which resolves to a different name.
-
- *Olek Janiszewski*
-
-
-## Rails 4.2.6 (March 07, 2016) ##
-
-* No changes.
-
-
-## Rails 4.2.5.2 (February 26, 2016) ##
-
-* No changes.
-
-
-## Rails 4.2.5.1 (January 25, 2015) ##
-
-* No changes.
-
-
-## Rails 4.2.5 (November 12, 2015) ##
-
* Fix `TimeWithZone#eql?` to properly handle `TimeWithZone` created from `DateTime`:
twz = DateTime.now.in_time_zone
twz.eql?(twz.dup) => true
Fixes #14178.
*Roque Pinel*
-* Handle invalid UTF-8 characters in `MessageVerifier.verify`.
+* ActiveSupport::HashWithIndifferentAccess `select` and `reject` will now return
+ enumerator if called without block.
- *Roque Pinel*, *Grey Baker*
+ Fixes #20095
+ *Bernard Potocki*
-## Rails 4.2.4 (August 24, 2015) ##
+* Removed `ActiveSupport::Concurrency::Latch`, superseded by `Concurrent::CountDownLatch`
+ from the concurrent-ruby gem.
-* Fix a `SystemStackError` when encoding an `Enumerable` with `json` gem and
- with the Active Support JSON encoder loaded.
+ *Jerry D'Antonio*
- Fixes #20775.
-
- *Sammy Larbi*, *Prathamesh Sonpatki*
-
-* Fix not calling `#default` on `HashWithIndifferentAcess#to_hash` when only
+* Fix not calling `#default` on `HashWithIndifferentAccess#to_hash` when only
`default_proc` is set, which could raise.
*Simon Eskildsen*
* Fix setting `default_proc` on `HashWithIndifferentAccess#dup`
*Simon Eskildsen*
-
-## Rails 4.2.3 (June 25, 2015) ##
-
* Fix a range of values for parameters of the Time#change
*Nikolay Kondratyev*
-* Add some missing `require 'active_support/deprecation'`
+* Add `Enumerable#pluck` to get the same values from arrays as from ActiveRecord
+ associations.
- *Akira Matsuda*
+ Fixes #20339.
+ *Kevin Deisz*
-## Rails 4.2.2 (June 16, 2015) ##
+* Add a bang version to `ActiveSupport::OrderedOptions` get methods which will raise
+ an `KeyError` if the value is `.blank?`
-* Fix XSS vulnerability in `ActiveSupport::JSON.encode` method.
-
- CVE-2015-3226.
-
- *Rafael Mendonça França*
-
-* Fix denial of service vulnerability in the XML processing.
-
- CVE-2015-3227.
-
- *Aaron Patterson*
-
-
-## Rails 4.2.1 (March 19, 2015) ##
-
-* Fixed a problem where String#truncate_words would get stuck with a complex
- string.
-
- *Henrik Nygren*
-
-* Fixed a roundtrip problem with AS::SafeBuffer where primitive-like strings
- will be dumped as primitives:
-
Before:
- YAML.load ActiveSupport::SafeBuffer.new("Hello").to_yaml # => "Hello"
- YAML.load ActiveSupport::SafeBuffer.new("true").to_yaml # => true
- YAML.load ActiveSupport::SafeBuffer.new("false").to_yaml # => false
- YAML.load ActiveSupport::SafeBuffer.new("1").to_yaml # => 1
- YAML.load ActiveSupport::SafeBuffer.new("1.1").to_yaml # => 1.1
+ if (slack_url = Rails.application.secrets.slack_url).present?
+ # Do something worthwhile
+ else
+ # Raise as important secret password is not specified
+ end
- After:
+ After:
- YAML.load ActiveSupport::SafeBuffer.new("Hello").to_yaml # => "Hello"
- YAML.load ActiveSupport::SafeBuffer.new("true").to_yaml # => "true"
- YAML.load ActiveSupport::SafeBuffer.new("false").to_yaml # => "false"
- YAML.load ActiveSupport::SafeBuffer.new("1").to_yaml # => "1"
- YAML.load ActiveSupport::SafeBuffer.new("1.1").to_yaml # => "1.1"
+ slack_url = Rails.application.secrets.slack_url!
- *Godfrey Chan*
+ *Aditya Sanghi*, *Gaurish Sharma*
-* Replace fixed `:en` with `I18n.default_locale` in `Duration#inspect`.
+* Remove deprecated `Class#superclass_delegating_accessor`.
+ Use `Class#class_attribute` instead.
- *Dominik Masur*
+ *Akshay Vishnoi*
-* Add missing time zone definitions for Russian Federation and sync them
- with `zone.tab` file from tzdata version 2014j (latest).
+* Patch `Delegator` to work with `#try`.
- *Andrey Novikov*
+ Fixes #5790.
+ *Nate Smith*
-## Rails 4.2.0 (December 20, 2014) ##
+* Add `Integer#positive?` and `Integer#negative?` query methods
+ in the vein of `Fixnum#zero?`.
-* The decorated `load` and `require` methods are now kept private.
+ This makes it nicer to do things like `bunch_of_numbers.select(&:positive?)`.
- 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_dup`ed.
-
- *Peter Jaros*
-
-* `determine_constant_from_test_name` does no longer shadow `NameError`s
- 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.
+* Encoding `ActiveSupport::TimeWithZone` to YAML now preserves the timezone information.
- *Rafael Mendonça França*
+ Fixes #9183.
-* Added Object#itself which returns the object itself. Useful when dealing with a chaining scenario, like Active Record scopes:
+ *Andrew White*
- Event.public_send(state.presence_in([ :trashed, :drafted ]) || :itself).order(:created_at)
+* Added `ActiveSupport::TimeZone#strptime` to allow parsing times as if
+ from a given timezone.
- *DHH*
+ *Paul A Jungwirth*
-* `Object#with_options` executes block in merging option context when
- explicit receiver in not passed.
+* `ActiveSupport::Callbacks#skip_callback` now raises an `ArgumentError` if
+ an unrecognized callback is removed.
- *Pavel Pravosud*
+ *Iain Beeston*
-* Fixed a compatibility issue with the `Oj` gem when cherry-picking the file
- `active_support/core_ext/object/json` without requiring `active_support/json`.
+* Added `ActiveSupport::ArrayInquirer` and `Array#inquiry`.
- Fixes #16131.
+ Wrapping an array in an `ArrayInquirer` gives a friendlier way to check its
+ contents:
- *Godfrey Chan*
+ variants = ActiveSupport::ArrayInquirer.new([:phone, :tablet])
-* Make `Hash#with_indifferent_access` copy the default proc too.
+ variants.phone? # => true
+ variants.tablet? # => true
+ variants.desktop? # => false
- *arthurnn*, *Xanders*
+ variants.any?(:phone, :tablet) # => true
+ variants.any?(:phone, :desktop) # => true
+ variants.any?(:desktop, :watch) # => false
-* Add `String#truncate_words` to truncate a string by a number of words.
+ `Array#inquiry` is a shortcut for wrapping the receiving array in an
+ `ArrayInquirer`.
- *Mohamed Osama*
+ *George Claghorn*
-* Deprecate `capture` and `quietly`.
+* Deprecate `alias_method_chain` in favour of `Module#prepend` introduced in
+ Ruby 2.0.
- These methods are not thread safe and may cause issues when used in threaded environments.
- To avoid problems we are deprecating them.
+ *Kir Shatrov*
- *Tom Meier*
+* Added `#without` on `Enumerable` and `Array` to return a copy of an
+ enumerable without the specified elements.
-* `DateTime#to_f` now preserves the fractional seconds instead of always
- rounding to `.0`.
+ *Todd Bealmear*
- Fixes #15994.
+* Fixed a problem where `String#truncate_words` would get stuck with a complex
+ string.
- *John Paul Ashenfelter*
+ *Henrik Nygren*
-* Add `Hash#transform_values` to simplify a common pattern where the values of a
- hash must change, but the keys are left the same.
+* Fixed a roundtrip problem with `AS::SafeBuffer` where primitive-like strings
+ will be dumped as primitives:
- *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
+ YAML.load ActiveSupport::SafeBuffer.new("Hello").to_yaml # => "Hello"
+ YAML.load ActiveSupport::SafeBuffer.new("true").to_yaml # => true
+ YAML.load ActiveSupport::SafeBuffer.new("false").to_yaml # => false
+ YAML.load ActiveSupport::SafeBuffer.new("1").to_yaml # => 1
+ YAML.load ActiveSupport::SafeBuffer.new("1.1").to_yaml # => 1.1
After:
- Time.zone.now.end_of_day - Time.zone.now.beginning_of_day
- # => 86399.999999999
+ YAML.load ActiveSupport::SafeBuffer.new("Hello").to_yaml # => "Hello"
+ YAML.load ActiveSupport::SafeBuffer.new("true").to_yaml # => "true"
+ YAML.load ActiveSupport::SafeBuffer.new("false").to_yaml # => "false"
+ YAML.load ActiveSupport::SafeBuffer.new("1").to_yaml # => "1"
+ YAML.load ActiveSupport::SafeBuffer.new("1.1").to_yaml # => "1.1"
- *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.
+* Enable `number_to_percentage` to keep the number's precision by allowing
+ `:precision` to be `nil`.
- Before:
+ *Jack Xu*
- DateTime.now.advance(days: 1, hours: 12)
+* `config_accessor` became a private method, as with Ruby's `attr_accessor`.
- After:
+ *Akira Matsuda*
- DateTime.now.advance(days: 1.5)
+* `AS::Testing::TimeHelpers#travel_to` now changes `DateTime.now` as well as
+ `Time.now` and `Date.today`.
- Fixes #12005.
+ *Yuki Nishijima*
- *Shay Davidson*
+* Add `file_fixture` to `ActiveSupport::TestCase`.
+ It provides a simple mechanism to access sample files in your test cases.
-* `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!`.
+ By default file fixtures are stored in `test/fixtures/files`. This can be
+ configured per test-case using the `file_fixture_path` class attribute.
- *OZAWA Sakuro*
+ *Yves Senn*
-* Fixed confusing `DelegationError` in `Module#delegate`.
+* Return value of yielded block in `File.atomic_write`.
- See #15186.
+ *Ian Ker-Seymer*
- *Vladimir Yarotsky*
+* Duplicate frozen array when assigning it to a `HashWithIndifferentAccess` so
+ that it doesn't raise a `RuntimeError` when calling `map!` on it in `convert_value`.
-* Fixed `ActiveSupport::Subscriber` so that no duplicate subscriber is created
- when a subscriber method is redefined.
+ Fixes #18550.
- *Dennis Schön*
+ *Aditya Kapoor*
-* Remove deprecated string based terminators for `ActiveSupport::Callbacks`.
+* Add missing time zone definitions for Russian Federation and sync them
+ with `zone.tab` file from tzdata version 2014j (latest).
- *Eileen M. Uchitelle*
+ *Andrey Novikov*
-* Fixed an issue when using
- `ActiveSupport::NumberHelper::NumberToDelimitedConverter` to
- convert a value that is an `ActiveSupport::SafeBuffer` introduced
- in 2da9d67.
+* Add `SecureRandom.base58` for generation of random base58 strings.
- See #15064.
+ *Matthew Draper*, *Guillermo Iguaran*
- *Mark J. Titorenko*
+* Add `#prev_day` and `#next_day` counterparts to `#yesterday` and
+ `#tomorrow` for `Date`, `Time`, and `DateTime`.
-* `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`.
+ *George Claghorn*
- *Ulysse Carion*
+* Add `same_time` option to `#next_week` and `#prev_week` for `Date`, `Time`,
+ and `DateTime`.
-* `humanize` strips leading underscores, if any.
+ *George Claghorn*
- Before:
+* Add `#on_weekend?`, `#next_weekday`, `#prev_weekday` methods to `Date`,
+ `Time`, and `DateTime`.
- '_id'.humanize # => ""
+ `#on_weekend?` returns `true` if the receiving date/time falls on a Saturday
+ or Sunday.
- After:
+ `#next_weekday` returns a new date/time representing the next day that does
+ not fall on a Saturday or Sunday.
- '_id'.humanize # => "Id"
+ `#prev_weekday` returns a new date/time representing the previous day that
+ does not fall on a Saturday or Sunday.
- *Xavier Noria*
+ *George Claghorn*
-* Fixed backward compatibility issues introduced in 326e652.
+* Change the default test order from `:sorted` to `:random`.
- Empty Hash or Array should not be present in serialization result.
+ *Rafael Mendonça França*
- {a: []}.to_query # => ""
- {a: {}}.to_query # => ""
+* Remove deprecated `ActiveSupport::JSON::Encoding::CircularReferenceError`.
- For more info see #14948.
+ *Rafael Mendonça França*
- *Bogdan Gusiev*
+* Remove deprecated methods `ActiveSupport::JSON::Encoding.encode_big_decimal_as_string=`
+ and `ActiveSupport::JSON::Encoding.encode_big_decimal_as_string`.
-* Add `Digest::UUID::uuid_v3` and `Digest::UUID::uuid_v5` to support stable
- UUID fixtures on PostgreSQL.
+ *Rafael Mendonça França*
- *Roderick van Domburg*
+* Remove deprecated `ActiveSupport::SafeBuffer#prepend`.
-* Fixed `ActiveSupport::Duration#eql?` so that `1.second.eql?(1.second)` is
- true.
+ *Rafael Mendonça França*
- This fixes the current situation of:
+* Remove deprecated methods at `Kernel`.
- 1.second.eql?(1.second) # => false
+ `silence_stderr`, `silence_stream`, `capture` and `quietly`.
- `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:
+ *Rafael Mendonça França*
- 1.eql?(1.0) # => false
- 1.0.eql?(1) # => false
+* Remove deprecated `active_support/core_ext/big_decimal/yaml_conversions`
+ file.
- 1.second.eql?(1) # => false (was true)
- 1.eql?(1.second) # => false
+ *Rafael Mendonça França*
- { 1 => "foo", 1.0 => "bar" }
- # => { 1 => "foo", 1.0 => "bar" }
+* Remove deprecated methods `ActiveSupport::Cache::Store.instrument` and
+ `ActiveSupport::Cache::Store.instrument=`.
- { 1 => "foo", 1.second => "bar" }
- # now => { 1 => "foo", 1.second => "bar" }
- # was => { 1 => "bar" }
+ *Rafael Mendonça França*
- And though the behavior of these hasn't changed, for reference:
+* Change the way in which callback chains can be halted.
- 1 == 1.0 # => true
- 1.0 == 1 # => true
+ The preferred method to halt a callback chain from now on is to explicitly
+ `throw(:abort)`.
+ In the past, callbacks could only be halted by explicitly providing a
+ terminator and by having a callback match the conditions of the terminator.
- 1 == 1.second # => true
- 1.second == 1 # => true
+* Add `ActiveSupport.halt_callback_chains_on_return_false`
- *Emily Dobervich*
+ Setting `ActiveSupport.halt_callback_chains_on_return_false`
+ to `true` will let an app support the deprecated way of halting Active Record,
+ and Active Model callback chains by returning `false`.
-* `ActiveSupport::SafeBuffer#prepend` acts like `String#prepend` and modifies
- instance in-place, returning self. `ActiveSupport::SafeBuffer#prepend!` is
- deprecated.
+ Setting the value to `false` will tell the app to ignore any `false` value
+ returned by those callbacks, and only halt the chain upon `throw(:abort)`.
- *Pavel Pravosud*
+ When the configuration option is missing, its value is `true`, so older apps
+ ported to Rails 5.0 will not break (but display a deprecation warning).
+ For new Rails 5.0 apps, its value is set to `false` in an initializer, so
+ these apps will support the new behavior by default.
-* `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.
+ *claudiob*, *Roque Pinel*
- *Peter Jaros*
+* Changes arguments and default value of CallbackChain's `:terminator` option
-* Deprecate `Class#superclass_delegating_accessor`, use `Class#class_attribute` instead.
+ Chains of callbacks defined without an explicit `:terminator` option will
+ now be halted as soon as a `before_` callback throws `:abort`.
- *Akshay Vishnoi*
+ Chains of callbacks defined with a `:terminator` option will maintain their
+ existing behavior of halting as soon as a `before_` callback matches the
+ terminator's expectation.
-* Ensure classes which `include Enumerable` get `#to_json` in addition to
- `#as_json`.
+ *claudiob*
- *Sammy Larbi*
+* Deprecate `MissingSourceFile` in favor of `LoadError`.
-* Change the signature of `fetch_multi` to return a hash rather than an
- array. This makes it consistent with the output of `read_multi`.
+ `MissingSourceFile` was just an alias to `LoadError` and was not being
+ raised inside the framework.
- *Parker Selbert*
+ *Rafael Mendonça França*
-* 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.
+* Add support for error dispatcher classes in `ActiveSupport::Rescuable`.
+ Now it acts closer to Ruby's rescue.
- # app/models/concerns/authentication.rb
- concern :Authentication do
- included do
- after_create :generate_private_key
- end
+ Example:
- class_methods do
- def authenticate(credentials)
- # ...
+ class BaseController < ApplicationController
+ module ErrorDispatcher
+ def self.===(other)
+ Exception === other && other.respond_to?(:status)
end
end
- def generate_private_key
- # ...
+ rescue_from ErrorDispatcher do |error|
+ render status: error.status, json: { error: error.to_s }
end
end
- # app/models/user.rb
- class User < ActiveRecord::Base
- include Authentication
- end
+ *Genadi Samokovarov*
- *Jeremy Kemper*
+* Add `#verified` and `#valid_message?` methods to `ActiveSupport::MessageVerifier`
-Please check [4-1-stable](https://github.com/rails/rails/blob/4-1-stable/activesupport/CHANGELOG.md) for previous changes.
+ Previously, the only way to decode a message with `ActiveSupport::MessageVerifier`
+ was to use `#verify`, which would raise an exception on invalid messages. Now
+ `#verified` can also be used, which returns `nil` on messages that cannot be
+ decoded.
+
+ Previously, there was no way to check if a message's format was valid without
+ attempting to decode it. `#valid_message?` is a boolean convenience method that
+ checks whether the message is valid without actually decoding it.
+
+ *Logan Leger*
+
+Please check [4-2-stable](https://github.com/rails/rails/blob/4-2-stable/activesupport/CHANGELOG.md) for previous changes.