aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/CHANGELOG.md
diff options
context:
space:
mode:
Diffstat (limited to 'activesupport/CHANGELOG.md')
-rw-r--r--activesupport/CHANGELOG.md626
1 files changed, 155 insertions, 471 deletions
diff --git a/activesupport/CHANGELOG.md b/activesupport/CHANGELOG.md
index f4c324803c..83ff80e31a 100644
--- a/activesupport/CHANGELOG.md
+++ b/activesupport/CHANGELOG.md
@@ -1,561 +1,245 @@
-* Add `#on_weekday?` method to `Date`, `Time`, and `DateTime`.
+* Use `Hash#compact` and `Hash#compact!` from Ruby 2.4. Old Ruby versions
+ will continue to get these methods from Active Support as before.
- `#on_weekday?` returns `true` if the receiving date/time does not fall on a Saturday
- or Sunday.
-
- *Vipul A M*
+ *Prathamesh Sonpatki*
-* Add `Array#second_to_last` and `Array#third_to_last` methods.
+* Fix `ActiveSupport::TimeZone#strptime`.
+ Support for timestamps in format of seconds (%s) and milliseconds (%Q).
- *Brian Christian*
+ Fixes #26840.
-* Fix regression in `Hash#dig` for HashWithIndifferentAccess.
+ *Lev Denisov*
- *Jon Moss*
+* Fix `DateAndTime::Calculations#copy_time_to`. Copy `nsec` instead of `usec`.
-## Rails 5.0.0.beta2 (February 01, 2016) ##
+ Jumping forward or backward between weeks now preserves nanosecond digits.
-* Change number_to_currency behavior for checking negativity.
+ *Josua Schmid*
- Used `to_f.negative` instead of using `to_f.phase` for checking negativity
- of a number in number_to_currency helper.
- This change works same for all cases except when number is "-0.0".
+* Fix `ActiveSupport::TimeWithZone#in` across DST boundaries.
- -0.0.to_f.negative? => false
- -0.0.to_f.phase? => 3.14
+ 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#+` which handles
+ transitions across DST boundaries, e.g:
- This change reverts changes from https://github.com/rails/rails/pull/6512.
- But it should be acceptable as we could not find any currency which
- supports negative zeros.
+ Time.zone = "US/Eastern"
- *Prathamesh Sonpatki*, *Rafael Mendonça França*
+ t = Time.zone.local(2016,11,6,1)
+ # => Sun, 06 Nov 2016 01:00:00 EDT -05:00
-* Match `HashWithIndifferentAccess#default`'s behaviour with `Hash#default`.
+ t.in(1.hour)
+ # => Sun, 06 Nov 2016 01:00:00 EST -05:00
- *David Cornu*
+ Fixes #26580.
-* Adds `:exception_object` key to `ActiveSupport::Notifications::Instrumenter`
- payload when an exception is raised.
+ *Thomas Balthazar*
- Adds new key/value pair to payload when an exception is raised:
- e.g. `:exception_object => #<RuntimeError: FAIL>`.
+* Remove unused parameter `options = nil` for `#clear` of
+ `ActiveSupport::Cache::Strategy::LocalCache::LocalStore` and
+ `ActiveSupport::Cache::Strategy::LocalCache`.
- *Ryan T. Hosford*
+ *Yosuke Kabuto*
-* Support extended grapheme clusters and UAX 29.
+* Fix `thread_mattr_accessor` subclass no longer overwrites parent.
- *Adam Roben*
+ Assigning a value to a subclass using `thread_mattr_accessor` no
+ longer changes the value of the parent class. This brings the
+ behavior inline with the documentation.
-* Add petabyte and exabyte numeric conversion.
+ Given:
- *Akshay Vishnoi*
-
-## Rails 5.0.0.beta1 (December 18, 2015) ##
-
-* 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.
-
- 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
+ class Account
thread_mattr_accessor :user
-
- def self.reset() self.account = self.user = nil end
end
- class ApplicationController < ActionController::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
-
- class MessagesController < ApplicationController
- def create
- @message = Message.create!(message_params)
- end
+ class Customer < Account
end
- class Message < ApplicationRecord
- has_many :events
- after_create :track_created
-
- private
- def track_created
- events.create! origin: self, action: :create
- end
- end
-
- class Event < ApplicationRecord
- belongs_to :creator, class_name: 'User'
- before_validation { self.creator ||= Current.user }
- end
-
- *DHH*
-
-
-* Deprecated `Module#qualified_const_` in favour of the builtin Module#const_
- methods.
-
- *Genadi Samokovarov*
-
-* Deprecate passing string to define callback.
-
- *Yuichiro Kaneko*
-
-* `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`.
-
- `ActiveSupport::Cache::LocaleCache#set_cache_value` is deprecated and replaced with `write_cache_value`.
-
- *Michael Grosser*
-
-* Implements an evented file watcher to asynchronously detect changes in the
- application source code, routes, locales, etc.
-
- This watcher is disabled by default, applications my enable it in the configuration:
-
- # config/environments/development.rb
- config.file_watcher = ActiveSupport::EventedFileUpdateChecker
-
- This feature depends on the [listen](https://github.com/guard/listen) gem:
-
- group :development do
- gem 'listen', '~> 3.0.5'
- end
-
- *Puneet Agarwal* and *Xavier Noria*
-
-* Added `Time.days_in_year` to return the number of days in the given year, or the
- current year if no argument is provided.
-
- *Jon Pascoe*
-
-* Updated `parameterize` to preserve the case of a string, optionally.
-
- Example:
-
- parameterize("Donald E. Knuth", separator: '_') # => "donald_e_knuth"
- parameterize("Donald E. Knuth", preserve_case: true) # => "Donald-E-Knuth"
-
- *Swaathi Kakarla*
-
-* `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`.
-
- *Gordon Chan*
-
-* Change Integer#year to return a Fixnum instead of a Float to improve
- consistency.
-
- Integer#years returned a Float while the rest of the accompanying methods
- (days, weeks, months, etc.) return a Fixnum.
+ Account.user = "DHH"
+ Customer.user = "Rafael"
Before:
- 1.year # => 31557600.0
+ Account.user # => "Rafael"
After:
- 1.year # => 31557600
-
- *Konstantinos Rousis*
-
-* Handle invalid UTF-8 strings when HTML escaping.
-
- 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.
-
- *Grey Baker*
-
-* Update `ActiveSupport::Multibyte::Chars#slice!` to return `nil` if the
- arguments are out of bounds, to mirror the behavior of `String#slice!`
-
- *Gourav Tiwari*
-
-* Fix `number_to_human` so that 999999999 rounds to "1 Billion" instead of
- "1000 Million".
+ Account.user # => "DHH"
- *Max Jacobson*
+ *Shinichi Maeshima*
-* Fix `ActiveSupport::Deprecation#deprecate_methods` to report using the
- current deprecator instance, where applicable.
+* Since weeks are no longer converted to days, add `:weeks` to the list of
+ parts that `ActiveSupport::TimeWithZone` will recognize as possibly being
+ of variable duration to take account of DST transitions.
- *Brandon Dunne*
-
-* `Cache#fetch` instrumentation marks whether it was a `:hit`.
-
- *Robin Clowers*
-
-* `assert_difference` and `assert_no_difference` now returns the result of the
- yielded block.
-
- Example:
-
- post = assert_difference -> { Post.count }, 1 do
- Post.create
- end
-
- *Lucas Mazza*
-
-* Short-circuit `blank?` on date and time values since they are never blank.
-
- Fixes #21657.
+ Fixes #26039.
*Andrew White*
-* Replaced deprecated `ThreadSafe::Cache` with its successor `Concurrent::Map` now that
- the thread_safe gem has been merged into concurrent-ruby.
-
- *Jerry D'Antonio*
-
-* Updated Unicode version to 8.0.0
+* Defines `Regexp.match?` for Ruby versions prior to 2.4. The predicate
+ has the same interface, but it does not have the performance boost. Its
+ purpose is to be able to write 2.4 compatible code.
- *Anshul Sharma*
+ *Xavier Noria*
-* `number_to_currency` and `number_with_delimiter` now accept custom `delimiter_pattern` option
- to handle placement of delimiter, to support currency formats like INR
+* Allow `MessageEncryptor` to take advantage of authenticated encryption modes.
- Example:
+ AEAD modes like `aes-256-gcm` provide both confidentiality and data
+ authenticity, eliminating the need to use `MessageVerifier` to check if the
+ encrypted data has been tampered with. This speeds up encryption/decryption
+ and results in shorter cipher text.
- number_to_currency(1230000, delimiter_pattern: /(\d+?)(?=(\d\d)+(\d)(?!\d))/, unit: '₹', format: "%u %n")
- # => '₹ 12,30,000.00'
+ *Bart de Water*
- *Vipul A M*
+* Introduce `assert_changes` and `assert_no_changes`.
-* Deprecate `:prefix` option of `number_to_human_size` with no replacement.
+ `assert_changes` is a more general `assert_difference` that works with any
+ value.
- *Jean Boussier*
-
-* 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*
-
-* ActiveSupport::HashWithIndifferentAccess `select` and `reject` will now return
- enumerator if called without block.
-
- Fixes #20095.
-
- *Bernard Potocki*
-
-* Removed `ActiveSupport::Concurrency::Latch`, superseded by `Concurrent::CountDownLatch`
- from the concurrent-ruby gem.
-
- *Jerry D'Antonio*
-
-* 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*
-
-* Fix a range of values for parameters of the Time#change.
-
- *Nikolay Kondratyev*
-
-* Add `Enumerable#pluck` to get the same values from arrays as from ActiveRecord
- associations.
-
- Fixes #20339.
-
- *Kevin Deisz*
-
-* Add a bang version to `ActiveSupport::OrderedOptions` get methods which will raise
- an `KeyError` if the value is `.blank?`.
-
- Before:
-
- if (slack_url = Rails.application.secrets.slack_url).present?
- # Do something worthwhile
- else
- # Raise as important secret password is not specified
+ assert_changes 'Error.current', from: nil, to: 'ERR' do
+ expected_bad_operation
end
- After:
-
- slack_url = Rails.application.secrets.slack_url!
-
- *Aditya Sanghi*, *Gaurish Sharma*
-
-* Remove deprecated `Class#superclass_delegating_accessor`.
- Use `Class#class_attribute` instead.
-
- *Akshay Vishnoi*
-
-* Patch `Delegator` to work with `#try`.
-
- Fixes #5790.
-
- *Nate Smith*
-
-* Add `Integer#positive?` and `Integer#negative?` query methods
- in the vein of `Fixnum#zero?`.
-
- This makes it nicer to do things like `bunch_of_numbers.select(&:positive?)`.
-
- *DHH*
-
-* Encoding `ActiveSupport::TimeWithZone` to YAML now preserves the timezone information.
-
- Fixes #9183.
-
- *Andrew White*
-
-* Added `ActiveSupport::TimeZone#strptime` to allow parsing times as if
- from a given timezone.
-
- *Paul A Jungwirth*
-
-* `ActiveSupport::Callbacks#skip_callback` now raises an `ArgumentError` if
- an unrecognized callback is removed.
-
- *Iain Beeston*
-
-* Added `ActiveSupport::ArrayInquirer` and `Array#inquiry`.
-
- Wrapping an array in an `ArrayInquirer` gives a friendlier way to check its
- contents:
-
- variants = ActiveSupport::ArrayInquirer.new([:phone, :tablet])
-
- variants.phone? # => true
- variants.tablet? # => true
- variants.desktop? # => false
-
- variants.any?(:phone, :tablet) # => true
- variants.any?(:phone, :desktop) # => true
- variants.any?(:desktop, :watch) # => false
-
- `Array#inquiry` is a shortcut for wrapping the receiving array in an
- `ArrayInquirer`.
-
- *George Claghorn*
-
-* Deprecate `alias_method_chain` in favour of `Module#prepend` introduced in
- Ruby 2.0.
-
- *Kir Shatrov*
-
-* Added `#without` on `Enumerable` and `Array` to return a copy of an
- enumerable without the specified elements.
-
- *Todd Bealmear*
-
-* 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
-
- 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"
+ Can be called with strings, to be evaluated in the binding (context) of
+ the block given to the assertion, or a lambda.
- *Godfrey Chan*
-
-* Enable `number_to_percentage` to keep the number's precision by allowing
- `:precision` to be `nil`.
-
- *Jack Xu*
-
-* `config_accessor` became a private method, as with Ruby's `attr_accessor`.
-
- *Akira Matsuda*
-
-* `AS::Testing::TimeHelpers#travel_to` now changes `DateTime.now` as well as
- `Time.now` and `Date.today`.
-
- *Yuki Nishijima*
-
-* Add `file_fixture` to `ActiveSupport::TestCase`.
- It provides a simple mechanism to access sample files in your test cases.
-
- By default file fixtures are stored in `test/fixtures/files`. This can be
- configured per test-case using the `file_fixture_path` class attribute.
-
- *Yves Senn*
-
-* Return value of yielded block in `File.atomic_write`.
-
- *Ian Ker-Seymer*
-
-* 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`.
-
- Fixes #18550.
-
- *Aditya Kapoor*
-
-* Add missing time zone definitions for Russian Federation and sync them
- with `zone.tab` file from tzdata version 2014j (latest).
-
- *Andrey Novikov*
-
-* Add `SecureRandom.base58` for generation of random base58 strings.
-
- *Matthew Draper*, *Guillermo Iguaran*
-
-* Add `#prev_day` and `#next_day` counterparts to `#yesterday` and
- `#tomorrow` for `Date`, `Time`, and `DateTime`.
-
- *George Claghorn*
-
-* Add `same_time` option to `#next_week` and `#prev_week` for `Date`, `Time`,
- and `DateTime`.
-
- *George Claghorn*
-
-* Add `#on_weekend?`, `#next_weekday`, `#prev_weekday` methods to `Date`,
- `Time`, and `DateTime`.
-
- `#on_weekend?` returns `true` if the receiving date/time falls on a Saturday
- or Sunday.
+ assert_changes -> { Error.current }, from: nil, to: 'ERR' do
+ expected_bad_operation
+ end
- `#next_weekday` returns a new date/time representing the next day that does
- not fall on a Saturday or Sunday.
+ The `from` and `to` arguments are compared with the case operator (`===`).
- `#prev_weekday` returns a new date/time representing the previous day that
- does not fall on a Saturday or Sunday.
+ assert_changes 'Error.current', from: nil, to: Error do
+ expected_bad_operation
+ end
- *George Claghorn*
+ This is pretty useful, if you need to loosely compare a value. For example,
+ you need to test a token has been generated and it has that many random
+ characters.
-* Change the default test order from `:sorted` to `:random`.
+ user = User.start_registration
+ assert_changes 'user.token', to: /\w{32}/ do
+ user.finish_registration
+ end
- *Rafael Mendonça França*
+ *Genadi Samokovarov*
-* Remove deprecated `ActiveSupport::JSON::Encoding::CircularReferenceError`.
+* Add `:fallback_string` option to `Array#to_sentence`. If an empty array
+ calls the function and a fallback string option is set then it returns the
+ fallback string other than an empty string.
- *Rafael Mendonça França*
+ *Mohamed Osama*
-* Remove deprecated methods `ActiveSupport::JSON::Encoding.encode_big_decimal_as_string=`
- and `ActiveSupport::JSON::Encoding.encode_big_decimal_as_string`.
+* Fix `ActiveSupport::TimeZone#strptime`. Now raises `ArgumentError` when the
+ given time doesn't match the format. The error is the same as the one given
+ by Ruby's `Date.strptime`. Previously it raised
+ `NoMethodError: undefined method empty? for nil:NilClass.` due to a bug.
- *Rafael Mendonça França*
+ Fixes #25701.
-* Remove deprecated `ActiveSupport::SafeBuffer#prepend`.
+ *John Gesimondo*
- *Rafael Mendonça França*
+* `travel/travel_to` travel time helpers, now raise on nested calls,
+ as this can lead to confusing time stubbing.
-* Remove deprecated methods at `Kernel`.
+ Instead of:
- `silence_stderr`, `silence_stream`, `capture` and `quietly`.
+ travel_to 2.days.from_now do
+ # 2 days from today
+ travel_to 3.days.from_now do
+ # 5 days from today
+ end
+ end
- *Rafael Mendonça França*
+ preferred way to achieve above is:
-* Remove deprecated `active_support/core_ext/big_decimal/yaml_conversions`
- file.
+ travel 2.days do
+ # 2 days from today
+ end
- *Rafael Mendonça França*
+ travel 5.days do
+ # 5 days from today
+ end
-* Remove deprecated methods `ActiveSupport::Cache::Store.instrument` and
- `ActiveSupport::Cache::Store.instrument=`.
+ *Vipul A M*
- *Rafael Mendonça França*
+* Support parsing JSON time in ISO8601 local time strings in
+ `ActiveSupport::JSON.decode` when `parse_json_times` is enabled.
+ Strings in the format of `YYYY-MM-DD hh:mm:ss` (without a `Z` at
+ the end) will be parsed in the local timezone (`Time.zone`). In
+ addition, date strings (`YYYY-MM-DD`) are now parsed into `Date`
+ objects.
-* Change the way in which callback chains can be halted.
+ *Grzegorz Witek*
- 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.
+* 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.
-* Add `ActiveSupport.halt_callback_chains_on_return_false`
+ *Kevin McPhillips*
- 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`.
+* Remove deprecated arguments in `assert_nothing_raised`.
- 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)`.
+ *Rafel Mendonça França*
- 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.
+* `Date.to_s` doesn't produce too many spaces. For example, `to_s(:short)`
+ will now produce `01 Feb` instead of ` 1 Feb`.
- *claudiob*, *Roque Pinel*
+ Fixes #25251.
-* Changes arguments and default value of CallbackChain's `:terminator` option
+ *Sean Griffin*
- Chains of callbacks defined without an explicit `:terminator` option will
- now be halted as soon as a `before_` callback throws `:abort`.
+* Introduce `Module#delegate_missing_to`.
- 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.
+ When building a decorator, a common pattern emerges:
- *claudiob*
+ class Partition
+ def initialize(first_event)
+ @events = [ first_event ]
+ end
-* Deprecate `MissingSourceFile` in favor of `LoadError`.
+ def people
+ if @events.first.detail.people.any?
+ @events.collect { |e| Array(e.detail.people) }.flatten.uniq
+ else
+ @events.collect(&:creator).uniq
+ end
+ end
- `MissingSourceFile` was just an alias to `LoadError` and was not being
- raised inside the framework.
+ private
+ def respond_to_missing?(name, include_private = false)
+ @events.respond_to?(name, include_private)
+ end
- *Rafael Mendonça França*
+ def method_missing(method, *args, &block)
+ @events.send(method, *args, &block)
+ end
+ end
-* Add support for error dispatcher classes in `ActiveSupport::Rescuable`.
- Now it acts closer to Ruby's rescue.
+ With `Module#delegate_missing_to`, the above is condensed to:
- Example:
+ class Partition
+ delegate_missing_to :@events
- class BaseController < ApplicationController
- module ErrorDispatcher
- def self.===(other)
- Exception === other && other.respond_to?(:status)
- end
+ def initialize(first_event)
+ @events = [ first_event ]
end
- rescue_from ErrorDispatcher do |error|
- render status: error.status, json: { error: error.to_s }
+ def people
+ if @events.first.detail.people.any?
+ @events.collect { |e| Array(e.detail.people) }.flatten.uniq
+ else
+ @events.collect(&:creator).uniq
+ end
end
end
- *Genadi Samokovarov*
-
-* Add `#verified` and `#valid_message?` methods to `ActiveSupport::MessageVerifier`
-
- 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.
+ *Genadi Samokovarov*, *DHH*
- 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.
+* Rescuable: If a handler doesn't match the exception, check for handlers
+ matching the exception's cause.
- *Logan Leger*
+ *Jeremy Daer*
-Please check [4-2-stable](https://github.com/rails/rails/blob/4-2-stable/activesupport/CHANGELOG.md) for previous changes.
+Please check [5-0-stable](https://github.com/rails/rails/blob/5-0-stable/activesupport/CHANGELOG.md) for previous changes.