activesupport 5.2.4.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.

Files changed (138) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +327 -408
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +3 -2
  5. data/lib/active_support.rb +2 -1
  6. data/lib/active_support/actionable_error.rb +48 -0
  7. data/lib/active_support/backtrace_cleaner.rb +28 -1
  8. data/lib/active_support/cache.rb +45 -23
  9. data/lib/active_support/cache/file_store.rb +22 -22
  10. data/lib/active_support/cache/mem_cache_store.rb +17 -2
  11. data/lib/active_support/cache/memory_store.rb +7 -2
  12. data/lib/active_support/cache/null_store.rb +5 -0
  13. data/lib/active_support/cache/redis_cache_store.rb +47 -25
  14. data/lib/active_support/callbacks.rb +16 -5
  15. data/lib/active_support/concern.rb +24 -1
  16. data/lib/active_support/configurable.rb +7 -11
  17. data/lib/active_support/core_ext/array.rb +1 -1
  18. data/lib/active_support/core_ext/array/access.rb +18 -6
  19. data/lib/active_support/core_ext/array/extract.rb +21 -0
  20. data/lib/active_support/core_ext/array/prepend_and_append.rb +2 -6
  21. data/lib/active_support/core_ext/class/attribute.rb +11 -16
  22. data/lib/active_support/core_ext/class/subclasses.rb +1 -1
  23. data/lib/active_support/core_ext/date/calculations.rb +6 -5
  24. data/lib/active_support/core_ext/date_and_time/calculations.rb +24 -47
  25. data/lib/active_support/core_ext/date_time/calculations.rb +1 -1
  26. data/lib/active_support/core_ext/enumerable.rb +97 -73
  27. data/lib/active_support/core_ext/hash.rb +1 -2
  28. data/lib/active_support/core_ext/hash/compact.rb +2 -26
  29. data/lib/active_support/core_ext/hash/deep_transform_values.rb +46 -0
  30. data/lib/active_support/core_ext/hash/except.rb +1 -1
  31. data/lib/active_support/core_ext/hash/keys.rb +0 -29
  32. data/lib/active_support/core_ext/hash/slice.rb +3 -25
  33. data/lib/active_support/core_ext/hash/transform_values.rb +2 -29
  34. data/lib/active_support/core_ext/integer/multiple.rb +1 -1
  35. data/lib/active_support/core_ext/kernel.rb +0 -1
  36. data/lib/active_support/core_ext/load_error.rb +1 -1
  37. data/lib/active_support/core_ext/module.rb +0 -1
  38. data/lib/active_support/core_ext/module/attribute_accessors.rb +7 -10
  39. data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +13 -19
  40. data/lib/active_support/core_ext/module/delegation.rb +33 -7
  41. data/lib/active_support/core_ext/module/introspection.rb +37 -13
  42. data/lib/active_support/core_ext/module/reachable.rb +1 -6
  43. data/lib/active_support/core_ext/module/redefine_method.rb +8 -17
  44. data/lib/active_support/core_ext/numeric.rb +0 -1
  45. data/lib/active_support/core_ext/numeric/conversions.rb +124 -128
  46. data/lib/active_support/core_ext/numeric/inquiry.rb +2 -25
  47. data/lib/active_support/core_ext/object/blank.rb +1 -2
  48. data/lib/active_support/core_ext/object/duplicable.rb +7 -114
  49. data/lib/active_support/core_ext/object/json.rb +1 -0
  50. data/lib/active_support/core_ext/object/try.rb +15 -7
  51. data/lib/active_support/core_ext/object/with_options.rb +1 -1
  52. data/lib/active_support/core_ext/range/compare_range.rb +22 -13
  53. data/lib/active_support/core_ext/range/conversions.rb +31 -29
  54. data/lib/active_support/core_ext/range/include_range.rb +6 -0
  55. data/lib/active_support/core_ext/regexp.rb +0 -4
  56. data/lib/active_support/core_ext/securerandom.rb +23 -3
  57. data/lib/active_support/core_ext/string/access.rb +8 -0
  58. data/lib/active_support/core_ext/string/filters.rb +42 -1
  59. data/lib/active_support/core_ext/string/inflections.rb +7 -2
  60. data/lib/active_support/core_ext/string/multibyte.rb +4 -3
  61. data/lib/active_support/core_ext/string/output_safety.rb +61 -5
  62. data/lib/active_support/core_ext/string/strip.rb +3 -1
  63. data/lib/active_support/core_ext/time/calculations.rb +31 -2
  64. data/lib/active_support/core_ext/uri.rb +1 -0
  65. data/lib/active_support/current_attributes.rb +8 -0
  66. data/lib/active_support/dependencies.rb +69 -16
  67. data/lib/active_support/dependencies/zeitwerk_integration.rb +110 -0
  68. data/lib/active_support/deprecation.rb +1 -1
  69. data/lib/active_support/deprecation/behaviors.rb +1 -1
  70. data/lib/active_support/deprecation/method_wrappers.rb +8 -20
  71. data/lib/active_support/deprecation/proxy_wrappers.rb +24 -5
  72. data/lib/active_support/descendants_tracker.rb +56 -9
  73. data/lib/active_support/duration.rb +4 -3
  74. data/lib/active_support/duration/iso8601_parser.rb +2 -3
  75. data/lib/active_support/duration/iso8601_serializer.rb +3 -4
  76. data/lib/active_support/encrypted_configuration.rb +0 -4
  77. data/lib/active_support/encrypted_file.rb +2 -1
  78. data/lib/active_support/evented_file_update_checker.rb +39 -9
  79. data/lib/active_support/execution_wrapper.rb +1 -0
  80. data/lib/active_support/gem_version.rb +4 -4
  81. data/lib/active_support/hash_with_indifferent_access.rb +22 -18
  82. data/lib/active_support/i18n.rb +1 -0
  83. data/lib/active_support/i18n_railtie.rb +9 -1
  84. data/lib/active_support/inflector/inflections.rb +1 -4
  85. data/lib/active_support/inflector/methods.rb +15 -27
  86. data/lib/active_support/inflector/transliterate.rb +47 -18
  87. data/lib/active_support/json/decoding.rb +23 -23
  88. data/lib/active_support/json/encoding.rb +6 -2
  89. data/lib/active_support/key_generator.rb +0 -32
  90. data/lib/active_support/lazy_load_hooks.rb +5 -1
  91. data/lib/active_support/locale/en.rb +31 -0
  92. data/lib/active_support/log_subscriber.rb +31 -8
  93. data/lib/active_support/logger.rb +0 -15
  94. data/lib/active_support/logger_silence.rb +28 -12
  95. data/lib/active_support/logger_thread_safe_level.rb +26 -4
  96. data/lib/active_support/message_encryptor.rb +3 -5
  97. data/lib/active_support/message_verifier.rb +3 -3
  98. data/lib/active_support/multibyte/chars.rb +29 -48
  99. data/lib/active_support/multibyte/unicode.rb +44 -281
  100. data/lib/active_support/notifications.rb +41 -4
  101. data/lib/active_support/notifications/fanout.rb +98 -13
  102. data/lib/active_support/notifications/instrumenter.rb +79 -8
  103. data/lib/active_support/number_helper.rb +7 -0
  104. data/lib/active_support/number_helper/number_to_currency_converter.rb +2 -2
  105. data/lib/active_support/number_helper/number_to_delimited_converter.rb +3 -1
  106. data/lib/active_support/number_helper/number_to_human_converter.rb +3 -1
  107. data/lib/active_support/number_helper/number_to_human_size_converter.rb +3 -1
  108. data/lib/active_support/number_helper/number_to_percentage_converter.rb +3 -1
  109. data/lib/active_support/number_helper/number_to_phone_converter.rb +2 -0
  110. data/lib/active_support/number_helper/number_to_rounded_converter.rb +5 -3
  111. data/lib/active_support/ordered_options.rb +1 -1
  112. data/lib/active_support/parameter_filter.rb +129 -0
  113. data/lib/active_support/rails.rb +0 -6
  114. data/lib/active_support/reloader.rb +4 -5
  115. data/lib/active_support/security_utils.rb +1 -1
  116. data/lib/active_support/subscriber.rb +65 -26
  117. data/lib/active_support/tagged_logging.rb +13 -4
  118. data/lib/active_support/test_case.rb +91 -0
  119. data/lib/active_support/testing/assertions.rb +15 -1
  120. data/lib/active_support/testing/deprecation.rb +0 -1
  121. data/lib/active_support/testing/file_fixtures.rb +2 -0
  122. data/lib/active_support/testing/isolation.rb +2 -2
  123. data/lib/active_support/testing/method_call_assertions.rb +28 -1
  124. data/lib/active_support/testing/parallelization.rb +128 -0
  125. data/lib/active_support/testing/stream.rb +1 -1
  126. data/lib/active_support/testing/time_helpers.rb +7 -7
  127. data/lib/active_support/time_with_zone.rb +15 -5
  128. data/lib/active_support/values/time_zone.rb +12 -7
  129. data/lib/active_support/xml_mini.rb +2 -9
  130. data/lib/active_support/xml_mini/jdom.rb +2 -2
  131. data/lib/active_support/xml_mini/libxml.rb +2 -2
  132. data/lib/active_support/xml_mini/libxmlsax.rb +4 -4
  133. data/lib/active_support/xml_mini/nokogiri.rb +2 -2
  134. data/lib/active_support/xml_mini/nokogirisax.rb +3 -3
  135. data/lib/active_support/xml_mini/rexml.rb +2 -2
  136. metadata +34 -9
  137. data/lib/active_support/core_ext/kernel/agnostics.rb +0 -13
  138. 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: f3bb5a13385855af91f1e96d4d28fc628debd76b122cd65d16e7c40ca26a70c6
4
- data.tar.gz: 2df7294b411760b2207c7f426de1c462b3bbeeac60e9291664196115f6a07597
3
+ metadata.gz: 20a0c971abcca4b9dabec6e28ef72c919a6ffaed5e35b29e4c3e2f359e99341b
4
+ data.tar.gz: e42089cf6ad412ef2fcf772afd6a8e010944b57fde1833c9d495dfb9c5eb3da5
5
5
  SHA512:
6
- metadata.gz: 5e3b6220c7fdbcbedfa5813ac8bc03da049e319178bcf8e0a0d37dfb698077a841515cce0fa50ccecfd3ae018840f8e6ab2b0c658f0768dffab2f3096340701f
7
- data.tar.gz: 788c51200d4d71af4975c460f5920822bb91ebe2d774c84fbd08b99048190f0c43f8b29b9a8a12c320e99e4947688fe976a3367cfa8390d047735ba0d90f83cd
6
+ metadata.gz: 8ff0c3e5feb9bb0dfcf5e0c95b4fb5bb8c6a30d2e276101c8ec949db9ad0895c397dc33cc1a99ec2636b45b3169a495eb8c852440956d8500d95399548b70948
7
+ data.tar.gz: fdf6945ee23e487a9b0403fcac9a7b51551900a6338a4caeb34970656033fd1e62c00eda5d463fb6fc3d0ad880470c7544f2a2108bcc5809520a8436d1bdf360
data/CHANGELOG.md CHANGED
@@ -1,20 +1,14 @@
1
- ## Rails 5.2.4.4 (September 09, 2020) ##
1
+ ## Rails 6.0.0 (August 16, 2019) ##
2
2
 
3
- * No changes.
4
-
5
-
6
- ## Rails 5.2.4.3 (May 18, 2020) ##
7
-
8
- * [CVE-2020-8165] Deprecate Marshal.load on raw cache read in RedisCacheStore
9
-
10
- * [CVE-2020-8165] Avoid Marshal.load on raw cache value in MemCacheStore
3
+ * Let `require_dependency` in `zeitwerk` mode look the autoload paths up for
4
+ better backwards compatibility.
11
5
 
12
- ## Rails 5.2.4.1 (December 18, 2019) ##
13
-
14
- * No changes.
6
+ *Xavier Noria*
15
7
 
8
+ * Let `require_dependency` in `zeitwerk` mode support arguments that respond
9
+ to `to_path` for better backwards compatibility.
16
10
 
17
- ## Rails 5.2.4 (November 27, 2019) ##
11
+ *Xavier Noria*
18
12
 
19
13
  * Make ActiveSupport::Logger Fiber-safe. Fixes #36752.
20
14
 
@@ -48,606 +42,531 @@
48
42
 
49
43
  *Alexander Varnin*
50
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.
51
49
 
52
- ## Rails 5.2.3 (March 27, 2019) ##
53
-
54
- * Add `ActiveSupport::HashWithIndifferentAccess#assoc`.
55
-
56
- `assoc` can now be called with either a string or a symbol.
57
-
58
- *Stefan Schüßler*
59
-
60
- * Fix `String#safe_constantize` throwing a `LoadError` for incorrectly cased constant references.
61
-
62
- *Keenan Brock*
50
+ *Aaron Lipman*
63
51
 
64
- * Allow Range#=== and Range#cover? on Range
52
+ ## Rails 6.0.0.rc2 (July 22, 2019) ##
65
53
 
66
- `Range#cover?` can now accept a range argument like `Range#include?` and
67
- `Range#===`. `Range#===` works correctly on Ruby 2.6. `Range#include?` is moved
68
- into a new file, with these two methods.
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`.
69
58
 
70
- *utilum*
59
+ Before:
71
60
 
72
- * If the same block is `included` multiple times for a Concern, an exception is no longer raised.
61
+ 'foobar'.truncate(5).frozen?
62
+ # => true
63
+ 'foobar'.truncate(6).frozen?
64
+ # => false
73
65
 
74
- *Mark J. Titorenko*, *Vlad Bokov*
66
+ After:
75
67
 
68
+ 'foobar'.truncate(5).frozen?
69
+ # => false
70
+ 'foobar'.truncate(6).frozen?
71
+ # => false
76
72
 
77
- ## Rails 5.2.2.1 (March 11, 2019) ##
73
+ *Jordan Thomas*
78
74
 
79
- * No changes.
80
75
 
76
+ ## Rails 6.0.0.rc1 (April 24, 2019) ##
81
77
 
82
- ## Rails 5.2.2 (December 04, 2018) ##
78
+ * Introduce `ActiveSupport::ActionableError`.
83
79
 
84
- * Fix bug where `#to_options` for `ActiveSupport::HashWithIndifferentAccess`
85
- would not act as alias for `#symbolize_keys`.
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.
86
83
 
87
- *Nick Weiland*
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.
88
89
 
89
- * Improve the logic that detects non-autoloaded constants.
90
+ Here is how to define an actionable error:
90
91
 
91
- *Jan Habermann*, *Xavier Noria*
92
-
93
- * Fix bug where `URI.unescape` would fail with mixed Unicode/escaped character input:
92
+ ```ruby
93
+ class PendingMigrationError < MigrationError #:nodoc:
94
+ include ActiveSupport::ActionableError
94
95
 
95
- URI.unescape("\xe3\x83\x90") # => "バ"
96
- URI.unescape("%E3%83%90") # => "バ"
97
- URI.unescape("\xe3\x83\x90%E3%83%90") # => Encoding::CompatibilityError
96
+ action "Run pending migrations" do
97
+ ActiveRecord::Tasks::DatabaseTasks.migrate
98
+ end
99
+ end
100
+ ```
98
101
 
99
- *Ashe Connor*, *Aaron Patterson*
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.
100
107
 
108
+ *Vipul A M*, *Yao Jie*, *Genadi Samokovarov*
101
109
 
102
- ## Rails 5.2.1.1 (November 27, 2018) ##
110
+ * Preserve `html_safe?` status on `ActiveSupport::SafeBuffer#*`.
103
111
 
104
- * No changes.
112
+ Before:
105
113
 
114
+ ("<br />".html_safe * 2).html_safe? #=> nil
106
115
 
107
- ## Rails 5.2.1 (August 07, 2018) ##
116
+ After:
108
117
 
109
- * Redis cache store: `delete_matched` no longer blocks the Redis server.
110
- (Switches from evaled Lua to a batched SCAN + DEL loop.)
118
+ ("<br />".html_safe * 2).html_safe? #=> true
111
119
 
112
- *Gleb Mazovetskiy*
120
+ *Ryo Nakamura*
113
121
 
114
- * Fix bug where `ActiveSupport::Timezone.all` would fail when tzinfo data for
115
- any timezone defined in `ActiveSupport::TimeZone::MAPPING` is missing.
122
+ * Calling test methods with `with_info_handler` method to allow minitest-hooks
123
+ plugin to work.
116
124
 
117
- *Dominik Sander*
125
+ *Mauri Mustonen*
118
126
 
119
- * Fix bug where `ActiveSupport::Cache` will massively inflate the storage
120
- size when compression is enabled (which is true by default). This patch
121
- does not attempt to repair existing data: please manually flush the cache
122
- to clear out the problematic entries.
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.
123
132
 
124
- *Godfrey Chan*
133
+ *Xavier Noria*
125
134
 
126
- * Fix `ActiveSupport::Cache#read_multi` bug with local cache enabled that was
127
- returning instances of `ActiveSupport::Cache::Entry` instead of the raw values.
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.
128
138
 
129
- *Jason Lee*
139
+ *Xavier Noria*
130
140
 
141
+ * In `:zeitwerk` mode, eager load directories in engines and applications only
142
+ if present in their respective `config.eager_load_paths`.
131
143
 
132
- ## Rails 5.2.0 (April 09, 2018) ##
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.
133
147
 
134
- * Caching: MemCache and Redis `read_multi` and `fetch_multi` speedup.
135
- Read from the local in-memory cache before consulting the backend.
148
+ *Xavier Noria*
136
149
 
137
- *Gabriel Sobrinho*
150
+ * Fix bug in Range comparisons when comparing to an excluded-end Range
138
151
 
139
- * Return all mappings for a timezone identifier in `country_zones`.
152
+ Before:
140
153
 
141
- Some timezones like `Europe/London` have multiple mappings in
142
- `ActiveSupport::TimeZone::MAPPING` so return all of them instead
143
- of the first one found by using `Hash#value`. e.g:
154
+ (1..10).cover?(1...11) # => false
144
155
 
145
- # Before
146
- ActiveSupport::TimeZone.country_zones("GB") # => ["Edinburgh"]
156
+ After:
147
157
 
148
- # After
149
- ActiveSupport::TimeZone.country_zones("GB") # => ["Edinburgh", "London"]
158
+ (1..10).cover?(1...11) # => true
150
159
 
151
- Fixes #31668.
160
+ With the same change for `Range#include?` and `Range#===`.
152
161
 
153
- *Andrew White*
162
+ *Owen Stephens*
154
163
 
155
- * Add support for connection pooling on RedisCacheStore.
164
+ * Use weak references in descendants tracker to allow anonymous subclasses to
165
+ be garbage collected.
156
166
 
157
- *fatkodima*
167
+ *Edgars Beigarts*
158
168
 
159
- * Support hash as first argument in `assert_difference`. This allows to specify multiple
160
- numeric differences in the same assertion.
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.
161
173
 
162
- assert_difference ->{ Article.count } => 1, ->{ Post.count } => 2
174
+ *Ali Ibrahim*
163
175
 
164
- *Julien Meichelbeck*
176
+ * Fix `Time#advance` to work with dates before 1001-03-07
165
177
 
166
- * Add missing instrumentation for `read_multi` in `ActiveSupport::Cache::Store`.
178
+ Before:
167
179
 
168
- *Ignatius Reza Lesmana*
180
+ Time.utc(1001, 3, 6).advance(years: -1) # => 1000-03-05 00:00:00 UTC
169
181
 
170
- * `assert_changes` will always assert that the expression changes,
171
- regardless of `from:` and `to:` argument combinations.
182
+ After
172
183
 
173
- *Daniel Ma*
184
+ Time.utc(1001, 3, 6).advance(years: -1) # => 1000-03-06 00:00:00 UTC
174
185
 
175
- * Use SHA-1 to generate non-sensitive digests, such as the ETag header.
186
+ Note that this doesn't affect `DateTime#advance` as that doesn't use a proleptic calendar.
176
187
 
177
- Enabled by default for new apps; upgrading apps can opt in by setting
178
- `config.active_support.use_sha1_digests = true`.
188
+ *Andrew White*
179
189
 
180
- *Dmitri Dolguikh*, *Eugene Kenny*
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.
181
191
 
182
- * Changed default behaviour of `ActiveSupport::SecurityUtils.secure_compare`,
183
- to make it not leak length information even for variable length string.
192
+ *Xavier Noria*
184
193
 
185
- Renamed old `ActiveSupport::SecurityUtils.secure_compare` to `fixed_length_secure_compare`,
186
- and started raising `ArgumentError` in case of length mismatch of passed strings.
194
+ * Add support for supplying `locale` to `transliterate` and `parameterize`.
187
195
 
188
- *Vipul A M*
196
+ I18n.backend.store_translations(:de, i18n: { transliterate: { rule: { "ü" => "ue" } } })
189
197
 
190
- * Make `ActiveSupport::TimeZone.all` return only time zones that are in
191
- `ActiveSupport::TimeZone::MAPPING`.
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"
192
201
 
193
- Fixes #7245.
202
+ *Kaan Ozkan*, *Sharang Dashputre*
194
203
 
195
- *Chris LaRose*
204
+ * Allow `Array#excluding` and `Enumerable#excluding` to deal with a passed array gracefully.
196
205
 
197
- * MemCacheStore: Support expiring counters.
206
+ [ 1, 2, 3, 4, 5 ].excluding([4, 5]) # => [ 1, 2, 3 ]
198
207
 
199
- Pass `expires_in: [seconds]` to `#increment` and `#decrement` options
200
- to set the Memcached TTL (time-to-live) if the counter doesn't exist.
201
- If the counter exists, Memcached doesn't extend its expiry when it's
202
- incremented or decremented.
208
+ *DHH*
203
209
 
204
- ```
205
- Rails.cache.increment("my_counter", 1, expires_in: 2.minutes)
206
- ```
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.
207
212
 
208
- *Takumasa Ochi*
213
+ *DHH*
209
214
 
210
- * Handle `TZInfo::AmbiguousTime` errors.
215
+ * Added `Array#including` and `Enumerable#including` to conveniently enlarge a collection with more members using a method rather than an operator:
211
216
 
212
- Make `ActiveSupport::TimeWithZone` match Ruby's handling of ambiguous
213
- times by choosing the later period, e.g.
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!
214
219
 
215
- Ruby:
216
- ```
217
- ENV["TZ"] = "Europe/Moscow"
218
- Time.local(2014, 10, 26, 1, 0, 0) # => 2014-10-26 01:00:00 +0300
219
- ```
220
+ *DHH*
220
221
 
221
- Before:
222
- ```
223
- >> "2014-10-26 01:00:00".in_time_zone("Moscow")
224
- TZInfo::AmbiguousTime: 26/10/2014 01:00 is an ambiguous local time.
225
- ```
226
222
 
227
- After:
228
- ```
229
- >> "2014-10-26 01:00:00".in_time_zone("Moscow")
230
- => Sun, 26 Oct 2014 01:00:00 MSK +03:00
231
- ```
223
+ ## Rails 6.0.0.beta3 (March 11, 2019) ##
232
224
 
233
- Fixes #17395.
225
+ * No changes.
234
226
 
235
- *Andrew White*
236
227
 
237
- * Redis cache store.
228
+ ## Rails 6.0.0.beta2 (February 25, 2019) ##
238
229
 
239
- ```
240
- # Defaults to `redis://localhost:6379/0`. Only use for dev/test.
241
- config.cache_store = :redis_cache_store
242
-
243
- # Supports all common cache store options (:namespace, :compress,
244
- # :compress_threshold, :expires_in, :race_condition_ttl) and all
245
- # Redis options.
246
- cache_password = Rails.application.secrets.redis_cache_password
247
- config.cache_store = :redis_cache_store, driver: :hiredis,
248
- namespace: 'myapp-cache', compress: true, timeout: 1,
249
- url: "redis://:#{cache_password}@myapp-cache-1:6379/0"
250
-
251
- # Supports Redis::Distributed with multiple hosts
252
- config.cache_store = :redis_cache_store, driver: :hiredis
253
- namespace: 'myapp-cache', compress: true,
254
- url: %w[
255
- redis://myapp-cache-1:6379/0
256
- redis://myapp-cache-1:6380/0
257
- redis://myapp-cache-2:6379/0
258
- redis://myapp-cache-2:6380/0
259
- redis://myapp-cache-3:6379/0
260
- redis://myapp-cache-3:6380/0
261
- ]
262
-
263
- # Or pass a builder block
264
- config.cache_store = :redis_cache_store,
265
- namespace: 'myapp-cache', compress: true,
266
- redis: -> { Redis.new … }
267
- ```
230
+ * New autoloading based on [Zeitwerk](https://github.com/fxn/zeitwerk).
268
231
 
269
- Deployment note: Take care to use a *dedicated Redis cache* rather
270
- than pointing this at your existing Redis server. It won't cope well
271
- with mixed usage patterns and it won't expire cache entries by default.
232
+ *Xavier Noria*
272
233
 
273
- Redis cache server setup guide: https://redis.io/topics/lru-cache
234
+ * Revise `ActiveSupport::Notifications.unsubscribe` to correctly handle Regex or other multiple-pattern subscribers.
274
235
 
275
- *Jeremy Daer*
236
+ *Zach Kemp*
276
237
 
277
- * Cache: Enable compression by default for values > 1kB.
238
+ * Add `before_reset` callback to `CurrentAttributes` and define `after_reset` as an alias of `resets` for symmetry.
278
239
 
279
- Compression has long been available, but opt-in and at a 16kB threshold.
280
- It wasn't enabled by default due to CPU cost. Today it's cheap and typical
281
- cache data is eminently compressible, such as HTML or JSON fragments.
282
- Compression dramatically reduces Memcached/Redis mem usage, which means
283
- the same cache servers can store more data, which means higher hit rates.
240
+ *Rosa Gutierrez*
284
241
 
285
- To disable compression, pass `compress: false` to the initializer.
242
+ * Remove the `` Kernel#` `` override that suppresses ENOENT and accidentally returns nil on Unix systems.
286
243
 
287
- *Jeremy Daer*
244
+ *Akinori Musha*
288
245
 
289
- * Allow `Range#include?` on TWZ ranges.
246
+ * Add `ActiveSupport::HashWithIndifferentAccess#assoc`.
290
247
 
291
- In #11474 we prevented TWZ ranges being iterated over which matched
292
- Ruby's handling of Time ranges and as a consequence `include?`
293
- stopped working with both Time ranges and TWZ ranges. However in
294
- ruby/ruby@b061634 support was added for `include?` to use `cover?`
295
- for 'linear' objects. Since we have no way of making Ruby consider
296
- TWZ instances as 'linear' we have to override `Range#include?`.
248
+ `assoc` can now be called with either a string or a symbol.
297
249
 
298
- Fixes #30799.
250
+ *Stefan Schüßler*
299
251
 
300
- *Andrew White*
252
+ * Add `Hash#deep_transform_values`, and `Hash#deep_transform_values!`.
301
253
 
302
- * Fix acronym support in `humanize`.
254
+ *Guillermo Iguaran*
303
255
 
304
- Acronym inflections are stored with lowercase keys in the hash but
305
- the match wasn't being lowercased before being looked up in the hash.
306
- This shouldn't have any performance impact because before it would
307
- fail to find the acronym and perform the `downcase` operation anyway.
308
256
 
309
- Fixes #31052.
257
+ ## Rails 6.0.0.beta1 (January 18, 2019) ##
310
258
 
311
- *Andrew White*
259
+ * Remove deprecated `Module#reachable?` method.
312
260
 
313
- * Add same method signature for `Time#prev_year` and `Time#next_year`
314
- in accordance with `Date#prev_year`, `Date#next_year`.
261
+ *Rafael Mendonça França*
315
262
 
316
- Allows pass argument for `Time#prev_year` and `Time#next_year`.
263
+ * Remove deprecated `#acronym_regex` method from `Inflections`.
317
264
 
318
- Before:
319
- ```
320
- Time.new(2017, 9, 16, 17, 0).prev_year # => 2016-09-16 17:00:00 +0300
321
- Time.new(2017, 9, 16, 17, 0).prev_year(1)
322
- # => ArgumentError: wrong number of arguments (given 1, expected 0)
265
+ *Rafael Mendonça França*
323
266
 
324
- Time.new(2017, 9, 16, 17, 0).next_year # => 2018-09-16 17:00:00 +0300
325
- Time.new(2017, 9, 16, 17, 0).next_year(1)
326
- # => ArgumentError: wrong number of arguments (given 1, expected 0)
327
- ```
267
+ * Fix `String#safe_constantize` throwing a `LoadError` for incorrectly cased constant references.
328
268
 
329
- After:
330
- ```
331
- Time.new(2017, 9, 16, 17, 0).prev_year # => 2016-09-16 17:00:00 +0300
332
- Time.new(2017, 9, 16, 17, 0).prev_year(1) # => 2016-09-16 17:00:00 +0300
269
+ *Keenan Brock*
333
270
 
334
- Time.new(2017, 9, 16, 17, 0).next_year # => 2018-09-16 17:00:00 +0300
335
- Time.new(2017, 9, 16, 17, 0).next_year(1) # => 2018-09-16 17:00:00 +0300
336
- ```
271
+ * Preserve key order passed to `ActiveSupport::CacheStore#fetch_multi`.
337
272
 
338
- *bogdanvlviv*
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.
339
274
 
340
- * Add same method signature for `Time#prev_month` and `Time#next_month`
341
- in accordance with `Date#prev_month`, `Date#next_month`.
275
+ *Gannon McGibbon*
342
276
 
343
- Allows pass argument for `Time#prev_month` and `Time#next_month`.
277
+ * If the same block is `included` multiple times for a Concern, an exception is no longer raised.
344
278
 
345
- Before:
346
- ```
347
- Time.new(2017, 9, 16, 17, 0).prev_month # => 2017-08-16 17:00:00 +0300
348
- Time.new(2017, 9, 16, 17, 0).prev_month(1)
349
- # => ArgumentError: wrong number of arguments (given 1, expected 0)
279
+ *Mark J. Titorenko*, *Vlad Bokov*
350
280
 
351
- Time.new(2017, 9, 16, 17, 0).next_month # => 2017-10-16 17:00:00 +0300
352
- Time.new(2017, 9, 16, 17, 0).next_month(1)
353
- # => ArgumentError: wrong number of arguments (given 1, expected 0)
354
- ```
281
+ * Fix bug where `#to_options` for `ActiveSupport::HashWithIndifferentAccess`
282
+ would not act as alias for `#symbolize_keys`.
355
283
 
356
- After:
357
- ```
358
- Time.new(2017, 9, 16, 17, 0).prev_month # => 2017-08-16 17:00:00 +0300
359
- Time.new(2017, 9, 16, 17, 0).prev_month(1) # => 2017-08-16 17:00:00 +0300
284
+ *Nick Weiland*
360
285
 
361
- Time.new(2017, 9, 16, 17, 0).next_month # => 2017-10-16 17:00:00 +0300
362
- Time.new(2017, 9, 16, 17, 0).next_month(1) # => 2017-10-16 17:00:00 +0300
363
- ```
286
+ * Improve the logic that detects non-autoloaded constants.
364
287
 
365
- *bogdanvlviv*
288
+ *Jan Habermann*, *Xavier Noria*
366
289
 
367
- * Add same method signature for `Time#prev_day` and `Time#next_day`
368
- in accordance with `Date#prev_day`, `Date#next_day`.
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.
369
292
 
370
- Allows pass argument for `Time#prev_day` and `Time#next_day`.
293
+ *Francesco Rodríguez*
371
294
 
372
- Before:
373
- ```
374
- Time.new(2017, 9, 16, 17, 0).prev_day # => 2017-09-15 17:00:00 +0300
375
- Time.new(2017, 9, 16, 17, 0).prev_day(1)
376
- # => ArgumentError: wrong number of arguments (given 1, expected 0)
295
+ * Deprecate `ActiveSupport::Multibyte::Chars.consumes?` in favor of `String#is_utf8?`.
377
296
 
378
- Time.new(2017, 9, 16, 17, 0).next_day # => 2017-09-17 17:00:00 +0300
379
- Time.new(2017, 9, 16, 17, 0).next_day(1)
380
- # => ArgumentError: wrong number of arguments (given 1, expected 0)
381
- ```
297
+ *Francesco Rodríguez*
382
298
 
383
- After:
299
+ * Fix duration being rounded to a full second.
384
300
  ```
385
- Time.new(2017, 9, 16, 17, 0).prev_day # => 2017-09-15 17:00:00 +0300
386
- Time.new(2017, 9, 16, 17, 0).prev_day(1) # => 2017-09-15 17:00:00 +0300
387
-
388
- Time.new(2017, 9, 16, 17, 0).next_day # => 2017-09-17 17:00:00 +0300
389
- 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
390
303
  ```
304
+ Will now correctly add 0.51 second and not 1 full second.
391
305
 
392
- *bogdanvlviv*
306
+ *Edouard Chin*
393
307
 
394
- * `IO#to_json` now returns the `to_s` representation, rather than
395
- attempting to convert to an array. This fixes a bug where `IO#to_json`
396
- 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`
397
310
 
398
- Fixes #26132.
311
+ *Francesco Rodríguez*
399
312
 
400
- *Paul Kuruvilla*
313
+ * Deprecate `ActiveSupport::Multibyte::Unicode#downcase/upcase/swapcase` in favor of
314
+ `String#downcase/upcase/swapcase`.
401
315
 
402
- * Remove deprecated `halt_callback_chains_on_return_false` option.
316
+ *Francesco Rodríguez*
403
317
 
404
- *Rafael Mendonça França*
405
-
406
- * Remove deprecated `:if` and `:unless` string filter for callbacks.
318
+ * Add `ActiveSupport::ParameterFilter`.
407
319
 
408
- *Rafael Mendonça França*
320
+ *Yoshiyuki Kinjo*
409
321
 
410
- * `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`.
411
324
 
412
- *Akira Matsuda*
325
+ *Gannon McGibbon*
413
326
 
414
- * Deprecate `secrets.secret_token`.
327
+ * Deprecate the use of `LoggerSilence` in favor of `ActiveSupport::LoggerSilence`
415
328
 
416
- The architecture for secrets had a big upgrade between Rails 3 and Rails 4,
417
- when the default changed from using `secret_token` to `secret_key_base`.
329
+ *Edouard Chin*
418
330
 
419
- `secret_token` has been soft deprecated in documentation for four years
420
- but is still in place to support apps created before Rails 4.
421
- Deprecation warnings have been added to help developers upgrade their
422
- applications to `secret_key_base`.
331
+ * Deprecate using negative limits in `String#first` and `String#last`.
423
332
 
424
- *claudiob*, *Kasper Timm Hansen*
333
+ *Gannon McGibbon*, *Eric Turner*
425
334
 
426
- * Return an instance of `HashWithIndifferentAccess` from `HashWithIndifferentAccess#transform_keys`.
335
+ * Fix bug where `#without` for `ActiveSupport::HashWithIndifferentAccess` would fail
336
+ with symbol arguments
427
337
 
428
- *Yuji Yaginuma*
338
+ *Abraham Chan*
429
339
 
430
- * Add key rotation support to `MessageEncryptor` and `MessageVerifier`.
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.
431
342
 
432
- This change introduces a `rotate` method to both the `MessageEncryptor` and
433
- `MessageVerifier` classes. This method accepts the same arguments and
434
- options as the given classes' constructor. The `encrypt_and_verify` method
435
- for `MessageEncryptor` and the `verified` method for `MessageVerifier` also
436
- accept an optional keyword argument `:on_rotation` block which is called
437
- when a rotated instance is used to decrypt or verify the message.
343
+ *Janosch Müller*
438
344
 
439
- *Michael J Coyne*
345
+ * Changed `ActiveSupport::TaggedLogging.new` to return a new logger instance instead
346
+ of mutating the one received as parameter.
440
347
 
441
- * Deprecate `Module#reachable?` method.
348
+ *Thierry Joyal*
442
349
 
443
- *bogdanvlviv*
350
+ * Define `unfreeze_time` as an alias of `travel_back` in `ActiveSupport::Testing::TimeHelpers`.
444
351
 
445
- * Add `config/credentials.yml.enc` to store production app secrets.
352
+ The alias is provided for symmetry with `freeze_time`.
446
353
 
447
- Allows saving any authentication credentials for third party services
448
- directly in repo encrypted with `config/master.key` or `ENV["RAILS_MASTER_KEY"]`.
354
+ *Ryan Davidson*
449
355
 
450
- This will eventually replace `Rails.application.secrets` and the encrypted
451
- secrets introduced in Rails 5.1.
356
+ * Add support for tracing constant autoloads. Just throw
452
357
 
453
- *DHH*, *Kasper Timm Hansen*
358
+ ActiveSupport::Dependencies.logger = Rails.logger
359
+ ActiveSupport::Dependencies.verbose = true
454
360
 
455
- * Add `ActiveSupport::EncryptedFile` and `ActiveSupport::EncryptedConfiguration`.
361
+ in an initializer.
456
362
 
457
- Allows for stashing encrypted files or configuration directly in repo by
458
- encrypting it with a key.
363
+ *Xavier Noria*
459
364
 
460
- Backs the new credentials setup above, but can also be used independently.
365
+ * Maintain `html_safe?` on html_safe strings when sliced.
461
366
 
462
- *DHH*, *Kasper Timm Hansen*
367
+ string = "<div>test</div>".html_safe
368
+ string[-1..1].html_safe? # => true
463
369
 
464
- * `Module#delegate_missing_to` now raises `DelegationError` if target is nil,
465
- similar to `Module#delegate`.
370
+ *Elom Gomez*, *Yumin Wong*
466
371
 
467
- *Anton Khamets*
372
+ * Add `Array#extract!`.
468
373
 
469
- * Update `String#camelize` to provide feedback when wrong option is passed.
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.
470
376
 
471
- `String#camelize` was returning nil without any feedback when an
472
- invalid option was passed as a parameter.
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]
473
380
 
474
- Previously:
475
-
476
- 'one_two'.camelize(true)
477
- # => nil
478
-
479
- Now:
480
-
481
- 'one_two'.camelize(true)
482
- # => ArgumentError: Invalid option, use either :upper or :lower.
483
-
484
- *Ricardo Díaz*
485
-
486
- * Fix modulo operations involving durations.
487
-
488
- Rails 5.1 introduced `ActiveSupport::Duration::Scalar` as a wrapper
489
- around numeric values as a way of ensuring a duration was the outcome of
490
- an expression. However, the implementation was missing support for modulo
491
- operations. This support has now been added and should result in a duration
492
- being returned from expressions involving modulo operations.
381
+ *bogdanvlviv*
493
382
 
494
- Prior to Rails 5.1:
383
+ * Support not to cache `nil` for `ActiveSupport::Cache#fetch`.
495
384
 
496
- 5.minutes % 2.minutes
497
- # => 60
385
+ cache.fetch('bar', skip_nil: true) { nil }
386
+ cache.exist?('bar') # => false
498
387
 
499
- Now:
388
+ *Martin Hong*
500
389
 
501
- 5.minutes % 2.minutes
502
- # => 1 minute
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:
503
393
 
504
- Fixes #29603 and #29743.
394
+ ActiveSupport::Notifications.subscribe('wait') do |*args|
395
+ @event = ActiveSupport::Notifications::Event.new(*args)
396
+ end
505
397
 
506
- *Sayan Chakraborty*, *Andrew White*
398
+ ActiveSupport::Notifications.instrument('wait') do
399
+ sleep 1
400
+ end
507
401
 
508
- * Fix division where a duration is the denominator.
402
+ @event.duration # => 1000.138
509
403
 
510
- PR #29163 introduced a change in behavior when a duration was the denominator
511
- in a calculation - this was incorrect as dividing by a duration should always
512
- return a `Numeric`. The behavior of previous versions of Rails has been restored.
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:
513
407
 
514
- Fixes #29592.
408
+ ActiveSupport::Notifications.subscribe('wait') do |event|
409
+ @event = event
410
+ end
515
411
 
516
- *Andrew White*
412
+ ActiveSupport::Notifications.instrument('wait') do
413
+ sleep 1
414
+ end
517
415
 
518
- * Add purpose and expiry support to `ActiveSupport::MessageVerifier` and
519
- `ActiveSupport::MessageEncryptor`.
416
+ p @event.allocations # => 7
417
+ p @event.cpu_time # => 0.256
418
+ p @event.idle_time # => 1003.2399
520
419
 
521
- For instance, to ensure a message is only usable for one intended purpose:
420
+ Now you can enjoy event objects without making them yourself. Neat!
522
421
 
523
- token = @verifier.generate("x", purpose: :shipping)
422
+ *Aaron "t.lo" Patterson*
524
423
 
525
- @verifier.verified(token, purpose: :shipping) # => "x"
526
- @verifier.verified(token) # => nil
424
+ * Add cpu_time, idle_time, and allocations to Event.
527
425
 
528
- Or make it expire after a set time:
426
+ *Eileen M. Uchitelle*, *Aaron Patterson*
529
427
 
530
- @verifier.generate("x", expires_in: 1.month)
531
- @verifier.generate("y", expires_at: Time.now.end_of_year)
428
+ * RedisCacheStore: support key expiry in increment/decrement.
532
429
 
533
- Showcased with `ActiveSupport::MessageVerifier`, but works the same for
534
- `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.
535
431
 
536
- Pull requests: #29599, #29854
432
+ If the key is already set to expire, RedisCacheStore won't extend its expiry.
537
433
 
538
- *Assain Jaleel*
434
+ Rails.cache.increment("some_key", 1, expires_in: 2.minutes)
539
435
 
540
- * Make the order of `Hash#reverse_merge!` consistent with `HashWithIndifferentAccess`.
436
+ *Jason Lee*
541
437
 
542
- *Erol Fornoles*
438
+ * Allow `Range#===` and `Range#cover?` on Range.
543
439
 
544
- * Add `freeze_time` helper which freezes time to `Time.now` in tests.
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.
545
443
 
546
- *Prathamesh Sonpatki*
444
+ *Requiring active_support/core_ext/range/include_range is now deprecated.*
445
+ *Use `require "active_support/core_ext/range/compare_range"` instead.*
547
446
 
548
- * Default `ActiveSupport::MessageEncryptor` to use AES 256 GCM encryption.
447
+ *utilum*
549
448
 
550
- On for new Rails 5.2 apps. Upgrading apps can find the config as a new
551
- framework default.
449
+ * Add `index_with` to Enumerable.
552
450
 
553
- *Assain Jaleel*
451
+ Allows creating a hash from an enumerable with the value from a passed block
452
+ or a default argument.
554
453
 
555
- * Cache: `write_multi`.
454
+ %i( title body ).index_with { |attr| post.public_send(attr) }
455
+ # => { title: "hey", body: "what's up?" }
556
456
 
557
- Rails.cache.write_multi foo: 'bar', baz: 'qux'
457
+ %i( title body ).index_with(nil)
458
+ # => { title: nil, body: nil }
558
459
 
559
- Plus faster fetch_multi with stores that implement `write_multi_entries`.
560
- Keys that aren't found may be written to the cache store in one shot
561
- instead of separate writes.
460
+ Closely linked with `index_by`, which creates a hash where the keys are extracted from a block.
562
461
 
563
- The default implementation simply calls `write_entry` for each entry.
564
- Stores may override if they're capable of one-shot bulk writes, like
565
- Redis `MSET`.
462
+ *Kasper Timm Hansen*
566
463
 
567
- *Jeremy Daer*
464
+ * Fix bug where `ActiveSupport::TimeZone.all` would fail when tzinfo data for
465
+ any timezone defined in `ActiveSupport::TimeZone::MAPPING` is missing.
568
466
 
569
- * Add default option to module and class attribute accessors.
467
+ *Dominik Sander*
570
468
 
571
- mattr_accessor :settings, default: {}
469
+ * Redis cache store: `delete_matched` no longer blocks the Redis server.
470
+ (Switches from evaled Lua to a batched SCAN + DEL loop.)
572
471
 
573
- Works for `mattr_reader`, `mattr_writer`, `cattr_accessor`, `cattr_reader`,
574
- and `cattr_writer` as well.
472
+ *Gleb Mazovetskiy*
575
473
 
576
- *Genadi Samokovarov*
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.
577
478
 
578
- * Add `Date#prev_occurring` and `Date#next_occurring` to return specified next/previous occurring day of week.
479
+ *Godfrey Chan*
579
480
 
580
- *Shota Iguchi*
481
+ * Fix bug where `URI.unescape` would fail with mixed Unicode/escaped character input:
581
482
 
582
- * Add default option to `class_attribute`.
483
+ URI.unescape("\xe3\x83\x90") # => "バ"
484
+ URI.unescape("%E3%83%90") # => "バ"
485
+ URI.unescape("\xe3\x83\x90%E3%83%90") # => Encoding::CompatibilityError
583
486
 
584
- Before:
487
+ *Ashe Connor*, *Aaron Patterson*
585
488
 
586
- class_attribute :settings
587
- self.settings = {}
489
+ * Add `before?` and `after?` methods to `Date`, `DateTime`,
490
+ `Time`, and `TimeWithZone`.
588
491
 
589
- Now:
492
+ *Nick Holden*
590
493
 
591
- class_attribute :settings, default: {}
494
+ * `ActiveSupport::Inflector#ordinal` and `ActiveSupport::Inflector#ordinalize` now support
495
+ translations through I18n.
592
496
 
593
- *DHH*
497
+ # locale/fr.rb
594
498
 
595
- * `#singularize` and `#pluralize` now respect uncountables for the specified locale.
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,
596
510
 
597
- *Eilis Hamilton*
511
+ ordinalized: lambda do |_key, number:, **_options|
512
+ "#{number}#{ActiveSupport::Inflector.ordinal(number)}"
513
+ end
514
+ }
515
+ }
516
+ }
517
+ }
598
518
 
599
- * Add `ActiveSupport::CurrentAttributes` to provide a thread-isolated attributes singleton.
600
- Primary use case is keeping all the per-request attributes easily available to the whole system.
601
519
 
602
- *DHH*
520
+ *Christian Blais*
603
521
 
604
- * Fix implicit coercion calculations with scalars and durations.
522
+ * Add `:private` option to ActiveSupport's `Module#delegate`
523
+ in order to delegate methods as private:
605
524
 
606
- Previously, calculations where the scalar is first would be converted to a duration
607
- of seconds, but this causes issues with dates being converted to times, e.g:
525
+ class User < ActiveRecord::Base
526
+ has_one :profile
527
+ delegate :date_of_birth, to: :profile, private: true
608
528
 
609
- Time.zone = "Beijing" # => Asia/Shanghai
610
- date = Date.civil(2017, 5, 20) # => Mon, 20 May 2017
611
- 2 * 1.day # => 172800 seconds
612
- date + 2 * 1.day # => Mon, 22 May 2017 00:00:00 CST +08:00
529
+ def age
530
+ Date.today.year - date_of_birth.year
531
+ end
532
+ end
613
533
 
614
- Now, the `ActiveSupport::Duration::Scalar` calculation methods will try to maintain
615
- the part structure of the duration where possible, e.g:
534
+ # User.new.age # => 29
535
+ # User.new.date_of_birth
536
+ # => NoMethodError: private method `date_of_birth' called for #<User:0x00000008221340>
616
537
 
617
- Time.zone = "Beijing" # => Asia/Shanghai
618
- date = Date.civil(2017, 5, 20) # => Mon, 20 May 2017
619
- 2 * 1.day # => 2 days
620
- date + 2 * 1.day # => Mon, 22 May 2017
538
+ *Tomas Valent*
621
539
 
622
- Fixes #29160, #28970.
540
+ * `String#truncate_bytes` to truncate a string to a maximum bytesize without
541
+ breaking multibyte characters or grapheme clusters like 👩‍👩‍👦‍👦.
623
542
 
624
- *Andrew White*
543
+ *Jeremy Daer*
625
544
 
626
- * Add support for versioned cache entries. This enables the cache stores to recycle cache keys, greatly saving
627
- on storage in cases with frequent churn. Works together with the separation of `#cache_key` and `#cache_version`
628
- in Active Record and its use in Action Pack's fragment caching.
545
+ * `String#strip_heredoc` preserves frozenness.
629
546
 
630
- *DHH*
547
+ "foo".freeze.strip_heredoc.frozen? # => true
631
548
 
632
- * Pass gem name and deprecation horizon to deprecation notifications.
549
+ Fixes that frozen string literals would inadvertently become unfrozen:
633
550
 
634
- *Willem van Bergen*
551
+ # frozen_string_literal: true
635
552
 
636
- * Add support for `:offset` and `:zone` to `ActiveSupport::TimeWithZone#change`.
553
+ foo = <<-MSG.strip_heredoc
554
+ la la la
555
+ MSG
637
556
 
638
- *Andrew White*
557
+ foo.frozen? # => false !??
639
558
 
640
- * Add support for `:offset` to `Time#change`.
559
+ *Jeremy Daer*
641
560
 
642
- Fixes #28723.
561
+ * Rails 6 requires Ruby 2.5.0 or newer.
643
562
 
644
- *Andrew White*
563
+ *Jeremy Daer*, *Kasper Timm Hansen*
645
564
 
646
- * Add `fetch_values` for `HashWithIndifferentAccess`.
565
+ * Adds parallel testing to Rails.
647
566
 
648
- The method was originally added to `Hash` in Ruby 2.3.0.
567
+ Parallelize your test suite with forked processes or threads.
649
568
 
650
- *Josh Pencheon*
569
+ *Eileen M. Uchitelle*, *Aaron Patterson*
651
570
 
652
571
 
653
- Please check [5-1-stable](https://github.com/rails/rails/blob/5-1-stable/activesupport/CHANGELOG.md) for previous changes.
572
+ Please check [5-2-stable](https://github.com/rails/rails/blob/5-2-stable/activesupport/CHANGELOG.md) for previous changes.