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.

Files changed (138) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +331 -396
  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 +5 -0
  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 +36 -9
  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 +3 -3
  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: 1fd0afb64741d8e794acec9c74cca9ed2526e30ac7c78e5b66135bfc2567a187
4
- data.tar.gz: 33b2caf831d3c6907351646dbe4ab033b810adcdf0737a627e712b50782b7ed7
3
+ metadata.gz: 20a0c971abcca4b9dabec6e28ef72c919a6ffaed5e35b29e4c3e2f359e99341b
4
+ data.tar.gz: e42089cf6ad412ef2fcf772afd6a8e010944b57fde1833c9d495dfb9c5eb3da5
5
5
  SHA512:
6
- metadata.gz: 5a78f3d685d14d51a926f0cc38d800bc0440d8f71fd1198fbe9842cccfb12875b4930377da6681518aa4c473bbc0a0cd8b65067916dedbf7a7b07a1815fcc1b6
7
- data.tar.gz: 4c32299fa0aa0c61e5a415c10aa152b3bb9bf286b3836914fed1458fb43183ad8ee38908dd0af59403edfc3f062dc5f4e11772305f1abc599f3ddd0c90c211dc
6
+ metadata.gz: 8ff0c3e5feb9bb0dfcf5e0c95b4fb5bb8c6a30d2e276101c8ec949db9ad0895c397dc33cc1a99ec2636b45b3169a495eb8c852440956d8500d95399548b70948
7
+ data.tar.gz: fdf6945ee23e487a9b0403fcac9a7b51551900a6338a4caeb34970656033fd1e62c00eda5d463fb6fc3d0ad880470c7544f2a2108bcc5809520a8436d1bdf360
@@ -1,4 +1,14 @@
1
- ## Rails 5.2.4 (November 27, 2019) ##
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
- ## Rails 5.2.3 (March 27, 2019) ##
37
-
38
- * Add `ActiveSupport::HashWithIndifferentAccess#assoc`.
50
+ *Aaron Lipman*
39
51
 
40
- `assoc` can now be called with either a string or a symbol.
52
+ ## Rails 6.0.0.rc2 (July 22, 2019) ##
41
53
 
42
- *Stefan Schüßler*
43
-
44
- * Fix `String#safe_constantize` throwing a `LoadError` for incorrectly cased constant references.
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
- *Keenan Brock*
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
- * 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
57
65
 
58
- *Mark J. Titorenko*, *Vlad Bokov*
66
+ After:
59
67
 
68
+ 'foobar'.truncate(5).frozen?
69
+ # => false
70
+ 'foobar'.truncate(6).frozen?
71
+ # => false
60
72
 
61
- ## Rails 5.2.2.1 (March 11, 2019) ##
73
+ *Jordan Thomas*
62
74
 
63
- * No changes.
64
75
 
76
+ ## Rails 6.0.0.rc1 (April 24, 2019) ##
65
77
 
66
- ## Rails 5.2.2 (December 04, 2018) ##
78
+ * Introduce `ActiveSupport::ActionableError`.
67
79
 
68
- * Fix bug where `#to_options` for `ActiveSupport::HashWithIndifferentAccess`
69
- 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.
70
83
 
71
- *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.
72
89
 
73
- * Improve the logic that detects non-autoloaded constants.
90
+ Here is how to define an actionable error:
74
91
 
75
- *Jan Habermann*, *Xavier Noria*
92
+ ```ruby
93
+ class PendingMigrationError < MigrationError #:nodoc:
94
+ include ActiveSupport::ActionableError
76
95
 
77
- * Fix bug where `URI.unescape` would fail with mixed Unicode/escaped character input:
96
+ action "Run pending migrations" do
97
+ ActiveRecord::Tasks::DatabaseTasks.migrate
98
+ end
99
+ end
100
+ ```
78
101
 
79
- URI.unescape("\xe3\x83\x90") # => "バ"
80
- URI.unescape("%E3%83%90") # => "バ"
81
- URI.unescape("\xe3\x83\x90%E3%83%90") # => Encoding::CompatibilityError
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
- *Ashe Connor*, *Aaron Patterson*
108
+ *Vipul A M*, *Yao Jie*, *Genadi Samokovarov*
84
109
 
110
+ * Preserve `html_safe?` status on `ActiveSupport::SafeBuffer#*`.
85
111
 
86
- ## Rails 5.2.1.1 (November 27, 2018) ##
112
+ Before:
87
113
 
88
- * No changes.
114
+ ("<br />".html_safe * 2).html_safe? #=> nil
89
115
 
116
+ After:
90
117
 
91
- ## Rails 5.2.1 (August 07, 2018) ##
118
+ ("<br />".html_safe * 2).html_safe? #=> true
92
119
 
93
- * Redis cache store: `delete_matched` no longer blocks the Redis server.
94
- (Switches from evaled Lua to a batched SCAN + DEL loop.)
120
+ *Ryo Nakamura*
95
121
 
96
- *Gleb Mazovetskiy*
122
+ * Calling test methods with `with_info_handler` method to allow minitest-hooks
123
+ plugin to work.
97
124
 
98
- * Fix bug where `ActiveSupport::Timezone.all` would fail when tzinfo data for
99
- any timezone defined in `ActiveSupport::TimeZone::MAPPING` is missing.
125
+ *Mauri Mustonen*
100
126
 
101
- *Dominik Sander*
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
- * Fix bug where `ActiveSupport::Cache` will massively inflate the storage
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
- *Godfrey Chan*
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
- * Fix `ActiveSupport::Cache#read_multi` bug with local cache enabled that was
111
- returning instances of `ActiveSupport::Cache::Entry` instead of the raw values.
139
+ *Xavier Noria*
112
140
 
113
- *Jason Lee*
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
- ## Rails 5.2.0 (April 09, 2018) ##
148
+ *Xavier Noria*
117
149
 
118
- * Caching: MemCache and Redis `read_multi` and `fetch_multi` speedup.
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
- *Gabriel Sobrinho*
152
+ Before:
122
153
 
123
- * Return all mappings for a timezone identifier in `country_zones`.
154
+ (1..10).cover?(1...11) # => false
124
155
 
125
- Some timezones like `Europe/London` have multiple mappings in
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
- # Before
130
- ActiveSupport::TimeZone.country_zones("GB") # => ["Edinburgh"]
158
+ (1..10).cover?(1...11) # => true
131
159
 
132
- # After
133
- ActiveSupport::TimeZone.country_zones("GB") # => ["Edinburgh", "London"]
160
+ With the same change for `Range#include?` and `Range#===`.
134
161
 
135
- Fixes #31668.
162
+ *Owen Stephens*
136
163
 
137
- *Andrew White*
164
+ * Use weak references in descendants tracker to allow anonymous subclasses to
165
+ be garbage collected.
138
166
 
139
- * Add support for connection pooling on RedisCacheStore.
167
+ *Edgars Beigarts*
140
168
 
141
- *fatkodima*
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
- * Support hash as first argument in `assert_difference`. This allows to specify multiple
144
- numeric differences in the same assertion.
174
+ *Ali Ibrahim*
145
175
 
146
- assert_difference ->{ Article.count } => 1, ->{ Post.count } => 2
176
+ * Fix `Time#advance` to work with dates before 1001-03-07
147
177
 
148
- *Julien Meichelbeck*
178
+ Before:
149
179
 
150
- * Add missing instrumentation for `read_multi` in `ActiveSupport::Cache::Store`.
180
+ Time.utc(1001, 3, 6).advance(years: -1) # => 1000-03-05 00:00:00 UTC
151
181
 
152
- *Ignatius Reza Lesmana*
182
+ After
153
183
 
154
- * `assert_changes` will always assert that the expression changes,
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
- *Daniel Ma*
186
+ Note that this doesn't affect `DateTime#advance` as that doesn't use a proleptic calendar.
158
187
 
159
- * Use SHA-1 to generate non-sensitive digests, such as the ETag header.
188
+ *Andrew White*
160
189
 
161
- Enabled by default for new apps; upgrading apps can opt in by setting
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
- *Dmitri Dolguikh*, *Eugene Kenny*
192
+ *Xavier Noria*
165
193
 
166
- * Changed default behaviour of `ActiveSupport::SecurityUtils.secure_compare`,
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
- Renamed old `ActiveSupport::SecurityUtils.secure_compare` to `fixed_length_secure_compare`,
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
- *Vipul A M*
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
- * Make `ActiveSupport::TimeZone.all` return only time zones that are in
175
- `ActiveSupport::TimeZone::MAPPING`.
202
+ *Kaan Ozkan*, *Sharang Dashputre*
176
203
 
177
- Fixes #7245.
204
+ * Allow `Array#excluding` and `Enumerable#excluding` to deal with a passed array gracefully.
178
205
 
179
- *Chris LaRose*
206
+ [ 1, 2, 3, 4, 5 ].excluding([4, 5]) # => [ 1, 2, 3 ]
180
207
 
181
- * MemCacheStore: Support expiring counters.
208
+ *DHH*
182
209
 
183
- Pass `expires_in: [seconds]` to `#increment` and `#decrement` options
184
- to set the Memcached TTL (time-to-live) if the counter doesn't exist.
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
- *Takumasa Ochi*
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
- * Handle `TZInfo::AmbiguousTime` errors.
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
- Make `ActiveSupport::TimeWithZone` match Ruby's handling of ambiguous
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
- Before:
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
- After:
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
- *Andrew White*
228
+ ## Rails 6.0.0.beta2 (February 25, 2019) ##
220
229
 
221
- * Redis cache store.
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
- Deployment note: Take care to use a *dedicated Redis cache* rather
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
- Redis cache server setup guide: https://redis.io/topics/lru-cache
236
+ *Zach Kemp*
258
237
 
259
- *Jeremy Daer*
238
+ * Add `before_reset` callback to `CurrentAttributes` and define `after_reset` as an alias of `resets` for symmetry.
260
239
 
261
- * Cache: Enable compression by default for values > 1kB.
240
+ *Rosa Gutierrez*
262
241
 
263
- Compression has long been available, but opt-in and at a 16kB threshold.
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
- To disable compression, pass `compress: false` to the initializer.
244
+ *Akinori Musha*
270
245
 
271
- *Jeremy Daer*
246
+ * Add `ActiveSupport::HashWithIndifferentAccess#assoc`.
272
247
 
273
- * Allow `Range#include?` on TWZ ranges.
248
+ `assoc` can now be called with either a string or a symbol.
274
249
 
275
- In #11474 we prevented TWZ ranges being iterated over which matched
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
- Fixes #30799.
252
+ * Add `Hash#deep_transform_values`, and `Hash#deep_transform_values!`.
283
253
 
284
- *Andrew White*
254
+ *Guillermo Iguaran*
285
255
 
286
- * Fix acronym support in `humanize`.
287
256
 
288
- Acronym inflections are stored with lowercase keys in the hash but
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
- Fixes #31052.
259
+ * Remove deprecated `Module#reachable?` method.
294
260
 
295
- *Andrew White*
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
- Allows pass argument for `Time#prev_year` and `Time#next_year`.
263
+ * Remove deprecated `#acronym_regex` method from `Inflections`.
301
264
 
302
- Before:
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
- Time.new(2017, 9, 16, 17, 0).next_year # => 2018-09-16 17:00:00 +0300
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
- After:
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
- Time.new(2017, 9, 16, 17, 0).next_year # => 2018-09-16 17:00:00 +0300
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
- *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.
323
274
 
324
- * Add same method signature for `Time#prev_month` and `Time#next_month`
325
- in accordance with `Date#prev_month`, `Date#next_month`.
275
+ *Gannon McGibbon*
326
276
 
327
- 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.
328
278
 
329
- Before:
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
- Time.new(2017, 9, 16, 17, 0).next_month # => 2017-10-16 17:00:00 +0300
336
- Time.new(2017, 9, 16, 17, 0).next_month(1)
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
- After:
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
- Time.new(2017, 9, 16, 17, 0).next_month # => 2017-10-16 17:00:00 +0300
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
- *bogdanvlviv*
288
+ *Jan Habermann*, *Xavier Noria*
350
289
 
351
- * Add same method signature for `Time#prev_day` and `Time#next_day`
352
- 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.
353
292
 
354
- Allows pass argument for `Time#prev_day` and `Time#next_day`.
293
+ *Francesco Rodríguez*
355
294
 
356
- Before:
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
- Time.new(2017, 9, 16, 17, 0).next_day # => 2017-09-17 17:00:00 +0300
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
- After:
299
+ * Fix duration being rounded to a full second.
368
300
  ```
369
- Time.new(2017, 9, 16, 17, 0).prev_day # => 2017-09-15 17:00:00 +0300
370
- Time.new(2017, 9, 16, 17, 0).prev_day(1) # => 2017-09-15 17:00:00 +0300
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
- *bogdanvlviv*
306
+ *Edouard Chin*
377
307
 
378
- * `IO#to_json` now returns the `to_s` representation, rather than
379
- attempting to convert to an array. This fixes a bug where `IO#to_json`
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
- Fixes #26132.
311
+ *Francesco Rodríguez*
383
312
 
384
- *Paul Kuruvilla*
313
+ * Deprecate `ActiveSupport::Multibyte::Unicode#downcase/upcase/swapcase` in favor of
314
+ `String#downcase/upcase/swapcase`.
385
315
 
386
- * Remove deprecated `halt_callback_chains_on_return_false` option.
316
+ *Francesco Rodríguez*
387
317
 
388
- *Rafael Mendonça França*
318
+ * Add `ActiveSupport::ParameterFilter`.
389
319
 
390
- * Remove deprecated `:if` and `:unless` string filter for callbacks.
320
+ *Yoshiyuki Kinjo*
391
321
 
392
- *Rafael Mendonça França*
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
- *Akira Matsuda*
325
+ *Gannon McGibbon*
397
326
 
398
- * Deprecate `secrets.secret_token`.
327
+ * Deprecate the use of `LoggerSilence` in favor of `ActiveSupport::LoggerSilence`
399
328
 
400
- The architecture for secrets had a big upgrade between Rails 3 and Rails 4,
401
- when the default changed from using `secret_token` to `secret_key_base`.
329
+ *Edouard Chin*
402
330
 
403
- `secret_token` has been soft deprecated in documentation for four years
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
- *claudiob*, *Kasper Timm Hansen*
333
+ *Gannon McGibbon*, *Eric Turner*
409
334
 
410
- * Return an instance of `HashWithIndifferentAccess` from `HashWithIndifferentAccess#transform_keys`.
335
+ * Fix bug where `#without` for `ActiveSupport::HashWithIndifferentAccess` would fail
336
+ with symbol arguments
411
337
 
412
- *Yuji Yaginuma*
338
+ *Abraham Chan*
413
339
 
414
- * 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.
415
342
 
416
- This change introduces a `rotate` method to both the `MessageEncryptor` and
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
- *Michael J Coyne*
345
+ * Changed `ActiveSupport::TaggedLogging.new` to return a new logger instance instead
346
+ of mutating the one received as parameter.
424
347
 
425
- * Deprecate `Module#reachable?` method.
426
-
427
- *bogdanvlviv*
348
+ *Thierry Joyal*
428
349
 
429
- * Add `config/credentials.yml.enc` to store production app secrets.
350
+ * Define `unfreeze_time` as an alias of `travel_back` in `ActiveSupport::Testing::TimeHelpers`.
430
351
 
431
- Allows saving any authentication credentials for third party services
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
- This will eventually replace `Rails.application.secrets` and the encrypted
435
- secrets introduced in Rails 5.1.
354
+ *Ryan Davidson*
436
355
 
437
- *DHH*, *Kasper Timm Hansen*
356
+ * Add support for tracing constant autoloads. Just throw
438
357
 
439
- * Add `ActiveSupport::EncryptedFile` and `ActiveSupport::EncryptedConfiguration`.
358
+ ActiveSupport::Dependencies.logger = Rails.logger
359
+ ActiveSupport::Dependencies.verbose = true
440
360
 
441
- Allows for stashing encrypted files or configuration directly in repo by
442
- encrypting it with a key.
361
+ in an initializer.
443
362
 
444
- Backs the new credentials setup above, but can also be used independently.
363
+ *Xavier Noria*
445
364
 
446
- *DHH*, *Kasper Timm Hansen*
365
+ * Maintain `html_safe?` on html_safe strings when sliced.
447
366
 
448
- * `Module#delegate_missing_to` now raises `DelegationError` if target is nil,
449
- similar to `Module#delegate`.
367
+ string = "<div>test</div>".html_safe
368
+ string[-1..1].html_safe? # => true
450
369
 
451
- *Anton Khamets*
370
+ *Elom Gomez*, *Yumin Wong*
452
371
 
453
- * Update `String#camelize` to provide feedback when wrong option is passed.
372
+ * Add `Array#extract!`.
454
373
 
455
- `String#camelize` was returning nil without any feedback when an
456
- invalid option was passed as a parameter.
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
- Previously:
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
- 'one_two'.camelize(true)
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
- Prior to Rails 5.1:
383
+ * Support not to cache `nil` for `ActiveSupport::Cache#fetch`.
479
384
 
480
- 5.minutes % 2.minutes
481
- # => 60
385
+ cache.fetch('bar', skip_nil: true) { nil }
386
+ cache.exist?('bar') # => false
482
387
 
483
- Now:
388
+ *Martin Hong*
484
389
 
485
- 5.minutes % 2.minutes
486
- # => 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:
487
393
 
488
- Fixes #29603 and #29743.
394
+ ActiveSupport::Notifications.subscribe('wait') do |*args|
395
+ @event = ActiveSupport::Notifications::Event.new(*args)
396
+ end
489
397
 
490
- *Sayan Chakraborty*, *Andrew White*
398
+ ActiveSupport::Notifications.instrument('wait') do
399
+ sleep 1
400
+ end
491
401
 
492
- * Fix division where a duration is the denominator.
402
+ @event.duration # => 1000.138
493
403
 
494
- PR #29163 introduced a change in behavior when a duration was the denominator
495
- in a calculation - this was incorrect as dividing by a duration should always
496
- 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:
497
407
 
498
- Fixes #29592.
408
+ ActiveSupport::Notifications.subscribe('wait') do |event|
409
+ @event = event
410
+ end
499
411
 
500
- *Andrew White*
412
+ ActiveSupport::Notifications.instrument('wait') do
413
+ sleep 1
414
+ end
501
415
 
502
- * Add purpose and expiry support to `ActiveSupport::MessageVerifier` and
503
- `ActiveSupport::MessageEncryptor`.
416
+ p @event.allocations # => 7
417
+ p @event.cpu_time # => 0.256
418
+ p @event.idle_time # => 1003.2399
504
419
 
505
- 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!
506
421
 
507
- token = @verifier.generate("x", purpose: :shipping)
422
+ *Aaron "t.lo" Patterson*
508
423
 
509
- @verifier.verified(token, purpose: :shipping) # => "x"
510
- @verifier.verified(token) # => nil
424
+ * Add cpu_time, idle_time, and allocations to Event.
511
425
 
512
- Or make it expire after a set time:
426
+ *Eileen M. Uchitelle*, *Aaron Patterson*
513
427
 
514
- @verifier.generate("x", expires_in: 1.month)
515
- @verifier.generate("y", expires_at: Time.now.end_of_year)
428
+ * RedisCacheStore: support key expiry in increment/decrement.
516
429
 
517
- Showcased with `ActiveSupport::MessageVerifier`, but works the same for
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
- Pull requests: #29599, #29854
432
+ If the key is already set to expire, RedisCacheStore won't extend its expiry.
521
433
 
522
- *Assain Jaleel*
434
+ Rails.cache.increment("some_key", 1, expires_in: 2.minutes)
523
435
 
524
- * Make the order of `Hash#reverse_merge!` consistent with `HashWithIndifferentAccess`.
436
+ *Jason Lee*
525
437
 
526
- *Erol Fornoles*
438
+ * Allow `Range#===` and `Range#cover?` on Range.
527
439
 
528
- * 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.
529
443
 
530
- *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.*
531
446
 
532
- * Default `ActiveSupport::MessageEncryptor` to use AES 256 GCM encryption.
447
+ *utilum*
533
448
 
534
- On for new Rails 5.2 apps. Upgrading apps can find the config as a new
535
- framework default.
449
+ * Add `index_with` to Enumerable.
536
450
 
537
- *Assain Jaleel*
451
+ Allows creating a hash from an enumerable with the value from a passed block
452
+ or a default argument.
538
453
 
539
- * Cache: `write_multi`.
454
+ %i( title body ).index_with { |attr| post.public_send(attr) }
455
+ # => { title: "hey", body: "what's up?" }
540
456
 
541
- Rails.cache.write_multi foo: 'bar', baz: 'qux'
457
+ %i( title body ).index_with(nil)
458
+ # => { title: nil, body: nil }
542
459
 
543
- Plus faster fetch_multi with stores that implement `write_multi_entries`.
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
- The default implementation simply calls `write_entry` for each entry.
548
- Stores may override if they're capable of one-shot bulk writes, like
549
- Redis `MSET`.
462
+ *Kasper Timm Hansen*
550
463
 
551
- *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.
552
466
 
553
- * Add default option to module and class attribute accessors.
467
+ *Dominik Sander*
554
468
 
555
- 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.)
556
471
 
557
- Works for `mattr_reader`, `mattr_writer`, `cattr_accessor`, `cattr_reader`,
558
- and `cattr_writer` as well.
472
+ *Gleb Mazovetskiy*
559
473
 
560
- *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.
561
478
 
562
- * Add `Date#prev_occurring` and `Date#next_occurring` to return specified next/previous occurring day of week.
479
+ *Godfrey Chan*
563
480
 
564
- *Shota Iguchi*
481
+ * Fix bug where `URI.unescape` would fail with mixed Unicode/escaped character input:
565
482
 
566
- * 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
567
486
 
568
- Before:
487
+ *Ashe Connor*, *Aaron Patterson*
569
488
 
570
- class_attribute :settings
571
- self.settings = {}
489
+ * Add `before?` and `after?` methods to `Date`, `DateTime`,
490
+ `Time`, and `TimeWithZone`.
572
491
 
573
- Now:
492
+ *Nick Holden*
574
493
 
575
- class_attribute :settings, default: {}
494
+ * `ActiveSupport::Inflector#ordinal` and `ActiveSupport::Inflector#ordinalize` now support
495
+ translations through I18n.
576
496
 
577
- *DHH*
497
+ # locale/fr.rb
578
498
 
579
- * `#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,
580
510
 
581
- *Eilis Hamilton*
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
- *DHH*
520
+ *Christian Blais*
587
521
 
588
- * 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:
589
524
 
590
- Previously, calculations where the scalar is first would be converted to a duration
591
- 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
592
528
 
593
- Time.zone = "Beijing" # => Asia/Shanghai
594
- date = Date.civil(2017, 5, 20) # => Mon, 20 May 2017
595
- 2 * 1.day # => 172800 seconds
596
- 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
597
533
 
598
- Now, the `ActiveSupport::Duration::Scalar` calculation methods will try to maintain
599
- 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>
600
537
 
601
- Time.zone = "Beijing" # => Asia/Shanghai
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
- Fixes #29160, #28970.
540
+ * `String#truncate_bytes` to truncate a string to a maximum bytesize without
541
+ breaking multibyte characters or grapheme clusters like 👩‍👩‍👦‍👦.
607
542
 
608
- *Andrew White*
543
+ *Jeremy Daer*
609
544
 
610
- * Add support for versioned cache entries. This enables the cache stores to recycle cache keys, greatly saving
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
- *DHH*
547
+ "foo".freeze.strip_heredoc.frozen? # => true
615
548
 
616
- * Pass gem name and deprecation horizon to deprecation notifications.
549
+ Fixes that frozen string literals would inadvertently become unfrozen:
617
550
 
618
- *Willem van Bergen*
551
+ # frozen_string_literal: true
619
552
 
620
- * Add support for `:offset` and `:zone` to `ActiveSupport::TimeWithZone#change`.
553
+ foo = <<-MSG.strip_heredoc
554
+ la la la
555
+ MSG
621
556
 
622
- *Andrew White*
557
+ foo.frozen? # => false !??
623
558
 
624
- * Add support for `:offset` to `Time#change`.
559
+ *Jeremy Daer*
625
560
 
626
- Fixes #28723.
561
+ * Rails 6 requires Ruby 2.5.0 or newer.
627
562
 
628
- *Andrew White*
563
+ *Jeremy Daer*, *Kasper Timm Hansen*
629
564
 
630
- * Add `fetch_values` for `HashWithIndifferentAccess`.
565
+ * Adds parallel testing to Rails.
631
566
 
632
- The method was originally added to `Hash` in Ruby 2.3.0.
567
+ Parallelize your test suite with forked processes or threads.
633
568
 
634
- *Josh Pencheon*
569
+ *Eileen M. Uchitelle*, *Aaron Patterson*
635
570
 
636
571
 
637
- 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.