activesupport 5.2.4 → 6.0.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of activesupport might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +331 -396
- data/MIT-LICENSE +1 -1
- data/README.rdoc +3 -2
- data/lib/active_support.rb +2 -1
- data/lib/active_support/actionable_error.rb +48 -0
- data/lib/active_support/backtrace_cleaner.rb +28 -1
- data/lib/active_support/cache.rb +45 -23
- data/lib/active_support/cache/file_store.rb +22 -22
- data/lib/active_support/cache/mem_cache_store.rb +5 -0
- data/lib/active_support/cache/memory_store.rb +7 -2
- data/lib/active_support/cache/null_store.rb +5 -0
- data/lib/active_support/cache/redis_cache_store.rb +36 -9
- data/lib/active_support/callbacks.rb +16 -5
- data/lib/active_support/concern.rb +24 -1
- data/lib/active_support/configurable.rb +7 -11
- data/lib/active_support/core_ext/array.rb +1 -1
- data/lib/active_support/core_ext/array/access.rb +18 -6
- data/lib/active_support/core_ext/array/extract.rb +21 -0
- data/lib/active_support/core_ext/array/prepend_and_append.rb +2 -6
- data/lib/active_support/core_ext/class/attribute.rb +11 -16
- data/lib/active_support/core_ext/class/subclasses.rb +1 -1
- data/lib/active_support/core_ext/date/calculations.rb +6 -5
- data/lib/active_support/core_ext/date_and_time/calculations.rb +24 -47
- data/lib/active_support/core_ext/date_time/calculations.rb +1 -1
- data/lib/active_support/core_ext/enumerable.rb +97 -73
- data/lib/active_support/core_ext/hash.rb +1 -2
- data/lib/active_support/core_ext/hash/compact.rb +2 -26
- data/lib/active_support/core_ext/hash/deep_transform_values.rb +46 -0
- data/lib/active_support/core_ext/hash/except.rb +1 -1
- data/lib/active_support/core_ext/hash/keys.rb +0 -29
- data/lib/active_support/core_ext/hash/slice.rb +3 -25
- data/lib/active_support/core_ext/hash/transform_values.rb +2 -29
- data/lib/active_support/core_ext/integer/multiple.rb +1 -1
- data/lib/active_support/core_ext/kernel.rb +0 -1
- data/lib/active_support/core_ext/load_error.rb +1 -1
- data/lib/active_support/core_ext/module.rb +0 -1
- data/lib/active_support/core_ext/module/attribute_accessors.rb +7 -10
- data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +13 -19
- data/lib/active_support/core_ext/module/delegation.rb +33 -7
- data/lib/active_support/core_ext/module/introspection.rb +37 -13
- data/lib/active_support/core_ext/module/reachable.rb +1 -6
- data/lib/active_support/core_ext/module/redefine_method.rb +8 -17
- data/lib/active_support/core_ext/numeric.rb +0 -1
- data/lib/active_support/core_ext/numeric/conversions.rb +124 -128
- data/lib/active_support/core_ext/numeric/inquiry.rb +2 -25
- data/lib/active_support/core_ext/object/blank.rb +1 -2
- data/lib/active_support/core_ext/object/duplicable.rb +7 -114
- data/lib/active_support/core_ext/object/json.rb +1 -0
- data/lib/active_support/core_ext/object/try.rb +15 -7
- data/lib/active_support/core_ext/object/with_options.rb +1 -1
- data/lib/active_support/core_ext/range/compare_range.rb +22 -13
- data/lib/active_support/core_ext/range/conversions.rb +31 -29
- data/lib/active_support/core_ext/range/include_range.rb +6 -0
- data/lib/active_support/core_ext/regexp.rb +0 -4
- data/lib/active_support/core_ext/securerandom.rb +23 -3
- data/lib/active_support/core_ext/string/access.rb +8 -0
- data/lib/active_support/core_ext/string/filters.rb +42 -1
- data/lib/active_support/core_ext/string/inflections.rb +7 -2
- data/lib/active_support/core_ext/string/multibyte.rb +4 -3
- data/lib/active_support/core_ext/string/output_safety.rb +61 -5
- data/lib/active_support/core_ext/string/strip.rb +3 -1
- data/lib/active_support/core_ext/time/calculations.rb +31 -2
- data/lib/active_support/core_ext/uri.rb +1 -0
- data/lib/active_support/current_attributes.rb +8 -0
- data/lib/active_support/dependencies.rb +69 -16
- data/lib/active_support/dependencies/zeitwerk_integration.rb +110 -0
- data/lib/active_support/deprecation.rb +1 -1
- data/lib/active_support/deprecation/behaviors.rb +1 -1
- data/lib/active_support/deprecation/method_wrappers.rb +8 -20
- data/lib/active_support/deprecation/proxy_wrappers.rb +24 -5
- data/lib/active_support/descendants_tracker.rb +56 -9
- data/lib/active_support/duration.rb +4 -3
- data/lib/active_support/duration/iso8601_parser.rb +2 -3
- data/lib/active_support/duration/iso8601_serializer.rb +3 -4
- data/lib/active_support/encrypted_configuration.rb +0 -4
- data/lib/active_support/encrypted_file.rb +2 -1
- data/lib/active_support/evented_file_update_checker.rb +39 -9
- data/lib/active_support/execution_wrapper.rb +1 -0
- data/lib/active_support/gem_version.rb +3 -3
- data/lib/active_support/hash_with_indifferent_access.rb +22 -18
- data/lib/active_support/i18n.rb +1 -0
- data/lib/active_support/i18n_railtie.rb +9 -1
- data/lib/active_support/inflector/inflections.rb +1 -4
- data/lib/active_support/inflector/methods.rb +15 -27
- data/lib/active_support/inflector/transliterate.rb +47 -18
- data/lib/active_support/json/decoding.rb +23 -23
- data/lib/active_support/json/encoding.rb +6 -2
- data/lib/active_support/key_generator.rb +0 -32
- data/lib/active_support/lazy_load_hooks.rb +5 -1
- data/lib/active_support/locale/en.rb +31 -0
- data/lib/active_support/log_subscriber.rb +31 -8
- data/lib/active_support/logger.rb +0 -15
- data/lib/active_support/logger_silence.rb +28 -12
- data/lib/active_support/logger_thread_safe_level.rb +26 -4
- data/lib/active_support/message_encryptor.rb +3 -5
- data/lib/active_support/message_verifier.rb +3 -3
- data/lib/active_support/multibyte/chars.rb +29 -48
- data/lib/active_support/multibyte/unicode.rb +44 -281
- data/lib/active_support/notifications.rb +41 -4
- data/lib/active_support/notifications/fanout.rb +98 -13
- data/lib/active_support/notifications/instrumenter.rb +79 -8
- data/lib/active_support/number_helper.rb +7 -0
- data/lib/active_support/number_helper/number_to_currency_converter.rb +2 -2
- data/lib/active_support/number_helper/number_to_delimited_converter.rb +3 -1
- data/lib/active_support/number_helper/number_to_human_converter.rb +3 -1
- data/lib/active_support/number_helper/number_to_human_size_converter.rb +3 -1
- data/lib/active_support/number_helper/number_to_percentage_converter.rb +3 -1
- data/lib/active_support/number_helper/number_to_phone_converter.rb +2 -0
- data/lib/active_support/number_helper/number_to_rounded_converter.rb +5 -3
- data/lib/active_support/ordered_options.rb +1 -1
- data/lib/active_support/parameter_filter.rb +129 -0
- data/lib/active_support/rails.rb +0 -6
- data/lib/active_support/reloader.rb +4 -5
- data/lib/active_support/security_utils.rb +1 -1
- data/lib/active_support/subscriber.rb +65 -26
- data/lib/active_support/tagged_logging.rb +13 -4
- data/lib/active_support/test_case.rb +91 -0
- data/lib/active_support/testing/assertions.rb +15 -1
- data/lib/active_support/testing/deprecation.rb +0 -1
- data/lib/active_support/testing/file_fixtures.rb +2 -0
- data/lib/active_support/testing/isolation.rb +2 -2
- data/lib/active_support/testing/method_call_assertions.rb +28 -1
- data/lib/active_support/testing/parallelization.rb +128 -0
- data/lib/active_support/testing/stream.rb +1 -1
- data/lib/active_support/testing/time_helpers.rb +7 -7
- data/lib/active_support/time_with_zone.rb +15 -5
- data/lib/active_support/values/time_zone.rb +12 -7
- data/lib/active_support/xml_mini.rb +2 -9
- data/lib/active_support/xml_mini/jdom.rb +2 -2
- data/lib/active_support/xml_mini/libxml.rb +2 -2
- data/lib/active_support/xml_mini/libxmlsax.rb +4 -4
- data/lib/active_support/xml_mini/nokogiri.rb +2 -2
- data/lib/active_support/xml_mini/nokogirisax.rb +3 -3
- data/lib/active_support/xml_mini/rexml.rb +2 -2
- metadata +34 -9
- data/lib/active_support/core_ext/kernel/agnostics.rb +0 -13
- data/lib/active_support/values/unicode_tables.dat +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 20a0c971abcca4b9dabec6e28ef72c919a6ffaed5e35b29e4c3e2f359e99341b
|
4
|
+
data.tar.gz: e42089cf6ad412ef2fcf772afd6a8e010944b57fde1833c9d495dfb9c5eb3da5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8ff0c3e5feb9bb0dfcf5e0c95b4fb5bb8c6a30d2e276101c8ec949db9ad0895c397dc33cc1a99ec2636b45b3169a495eb8c852440956d8500d95399548b70948
|
7
|
+
data.tar.gz: fdf6945ee23e487a9b0403fcac9a7b51551900a6338a4caeb34970656033fd1e62c00eda5d463fb6fc3d0ad880470c7544f2a2108bcc5809520a8436d1bdf360
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,14 @@
|
|
1
|
-
## Rails
|
1
|
+
## Rails 6.0.0 (August 16, 2019) ##
|
2
|
+
|
3
|
+
* Let `require_dependency` in `zeitwerk` mode look the autoload paths up for
|
4
|
+
better backwards compatibility.
|
5
|
+
|
6
|
+
*Xavier Noria*
|
7
|
+
|
8
|
+
* Let `require_dependency` in `zeitwerk` mode support arguments that respond
|
9
|
+
to `to_path` for better backwards compatibility.
|
10
|
+
|
11
|
+
*Xavier Noria*
|
2
12
|
|
3
13
|
* Make ActiveSupport::Logger Fiber-safe. Fixes #36752.
|
4
14
|
|
@@ -32,606 +42,531 @@
|
|
32
42
|
|
33
43
|
*Alexander Varnin*
|
34
44
|
|
45
|
+
* Do not delegate missing `marshal_dump` and `_dump` methods via the
|
46
|
+
`delegate_missing_to` extension. This avoids unintentionally adding instance
|
47
|
+
variables when calling `Marshal.dump(object)`, should the delegation target of
|
48
|
+
`object` be a method which would otherwise add them. Fixes #36522.
|
35
49
|
|
36
|
-
|
37
|
-
|
38
|
-
* Add `ActiveSupport::HashWithIndifferentAccess#assoc`.
|
50
|
+
*Aaron Lipman*
|
39
51
|
|
40
|
-
|
52
|
+
## Rails 6.0.0.rc2 (July 22, 2019) ##
|
41
53
|
|
42
|
-
|
43
|
-
|
44
|
-
|
54
|
+
* `truncate` would return the original string if it was too short to be truncated
|
55
|
+
and a frozen string if it were long enough to be truncated. Now truncate will
|
56
|
+
consistently return an unfrozen string regardless. This behavior is consistent
|
57
|
+
with `gsub` and `strip`.
|
45
58
|
|
46
|
-
|
47
|
-
|
48
|
-
* Allow Range#=== and Range#cover? on Range
|
49
|
-
|
50
|
-
`Range#cover?` can now accept a range argument like `Range#include?` and
|
51
|
-
`Range#===`. `Range#===` works correctly on Ruby 2.6. `Range#include?` is moved
|
52
|
-
into a new file, with these two methods.
|
53
|
-
|
54
|
-
*utilum*
|
59
|
+
Before:
|
55
60
|
|
56
|
-
|
61
|
+
'foobar'.truncate(5).frozen?
|
62
|
+
# => true
|
63
|
+
'foobar'.truncate(6).frozen?
|
64
|
+
# => false
|
57
65
|
|
58
|
-
|
66
|
+
After:
|
59
67
|
|
68
|
+
'foobar'.truncate(5).frozen?
|
69
|
+
# => false
|
70
|
+
'foobar'.truncate(6).frozen?
|
71
|
+
# => false
|
60
72
|
|
61
|
-
|
73
|
+
*Jordan Thomas*
|
62
74
|
|
63
|
-
* No changes.
|
64
75
|
|
76
|
+
## Rails 6.0.0.rc1 (April 24, 2019) ##
|
65
77
|
|
66
|
-
|
78
|
+
* Introduce `ActiveSupport::ActionableError`.
|
67
79
|
|
68
|
-
|
69
|
-
|
80
|
+
Actionable errors let's you dispatch actions from Rails' error pages. This
|
81
|
+
can help you save time if you have a clear action for the resolution of
|
82
|
+
common development errors.
|
70
83
|
|
71
|
-
|
84
|
+
The de-facto example are pending migrations. Every time pending migrations
|
85
|
+
are found, a middleware raises an error. With actionable errors, you can
|
86
|
+
run the migrations right from the error page. Other examples include Rails
|
87
|
+
plugins that need to run a rake task to setup themselves. They can now
|
88
|
+
raise actionable errors to run the setup straight from the error pages.
|
72
89
|
|
73
|
-
|
90
|
+
Here is how to define an actionable error:
|
74
91
|
|
75
|
-
|
92
|
+
```ruby
|
93
|
+
class PendingMigrationError < MigrationError #:nodoc:
|
94
|
+
include ActiveSupport::ActionableError
|
76
95
|
|
77
|
-
|
96
|
+
action "Run pending migrations" do
|
97
|
+
ActiveRecord::Tasks::DatabaseTasks.migrate
|
98
|
+
end
|
99
|
+
end
|
100
|
+
```
|
78
101
|
|
79
|
-
|
80
|
-
|
81
|
-
|
102
|
+
To make an error actionable, include the `ActiveSupport::ActionableError`
|
103
|
+
module and invoke the `action` class macro to define the action. An action
|
104
|
+
needs a name and a procedure to execute. The name is shown as the name of a
|
105
|
+
button on the error pages. Once clicked, it will invoke the given
|
106
|
+
procedure.
|
82
107
|
|
83
|
-
*
|
108
|
+
*Vipul A M*, *Yao Jie*, *Genadi Samokovarov*
|
84
109
|
|
110
|
+
* Preserve `html_safe?` status on `ActiveSupport::SafeBuffer#*`.
|
85
111
|
|
86
|
-
|
112
|
+
Before:
|
87
113
|
|
88
|
-
*
|
114
|
+
("<br />".html_safe * 2).html_safe? #=> nil
|
89
115
|
|
116
|
+
After:
|
90
117
|
|
91
|
-
|
118
|
+
("<br />".html_safe * 2).html_safe? #=> true
|
92
119
|
|
93
|
-
*
|
94
|
-
(Switches from evaled Lua to a batched SCAN + DEL loop.)
|
120
|
+
*Ryo Nakamura*
|
95
121
|
|
96
|
-
|
122
|
+
* Calling test methods with `with_info_handler` method to allow minitest-hooks
|
123
|
+
plugin to work.
|
97
124
|
|
98
|
-
*
|
99
|
-
any timezone defined in `ActiveSupport::TimeZone::MAPPING` is missing.
|
125
|
+
*Mauri Mustonen*
|
100
126
|
|
101
|
-
|
127
|
+
* The Zeitwerk compatibility interface for `ActiveSupport::Dependencies` no
|
128
|
+
longer implements `autoloaded_constants` or `autoloaded?` (undocumented,
|
129
|
+
anyway). Experience shows introspection does not have many use cases, and
|
130
|
+
troubleshooting is done by logging. With this design trade-off we are able
|
131
|
+
to use even less memory in all environments.
|
102
132
|
|
103
|
-
*
|
104
|
-
size when compression is enabled (which is true by default). This patch
|
105
|
-
does not attempt to repair existing data: please manually flush the cache
|
106
|
-
to clear out the problematic entries.
|
133
|
+
*Xavier Noria*
|
107
134
|
|
108
|
-
|
135
|
+
* Depends on Zeitwerk 2, which stores less metadata if reloading is disabled
|
136
|
+
and hence uses less memory when `config.cache_classes` is `true`, a standard
|
137
|
+
setup in production.
|
109
138
|
|
110
|
-
*
|
111
|
-
returning instances of `ActiveSupport::Cache::Entry` instead of the raw values.
|
139
|
+
*Xavier Noria*
|
112
140
|
|
113
|
-
|
141
|
+
* In `:zeitwerk` mode, eager load directories in engines and applications only
|
142
|
+
if present in their respective `config.eager_load_paths`.
|
114
143
|
|
144
|
+
A common use case for this is adding `lib` to `config.autoload_paths`, but
|
145
|
+
not to `config.eager_load_paths`. In that configuration, for example, files
|
146
|
+
in the `lib` directory should not be eager loaded.
|
115
147
|
|
116
|
-
|
148
|
+
*Xavier Noria*
|
117
149
|
|
118
|
-
*
|
119
|
-
Read from the local in-memory cache before consulting the backend.
|
150
|
+
* Fix bug in Range comparisons when comparing to an excluded-end Range
|
120
151
|
|
121
|
-
|
152
|
+
Before:
|
122
153
|
|
123
|
-
|
154
|
+
(1..10).cover?(1...11) # => false
|
124
155
|
|
125
|
-
|
126
|
-
`ActiveSupport::TimeZone::MAPPING` so return all of them instead
|
127
|
-
of the first one found by using `Hash#value`. e.g:
|
156
|
+
After:
|
128
157
|
|
129
|
-
#
|
130
|
-
ActiveSupport::TimeZone.country_zones("GB") # => ["Edinburgh"]
|
158
|
+
(1..10).cover?(1...11) # => true
|
131
159
|
|
132
|
-
|
133
|
-
ActiveSupport::TimeZone.country_zones("GB") # => ["Edinburgh", "London"]
|
160
|
+
With the same change for `Range#include?` and `Range#===`.
|
134
161
|
|
135
|
-
|
162
|
+
*Owen Stephens*
|
136
163
|
|
137
|
-
|
164
|
+
* Use weak references in descendants tracker to allow anonymous subclasses to
|
165
|
+
be garbage collected.
|
138
166
|
|
139
|
-
*
|
167
|
+
*Edgars Beigarts*
|
140
168
|
|
141
|
-
|
169
|
+
* Update `ActiveSupport::Notifications::Instrumenter#instrument` to make
|
170
|
+
passing a block optional. This will let users use
|
171
|
+
`ActiveSupport::Notifications` messaging features outside of
|
172
|
+
instrumentation.
|
142
173
|
|
143
|
-
*
|
144
|
-
numeric differences in the same assertion.
|
174
|
+
*Ali Ibrahim*
|
145
175
|
|
146
|
-
|
176
|
+
* Fix `Time#advance` to work with dates before 1001-03-07
|
147
177
|
|
148
|
-
|
178
|
+
Before:
|
149
179
|
|
150
|
-
|
180
|
+
Time.utc(1001, 3, 6).advance(years: -1) # => 1000-03-05 00:00:00 UTC
|
151
181
|
|
152
|
-
|
182
|
+
After
|
153
183
|
|
154
|
-
|
155
|
-
regardless of `from:` and `to:` argument combinations.
|
184
|
+
Time.utc(1001, 3, 6).advance(years: -1) # => 1000-03-06 00:00:00 UTC
|
156
185
|
|
157
|
-
|
186
|
+
Note that this doesn't affect `DateTime#advance` as that doesn't use a proleptic calendar.
|
158
187
|
|
159
|
-
*
|
188
|
+
*Andrew White*
|
160
189
|
|
161
|
-
|
162
|
-
`config.active_support.use_sha1_digests = true`.
|
190
|
+
* In Zeitwerk mode, engines are now managed by the `main` autoloader. Engines may reference application constants, if the application is reloaded and we do not reload engines, they won't use the reloaded application code.
|
163
191
|
|
164
|
-
*
|
192
|
+
*Xavier Noria*
|
165
193
|
|
166
|
-
*
|
167
|
-
to make it not leak length information even for variable length string.
|
194
|
+
* Add support for supplying `locale` to `transliterate` and `parameterize`.
|
168
195
|
|
169
|
-
|
170
|
-
and started raising `ArgumentError` in case of length mismatch of passed strings.
|
196
|
+
I18n.backend.store_translations(:de, i18n: { transliterate: { rule: { "ü" => "ue" } } })
|
171
197
|
|
172
|
-
|
198
|
+
ActiveSupport::Inflector.transliterate("ü", locale: :de) # => "ue"
|
199
|
+
"Fünf autos".parameterize(locale: :de) # => "fuenf-autos"
|
200
|
+
ActiveSupport::Inflector.parameterize("Fünf autos", locale: :de) # => "fuenf-autos"
|
173
201
|
|
174
|
-
*
|
175
|
-
`ActiveSupport::TimeZone::MAPPING`.
|
202
|
+
*Kaan Ozkan*, *Sharang Dashputre*
|
176
203
|
|
177
|
-
|
204
|
+
* Allow `Array#excluding` and `Enumerable#excluding` to deal with a passed array gracefully.
|
178
205
|
|
179
|
-
|
206
|
+
[ 1, 2, 3, 4, 5 ].excluding([4, 5]) # => [ 1, 2, 3 ]
|
180
207
|
|
181
|
-
*
|
208
|
+
*DHH*
|
182
209
|
|
183
|
-
|
184
|
-
|
185
|
-
If the counter exists, Memcached doesn't extend its expiry when it's
|
186
|
-
incremented or decremented.
|
210
|
+
* Renamed `Array#without` and `Enumerable#without` to `Array#excluding` and `Enumerable#excluding`, to create parity with
|
211
|
+
`Array#including` and `Enumerable#including`. Retained the old names as aliases.
|
187
212
|
|
188
|
-
|
189
|
-
Rails.cache.increment("my_counter", 1, expires_in: 2.minutes)
|
190
|
-
```
|
213
|
+
*DHH*
|
191
214
|
|
192
|
-
|
215
|
+
* Added `Array#including` and `Enumerable#including` to conveniently enlarge a collection with more members using a method rather than an operator:
|
193
216
|
|
194
|
-
|
217
|
+
[ 1, 2, 3 ].including(4, 5) # => [ 1, 2, 3, 4, 5 ]
|
218
|
+
post.authors.including(Current.person) # => All the authors plus the current person!
|
195
219
|
|
196
|
-
|
197
|
-
times by choosing the later period, e.g.
|
220
|
+
*DHH*
|
198
221
|
|
199
|
-
Ruby:
|
200
|
-
```
|
201
|
-
ENV["TZ"] = "Europe/Moscow"
|
202
|
-
Time.local(2014, 10, 26, 1, 0, 0) # => 2014-10-26 01:00:00 +0300
|
203
|
-
```
|
204
222
|
|
205
|
-
|
206
|
-
```
|
207
|
-
>> "2014-10-26 01:00:00".in_time_zone("Moscow")
|
208
|
-
TZInfo::AmbiguousTime: 26/10/2014 01:00 is an ambiguous local time.
|
209
|
-
```
|
223
|
+
## Rails 6.0.0.beta3 (March 11, 2019) ##
|
210
224
|
|
211
|
-
|
212
|
-
```
|
213
|
-
>> "2014-10-26 01:00:00".in_time_zone("Moscow")
|
214
|
-
=> Sun, 26 Oct 2014 01:00:00 MSK +03:00
|
215
|
-
```
|
225
|
+
* No changes.
|
216
226
|
|
217
|
-
Fixes #17395.
|
218
227
|
|
219
|
-
|
228
|
+
## Rails 6.0.0.beta2 (February 25, 2019) ##
|
220
229
|
|
221
|
-
*
|
230
|
+
* New autoloading based on [Zeitwerk](https://github.com/fxn/zeitwerk).
|
222
231
|
|
223
|
-
|
224
|
-
# Defaults to `redis://localhost:6379/0`. Only use for dev/test.
|
225
|
-
config.cache_store = :redis_cache_store
|
226
|
-
|
227
|
-
# Supports all common cache store options (:namespace, :compress,
|
228
|
-
# :compress_threshold, :expires_in, :race_condition_ttl) and all
|
229
|
-
# Redis options.
|
230
|
-
cache_password = Rails.application.secrets.redis_cache_password
|
231
|
-
config.cache_store = :redis_cache_store, driver: :hiredis,
|
232
|
-
namespace: 'myapp-cache', compress: true, timeout: 1,
|
233
|
-
url: "redis://:#{cache_password}@myapp-cache-1:6379/0"
|
234
|
-
|
235
|
-
# Supports Redis::Distributed with multiple hosts
|
236
|
-
config.cache_store = :redis_cache_store, driver: :hiredis
|
237
|
-
namespace: 'myapp-cache', compress: true,
|
238
|
-
url: %w[
|
239
|
-
redis://myapp-cache-1:6379/0
|
240
|
-
redis://myapp-cache-1:6380/0
|
241
|
-
redis://myapp-cache-2:6379/0
|
242
|
-
redis://myapp-cache-2:6380/0
|
243
|
-
redis://myapp-cache-3:6379/0
|
244
|
-
redis://myapp-cache-3:6380/0
|
245
|
-
]
|
246
|
-
|
247
|
-
# Or pass a builder block
|
248
|
-
config.cache_store = :redis_cache_store,
|
249
|
-
namespace: 'myapp-cache', compress: true,
|
250
|
-
redis: -> { Redis.new … }
|
251
|
-
```
|
232
|
+
*Xavier Noria*
|
252
233
|
|
253
|
-
|
254
|
-
than pointing this at your existing Redis server. It won't cope well
|
255
|
-
with mixed usage patterns and it won't expire cache entries by default.
|
234
|
+
* Revise `ActiveSupport::Notifications.unsubscribe` to correctly handle Regex or other multiple-pattern subscribers.
|
256
235
|
|
257
|
-
|
236
|
+
*Zach Kemp*
|
258
237
|
|
259
|
-
|
238
|
+
* Add `before_reset` callback to `CurrentAttributes` and define `after_reset` as an alias of `resets` for symmetry.
|
260
239
|
|
261
|
-
*
|
240
|
+
*Rosa Gutierrez*
|
262
241
|
|
263
|
-
|
264
|
-
It wasn't enabled by default due to CPU cost. Today it's cheap and typical
|
265
|
-
cache data is eminently compressible, such as HTML or JSON fragments.
|
266
|
-
Compression dramatically reduces Memcached/Redis mem usage, which means
|
267
|
-
the same cache servers can store more data, which means higher hit rates.
|
242
|
+
* Remove the `` Kernel#` `` override that suppresses ENOENT and accidentally returns nil on Unix systems.
|
268
243
|
|
269
|
-
|
244
|
+
*Akinori Musha*
|
270
245
|
|
271
|
-
|
246
|
+
* Add `ActiveSupport::HashWithIndifferentAccess#assoc`.
|
272
247
|
|
273
|
-
|
248
|
+
`assoc` can now be called with either a string or a symbol.
|
274
249
|
|
275
|
-
|
276
|
-
Ruby's handling of Time ranges and as a consequence `include?`
|
277
|
-
stopped working with both Time ranges and TWZ ranges. However in
|
278
|
-
ruby/ruby@b061634 support was added for `include?` to use `cover?`
|
279
|
-
for 'linear' objects. Since we have no way of making Ruby consider
|
280
|
-
TWZ instances as 'linear' we have to override `Range#include?`.
|
250
|
+
*Stefan Schüßler*
|
281
251
|
|
282
|
-
|
252
|
+
* Add `Hash#deep_transform_values`, and `Hash#deep_transform_values!`.
|
283
253
|
|
284
|
-
*
|
254
|
+
*Guillermo Iguaran*
|
285
255
|
|
286
|
-
* Fix acronym support in `humanize`.
|
287
256
|
|
288
|
-
|
289
|
-
the match wasn't being lowercased before being looked up in the hash.
|
290
|
-
This shouldn't have any performance impact because before it would
|
291
|
-
fail to find the acronym and perform the `downcase` operation anyway.
|
257
|
+
## Rails 6.0.0.beta1 (January 18, 2019) ##
|
292
258
|
|
293
|
-
|
259
|
+
* Remove deprecated `Module#reachable?` method.
|
294
260
|
|
295
|
-
*
|
296
|
-
|
297
|
-
* Add same method signature for `Time#prev_year` and `Time#next_year`
|
298
|
-
in accordance with `Date#prev_year`, `Date#next_year`.
|
261
|
+
*Rafael Mendonça França*
|
299
262
|
|
300
|
-
|
263
|
+
* Remove deprecated `#acronym_regex` method from `Inflections`.
|
301
264
|
|
302
|
-
|
303
|
-
```
|
304
|
-
Time.new(2017, 9, 16, 17, 0).prev_year # => 2016-09-16 17:00:00 +0300
|
305
|
-
Time.new(2017, 9, 16, 17, 0).prev_year(1)
|
306
|
-
# => ArgumentError: wrong number of arguments (given 1, expected 0)
|
265
|
+
*Rafael Mendonça França*
|
307
266
|
|
308
|
-
|
309
|
-
Time.new(2017, 9, 16, 17, 0).next_year(1)
|
310
|
-
# => ArgumentError: wrong number of arguments (given 1, expected 0)
|
311
|
-
```
|
267
|
+
* Fix `String#safe_constantize` throwing a `LoadError` for incorrectly cased constant references.
|
312
268
|
|
313
|
-
|
314
|
-
```
|
315
|
-
Time.new(2017, 9, 16, 17, 0).prev_year # => 2016-09-16 17:00:00 +0300
|
316
|
-
Time.new(2017, 9, 16, 17, 0).prev_year(1) # => 2016-09-16 17:00:00 +0300
|
269
|
+
*Keenan Brock*
|
317
270
|
|
318
|
-
|
319
|
-
Time.new(2017, 9, 16, 17, 0).next_year(1) # => 2018-09-16 17:00:00 +0300
|
320
|
-
```
|
271
|
+
* Preserve key order passed to `ActiveSupport::CacheStore#fetch_multi`.
|
321
272
|
|
322
|
-
*
|
273
|
+
`fetch_multi(*names)` now returns its results in the same order as the `*names` requested, rather than returning cache hits followed by cache misses.
|
323
274
|
|
324
|
-
*
|
325
|
-
in accordance with `Date#prev_month`, `Date#next_month`.
|
275
|
+
*Gannon McGibbon*
|
326
276
|
|
327
|
-
|
277
|
+
* If the same block is `included` multiple times for a Concern, an exception is no longer raised.
|
328
278
|
|
329
|
-
|
330
|
-
```
|
331
|
-
Time.new(2017, 9, 16, 17, 0).prev_month # => 2017-08-16 17:00:00 +0300
|
332
|
-
Time.new(2017, 9, 16, 17, 0).prev_month(1)
|
333
|
-
# => ArgumentError: wrong number of arguments (given 1, expected 0)
|
279
|
+
*Mark J. Titorenko*, *Vlad Bokov*
|
334
280
|
|
335
|
-
|
336
|
-
|
337
|
-
# => ArgumentError: wrong number of arguments (given 1, expected 0)
|
338
|
-
```
|
281
|
+
* Fix bug where `#to_options` for `ActiveSupport::HashWithIndifferentAccess`
|
282
|
+
would not act as alias for `#symbolize_keys`.
|
339
283
|
|
340
|
-
|
341
|
-
```
|
342
|
-
Time.new(2017, 9, 16, 17, 0).prev_month # => 2017-08-16 17:00:00 +0300
|
343
|
-
Time.new(2017, 9, 16, 17, 0).prev_month(1) # => 2017-08-16 17:00:00 +0300
|
284
|
+
*Nick Weiland*
|
344
285
|
|
345
|
-
|
346
|
-
Time.new(2017, 9, 16, 17, 0).next_month(1) # => 2017-10-16 17:00:00 +0300
|
347
|
-
```
|
286
|
+
* Improve the logic that detects non-autoloaded constants.
|
348
287
|
|
349
|
-
*
|
288
|
+
*Jan Habermann*, *Xavier Noria*
|
350
289
|
|
351
|
-
*
|
352
|
-
in
|
290
|
+
* Deprecate `ActiveSupport::Multibyte::Unicode#pack_graphemes(array)` and `ActiveSuppport::Multibyte::Unicode#unpack_graphemes(string)`
|
291
|
+
in favor of `array.flatten.pack("U*")` and `string.scan(/\X/).map(&:codepoints)`, respectively.
|
353
292
|
|
354
|
-
|
293
|
+
*Francesco Rodríguez*
|
355
294
|
|
356
|
-
|
357
|
-
```
|
358
|
-
Time.new(2017, 9, 16, 17, 0).prev_day # => 2017-09-15 17:00:00 +0300
|
359
|
-
Time.new(2017, 9, 16, 17, 0).prev_day(1)
|
360
|
-
# => ArgumentError: wrong number of arguments (given 1, expected 0)
|
295
|
+
* Deprecate `ActiveSupport::Multibyte::Chars.consumes?` in favor of `String#is_utf8?`.
|
361
296
|
|
362
|
-
|
363
|
-
Time.new(2017, 9, 16, 17, 0).next_day(1)
|
364
|
-
# => ArgumentError: wrong number of arguments (given 1, expected 0)
|
365
|
-
```
|
297
|
+
*Francesco Rodríguez*
|
366
298
|
|
367
|
-
|
299
|
+
* Fix duration being rounded to a full second.
|
368
300
|
```
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
Time.new(2017, 9, 16, 17, 0).next_day # => 2017-09-17 17:00:00 +0300
|
373
|
-
Time.new(2017, 9, 16, 17, 0).next_day(1) # => 2017-09-17 17:00:00 +0300
|
301
|
+
time = DateTime.parse("2018-1-1")
|
302
|
+
time += 0.51.seconds
|
374
303
|
```
|
304
|
+
Will now correctly add 0.51 second and not 1 full second.
|
375
305
|
|
376
|
-
*
|
306
|
+
*Edouard Chin*
|
377
307
|
|
378
|
-
* `
|
379
|
-
|
380
|
-
would raise an `IOError` when called on an unreadable object.
|
308
|
+
* Deprecate `ActiveSupport::Multibyte::Unicode#normalize` and `ActiveSuppport::Multibyte::Chars#normalize`
|
309
|
+
in favor of `String#unicode_normalize`
|
381
310
|
|
382
|
-
|
311
|
+
*Francesco Rodríguez*
|
383
312
|
|
384
|
-
|
313
|
+
* Deprecate `ActiveSupport::Multibyte::Unicode#downcase/upcase/swapcase` in favor of
|
314
|
+
`String#downcase/upcase/swapcase`.
|
385
315
|
|
386
|
-
*
|
316
|
+
*Francesco Rodríguez*
|
387
317
|
|
388
|
-
|
318
|
+
* Add `ActiveSupport::ParameterFilter`.
|
389
319
|
|
390
|
-
*
|
320
|
+
*Yoshiyuki Kinjo*
|
391
321
|
|
392
|
-
|
393
|
-
|
394
|
-
* `Hash#slice` now falls back to Ruby 2.5+'s built-in definition if defined.
|
322
|
+
* Rename `Module#parent`, `Module#parents`, and `Module#parent_name` to
|
323
|
+
`module_parent`, `module_parents`, and `module_parent_name`.
|
395
324
|
|
396
|
-
*
|
325
|
+
*Gannon McGibbon*
|
397
326
|
|
398
|
-
* Deprecate `
|
327
|
+
* Deprecate the use of `LoggerSilence` in favor of `ActiveSupport::LoggerSilence`
|
399
328
|
|
400
|
-
|
401
|
-
when the default changed from using `secret_token` to `secret_key_base`.
|
329
|
+
*Edouard Chin*
|
402
330
|
|
403
|
-
|
404
|
-
but is still in place to support apps created before Rails 4.
|
405
|
-
Deprecation warnings have been added to help developers upgrade their
|
406
|
-
applications to `secret_key_base`.
|
331
|
+
* Deprecate using negative limits in `String#first` and `String#last`.
|
407
332
|
|
408
|
-
*
|
333
|
+
*Gannon McGibbon*, *Eric Turner*
|
409
334
|
|
410
|
-
*
|
335
|
+
* Fix bug where `#without` for `ActiveSupport::HashWithIndifferentAccess` would fail
|
336
|
+
with symbol arguments
|
411
337
|
|
412
|
-
*
|
338
|
+
*Abraham Chan*
|
413
339
|
|
414
|
-
*
|
340
|
+
* Treat `#delete_prefix`, `#delete_suffix` and `#unicode_normalize` results as non-`html_safe`.
|
341
|
+
Ensure safety of arguments for `#insert`, `#[]=` and `#replace` calls on `html_safe` Strings.
|
415
342
|
|
416
|
-
|
417
|
-
`MessageVerifier` classes. This method accepts the same arguments and
|
418
|
-
options as the given classes' constructor. The `encrypt_and_verify` method
|
419
|
-
for `MessageEncryptor` and the `verified` method for `MessageVerifier` also
|
420
|
-
accept an optional keyword argument `:on_rotation` block which is called
|
421
|
-
when a rotated instance is used to decrypt or verify the message.
|
343
|
+
*Janosch Müller*
|
422
344
|
|
423
|
-
|
345
|
+
* Changed `ActiveSupport::TaggedLogging.new` to return a new logger instance instead
|
346
|
+
of mutating the one received as parameter.
|
424
347
|
|
425
|
-
*
|
426
|
-
|
427
|
-
*bogdanvlviv*
|
348
|
+
*Thierry Joyal*
|
428
349
|
|
429
|
-
*
|
350
|
+
* Define `unfreeze_time` as an alias of `travel_back` in `ActiveSupport::Testing::TimeHelpers`.
|
430
351
|
|
431
|
-
|
432
|
-
directly in repo encrypted with `config/master.key` or `ENV["RAILS_MASTER_KEY"]`.
|
352
|
+
The alias is provided for symmetry with `freeze_time`.
|
433
353
|
|
434
|
-
|
435
|
-
secrets introduced in Rails 5.1.
|
354
|
+
*Ryan Davidson*
|
436
355
|
|
437
|
-
|
356
|
+
* Add support for tracing constant autoloads. Just throw
|
438
357
|
|
439
|
-
|
358
|
+
ActiveSupport::Dependencies.logger = Rails.logger
|
359
|
+
ActiveSupport::Dependencies.verbose = true
|
440
360
|
|
441
|
-
|
442
|
-
encrypting it with a key.
|
361
|
+
in an initializer.
|
443
362
|
|
444
|
-
|
363
|
+
*Xavier Noria*
|
445
364
|
|
446
|
-
|
365
|
+
* Maintain `html_safe?` on html_safe strings when sliced.
|
447
366
|
|
448
|
-
|
449
|
-
|
367
|
+
string = "<div>test</div>".html_safe
|
368
|
+
string[-1..1].html_safe? # => true
|
450
369
|
|
451
|
-
*
|
370
|
+
*Elom Gomez*, *Yumin Wong*
|
452
371
|
|
453
|
-
*
|
372
|
+
* Add `Array#extract!`.
|
454
373
|
|
455
|
-
|
456
|
-
|
374
|
+
The method removes and returns the elements for which the block returns a true value.
|
375
|
+
If no block is given, an Enumerator is returned instead.
|
457
376
|
|
458
|
-
|
377
|
+
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
|
378
|
+
odd_numbers = numbers.extract! { |number| number.odd? } # => [1, 3, 5, 7, 9]
|
379
|
+
numbers # => [0, 2, 4, 6, 8]
|
459
380
|
|
460
|
-
|
461
|
-
# => nil
|
462
|
-
|
463
|
-
Now:
|
464
|
-
|
465
|
-
'one_two'.camelize(true)
|
466
|
-
# => ArgumentError: Invalid option, use either :upper or :lower.
|
467
|
-
|
468
|
-
*Ricardo Díaz*
|
469
|
-
|
470
|
-
* Fix modulo operations involving durations.
|
471
|
-
|
472
|
-
Rails 5.1 introduced `ActiveSupport::Duration::Scalar` as a wrapper
|
473
|
-
around numeric values as a way of ensuring a duration was the outcome of
|
474
|
-
an expression. However, the implementation was missing support for modulo
|
475
|
-
operations. This support has now been added and should result in a duration
|
476
|
-
being returned from expressions involving modulo operations.
|
381
|
+
*bogdanvlviv*
|
477
382
|
|
478
|
-
|
383
|
+
* Support not to cache `nil` for `ActiveSupport::Cache#fetch`.
|
479
384
|
|
480
|
-
|
481
|
-
# =>
|
385
|
+
cache.fetch('bar', skip_nil: true) { nil }
|
386
|
+
cache.exist?('bar') # => false
|
482
387
|
|
483
|
-
|
388
|
+
*Martin Hong*
|
484
389
|
|
485
|
-
|
486
|
-
|
390
|
+
* Add "event object" support to the notification system.
|
391
|
+
Before this change, end users were forced to create hand made artisanal
|
392
|
+
event objects on their own, like this:
|
487
393
|
|
488
|
-
|
394
|
+
ActiveSupport::Notifications.subscribe('wait') do |*args|
|
395
|
+
@event = ActiveSupport::Notifications::Event.new(*args)
|
396
|
+
end
|
489
397
|
|
490
|
-
|
398
|
+
ActiveSupport::Notifications.instrument('wait') do
|
399
|
+
sleep 1
|
400
|
+
end
|
491
401
|
|
492
|
-
|
402
|
+
@event.duration # => 1000.138
|
493
403
|
|
494
|
-
|
495
|
-
|
496
|
-
|
404
|
+
After this change, if the block passed to `subscribe` only takes one
|
405
|
+
parameter, the framework will yield an event object to the block. Now
|
406
|
+
end users are no longer required to make their own:
|
497
407
|
|
498
|
-
|
408
|
+
ActiveSupport::Notifications.subscribe('wait') do |event|
|
409
|
+
@event = event
|
410
|
+
end
|
499
411
|
|
500
|
-
|
412
|
+
ActiveSupport::Notifications.instrument('wait') do
|
413
|
+
sleep 1
|
414
|
+
end
|
501
415
|
|
502
|
-
|
503
|
-
|
416
|
+
p @event.allocations # => 7
|
417
|
+
p @event.cpu_time # => 0.256
|
418
|
+
p @event.idle_time # => 1003.2399
|
504
419
|
|
505
|
-
|
420
|
+
Now you can enjoy event objects without making them yourself. Neat!
|
506
421
|
|
507
|
-
|
422
|
+
*Aaron "t.lo" Patterson*
|
508
423
|
|
509
|
-
|
510
|
-
@verifier.verified(token) # => nil
|
424
|
+
* Add cpu_time, idle_time, and allocations to Event.
|
511
425
|
|
512
|
-
|
426
|
+
*Eileen M. Uchitelle*, *Aaron Patterson*
|
513
427
|
|
514
|
-
|
515
|
-
@verifier.generate("y", expires_at: Time.now.end_of_year)
|
428
|
+
* RedisCacheStore: support key expiry in increment/decrement.
|
516
429
|
|
517
|
-
|
518
|
-
`ActiveSupport::MessageEncryptor`'s `encrypt_and_sign` and `decrypt_and_verify`.
|
430
|
+
Pass `:expires_in` to `#increment` and `#decrement` to set a Redis EXPIRE on the key.
|
519
431
|
|
520
|
-
|
432
|
+
If the key is already set to expire, RedisCacheStore won't extend its expiry.
|
521
433
|
|
522
|
-
|
434
|
+
Rails.cache.increment("some_key", 1, expires_in: 2.minutes)
|
523
435
|
|
524
|
-
*
|
436
|
+
*Jason Lee*
|
525
437
|
|
526
|
-
|
438
|
+
* Allow `Range#===` and `Range#cover?` on Range.
|
527
439
|
|
528
|
-
|
440
|
+
`Range#cover?` can now accept a range argument like `Range#include?` and
|
441
|
+
`Range#===`. `Range#===` works correctly on Ruby 2.6. `Range#include?` is moved
|
442
|
+
into a new file, with these two methods.
|
529
443
|
|
530
|
-
*
|
444
|
+
*Requiring active_support/core_ext/range/include_range is now deprecated.*
|
445
|
+
*Use `require "active_support/core_ext/range/compare_range"` instead.*
|
531
446
|
|
532
|
-
*
|
447
|
+
*utilum*
|
533
448
|
|
534
|
-
|
535
|
-
framework default.
|
449
|
+
* Add `index_with` to Enumerable.
|
536
450
|
|
537
|
-
|
451
|
+
Allows creating a hash from an enumerable with the value from a passed block
|
452
|
+
or a default argument.
|
538
453
|
|
539
|
-
|
454
|
+
%i( title body ).index_with { |attr| post.public_send(attr) }
|
455
|
+
# => { title: "hey", body: "what's up?" }
|
540
456
|
|
541
|
-
|
457
|
+
%i( title body ).index_with(nil)
|
458
|
+
# => { title: nil, body: nil }
|
542
459
|
|
543
|
-
|
544
|
-
Keys that aren't found may be written to the cache store in one shot
|
545
|
-
instead of separate writes.
|
460
|
+
Closely linked with `index_by`, which creates a hash where the keys are extracted from a block.
|
546
461
|
|
547
|
-
|
548
|
-
Stores may override if they're capable of one-shot bulk writes, like
|
549
|
-
Redis `MSET`.
|
462
|
+
*Kasper Timm Hansen*
|
550
463
|
|
551
|
-
|
464
|
+
* Fix bug where `ActiveSupport::TimeZone.all` would fail when tzinfo data for
|
465
|
+
any timezone defined in `ActiveSupport::TimeZone::MAPPING` is missing.
|
552
466
|
|
553
|
-
*
|
467
|
+
*Dominik Sander*
|
554
468
|
|
555
|
-
|
469
|
+
* Redis cache store: `delete_matched` no longer blocks the Redis server.
|
470
|
+
(Switches from evaled Lua to a batched SCAN + DEL loop.)
|
556
471
|
|
557
|
-
|
558
|
-
and `cattr_writer` as well.
|
472
|
+
*Gleb Mazovetskiy*
|
559
473
|
|
560
|
-
|
474
|
+
* Fix bug where `ActiveSupport::Cache` will massively inflate the storage
|
475
|
+
size when compression is enabled (which is true by default). This patch
|
476
|
+
does not attempt to repair existing data: please manually flush the cache
|
477
|
+
to clear out the problematic entries.
|
561
478
|
|
562
|
-
*
|
479
|
+
*Godfrey Chan*
|
563
480
|
|
564
|
-
|
481
|
+
* Fix bug where `URI.unescape` would fail with mixed Unicode/escaped character input:
|
565
482
|
|
566
|
-
|
483
|
+
URI.unescape("\xe3\x83\x90") # => "バ"
|
484
|
+
URI.unescape("%E3%83%90") # => "バ"
|
485
|
+
URI.unescape("\xe3\x83\x90%E3%83%90") # => Encoding::CompatibilityError
|
567
486
|
|
568
|
-
|
487
|
+
*Ashe Connor*, *Aaron Patterson*
|
569
488
|
|
570
|
-
|
571
|
-
|
489
|
+
* Add `before?` and `after?` methods to `Date`, `DateTime`,
|
490
|
+
`Time`, and `TimeWithZone`.
|
572
491
|
|
573
|
-
|
492
|
+
*Nick Holden*
|
574
493
|
|
575
|
-
|
494
|
+
* `ActiveSupport::Inflector#ordinal` and `ActiveSupport::Inflector#ordinalize` now support
|
495
|
+
translations through I18n.
|
576
496
|
|
577
|
-
|
497
|
+
# locale/fr.rb
|
578
498
|
|
579
|
-
|
499
|
+
{
|
500
|
+
fr: {
|
501
|
+
number: {
|
502
|
+
nth: {
|
503
|
+
ordinals: lambda do |_key, number:, **_options|
|
504
|
+
if number.to_i.abs == 1
|
505
|
+
'er'
|
506
|
+
else
|
507
|
+
'e'
|
508
|
+
end
|
509
|
+
end,
|
580
510
|
|
581
|
-
|
511
|
+
ordinalized: lambda do |_key, number:, **_options|
|
512
|
+
"#{number}#{ActiveSupport::Inflector.ordinal(number)}"
|
513
|
+
end
|
514
|
+
}
|
515
|
+
}
|
516
|
+
}
|
517
|
+
}
|
582
518
|
|
583
|
-
* Add `ActiveSupport::CurrentAttributes` to provide a thread-isolated attributes singleton.
|
584
|
-
Primary use case is keeping all the per-request attributes easily available to the whole system.
|
585
519
|
|
586
|
-
*
|
520
|
+
*Christian Blais*
|
587
521
|
|
588
|
-
*
|
522
|
+
* Add `:private` option to ActiveSupport's `Module#delegate`
|
523
|
+
in order to delegate methods as private:
|
589
524
|
|
590
|
-
|
591
|
-
|
525
|
+
class User < ActiveRecord::Base
|
526
|
+
has_one :profile
|
527
|
+
delegate :date_of_birth, to: :profile, private: true
|
592
528
|
|
593
|
-
|
594
|
-
|
595
|
-
|
596
|
-
|
529
|
+
def age
|
530
|
+
Date.today.year - date_of_birth.year
|
531
|
+
end
|
532
|
+
end
|
597
533
|
|
598
|
-
|
599
|
-
|
534
|
+
# User.new.age # => 29
|
535
|
+
# User.new.date_of_birth
|
536
|
+
# => NoMethodError: private method `date_of_birth' called for #<User:0x00000008221340>
|
600
537
|
|
601
|
-
|
602
|
-
date = Date.civil(2017, 5, 20) # => Mon, 20 May 2017
|
603
|
-
2 * 1.day # => 2 days
|
604
|
-
date + 2 * 1.day # => Mon, 22 May 2017
|
538
|
+
*Tomas Valent*
|
605
539
|
|
606
|
-
|
540
|
+
* `String#truncate_bytes` to truncate a string to a maximum bytesize without
|
541
|
+
breaking multibyte characters or grapheme clusters like 👩👩👦👦.
|
607
542
|
|
608
|
-
*
|
543
|
+
*Jeremy Daer*
|
609
544
|
|
610
|
-
*
|
611
|
-
on storage in cases with frequent churn. Works together with the separation of `#cache_key` and `#cache_version`
|
612
|
-
in Active Record and its use in Action Pack's fragment caching.
|
545
|
+
* `String#strip_heredoc` preserves frozenness.
|
613
546
|
|
614
|
-
|
547
|
+
"foo".freeze.strip_heredoc.frozen? # => true
|
615
548
|
|
616
|
-
|
549
|
+
Fixes that frozen string literals would inadvertently become unfrozen:
|
617
550
|
|
618
|
-
|
551
|
+
# frozen_string_literal: true
|
619
552
|
|
620
|
-
|
553
|
+
foo = <<-MSG.strip_heredoc
|
554
|
+
la la la
|
555
|
+
MSG
|
621
556
|
|
622
|
-
|
557
|
+
foo.frozen? # => false !??
|
623
558
|
|
624
|
-
*
|
559
|
+
*Jeremy Daer*
|
625
560
|
|
626
|
-
|
561
|
+
* Rails 6 requires Ruby 2.5.0 or newer.
|
627
562
|
|
628
|
-
*
|
563
|
+
*Jeremy Daer*, *Kasper Timm Hansen*
|
629
564
|
|
630
|
-
*
|
565
|
+
* Adds parallel testing to Rails.
|
631
566
|
|
632
|
-
|
567
|
+
Parallelize your test suite with forked processes or threads.
|
633
568
|
|
634
|
-
*
|
569
|
+
*Eileen M. Uchitelle*, *Aaron Patterson*
|
635
570
|
|
636
571
|
|
637
|
-
Please check [5-
|
572
|
+
Please check [5-2-stable](https://github.com/rails/rails/blob/5-2-stable/activesupport/CHANGELOG.md) for previous changes.
|