2017-09-16 11:36:49 -04:00
|
|
|
* Add same method signature for `Time#prev_month` and `Time#next_month`
|
|
|
|
in accordance with `Date#prev_month`, `Date#next_month`.
|
|
|
|
|
|
|
|
Allows pass argument for `Time#prev_month` and `Time#next_month`.
|
|
|
|
|
|
|
|
Before:
|
|
|
|
```
|
|
|
|
Time.new(2017, 9, 16, 17, 0).prev_month # => 2017-08-16 17:00:00 +0300
|
|
|
|
Time.new(2017, 9, 16, 17, 0).prev_month(1)
|
|
|
|
# => ArgumentError: wrong number of arguments (given 1, expected 0)
|
|
|
|
|
|
|
|
Time.new(2017, 9, 16, 17, 0).next_month # => 2017-10-16 17:00:00 +0300
|
|
|
|
Time.new(2017, 9, 16, 17, 0).next_month(1)
|
|
|
|
# => ArgumentError: wrong number of arguments (given 1, expected 0)
|
|
|
|
```
|
|
|
|
|
|
|
|
After:
|
|
|
|
```
|
|
|
|
Time.new(2017, 9, 16, 17, 0).prev_month # => 2017-08-16 17:00:00 +0300
|
|
|
|
Time.new(2017, 9, 16, 17, 0).prev_month(1) # => 2017-08-16 17:00:00 +0300
|
|
|
|
|
|
|
|
Time.new(2017, 9, 16, 17, 0).next_month # => 2017-10-16 17:00:00 +0300
|
|
|
|
Time.new(2017, 9, 16, 17, 0).next_month(1) # => 2017-10-16 17:00:00 +0300
|
|
|
|
```
|
|
|
|
|
|
|
|
*bogdanvlviv*
|
|
|
|
|
2017-09-16 10:33:53 -04:00
|
|
|
* Add same method signature for `Time#prev_day` and `Time#next_day`
|
|
|
|
in accordance with `Date#prev_day`, `Date#next_day`.
|
|
|
|
|
|
|
|
Allows pass argument for `Time#prev_day` and `Time#next_day`.
|
|
|
|
|
|
|
|
Before:
|
|
|
|
```
|
|
|
|
Time.new(2017, 9, 16, 17, 0).prev_day # => 2017-09-15 17:00:00 +0300
|
|
|
|
Time.new(2017, 9, 16, 17, 0).prev_day(1)
|
|
|
|
# => ArgumentError: wrong number of arguments (given 1, expected 0)
|
|
|
|
|
|
|
|
Time.new(2017, 9, 16, 17, 0).next_day # => 2017-09-17 17:00:00 +0300
|
|
|
|
Time.new(2017, 9, 16, 17, 0).next_day(1)
|
|
|
|
# => ArgumentError: wrong number of arguments (given 1, expected 0)
|
|
|
|
```
|
|
|
|
|
|
|
|
After:
|
|
|
|
```
|
|
|
|
Time.new(2017, 9, 16, 17, 0).prev_day # => 2017-09-15 17:00:00 +0300
|
|
|
|
Time.new(2017, 9, 16, 17, 0).prev_day(1) # => 2017-09-15 17:00:00 +0300
|
|
|
|
|
|
|
|
Time.new(2017, 9, 16, 17, 0).next_day # => 2017-09-17 17:00:00 +0300
|
|
|
|
Time.new(2017, 9, 16, 17, 0).next_day(1) # => 2017-09-17 17:00:00 +0300
|
|
|
|
```
|
|
|
|
|
|
|
|
*bogdanvlviv*
|
|
|
|
|
2017-10-23 05:47:31 -04:00
|
|
|
* `IO#to_json` now returns the `to_s` representation, rather than
|
|
|
|
attempting to convert to an array. This fixes a bug where `IO#to_json`
|
|
|
|
would raise an `IOError` when called on an unreadable object.
|
|
|
|
|
|
|
|
Fixes #26132.
|
|
|
|
|
|
|
|
*Paul Kuruvilla*
|
|
|
|
|
2017-10-19 16:22:41 -04:00
|
|
|
* Remove deprecated `halt_callback_chains_on_return_false` option.
|
|
|
|
|
|
|
|
*Rafael Mendonça França*
|
|
|
|
|
2017-10-19 16:17:48 -04:00
|
|
|
* Remove deprecated `:if` and `:unless` string filter for callbacks.
|
|
|
|
|
|
|
|
*Rafael Mendonça França*
|
|
|
|
|
2017-10-21 04:24:18 -04:00
|
|
|
* `Hash#slice` now falls back to Ruby 2.5+'s built-in definition if defined.
|
|
|
|
|
|
|
|
*Akira Matsuda*
|
|
|
|
|
2017-09-28 14:04:46 -04:00
|
|
|
* Deprecate `secrets.secret_token`.
|
|
|
|
|
|
|
|
The architecture for secrets had a big upgrade between Rails 3 and Rails 4,
|
|
|
|
when the default changed from using `secret_token` to `secret_key_base`.
|
|
|
|
|
|
|
|
`secret_token` has been soft deprecated in documentation for four years
|
|
|
|
but is still in place to support apps created before Rails 4.
|
|
|
|
Deprecation warnings have been added to help developers upgrade their
|
|
|
|
applications to `secret_key_base`.
|
|
|
|
|
|
|
|
*claudiob*, *Kasper Timm Hansen*
|
|
|
|
|
2017-09-27 00:18:34 -04:00
|
|
|
* Return an instance of `HashWithIndifferentAccess` from `HashWithIndifferentAccess#transform_keys`.
|
|
|
|
|
|
|
|
*Yuji Yaginuma*
|
|
|
|
|
2017-09-23 17:16:21 -04:00
|
|
|
* Add key rotation support to `MessageEncryptor` and `MessageVerifier`
|
|
|
|
|
|
|
|
This change introduces a `rotate` method to both the `MessageEncryptor` and
|
|
|
|
`MessageVerifier` classes. This method accepts the same arguments and
|
|
|
|
options as the given classes' constructor. The `encrypt_and_verify` method
|
|
|
|
for `MessageEncryptor` and the `verified` method for `MessageVerifier` also
|
|
|
|
accept an optional keyword argument `:on_rotation` block which is called
|
|
|
|
when a rotated instance is used to decrypt or verify the message.
|
|
|
|
|
|
|
|
*Michael J Coyne*
|
|
|
|
|
2017-09-16 19:20:02 -04:00
|
|
|
* Deprecate `Module#reachable?` method.
|
|
|
|
|
|
|
|
*bogdanvlviv*
|
|
|
|
|
Add credentials using a generic EncryptedConfiguration class (#30067)
* WIP: Add credentials using a generic EncryptedConfiguration class
This is sketch code so far.
* Flesh out EncryptedConfiguration and test it
* Better name
* Add command and generator for credentials
* Use the Pathnames
* Extract EncryptedFile from EncryptedConfiguration and add serializers
* Test EncryptedFile
* Extract serializer validation
* Stress the point about losing comments
* Allow encrypted configuration to be read without parsing for display
* Use credentials by default and base them on the master key
* Derive secret_key_base in test/dev, source it from credentials in other envs
And document the usage.
* Document the new credentials setup
* Stop generating the secrets.yml file now that we have credentials
* Document what we should have instead
Still need to make it happen, tho.
* [ci skip] Keep wording to `key base`; prefer defaults.
Usually we say we change defaults, not "spec" out a release.
Can't use backticks in our sdoc generated documentation either.
* Abstract away OpenSSL; prefer MessageEncryptor.
* Spare needless new when raising.
* Encrypted file test shouldn't depend on subclass.
* [ci skip] Some woordings.
* Ditch serializer future coding.
* I said flip it. Flip it good.
* [ci skip] Move require_master_key to the real production.rb.
* Add require_master_key to abort the boot process.
In case the master key is required in a certain environment
we should inspect that the key is there and abort if it isn't.
* Print missing key message and exit immediately.
Spares us a lengthy backtrace and prevents further execution.
I've verified the behavior in a test app, but couldn't figure the
test out as loading the app just exits immediately with:
```
/Users/kasperhansen/Documents/code/rails/activesupport/lib/active_support/testing/isolation.rb:23:in `load': marshal data too short (ArgumentError)
from /Users/kasperhansen/Documents/code/rails/activesupport/lib/active_support/testing/isolation.rb:23:in `run'
from /Users/kasperhansen/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/minitest-5.10.2/lib/minitest.rb:830:in `run_one_method'
from /Users/kasperhansen/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/minitest-5.10.2/lib/minitest/parallel.rb:32:in `block (2 levels) in start'
```
It's likely we need to capture and prevent the exit somehow.
Kernel.stub(:exit) didn't work. Leaving it for tomorrow.
* Fix require_master_key config test.
Loading the app would trigger the `exit 1` per require_master_key's
semantics, which then aborted the test.
Fork and wait for the child process to finish, then inspect the
exit status.
Also check we aborted because of a missing master key, so something
else didn't just abort the boot.
Much <3 to @tenderlove for the tip.
* Support reading/writing configs via methods.
* Skip needless deep symbolizing.
* Remove save; test config reader elsewhere.
* Move secret_key_base check to when we're reading it.
Otherwise we'll abort too soon since we don't assign the secret_key_base
to secrets anymore.
* Add missing string literal comments; require unneeded yaml require.
* ya ya ya, rubocop.
* Add master_key/credentials after bundle.
Then we can reuse the existing message on `rails new bc4`.
It'll look like:
```
Using web-console 3.5.1 from https://github.com/rails/web-console.git (at master@ce985eb)
Using rails 5.2.0.alpha from source at `/Users/kasperhansen/Documents/code/rails`
Using sass-rails 5.0.6
Bundle complete! 16 Gemfile dependencies, 72 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
Adding config/master.key to store the master encryption key: 97070158c44b4675b876373a6bc9d5a0
Save this in a password manager your team can access.
If you lose the key, no one, including you, can access anything encrypted with it.
create config/master.key
```
And that'll be executed even if `--skip-bundle` was passed.
* Ensure test app has secret_key_base.
* Assign secret_key_base to app or omit.
* Merge noise
* Split options for dynamic delegation into its own method and use deep symbols to make it work
* Update error to point to credentials instead
* Appease Rubocop
* Validate secret_key_base when reading it.
Instead of relying on the validation in key_generator move that into
secret_key_base itself.
* Fix generator and secrets test.
Manually add config.read_encrypted_secrets since it's not there by default
anymore.
Move mentions of config/secrets.yml to config/credentials.yml.enc.
* Remove files I have no idea how they got here.
* [ci skip] swap secrets for credentials.
* [ci skip] And now, changelogs are coming.
2017-09-11 14:21:20 -04:00
|
|
|
* Add `config/credentials.yml.enc` to store production app secrets.
|
|
|
|
|
|
|
|
Allows saving any authentication credentials for third party services
|
|
|
|
directly in repo encrypted with `config/master.key` or `ENV["RAILS_MASTER_KEY"]`.
|
|
|
|
|
|
|
|
This will eventually replace `Rails.application.secrets` and the encrypted
|
|
|
|
secrets introduced in Rails 5.1.
|
|
|
|
|
|
|
|
*DHH*, *Kasper Timm Hansen*
|
|
|
|
|
|
|
|
* Add `ActiveSupport::EncryptedFile` and `ActiveSupport::EncryptedConfiguration`.
|
|
|
|
|
|
|
|
Allows for stashing encrypted files or configuration directly in repo by
|
|
|
|
encrypting it with a key.
|
|
|
|
|
|
|
|
Backs the new credentials setup above, but can also be used independently.
|
|
|
|
|
|
|
|
*DHH*, *Kasper Timm Hansen*
|
|
|
|
|
2017-08-12 18:23:17 -04:00
|
|
|
* `Module#delegate_missing_to` now raises `DelegationError` if target is nil,
|
|
|
|
similar to `Module#delegate`.
|
|
|
|
|
|
|
|
*Anton Khamets*
|
|
|
|
|
2017-08-03 13:54:46 -04:00
|
|
|
* Update `String#camelize` to provide feedback when wrong option is passed
|
2017-08-02 01:10:36 -04:00
|
|
|
|
2017-08-03 13:54:46 -04:00
|
|
|
`String#camelize` was returning nil without any feedback when an
|
2017-08-06 22:29:07 -04:00
|
|
|
invalid option was passed as a parameter.
|
2017-08-02 01:10:36 -04:00
|
|
|
|
|
|
|
Previously:
|
|
|
|
|
|
|
|
'one_two'.camelize(true)
|
2017-10-03 18:27:33 -04:00
|
|
|
# => nil
|
2017-08-02 01:10:36 -04:00
|
|
|
|
|
|
|
Now:
|
|
|
|
|
|
|
|
'one_two'.camelize(true)
|
2017-10-03 18:27:33 -04:00
|
|
|
# => ArgumentError: Invalid option, use either :upper or :lower.
|
2017-08-02 01:10:36 -04:00
|
|
|
|
|
|
|
*Ricardo Díaz*
|
|
|
|
|
2017-06-28 10:08:02 -04:00
|
|
|
* Fix modulo operations involving durations
|
|
|
|
|
2017-08-06 22:29:07 -04:00
|
|
|
Rails 5.1 introduced `ActiveSupport::Duration::Scalar` as a wrapper
|
|
|
|
around numeric values as a way of ensuring a duration was the outcome of
|
|
|
|
an expression. However, the implementation was missing support for modulo
|
2017-06-28 10:08:02 -04:00
|
|
|
operations. This support has now been added and should result in a duration
|
|
|
|
being returned from expressions involving modulo operations.
|
|
|
|
|
|
|
|
Prior to Rails 5.1:
|
|
|
|
|
|
|
|
5.minutes % 2.minutes
|
2017-10-03 18:27:33 -04:00
|
|
|
# => 60
|
2017-06-28 10:08:02 -04:00
|
|
|
|
|
|
|
Now:
|
|
|
|
|
|
|
|
5.minutes % 2.minutes
|
2017-10-03 18:27:33 -04:00
|
|
|
# => 1 minute
|
2017-06-28 10:08:02 -04:00
|
|
|
|
|
|
|
Fixes #29603 and #29743.
|
|
|
|
|
|
|
|
*Sayan Chakraborty*, *Andrew White*
|
|
|
|
|
2017-07-27 07:30:17 -04:00
|
|
|
* Fix division where a duration is the denominator
|
|
|
|
|
|
|
|
PR #29163 introduced a change in behavior when a duration was the denominator
|
|
|
|
in a calculation - this was incorrect as dividing by a duration should always
|
|
|
|
return a `Numeric`. The behavior of previous versions of Rails has been restored.
|
|
|
|
|
|
|
|
Fixes #29592.
|
|
|
|
|
|
|
|
*Andrew White*
|
|
|
|
|
2017-07-24 04:25:57 -04:00
|
|
|
* Add purpose and expiry support to `ActiveSupport::MessageVerifier` &
|
|
|
|
`ActiveSupport::MessageEncryptor`.
|
2017-07-24 04:00:42 -04:00
|
|
|
|
|
|
|
For instance, to ensure a message is only usable for one intended purpose:
|
|
|
|
|
|
|
|
token = @verifier.generate("x", purpose: :shipping)
|
|
|
|
|
|
|
|
@verifier.verified(token, purpose: :shipping) # => "x"
|
|
|
|
@verifier.verified(token) # => nil
|
|
|
|
|
|
|
|
Or make it expire after a set time:
|
|
|
|
|
|
|
|
@verifier.generate("x", expires_in: 1.month)
|
|
|
|
@verifier.generate("y", expires_at: Time.now.end_of_year)
|
|
|
|
|
|
|
|
Showcased with `ActiveSupport::MessageVerifier`, but works the same for
|
|
|
|
`ActiveSupport::MessageEncryptor`'s `encrypt_and_sign` and `decrypt_and_verify`.
|
|
|
|
|
|
|
|
Pull requests: #29599, #29854
|
|
|
|
|
|
|
|
*Assain Jaleel*
|
|
|
|
|
2017-03-06 02:31:53 -05:00
|
|
|
* Make the order of `Hash#reverse_merge!` consistent with `HashWithIndifferentAccess`.
|
|
|
|
|
|
|
|
*Erol Fornoles*
|
|
|
|
|
2017-07-10 06:13:37 -04:00
|
|
|
* Add `freeze_time` helper which freezes time to `Time.now` in tests.
|
2017-03-03 15:14:22 -05:00
|
|
|
|
2017-07-10 06:13:37 -04:00
|
|
|
*Prathamesh Sonpatki*
|
Deprecate implicit coercion of `ActiveSupport::Duration`
Currently `ActiveSupport::Duration` implicitly converts to a seconds
value when used in a calculation except for the explicit examples of
addition and subtraction where the duration is the receiver, e.g:
>> 2 * 1.day
=> 172800
This results in lots of confusion especially when using durations
with dates because adding/subtracting a value from a date treats
integers as a day and not a second, e.g:
>> Date.today
=> Wed, 01 Mar 2017
>> Date.today + 2 * 1.day
=> Mon, 10 Apr 2490
To fix this we're implementing `coerce` so that we can provide a
deprecation warning with the intent of removing the implicit coercion
in Rails 5.2, e.g:
>> 2 * 1.day
DEPRECATION WARNING: Implicit coercion of ActiveSupport::Duration
to a Numeric is deprecated and will raise a TypeError in Rails 5.2.
=> 172800
In Rails 5.2 it will raise `TypeError`, e.g:
>> 2 * 1.day
TypeError: ActiveSupport::Duration can't be coerced into Integer
This is the same behavior as with other types in Ruby, e.g:
>> 2 * "foo"
TypeError: String can't be coerced into Integer
>> "foo" * 2
=> "foofoo"
As part of this deprecation add `*` and `/` methods to `AS::Duration`
so that calculations that keep the duration as the receiver work
correctly whether the final receiver is a `Date` or `Time`, e.g:
>> Date.today
=> Wed, 01 Mar 2017
>> Date.today + 1.day * 2
=> Fri, 03 Mar 2017
Fixes #27457.
2017-02-27 13:31:35 -05:00
|
|
|
|
2017-06-11 15:48:58 -04:00
|
|
|
* Default `ActiveSupport::MessageEncryptor` to use AES 256 GCM encryption.
|
Deprecate implicit coercion of `ActiveSupport::Duration`
Currently `ActiveSupport::Duration` implicitly converts to a seconds
value when used in a calculation except for the explicit examples of
addition and subtraction where the duration is the receiver, e.g:
>> 2 * 1.day
=> 172800
This results in lots of confusion especially when using durations
with dates because adding/subtracting a value from a date treats
integers as a day and not a second, e.g:
>> Date.today
=> Wed, 01 Mar 2017
>> Date.today + 2 * 1.day
=> Mon, 10 Apr 2490
To fix this we're implementing `coerce` so that we can provide a
deprecation warning with the intent of removing the implicit coercion
in Rails 5.2, e.g:
>> 2 * 1.day
DEPRECATION WARNING: Implicit coercion of ActiveSupport::Duration
to a Numeric is deprecated and will raise a TypeError in Rails 5.2.
=> 172800
In Rails 5.2 it will raise `TypeError`, e.g:
>> 2 * 1.day
TypeError: ActiveSupport::Duration can't be coerced into Integer
This is the same behavior as with other types in Ruby, e.g:
>> 2 * "foo"
TypeError: String can't be coerced into Integer
>> "foo" * 2
=> "foofoo"
As part of this deprecation add `*` and `/` methods to `AS::Duration`
so that calculations that keep the duration as the receiver work
correctly whether the final receiver is a `Date` or `Time`, e.g:
>> Date.today
=> Wed, 01 Mar 2017
>> Date.today + 1.day * 2
=> Fri, 03 Mar 2017
Fixes #27457.
2017-02-27 13:31:35 -05:00
|
|
|
|
2017-06-11 15:48:58 -04:00
|
|
|
On for new Rails 5.2 apps. Upgrading apps can find the config as a new
|
|
|
|
framework default.
|
Deprecate implicit coercion of `ActiveSupport::Duration`
Currently `ActiveSupport::Duration` implicitly converts to a seconds
value when used in a calculation except for the explicit examples of
addition and subtraction where the duration is the receiver, e.g:
>> 2 * 1.day
=> 172800
This results in lots of confusion especially when using durations
with dates because adding/subtracting a value from a date treats
integers as a day and not a second, e.g:
>> Date.today
=> Wed, 01 Mar 2017
>> Date.today + 2 * 1.day
=> Mon, 10 Apr 2490
To fix this we're implementing `coerce` so that we can provide a
deprecation warning with the intent of removing the implicit coercion
in Rails 5.2, e.g:
>> 2 * 1.day
DEPRECATION WARNING: Implicit coercion of ActiveSupport::Duration
to a Numeric is deprecated and will raise a TypeError in Rails 5.2.
=> 172800
In Rails 5.2 it will raise `TypeError`, e.g:
>> 2 * 1.day
TypeError: ActiveSupport::Duration can't be coerced into Integer
This is the same behavior as with other types in Ruby, e.g:
>> 2 * "foo"
TypeError: String can't be coerced into Integer
>> "foo" * 2
=> "foofoo"
As part of this deprecation add `*` and `/` methods to `AS::Duration`
so that calculations that keep the duration as the receiver work
correctly whether the final receiver is a `Date` or `Time`, e.g:
>> Date.today
=> Wed, 01 Mar 2017
>> Date.today + 1.day * 2
=> Fri, 03 Mar 2017
Fixes #27457.
2017-02-27 13:31:35 -05:00
|
|
|
|
2017-06-11 15:48:58 -04:00
|
|
|
*Assain Jaleel*
|
Deprecate implicit coercion of `ActiveSupport::Duration`
Currently `ActiveSupport::Duration` implicitly converts to a seconds
value when used in a calculation except for the explicit examples of
addition and subtraction where the duration is the receiver, e.g:
>> 2 * 1.day
=> 172800
This results in lots of confusion especially when using durations
with dates because adding/subtracting a value from a date treats
integers as a day and not a second, e.g:
>> Date.today
=> Wed, 01 Mar 2017
>> Date.today + 2 * 1.day
=> Mon, 10 Apr 2490
To fix this we're implementing `coerce` so that we can provide a
deprecation warning with the intent of removing the implicit coercion
in Rails 5.2, e.g:
>> 2 * 1.day
DEPRECATION WARNING: Implicit coercion of ActiveSupport::Duration
to a Numeric is deprecated and will raise a TypeError in Rails 5.2.
=> 172800
In Rails 5.2 it will raise `TypeError`, e.g:
>> 2 * 1.day
TypeError: ActiveSupport::Duration can't be coerced into Integer
This is the same behavior as with other types in Ruby, e.g:
>> 2 * "foo"
TypeError: String can't be coerced into Integer
>> "foo" * 2
=> "foofoo"
As part of this deprecation add `*` and `/` methods to `AS::Duration`
so that calculations that keep the duration as the receiver work
correctly whether the final receiver is a `Date` or `Time`, e.g:
>> Date.today
=> Wed, 01 Mar 2017
>> Date.today + 1.day * 2
=> Fri, 03 Mar 2017
Fixes #27457.
2017-02-27 13:31:35 -05:00
|
|
|
|
2017-06-06 19:39:20 -04:00
|
|
|
* Cache: `write_multi`
|
Deprecate implicit coercion of `ActiveSupport::Duration`
Currently `ActiveSupport::Duration` implicitly converts to a seconds
value when used in a calculation except for the explicit examples of
addition and subtraction where the duration is the receiver, e.g:
>> 2 * 1.day
=> 172800
This results in lots of confusion especially when using durations
with dates because adding/subtracting a value from a date treats
integers as a day and not a second, e.g:
>> Date.today
=> Wed, 01 Mar 2017
>> Date.today + 2 * 1.day
=> Mon, 10 Apr 2490
To fix this we're implementing `coerce` so that we can provide a
deprecation warning with the intent of removing the implicit coercion
in Rails 5.2, e.g:
>> 2 * 1.day
DEPRECATION WARNING: Implicit coercion of ActiveSupport::Duration
to a Numeric is deprecated and will raise a TypeError in Rails 5.2.
=> 172800
In Rails 5.2 it will raise `TypeError`, e.g:
>> 2 * 1.day
TypeError: ActiveSupport::Duration can't be coerced into Integer
This is the same behavior as with other types in Ruby, e.g:
>> 2 * "foo"
TypeError: String can't be coerced into Integer
>> "foo" * 2
=> "foofoo"
As part of this deprecation add `*` and `/` methods to `AS::Duration`
so that calculations that keep the duration as the receiver work
correctly whether the final receiver is a `Date` or `Time`, e.g:
>> Date.today
=> Wed, 01 Mar 2017
>> Date.today + 1.day * 2
=> Fri, 03 Mar 2017
Fixes #27457.
2017-02-27 13:31:35 -05:00
|
|
|
|
2017-06-06 19:39:20 -04:00
|
|
|
Rails.cache.write_multi foo: 'bar', baz: 'qux'
|
Deprecate implicit coercion of `ActiveSupport::Duration`
Currently `ActiveSupport::Duration` implicitly converts to a seconds
value when used in a calculation except for the explicit examples of
addition and subtraction where the duration is the receiver, e.g:
>> 2 * 1.day
=> 172800
This results in lots of confusion especially when using durations
with dates because adding/subtracting a value from a date treats
integers as a day and not a second, e.g:
>> Date.today
=> Wed, 01 Mar 2017
>> Date.today + 2 * 1.day
=> Mon, 10 Apr 2490
To fix this we're implementing `coerce` so that we can provide a
deprecation warning with the intent of removing the implicit coercion
in Rails 5.2, e.g:
>> 2 * 1.day
DEPRECATION WARNING: Implicit coercion of ActiveSupport::Duration
to a Numeric is deprecated and will raise a TypeError in Rails 5.2.
=> 172800
In Rails 5.2 it will raise `TypeError`, e.g:
>> 2 * 1.day
TypeError: ActiveSupport::Duration can't be coerced into Integer
This is the same behavior as with other types in Ruby, e.g:
>> 2 * "foo"
TypeError: String can't be coerced into Integer
>> "foo" * 2
=> "foofoo"
As part of this deprecation add `*` and `/` methods to `AS::Duration`
so that calculations that keep the duration as the receiver work
correctly whether the final receiver is a `Date` or `Time`, e.g:
>> Date.today
=> Wed, 01 Mar 2017
>> Date.today + 1.day * 2
=> Fri, 03 Mar 2017
Fixes #27457.
2017-02-27 13:31:35 -05:00
|
|
|
|
2017-06-06 19:39:20 -04:00
|
|
|
Plus faster fetch_multi with stores that implement `write_multi_entries`.
|
|
|
|
Keys that aren't found may be written to the cache store in one shot
|
|
|
|
instead of separate writes.
|
Deprecate implicit coercion of `ActiveSupport::Duration`
Currently `ActiveSupport::Duration` implicitly converts to a seconds
value when used in a calculation except for the explicit examples of
addition and subtraction where the duration is the receiver, e.g:
>> 2 * 1.day
=> 172800
This results in lots of confusion especially when using durations
with dates because adding/subtracting a value from a date treats
integers as a day and not a second, e.g:
>> Date.today
=> Wed, 01 Mar 2017
>> Date.today + 2 * 1.day
=> Mon, 10 Apr 2490
To fix this we're implementing `coerce` so that we can provide a
deprecation warning with the intent of removing the implicit coercion
in Rails 5.2, e.g:
>> 2 * 1.day
DEPRECATION WARNING: Implicit coercion of ActiveSupport::Duration
to a Numeric is deprecated and will raise a TypeError in Rails 5.2.
=> 172800
In Rails 5.2 it will raise `TypeError`, e.g:
>> 2 * 1.day
TypeError: ActiveSupport::Duration can't be coerced into Integer
This is the same behavior as with other types in Ruby, e.g:
>> 2 * "foo"
TypeError: String can't be coerced into Integer
>> "foo" * 2
=> "foofoo"
As part of this deprecation add `*` and `/` methods to `AS::Duration`
so that calculations that keep the duration as the receiver work
correctly whether the final receiver is a `Date` or `Time`, e.g:
>> Date.today
=> Wed, 01 Mar 2017
>> Date.today + 1.day * 2
=> Fri, 03 Mar 2017
Fixes #27457.
2017-02-27 13:31:35 -05:00
|
|
|
|
2017-06-06 19:39:20 -04:00
|
|
|
The default implementation simply calls `write_entry` for each entry.
|
|
|
|
Stores may override if they're capable of one-shot bulk writes, like
|
|
|
|
Redis `MSET`.
|
Deprecate implicit coercion of `ActiveSupport::Duration`
Currently `ActiveSupport::Duration` implicitly converts to a seconds
value when used in a calculation except for the explicit examples of
addition and subtraction where the duration is the receiver, e.g:
>> 2 * 1.day
=> 172800
This results in lots of confusion especially when using durations
with dates because adding/subtracting a value from a date treats
integers as a day and not a second, e.g:
>> Date.today
=> Wed, 01 Mar 2017
>> Date.today + 2 * 1.day
=> Mon, 10 Apr 2490
To fix this we're implementing `coerce` so that we can provide a
deprecation warning with the intent of removing the implicit coercion
in Rails 5.2, e.g:
>> 2 * 1.day
DEPRECATION WARNING: Implicit coercion of ActiveSupport::Duration
to a Numeric is deprecated and will raise a TypeError in Rails 5.2.
=> 172800
In Rails 5.2 it will raise `TypeError`, e.g:
>> 2 * 1.day
TypeError: ActiveSupport::Duration can't be coerced into Integer
This is the same behavior as with other types in Ruby, e.g:
>> 2 * "foo"
TypeError: String can't be coerced into Integer
>> "foo" * 2
=> "foofoo"
As part of this deprecation add `*` and `/` methods to `AS::Duration`
so that calculations that keep the duration as the receiver work
correctly whether the final receiver is a `Date` or `Time`, e.g:
>> Date.today
=> Wed, 01 Mar 2017
>> Date.today + 1.day * 2
=> Fri, 03 Mar 2017
Fixes #27457.
2017-02-27 13:31:35 -05:00
|
|
|
|
2017-06-06 19:39:20 -04:00
|
|
|
*Jeremy Daer*
|
Deprecate implicit coercion of `ActiveSupport::Duration`
Currently `ActiveSupport::Duration` implicitly converts to a seconds
value when used in a calculation except for the explicit examples of
addition and subtraction where the duration is the receiver, e.g:
>> 2 * 1.day
=> 172800
This results in lots of confusion especially when using durations
with dates because adding/subtracting a value from a date treats
integers as a day and not a second, e.g:
>> Date.today
=> Wed, 01 Mar 2017
>> Date.today + 2 * 1.day
=> Mon, 10 Apr 2490
To fix this we're implementing `coerce` so that we can provide a
deprecation warning with the intent of removing the implicit coercion
in Rails 5.2, e.g:
>> 2 * 1.day
DEPRECATION WARNING: Implicit coercion of ActiveSupport::Duration
to a Numeric is deprecated and will raise a TypeError in Rails 5.2.
=> 172800
In Rails 5.2 it will raise `TypeError`, e.g:
>> 2 * 1.day
TypeError: ActiveSupport::Duration can't be coerced into Integer
This is the same behavior as with other types in Ruby, e.g:
>> 2 * "foo"
TypeError: String can't be coerced into Integer
>> "foo" * 2
=> "foofoo"
As part of this deprecation add `*` and `/` methods to `AS::Duration`
so that calculations that keep the duration as the receiver work
correctly whether the final receiver is a `Date` or `Time`, e.g:
>> Date.today
=> Wed, 01 Mar 2017
>> Date.today + 1.day * 2
=> Fri, 03 Mar 2017
Fixes #27457.
2017-02-27 13:31:35 -05:00
|
|
|
|
2017-05-30 09:16:19 -04:00
|
|
|
* Add default option to module and class attribute accessors.
|
2017-03-01 13:13:15 -05:00
|
|
|
|
2017-06-05 23:03:37 -04:00
|
|
|
mattr_accessor :settings, default: {}
|
2017-03-01 13:13:15 -05:00
|
|
|
|
2017-05-30 09:16:19 -04:00
|
|
|
Works for `mattr_reader`, `mattr_writer`, `cattr_accessor`, `cattr_reader`,
|
|
|
|
and `cattr_writer` as well.
|
2017-03-01 13:13:15 -05:00
|
|
|
|
2017-05-30 09:16:19 -04:00
|
|
|
*Genadi Samokovarov*
|
2017-03-01 13:13:15 -05:00
|
|
|
|
2017-05-30 07:13:29 -04:00
|
|
|
* Add `Date#prev_occurring` and `Date#next_occurring` to return specified next/previous occurring day of week.
|
2017-03-01 13:13:15 -05:00
|
|
|
|
2017-05-30 07:13:29 -04:00
|
|
|
*Shota Iguchi*
|
2017-02-22 02:45:48 -05:00
|
|
|
|
2017-06-05 23:03:37 -04:00
|
|
|
* Add default option to `class_attribute`.
|
2017-02-22 02:45:48 -05:00
|
|
|
|
|
|
|
Before:
|
|
|
|
|
2017-05-29 19:46:01 -04:00
|
|
|
class_attribute :settings
|
|
|
|
self.settings = {}
|
2017-02-22 03:29:58 -05:00
|
|
|
|
2017-05-29 12:01:50 -04:00
|
|
|
Now:
|
2017-02-07 10:24:46 -05:00
|
|
|
|
2017-05-29 19:46:01 -04:00
|
|
|
class_attribute :settings, default: {}
|
2017-02-07 10:24:46 -05:00
|
|
|
|
2017-05-29 12:01:50 -04:00
|
|
|
*DHH*
|
2017-02-07 10:13:15 -05:00
|
|
|
|
2017-05-28 09:23:42 -04:00
|
|
|
* `#singularize` and `#pluralize` now respect uncountables for the specified locale.
|
2017-02-07 10:13:15 -05:00
|
|
|
|
2017-05-09 17:50:47 -04:00
|
|
|
*Eilis Hamilton*
|
2017-01-18 18:50:35 -05:00
|
|
|
|
2017-05-29 19:44:39 -04:00
|
|
|
* Add `ActiveSupport::CurrentAttributes` to provide a thread-isolated attributes singleton.
|
2017-05-26 14:00:27 -04:00
|
|
|
Primary use case is keeping all the per-request attributes easily available to the whole system.
|
2017-01-18 18:50:35 -05:00
|
|
|
|
2017-05-26 14:00:27 -04:00
|
|
|
*DHH*
|
2017-01-08 05:45:58 -05:00
|
|
|
|
Fix implicit calculations with scalars and durations
Previously calculations where the scalar is first would be converted
to a duration of seconds but this causes issues with dates being
converted to times, e.g:
Time.zone = "Beijing" # => Asia/Shanghai
date = Date.civil(2017, 5, 20) # => Mon, 20 May 2017
2 * 1.day # => 172800 seconds
date + 2 * 1.day # => Mon, 22 May 2017 00:00:00 CST +08:00
Now the `ActiveSupport::Duration::Scalar` calculation methods will try
to maintain the part structure of the duration where possible, e.g:
Time.zone = "Beijing" # => Asia/Shanghai
date = Date.civil(2017, 5, 20) # => Mon, 20 May 2017
2 * 1.day # => 2 days
date + 2 * 1.day # => Mon, 22 May 2017
Fixes #29160, #28970.
2017-05-20 11:33:09 -04:00
|
|
|
* Fix implicit coercion calculations with scalars and durations
|
2017-01-08 05:45:58 -05:00
|
|
|
|
2017-08-06 22:29:07 -04:00
|
|
|
Previously, calculations where the scalar is first would be converted to a duration
|
|
|
|
of seconds, but this causes issues with dates being converted to times, e.g:
|
2017-01-26 04:15:37 -05:00
|
|
|
|
Fix implicit calculations with scalars and durations
Previously calculations where the scalar is first would be converted
to a duration of seconds but this causes issues with dates being
converted to times, e.g:
Time.zone = "Beijing" # => Asia/Shanghai
date = Date.civil(2017, 5, 20) # => Mon, 20 May 2017
2 * 1.day # => 172800 seconds
date + 2 * 1.day # => Mon, 22 May 2017 00:00:00 CST +08:00
Now the `ActiveSupport::Duration::Scalar` calculation methods will try
to maintain the part structure of the duration where possible, e.g:
Time.zone = "Beijing" # => Asia/Shanghai
date = Date.civil(2017, 5, 20) # => Mon, 20 May 2017
2 * 1.day # => 2 days
date + 2 * 1.day # => Mon, 22 May 2017
Fixes #29160, #28970.
2017-05-20 11:33:09 -04:00
|
|
|
Time.zone = "Beijing" # => Asia/Shanghai
|
|
|
|
date = Date.civil(2017, 5, 20) # => Mon, 20 May 2017
|
|
|
|
2 * 1.day # => 172800 seconds
|
|
|
|
date + 2 * 1.day # => Mon, 22 May 2017 00:00:00 CST +08:00
|
2017-01-26 04:15:37 -05:00
|
|
|
|
2017-08-06 22:29:07 -04:00
|
|
|
Now, the `ActiveSupport::Duration::Scalar` calculation methods will try to maintain
|
Fix implicit calculations with scalars and durations
Previously calculations where the scalar is first would be converted
to a duration of seconds but this causes issues with dates being
converted to times, e.g:
Time.zone = "Beijing" # => Asia/Shanghai
date = Date.civil(2017, 5, 20) # => Mon, 20 May 2017
2 * 1.day # => 172800 seconds
date + 2 * 1.day # => Mon, 22 May 2017 00:00:00 CST +08:00
Now the `ActiveSupport::Duration::Scalar` calculation methods will try
to maintain the part structure of the duration where possible, e.g:
Time.zone = "Beijing" # => Asia/Shanghai
date = Date.civil(2017, 5, 20) # => Mon, 20 May 2017
2 * 1.day # => 2 days
date + 2 * 1.day # => Mon, 22 May 2017
Fixes #29160, #28970.
2017-05-20 11:33:09 -04:00
|
|
|
the part structure of the duration where possible, e.g:
|
2017-01-26 04:15:37 -05:00
|
|
|
|
Fix implicit calculations with scalars and durations
Previously calculations where the scalar is first would be converted
to a duration of seconds but this causes issues with dates being
converted to times, e.g:
Time.zone = "Beijing" # => Asia/Shanghai
date = Date.civil(2017, 5, 20) # => Mon, 20 May 2017
2 * 1.day # => 172800 seconds
date + 2 * 1.day # => Mon, 22 May 2017 00:00:00 CST +08:00
Now the `ActiveSupport::Duration::Scalar` calculation methods will try
to maintain the part structure of the duration where possible, e.g:
Time.zone = "Beijing" # => Asia/Shanghai
date = Date.civil(2017, 5, 20) # => Mon, 20 May 2017
2 * 1.day # => 2 days
date + 2 * 1.day # => Mon, 22 May 2017
Fixes #29160, #28970.
2017-05-20 11:33:09 -04:00
|
|
|
Time.zone = "Beijing" # => Asia/Shanghai
|
|
|
|
date = Date.civil(2017, 5, 20) # => Mon, 20 May 2017
|
|
|
|
2 * 1.day # => 2 days
|
|
|
|
date + 2 * 1.day # => Mon, 22 May 2017
|
2017-01-26 04:15:37 -05:00
|
|
|
|
Fix implicit calculations with scalars and durations
Previously calculations where the scalar is first would be converted
to a duration of seconds but this causes issues with dates being
converted to times, e.g:
Time.zone = "Beijing" # => Asia/Shanghai
date = Date.civil(2017, 5, 20) # => Mon, 20 May 2017
2 * 1.day # => 172800 seconds
date + 2 * 1.day # => Mon, 22 May 2017 00:00:00 CST +08:00
Now the `ActiveSupport::Duration::Scalar` calculation methods will try
to maintain the part structure of the duration where possible, e.g:
Time.zone = "Beijing" # => Asia/Shanghai
date = Date.civil(2017, 5, 20) # => Mon, 20 May 2017
2 * 1.day # => 2 days
date + 2 * 1.day # => Mon, 22 May 2017
Fixes #29160, #28970.
2017-05-20 11:33:09 -04:00
|
|
|
Fixes #29160, #28970.
|
2016-11-13 18:25:05 -05:00
|
|
|
|
|
|
|
*Andrew White*
|
|
|
|
|
2017-05-18 12:12:32 -04:00
|
|
|
* Add support for versioned cache entries. This enables the cache stores to recycle cache keys, greatly saving
|
2017-05-18 19:28:15 -04:00
|
|
|
on storage in cases with frequent churn. Works together with the separation of `#cache_key` and `#cache_version`
|
2017-05-18 12:12:32 -04:00
|
|
|
in Active Record and its use in Action Pack's fragment caching.
|
2016-11-13 18:25:05 -05:00
|
|
|
|
2017-05-18 12:12:32 -04:00
|
|
|
*DHH*
|
2016-11-13 18:25:05 -05:00
|
|
|
|
2017-04-19 14:50:25 -04:00
|
|
|
* Pass gem name and deprecation horizon to deprecation notifications.
|
2016-11-13 18:25:05 -05:00
|
|
|
|
2017-04-19 14:50:25 -04:00
|
|
|
*Willem van Bergen*
|
2016-11-13 18:25:05 -05:00
|
|
|
|
2017-04-14 13:04:13 -04:00
|
|
|
* Add support for `:offset` and `:zone` to `ActiveSupport::TimeWithZone#change`
|
2016-11-13 18:25:05 -05:00
|
|
|
|
|
|
|
*Andrew White*
|
|
|
|
|
2017-04-14 13:04:13 -04:00
|
|
|
* Add support for `:offset` to `Time#change`
|
2016-11-13 18:25:05 -05:00
|
|
|
|
2017-04-14 13:04:13 -04:00
|
|
|
Fixes #28723.
|
2016-11-13 18:25:05 -05:00
|
|
|
|
|
|
|
*Andrew White*
|
|
|
|
|
2017-04-09 20:50:13 -04:00
|
|
|
* Add `fetch_values` for `HashWithIndifferentAccess`
|
2016-11-13 18:25:05 -05:00
|
|
|
|
2017-04-09 20:50:13 -04:00
|
|
|
The method was originally added to `Hash` in Ruby 2.3.0.
|
2016-11-13 18:25:05 -05:00
|
|
|
|
2017-04-09 20:50:13 -04:00
|
|
|
*Josh Pencheon*
|
2016-11-13 18:25:05 -05:00
|
|
|
|
2016-05-06 17:54:40 -04:00
|
|
|
|
2017-04-11 18:52:02 -04:00
|
|
|
Please check [5-1-stable](https://github.com/rails/rails/blob/5-1-stable/activesupport/CHANGELOG.md) for previous changes.
|