2015-10-09 16:57:01 -04:00
|
|
|
* `Cache#fetch` instrumentation marks whether it was a `:hit`.
|
|
|
|
|
|
|
|
*Robin Clowers*
|
|
|
|
|
2015-09-24 12:32:08 -04:00
|
|
|
* `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*
|
|
|
|
|
2015-09-21 07:59:00 -04:00
|
|
|
* Short-circuit `blank?` on date and time values since they are never blank.
|
|
|
|
|
|
|
|
Fixes #21657
|
|
|
|
|
|
|
|
*Andrew White*
|
|
|
|
|
2015-09-19 09:56:26 -04:00
|
|
|
* Replaced deprecated `ThreadSafe::Cache` with its successor `Concurrent::Map` now that
|
|
|
|
the thread_safe gem has been merged into concurrent-ruby.
|
|
|
|
|
|
|
|
*Jerry D'Antonio*
|
|
|
|
|
2015-08-30 22:06:39 -04:00
|
|
|
* Updated Unicode version to 8.0.0
|
|
|
|
|
|
|
|
*Anshul Sharma*
|
2015-09-24 12:32:08 -04:00
|
|
|
|
2015-08-28 16:00:48 -04:00
|
|
|
* `number_to_currency` and `number_with_delimiter` now accept custom `delimiter_pattern` option
|
|
|
|
to handle placement of delimiter, to support currency formats like INR
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
2014-11-04 02:22:41 -05:00
|
|
|
number_to_currency(1230000, delimiter_pattern: /(\d+?)(?=(\d\d)+(\d)(?!\d))/, unit: '₹', format: "%u %n")
|
2015-08-28 16:00:48 -04:00
|
|
|
# => '₹ 12,30,000.00'
|
|
|
|
|
2014-11-04 02:22:41 -05:00
|
|
|
*Vipul A M*
|
2015-08-28 16:00:48 -04:00
|
|
|
|
2015-08-10 23:19:40 -04:00
|
|
|
* Deprecate `:prefix` option of `number_to_human_size` with no replacement.
|
|
|
|
|
|
|
|
*Jean Boussier*
|
|
|
|
|
2015-07-19 11:08:20 -04:00
|
|
|
* 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*
|
|
|
|
|
2015-05-12 11:48:09 -04:00
|
|
|
* ActiveSupport::HashWithIndifferentAccess `select` and `reject` will now return
|
|
|
|
enumerator if called without block.
|
|
|
|
|
|
|
|
Fixes #20095
|
|
|
|
|
|
|
|
*Bernard Potocki*
|
|
|
|
|
2015-07-13 14:22:54 -04:00
|
|
|
* Removed `ActiveSupport::Concurrency::Latch`, superseded by `Concurrent::CountDownLatch`
|
|
|
|
from the concurrent-ruby gem.
|
|
|
|
|
|
|
|
*Jerry D'Antonio*
|
|
|
|
|
2015-07-11 04:11:15 -04:00
|
|
|
* Fix not calling `#default` on `HashWithIndifferentAccess#to_hash` when only
|
2015-07-09 23:11:37 -04:00
|
|
|
`default_proc` is set, which could raise.
|
|
|
|
|
|
|
|
*Simon Eskildsen*
|
|
|
|
|
2015-07-09 23:10:45 -04:00
|
|
|
* Fix setting `default_proc` on `HashWithIndifferentAccess#dup`
|
|
|
|
|
|
|
|
*Simon Eskildsen*
|
|
|
|
|
2015-02-08 09:18:30 -05:00
|
|
|
* Fix a range of values for parameters of the Time#change
|
|
|
|
|
|
|
|
*Nikolay Kondratyev*
|
|
|
|
|
2015-05-28 20:40:27 -04:00
|
|
|
* Add `Enumerable#pluck` to get the same values from arrays as from ActiveRecord
|
|
|
|
associations.
|
|
|
|
|
|
|
|
Fixes #20339.
|
|
|
|
|
|
|
|
*Kevin Deisz*
|
|
|
|
|
2015-05-26 12:21:28 -04:00
|
|
|
* Add a bang version to `ActiveSupport::OrderedOptions` get methods which will raise
|
|
|
|
an `KeyError` if the value is `.blank?`
|
|
|
|
|
2015-05-17 06:51:34 -04:00
|
|
|
Before:
|
|
|
|
|
2015-06-08 03:38:08 -04:00
|
|
|
if (slack_url = Rails.application.secrets.slack_url).present?
|
2015-05-26 12:21:28 -04:00
|
|
|
# Do something worthwhile
|
2015-05-17 06:51:34 -04:00
|
|
|
else
|
2015-05-26 12:21:28 -04:00
|
|
|
# Raise as important secret password is not specified
|
2015-05-17 06:51:34 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
After:
|
|
|
|
|
|
|
|
slack_url = Rails.application.secrets.slack_url!
|
|
|
|
|
|
|
|
*Aditya Sanghi*, *Gaurish Sharma*
|
|
|
|
|
2015-05-26 03:24:15 -04:00
|
|
|
* Remove deprecated `Class#superclass_delegating_accessor`.
|
|
|
|
Use `Class#class_attribute` instead.
|
2014-09-17 04:57:26 -04:00
|
|
|
|
|
|
|
*Akshay Vishnoi*
|
|
|
|
|
2015-05-20 05:26:09 -04:00
|
|
|
* Patch `Delegator` to work with `#try`.
|
2015-05-14 11:21:24 -04:00
|
|
|
|
2015-05-20 05:26:09 -04:00
|
|
|
Fixes #5790.
|
2015-05-14 11:21:24 -04:00
|
|
|
|
|
|
|
*Nate Smith*
|
|
|
|
|
2015-05-16 01:30:17 -04:00
|
|
|
* 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?)`.
|
2015-05-13 13:15:28 -04:00
|
|
|
|
|
|
|
*DHH*
|
|
|
|
|
2015-05-16 01:30:17 -04:00
|
|
|
* Encoding `ActiveSupport::TimeWithZone` to YAML now preserves the timezone information.
|
2014-10-20 04:12:35 -04:00
|
|
|
|
|
|
|
Fixes #9183.
|
|
|
|
|
|
|
|
*Andrew White*
|
|
|
|
|
2015-04-02 01:15:38 -04:00
|
|
|
* Added `ActiveSupport::TimeZone#strptime` to allow parsing times as if
|
|
|
|
from a given timezone.
|
|
|
|
|
|
|
|
*Paul A Jungwirth*
|
|
|
|
|
2015-02-21 09:37:07 -05:00
|
|
|
* `ActiveSupport::Callbacks#skip_callback` now raises an `ArgumentError` if
|
|
|
|
an unrecognized callback is removed.
|
|
|
|
|
|
|
|
*Iain Beeston*
|
|
|
|
|
2015-03-30 12:38:13 -04:00
|
|
|
* Added `ActiveSupport::ArrayInquirer` and `Array#inquiry`.
|
2015-03-10 01:00:37 -04:00
|
|
|
|
|
|
|
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
|
|
|
|
|
2015-03-30 12:38:13 -04:00
|
|
|
`Array#inquiry` is a shortcut for wrapping the receiving array in an
|
|
|
|
`ArrayInquirer`.
|
|
|
|
|
2015-03-10 01:00:37 -04:00
|
|
|
*George Claghorn*
|
|
|
|
|
2015-04-22 08:44:30 -04:00
|
|
|
* Deprecate `alias_method_chain` in favour of `Module#prepend` introduced in
|
|
|
|
Ruby 2.0.
|
2015-03-20 17:23:41 -04:00
|
|
|
|
|
|
|
*Kir Shatrov*
|
|
|
|
|
2015-03-01 20:44:36 -05:00
|
|
|
* Added `#without` on `Enumerable` and `Array` to return a copy of an
|
|
|
|
enumerable without the specified elements.
|
|
|
|
|
|
|
|
*Todd Bealmear*
|
|
|
|
|
2015-05-19 07:40:58 -04:00
|
|
|
* Fixed a problem where `String#truncate_words` would get stuck with a complex
|
2015-02-25 07:28:08 -05:00
|
|
|
string.
|
|
|
|
|
|
|
|
*Henrik Nygren*
|
|
|
|
|
2015-05-19 07:40:58 -04:00
|
|
|
* Fixed a roundtrip problem with `AS::SafeBuffer` where primitive-like strings
|
2015-02-11 20:04:23 -05:00
|
|
|
will be dumped as primitives:
|
|
|
|
|
|
|
|
Before:
|
|
|
|
|
2015-02-23 10:54:40 -05:00
|
|
|
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
|
2015-02-11 20:04:23 -05:00
|
|
|
|
2015-02-23 10:54:40 -05:00
|
|
|
After:
|
2015-02-11 20:04:23 -05:00
|
|
|
|
2015-02-23 10:54:40 -05:00
|
|
|
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"
|
2015-02-11 20:04:23 -05:00
|
|
|
|
|
|
|
*Godfrey Chan*
|
|
|
|
|
2015-02-23 10:54:40 -05:00
|
|
|
* Enable `number_to_percentage` to keep the number's precision by allowing
|
|
|
|
`:precision` to be `nil`.
|
2013-07-22 11:51:36 -04:00
|
|
|
|
2015-02-06 13:21:28 -05:00
|
|
|
*Jack Xu*
|
2013-07-22 11:51:36 -04:00
|
|
|
|
2015-02-23 10:54:40 -05:00
|
|
|
* `config_accessor` became a private method, as with Ruby's `attr_accessor`.
|
2015-01-20 07:03:27 -05:00
|
|
|
|
|
|
|
*Akira Matsuda*
|
|
|
|
|
2015-01-31 20:37:11 -05:00
|
|
|
* `AS::Testing::TimeHelpers#travel_to` now changes `DateTime.now` as well as
|
|
|
|
`Time.now` and `Date.today`.
|
|
|
|
|
|
|
|
*Yuki Nishijima*
|
|
|
|
|
2015-01-23 09:45:34 -05:00
|
|
|
* 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*
|
|
|
|
|
2015-01-28 02:56:40 -05:00
|
|
|
* Return value of yielded block in `File.atomic_write`.
|
|
|
|
|
|
|
|
*Ian Ker-Seymer*
|
|
|
|
|
2015-05-19 07:40:58 -04:00
|
|
|
* Duplicate frozen array when assigning it to a `HashWithIndifferentAccess` so
|
2015-01-16 14:23:17 -05:00
|
|
|
that it doesn't raise a `RuntimeError` when calling `map!` on it in `convert_value`.
|
|
|
|
|
|
|
|
Fixes #18550.
|
|
|
|
|
|
|
|
*Aditya Kapoor*
|
|
|
|
|
2015-01-13 10:54:41 -05:00
|
|
|
* Add missing time zone definitions for Russian Federation and sync them
|
|
|
|
with `zone.tab` file from tzdata version 2014j (latest).
|
|
|
|
|
|
|
|
*Andrey Novikov*
|
|
|
|
|
2015-01-09 17:51:23 -05:00
|
|
|
* Add `SecureRandom.base58` for generation of random base58 strings.
|
|
|
|
|
2015-01-10 06:17:57 -05:00
|
|
|
*Matthew Draper*, *Guillermo Iguaran*
|
2015-01-09 17:51:23 -05:00
|
|
|
|
2015-01-06 05:30:04 -05:00
|
|
|
* Add `#prev_day` and `#next_day` counterparts to `#yesterday` and
|
|
|
|
`#tomorrow` for `Date`, `Time`, and `DateTime`.
|
|
|
|
|
|
|
|
*George Claghorn*
|
|
|
|
|
2015-01-05 23:06:45 -05:00
|
|
|
* Add `same_time` option to `#next_week` and `#prev_week` for `Date`, `Time`,
|
|
|
|
and `DateTime`.
|
|
|
|
|
|
|
|
*George Claghorn*
|
|
|
|
|
2015-01-04 20:01:26 -05:00
|
|
|
* Add `#on_weekend?`, `#next_weekday`, `#prev_weekday` methods to `Date`,
|
|
|
|
`Time`, and `DateTime`.
|
|
|
|
|
2015-05-19 07:40:58 -04:00
|
|
|
`#on_weekend?` returns `true` if the receiving date/time falls on a Saturday
|
2015-01-04 20:01:26 -05:00
|
|
|
or Sunday.
|
|
|
|
|
|
|
|
`#next_weekday` returns a new date/time representing the next day that does
|
|
|
|
not fall on a Saturday or Sunday.
|
|
|
|
|
|
|
|
`#prev_weekday` returns a new date/time representing the previous day that
|
|
|
|
does not fall on a Saturday or Sunday.
|
|
|
|
|
|
|
|
*George Claghorn*
|
|
|
|
|
2015-01-02 20:43:06 -05:00
|
|
|
* Change the default test order from `:sorted` to `:random`.
|
|
|
|
|
|
|
|
*Rafael Mendonça França*
|
|
|
|
|
2015-01-02 20:32:28 -05:00
|
|
|
* Remove deprecated `ActiveSupport::JSON::Encoding::CircularReferenceError`.
|
|
|
|
|
|
|
|
*Rafael Mendonça França*
|
|
|
|
|
2015-01-02 20:22:16 -05:00
|
|
|
* Remove deprecated methods `ActiveSupport::JSON::Encoding.encode_big_decimal_as_string=`
|
|
|
|
and `ActiveSupport::JSON::Encoding.encode_big_decimal_as_string`.
|
|
|
|
|
|
|
|
*Rafael Mendonça França*
|
|
|
|
|
2015-01-02 20:13:27 -05:00
|
|
|
* Remove deprecated `ActiveSupport::SafeBuffer#prepend`.
|
|
|
|
|
|
|
|
*Rafael Mendonça França*
|
|
|
|
|
2015-01-02 20:08:41 -05:00
|
|
|
* Remove deprecated methods at `Kernel`.
|
|
|
|
|
|
|
|
`silence_stderr`, `silence_stream`, `capture` and `quietly`.
|
|
|
|
|
|
|
|
*Rafael Mendonça França*
|
|
|
|
|
2015-01-02 19:57:59 -05:00
|
|
|
* Remove deprecated `active_support/core_ext/big_decimal/yaml_conversions`
|
|
|
|
file.
|
|
|
|
|
|
|
|
*Rafael Mendonça França*
|
|
|
|
|
2015-01-02 19:54:44 -05:00
|
|
|
* Remove deprecated methods `ActiveSupport::Cache::Store.instrument` and
|
|
|
|
`ActiveSupport::Cache::Store.instrument=`.
|
|
|
|
|
|
|
|
*Rafael Mendonça França*
|
|
|
|
|
2014-12-24 03:58:19 -05:00
|
|
|
* Change the way in which callback chains can be halted.
|
2014-12-15 01:46:23 -05:00
|
|
|
|
2014-12-24 03:58:19 -05:00
|
|
|
The preferred method to halt a callback chain from now on is to explicitly
|
|
|
|
`throw(:abort)`.
|
2015-08-12 20:49:23 -04:00
|
|
|
In the past, callbacks could only be halted by explicitly providing a
|
|
|
|
terminator and by having a callback match the conditions of the terminator.
|
2014-12-24 03:58:19 -05:00
|
|
|
|
2015-09-24 21:33:58 -04:00
|
|
|
* Add `ActiveSupport.halt_callback_chains_on_return_false`
|
2014-12-24 03:58:19 -05:00
|
|
|
|
2015-09-24 21:33:58 -04:00
|
|
|
Setting `ActiveSupport.halt_callback_chains_on_return_false`
|
2015-08-12 20:49:23 -04:00
|
|
|
to `true` will let an app support the deprecated way of halting Active Record,
|
2015-09-24 21:33:58 -04:00
|
|
|
and Active Model callback chains by returning `false`.
|
2014-12-24 03:58:19 -05:00
|
|
|
|
2015-05-19 07:40:58 -04:00
|
|
|
Setting the value to `false` will tell the app to ignore any `false` value
|
2015-08-12 20:49:23 -04:00
|
|
|
returned by those callbacks, and only halt the chain upon `throw(:abort)`.
|
2014-12-24 03:58:19 -05:00
|
|
|
|
|
|
|
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.
|
2014-12-15 01:46:23 -05:00
|
|
|
|
2015-08-12 20:49:23 -04:00
|
|
|
*claudiob*, *Roque Pinel*
|
2014-12-15 01:46:23 -05:00
|
|
|
|
2015-05-19 07:40:58 -04:00
|
|
|
* Changes arguments and default value of CallbackChain's `:terminator` option
|
2014-10-16 19:21:24 -04:00
|
|
|
|
|
|
|
Chains of callbacks defined without an explicit `:terminator` option will
|
|
|
|
now be halted as soon as a `before_` callback throws `:abort`.
|
|
|
|
|
|
|
|
Chains of callbacks defined with a `:terminator` option will maintain their
|
|
|
|
existing behavior of halting as soon as a `before_` callback matches the
|
2014-12-24 03:58:19 -05:00
|
|
|
terminator's expectation.
|
2014-10-16 19:21:24 -04:00
|
|
|
|
|
|
|
*claudiob*
|
|
|
|
|
2015-01-02 17:44:39 -05:00
|
|
|
* Deprecate `MissingSourceFile` in favor of `LoadError`.
|
|
|
|
|
|
|
|
`MissingSourceFile` was just an alias to `LoadError` and was not being
|
|
|
|
raised inside the framework.
|
|
|
|
|
|
|
|
*Rafael Mendonça França*
|
|
|
|
|
2014-12-31 10:53:36 -05:00
|
|
|
* Add support for error dispatcher classes in `ActiveSupport::Rescuable`.
|
|
|
|
Now it acts closer to Ruby's rescue.
|
2014-12-09 05:04:50 -05:00
|
|
|
|
2015-01-10 06:17:57 -05:00
|
|
|
Example:
|
|
|
|
|
2014-12-09 05:04:50 -05:00
|
|
|
class BaseController < ApplicationController
|
|
|
|
module ErrorDispatcher
|
|
|
|
def self.===(other)
|
|
|
|
Exception === other && other.respond_to?(:status)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
rescue_from ErrorDispatcher do |error|
|
|
|
|
render status: error.status, json: { error: error.to_s }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
*Genadi Samokovarov*
|
|
|
|
|
2014-12-31 10:53:36 -05:00
|
|
|
* Add `#verified` and `#valid_message?` methods to `ActiveSupport::MessageVerifier`
|
2014-12-04 10:35:20 -05:00
|
|
|
|
2014-12-31 10:53:36 -05:00
|
|
|
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.
|
2014-12-04 10:35:20 -05:00
|
|
|
|
2014-12-31 10:53:36 -05:00
|
|
|
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.
|
2014-12-04 10:35:20 -05:00
|
|
|
|
2014-11-21 18:52:22 -05:00
|
|
|
*Logan Leger*
|
|
|
|
|
2014-11-28 12:00:06 -05:00
|
|
|
Please check [4-2-stable](https://github.com/rails/rails/blob/4-2-stable/activesupport/CHANGELOG.md) for previous changes.
|