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.