activesupport 4.2.8 → 5.2.6

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 (256) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +424 -373
  3. data/MIT-LICENSE +2 -2
  4. data/README.rdoc +4 -5
  5. data/lib/active_support/all.rb +5 -3
  6. data/lib/active_support/array_inquirer.rb +48 -0
  7. data/lib/active_support/backtrace_cleaner.rb +7 -5
  8. data/lib/active_support/benchmarkable.rb +6 -4
  9. data/lib/active_support/builder.rb +3 -1
  10. data/lib/active_support/cache/file_store.rb +41 -35
  11. data/lib/active_support/cache/mem_cache_store.rb +91 -91
  12. data/lib/active_support/cache/memory_store.rb +27 -30
  13. data/lib/active_support/cache/null_store.rb +7 -8
  14. data/lib/active_support/cache/redis_cache_store.rb +466 -0
  15. data/lib/active_support/cache/strategy/local_cache.rb +67 -34
  16. data/lib/active_support/cache/strategy/local_cache_middleware.rb +10 -9
  17. data/lib/active_support/cache.rb +287 -196
  18. data/lib/active_support/callbacks.rb +640 -590
  19. data/lib/active_support/concern.rb +11 -5
  20. data/lib/active_support/concurrency/load_interlock_aware_monitor.rb +17 -0
  21. data/lib/active_support/concurrency/share_lock.rb +227 -0
  22. data/lib/active_support/configurable.rb +8 -5
  23. data/lib/active_support/core_ext/array/access.rb +29 -1
  24. data/lib/active_support/core_ext/array/conversions.rb +22 -18
  25. data/lib/active_support/core_ext/array/extract_options.rb +2 -0
  26. data/lib/active_support/core_ext/array/grouping.rb +11 -18
  27. data/lib/active_support/core_ext/array/inquiry.rb +19 -0
  28. data/lib/active_support/core_ext/array/prepend_and_append.rb +5 -3
  29. data/lib/active_support/core_ext/array/wrap.rb +7 -4
  30. data/lib/active_support/core_ext/array.rb +9 -6
  31. data/lib/active_support/core_ext/benchmark.rb +3 -1
  32. data/lib/active_support/core_ext/big_decimal/conversions.rb +10 -12
  33. data/lib/active_support/core_ext/big_decimal.rb +3 -1
  34. data/lib/active_support/core_ext/class/attribute.rb +41 -22
  35. data/lib/active_support/core_ext/class/attribute_accessors.rb +3 -1
  36. data/lib/active_support/core_ext/class/subclasses.rb +20 -6
  37. data/lib/active_support/core_ext/class.rb +4 -3
  38. data/lib/active_support/core_ext/date/acts_like.rb +3 -1
  39. data/lib/active_support/core_ext/date/blank.rb +14 -0
  40. data/lib/active_support/core_ext/date/calculations.rb +11 -9
  41. data/lib/active_support/core_ext/date/conversions.rb +25 -23
  42. data/lib/active_support/core_ext/date/zones.rb +4 -2
  43. data/lib/active_support/core_ext/date.rb +6 -4
  44. data/lib/active_support/core_ext/date_and_time/calculations.rb +170 -58
  45. data/lib/active_support/core_ext/date_and_time/compatibility.rb +4 -17
  46. data/lib/active_support/core_ext/date_and_time/zones.rb +12 -12
  47. data/lib/active_support/core_ext/date_time/acts_like.rb +4 -2
  48. data/lib/active_support/core_ext/date_time/blank.rb +14 -0
  49. data/lib/active_support/core_ext/date_time/calculations.rb +29 -16
  50. data/lib/active_support/core_ext/date_time/compatibility.rb +14 -1
  51. data/lib/active_support/core_ext/date_time/conversions.rb +16 -12
  52. data/lib/active_support/core_ext/date_time.rb +7 -5
  53. data/lib/active_support/core_ext/digest/uuid.rb +7 -5
  54. data/lib/active_support/core_ext/digest.rb +3 -0
  55. data/lib/active_support/core_ext/enumerable.rb +101 -33
  56. data/lib/active_support/core_ext/file/atomic.rb +38 -31
  57. data/lib/active_support/core_ext/file.rb +3 -1
  58. data/lib/active_support/core_ext/hash/compact.rb +14 -9
  59. data/lib/active_support/core_ext/hash/conversions.rb +62 -41
  60. data/lib/active_support/core_ext/hash/deep_merge.rb +9 -13
  61. data/lib/active_support/core_ext/hash/except.rb +11 -8
  62. data/lib/active_support/core_ext/hash/indifferent_access.rb +4 -3
  63. data/lib/active_support/core_ext/hash/keys.rb +33 -27
  64. data/lib/active_support/core_ext/hash/reverse_merge.rb +5 -2
  65. data/lib/active_support/core_ext/hash/slice.rb +8 -8
  66. data/lib/active_support/core_ext/hash/transform_values.rb +14 -5
  67. data/lib/active_support/core_ext/hash.rb +11 -9
  68. data/lib/active_support/core_ext/integer/inflections.rb +3 -1
  69. data/lib/active_support/core_ext/integer/multiple.rb +2 -0
  70. data/lib/active_support/core_ext/integer/time.rb +11 -18
  71. data/lib/active_support/core_ext/integer.rb +5 -3
  72. data/lib/active_support/core_ext/kernel/agnostics.rb +2 -0
  73. data/lib/active_support/core_ext/kernel/concern.rb +5 -1
  74. data/lib/active_support/core_ext/kernel/reporting.rb +4 -84
  75. data/lib/active_support/core_ext/kernel/singleton_class.rb +2 -0
  76. data/lib/active_support/core_ext/kernel.rb +6 -5
  77. data/lib/active_support/core_ext/load_error.rb +3 -22
  78. data/lib/active_support/core_ext/marshal.rb +8 -8
  79. data/lib/active_support/core_ext/module/aliasing.rb +6 -44
  80. data/lib/active_support/core_ext/module/anonymous.rb +12 -1
  81. data/lib/active_support/core_ext/module/attr_internal.rb +8 -9
  82. data/lib/active_support/core_ext/module/attribute_accessors.rb +43 -40
  83. data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +150 -0
  84. data/lib/active_support/core_ext/module/concerning.rb +11 -12
  85. data/lib/active_support/core_ext/module/delegation.rb +99 -29
  86. data/lib/active_support/core_ext/module/deprecation.rb +4 -2
  87. data/lib/active_support/core_ext/module/introspection.rb +9 -9
  88. data/lib/active_support/core_ext/module/reachable.rb +5 -2
  89. data/lib/active_support/core_ext/module/redefine_method.rb +49 -0
  90. data/lib/active_support/core_ext/module/remove_method.rb +8 -3
  91. data/lib/active_support/core_ext/module.rb +14 -11
  92. data/lib/active_support/core_ext/name_error.rb +22 -2
  93. data/lib/active_support/core_ext/numeric/bytes.rb +22 -0
  94. data/lib/active_support/core_ext/numeric/conversions.rb +78 -81
  95. data/lib/active_support/core_ext/numeric/inquiry.rb +28 -0
  96. data/lib/active_support/core_ext/numeric/time.rb +35 -23
  97. data/lib/active_support/core_ext/numeric.rb +6 -3
  98. data/lib/active_support/core_ext/object/acts_like.rb +12 -1
  99. data/lib/active_support/core_ext/object/blank.rb +27 -2
  100. data/lib/active_support/core_ext/object/conversions.rb +6 -4
  101. data/lib/active_support/core_ext/object/deep_dup.rb +13 -4
  102. data/lib/active_support/core_ext/object/duplicable.rb +41 -14
  103. data/lib/active_support/core_ext/object/inclusion.rb +5 -3
  104. data/lib/active_support/core_ext/object/instance_variables.rb +3 -1
  105. data/lib/active_support/core_ext/object/json.rb +49 -19
  106. data/lib/active_support/core_ext/object/to_param.rb +3 -1
  107. data/lib/active_support/core_ext/object/to_query.rb +10 -5
  108. data/lib/active_support/core_ext/object/try.rb +69 -21
  109. data/lib/active_support/core_ext/object/with_options.rb +16 -3
  110. data/lib/active_support/core_ext/object.rb +14 -13
  111. data/lib/active_support/core_ext/range/compare_range.rb +61 -0
  112. data/lib/active_support/core_ext/range/conversions.rb +27 -7
  113. data/lib/active_support/core_ext/range/each.rb +19 -17
  114. data/lib/active_support/core_ext/range/include_range.rb +2 -22
  115. data/lib/active_support/core_ext/range/include_time_with_zone.rb +23 -0
  116. data/lib/active_support/core_ext/range/overlaps.rb +2 -0
  117. data/lib/active_support/core_ext/range.rb +7 -4
  118. data/lib/active_support/core_ext/regexp.rb +6 -0
  119. data/lib/active_support/core_ext/securerandom.rb +25 -0
  120. data/lib/active_support/core_ext/string/access.rb +8 -6
  121. data/lib/active_support/core_ext/string/behavior.rb +3 -1
  122. data/lib/active_support/core_ext/string/conversions.rb +7 -4
  123. data/lib/active_support/core_ext/string/exclude.rb +2 -0
  124. data/lib/active_support/core_ext/string/filters.rb +6 -5
  125. data/lib/active_support/core_ext/string/indent.rb +6 -4
  126. data/lib/active_support/core_ext/string/inflections.rb +61 -24
  127. data/lib/active_support/core_ext/string/inquiry.rb +3 -1
  128. data/lib/active_support/core_ext/string/multibyte.rb +15 -7
  129. data/lib/active_support/core_ext/string/output_safety.rb +34 -38
  130. data/lib/active_support/core_ext/string/starts_ends_with.rb +2 -0
  131. data/lib/active_support/core_ext/string/strip.rb +4 -5
  132. data/lib/active_support/core_ext/string/zones.rb +4 -2
  133. data/lib/active_support/core_ext/string.rb +15 -13
  134. data/lib/active_support/core_ext/time/acts_like.rb +3 -1
  135. data/lib/active_support/core_ext/time/calculations.rb +88 -52
  136. data/lib/active_support/core_ext/time/compatibility.rb +12 -1
  137. data/lib/active_support/core_ext/time/conversions.rb +20 -13
  138. data/lib/active_support/core_ext/time/zones.rb +41 -7
  139. data/lib/active_support/core_ext/time.rb +7 -6
  140. data/lib/active_support/core_ext/uri.rb +6 -8
  141. data/lib/active_support/core_ext.rb +3 -1
  142. data/lib/active_support/current_attributes.rb +195 -0
  143. data/lib/active_support/dependencies/autoload.rb +2 -0
  144. data/lib/active_support/dependencies/interlock.rb +57 -0
  145. data/lib/active_support/dependencies.rb +152 -161
  146. data/lib/active_support/deprecation/behaviors.rb +44 -11
  147. data/lib/active_support/deprecation/constant_accessor.rb +52 -0
  148. data/lib/active_support/deprecation/instance_delegator.rb +17 -2
  149. data/lib/active_support/deprecation/method_wrappers.rb +66 -20
  150. data/lib/active_support/deprecation/proxy_wrappers.rb +56 -28
  151. data/lib/active_support/deprecation/reporting.rb +32 -12
  152. data/lib/active_support/deprecation.rb +12 -9
  153. data/lib/active_support/descendants_tracker.rb +2 -0
  154. data/lib/active_support/digest.rb +20 -0
  155. data/lib/active_support/duration/iso8601_parser.rb +125 -0
  156. data/lib/active_support/duration/iso8601_serializer.rb +55 -0
  157. data/lib/active_support/duration.rb +314 -38
  158. data/lib/active_support/encrypted_configuration.rb +49 -0
  159. data/lib/active_support/encrypted_file.rb +99 -0
  160. data/lib/active_support/evented_file_update_checker.rb +205 -0
  161. data/lib/active_support/execution_wrapper.rb +128 -0
  162. data/lib/active_support/executor.rb +8 -0
  163. data/lib/active_support/file_update_checker.rb +63 -37
  164. data/lib/active_support/gem_version.rb +5 -3
  165. data/lib/active_support/gzip.rb +7 -5
  166. data/lib/active_support/hash_with_indifferent_access.rb +127 -28
  167. data/lib/active_support/i18n.rb +8 -6
  168. data/lib/active_support/i18n_railtie.rb +37 -13
  169. data/lib/active_support/inflections.rb +13 -11
  170. data/lib/active_support/inflector/inflections.rb +61 -12
  171. data/lib/active_support/inflector/methods.rb +163 -136
  172. data/lib/active_support/inflector/transliterate.rb +48 -27
  173. data/lib/active_support/inflector.rb +7 -5
  174. data/lib/active_support/json/decoding.rb +16 -13
  175. data/lib/active_support/json/encoding.rb +11 -58
  176. data/lib/active_support/json.rb +4 -2
  177. data/lib/active_support/key_generator.rb +25 -25
  178. data/lib/active_support/lazy_load_hooks.rb +50 -20
  179. data/lib/active_support/locale/en.yml +2 -0
  180. data/lib/active_support/log_subscriber/test_helper.rb +14 -12
  181. data/lib/active_support/log_subscriber.rb +13 -10
  182. data/lib/active_support/logger.rb +19 -7
  183. data/lib/active_support/logger_silence.rb +6 -4
  184. data/lib/active_support/logger_thread_safe_level.rb +7 -5
  185. data/lib/active_support/message_encryptor.rb +168 -53
  186. data/lib/active_support/message_verifier.rb +150 -17
  187. data/lib/active_support/messages/metadata.rb +71 -0
  188. data/lib/active_support/messages/rotation_configuration.rb +22 -0
  189. data/lib/active_support/messages/rotator.rb +56 -0
  190. data/lib/active_support/multibyte/chars.rb +36 -23
  191. data/lib/active_support/multibyte/unicode.rb +100 -96
  192. data/lib/active_support/multibyte.rb +4 -2
  193. data/lib/active_support/notifications/fanout.rb +11 -9
  194. data/lib/active_support/notifications/instrumenter.rb +27 -7
  195. data/lib/active_support/notifications.rb +11 -7
  196. data/lib/active_support/number_helper/number_converter.rb +13 -11
  197. data/lib/active_support/number_helper/number_to_currency_converter.rb +9 -9
  198. data/lib/active_support/number_helper/number_to_delimited_converter.rb +9 -3
  199. data/lib/active_support/number_helper/number_to_human_converter.rb +11 -9
  200. data/lib/active_support/number_helper/number_to_human_size_converter.rb +9 -8
  201. data/lib/active_support/number_helper/number_to_percentage_converter.rb +3 -1
  202. data/lib/active_support/number_helper/number_to_phone_converter.rb +13 -4
  203. data/lib/active_support/number_helper/number_to_rounded_converter.rb +23 -56
  204. data/lib/active_support/number_helper/rounding_helper.rb +66 -0
  205. data/lib/active_support/number_helper.rb +94 -68
  206. data/lib/active_support/option_merger.rb +3 -1
  207. data/lib/active_support/ordered_hash.rb +6 -4
  208. data/lib/active_support/ordered_options.rb +23 -5
  209. data/lib/active_support/per_thread_registry.rb +9 -4
  210. data/lib/active_support/proxy_object.rb +2 -0
  211. data/lib/active_support/rails.rb +16 -8
  212. data/lib/active_support/railtie.rb +43 -9
  213. data/lib/active_support/reloader.rb +131 -0
  214. data/lib/active_support/rescuable.rb +108 -53
  215. data/lib/active_support/security_utils.rb +15 -11
  216. data/lib/active_support/string_inquirer.rb +11 -3
  217. data/lib/active_support/subscriber.rb +21 -16
  218. data/lib/active_support/tagged_logging.rb +14 -11
  219. data/lib/active_support/test_case.rb +19 -47
  220. data/lib/active_support/testing/assertions.rb +137 -20
  221. data/lib/active_support/testing/autorun.rb +4 -2
  222. data/lib/active_support/testing/constant_lookup.rb +2 -1
  223. data/lib/active_support/testing/declarative.rb +3 -1
  224. data/lib/active_support/testing/deprecation.rb +14 -10
  225. data/lib/active_support/testing/file_fixtures.rb +36 -0
  226. data/lib/active_support/testing/isolation.rb +34 -25
  227. data/lib/active_support/testing/method_call_assertions.rb +43 -0
  228. data/lib/active_support/testing/setup_and_teardown.rb +13 -8
  229. data/lib/active_support/testing/stream.rb +44 -0
  230. data/lib/active_support/testing/tagged_logging.rb +3 -1
  231. data/lib/active_support/testing/time_helpers.rb +91 -23
  232. data/lib/active_support/time.rb +14 -12
  233. data/lib/active_support/time_with_zone.rb +182 -40
  234. data/lib/active_support/values/time_zone.rb +196 -61
  235. data/lib/active_support/values/unicode_tables.dat +0 -0
  236. data/lib/active_support/version.rb +3 -1
  237. data/lib/active_support/xml_mini/jdom.rb +116 -114
  238. data/lib/active_support/xml_mini/libxml.rb +17 -16
  239. data/lib/active_support/xml_mini/libxmlsax.rb +16 -18
  240. data/lib/active_support/xml_mini/nokogiri.rb +15 -15
  241. data/lib/active_support/xml_mini/nokogirisax.rb +15 -16
  242. data/lib/active_support/xml_mini/rexml.rb +11 -9
  243. data/lib/active_support/xml_mini.rb +37 -37
  244. data/lib/active_support.rb +12 -11
  245. metadata +54 -25
  246. data/lib/active_support/concurrency/latch.rb +0 -27
  247. data/lib/active_support/core_ext/big_decimal/yaml_conversions.rb +0 -16
  248. data/lib/active_support/core_ext/class/delegating_attributes.rb +0 -45
  249. data/lib/active_support/core_ext/date_time/zones.rb +0 -6
  250. data/lib/active_support/core_ext/kernel/debugger.rb +0 -10
  251. data/lib/active_support/core_ext/module/method_transplanting.rb +0 -13
  252. data/lib/active_support/core_ext/module/qualified_const.rb +0 -52
  253. data/lib/active_support/core_ext/object/itself.rb +0 -15
  254. data/lib/active_support/core_ext/struct.rb +0 -6
  255. data/lib/active_support/core_ext/thread.rb +0 -86
  256. data/lib/active_support/core_ext/time/marshal.rb +0 -30
data/CHANGELOG.md CHANGED
@@ -1,627 +1,678 @@
1
- ## Rails 4.2.8 (February 21, 2017) ##
2
-
3
- * Make `getlocal` and `getutc` always return instances of `Time` for
4
- `ActiveSupport::TimeWithZone` and `DateTime`. This eliminates a possible
5
- stack level too deep error in `to_time` where `ActiveSupport::TimeWithZone`
6
- was wrapping a `DateTime` instance. As a consequence of this the internal
7
- time value in `ActiveSupport::TimeWithZone` is now always an instance of
8
- `Time` in the UTC timezone, whether that's as the UTC time directly or
9
- a representation of the local time in the timezone. There should be no
10
- consequences of this internal change and if there are it's a bug due to
11
- leaky abstractions.
1
+ ## Rails 5.2.6 (May 05, 2021) ##
12
2
 
13
- *Andrew White*
3
+ * No changes.
14
4
 
15
- * Add `DateTime#subsec` to return the fraction of a second as a `Rational`.
16
5
 
17
- *Andrew White*
6
+ ## Rails 5.2.5 (March 26, 2021) ##
18
7
 
19
- * Add additional aliases for `DateTime#utc` to mirror the ones on
20
- `ActiveSupport::TimeWithZone` and `Time`.
8
+ * No changes.
21
9
 
22
- *Andrew White*
23
10
 
24
- * Add `DateTime#localtime` to return an instance of `Time` in the system's
25
- local timezone. Also aliased to `getlocal`.
11
+ ## Rails 5.2.4.6 (May 05, 2021) ##
26
12
 
27
- *Andrew White*, *Yuichiro Kaneko*
13
+ * No changes.
28
14
 
29
- * Add `Time#sec_fraction` to return the fraction of a second as a `Rational`.
30
15
 
31
- *Andrew White*
16
+ ## Rails 5.2.4.5 (February 10, 2021) ##
32
17
 
33
- * Add `ActiveSupport.to_time_preserves_timezone` config option to control
34
- how `to_time` handles timezones. In Ruby 2.4+ the behavior will change
35
- from converting to the local system timezone, to preserving the timezone
36
- of the receiver. This config option defaults to false so that apps made
37
- with earlier versions of Rails are not affected when upgrading, e.g:
18
+ * No changes.
38
19
 
39
- >> ENV['TZ'] = 'US/Eastern'
40
20
 
41
- >> "2016-04-23T10:23:12.000Z".to_time
42
- => "2016-04-23T06:23:12.000-04:00"
21
+ ## Rails 5.2.4.4 (September 09, 2020) ##
43
22
 
44
- >> ActiveSupport.to_time_preserves_timezone = true
23
+ * No changes.
45
24
 
46
- >> "2016-04-23T10:23:12.000Z".to_time
47
- => "2016-04-23T10:23:12.000Z"
48
25
 
49
- Fixes #24617.
26
+ ## Rails 5.2.4.3 (May 18, 2020) ##
50
27
 
51
- *Andrew White*
28
+ * [CVE-2020-8165] Deprecate Marshal.load on raw cache read in RedisCacheStore
52
29
 
53
- * Add `init_with` to `ActiveSupport::TimeWithZone` and `ActiveSupport::TimeZone`
30
+ * [CVE-2020-8165] Avoid Marshal.load on raw cache value in MemCacheStore
54
31
 
55
- It is helpful to be able to run apps concurrently written in successive
56
- versions of Rails to aid migration, e.g. run Rails 4.2 and 5.0 variants
57
- of your application at the same time to carry out A/B testing.
32
+ ## Rails 5.2.4.2 (March 19, 2020) ##
58
33
 
59
- To do this serialization formats need to be cross compatible and the
60
- change in 3aa26cf didn't meet this criteria because the Psych loader
61
- checks for the existence of `init_with` before setting the instance
62
- variables and the wrapping behavior of `ActiveSupport::TimeWithZone`
63
- tries to see if the `Time` instance responds to `init_with` before the
64
- `@time` variable is set.
34
+ * No changes.
65
35
 
66
- To fix this we backported just the `init_with` behavior from the change
67
- in 3aa26cf. If the revived instance is then written out to YAML again
68
- it will revert to the default Rails 4.2 behavior of converting it to
69
- a UTC timestamp string.
70
36
 
71
- Fixes #26296.
37
+ ## Rails 5.2.4.1 (December 18, 2019) ##
72
38
 
73
- *Andrew White*
39
+ * No changes.
74
40
 
75
- * Fix `ActiveSupport::TimeWithZone#in` across DST boundaries.
76
41
 
77
- Previously calls to `in` were being sent to the non-DST aware
78
- method `Time#since` via `method_missing`. It is now aliased to
79
- the DST aware `ActiveSupport::TimeWithZone#since` which handles
80
- transitions across DST boundaries, e.g:
42
+ ## Rails 5.2.4 (November 27, 2019) ##
81
43
 
82
- Time.zone = "US/Eastern"
44
+ * Make ActiveSupport::Logger Fiber-safe. Fixes #36752.
83
45
 
84
- t = Time.zone.local(2016,11,6,1)
85
- # => Sun, 06 Nov 2016 01:00:00 EDT -05:00
46
+ Use `Fiber.current.__id__` in `ActiveSupport::Logger#local_level=` in order
47
+ to make log level local to Ruby Fibers in addition to Threads.
86
48
 
87
- t.in(1.hour)
88
- # => Sun, 06 Nov 2016 01:00:00 EST -05:00
49
+ Example:
89
50
 
90
- Fixes #26580.
51
+ logger = ActiveSupport::Logger.new(STDOUT)
52
+ logger.level = 1
53
+ p "Main is debug? #{logger.debug?}"
91
54
 
92
- *Thomas Balthazar*
55
+ Fiber.new {
56
+ logger.local_level = 0
57
+ p "Thread is debug? #{logger.debug?}"
58
+ }.resume
93
59
 
60
+ p "Main is debug? #{logger.debug?}"
94
61
 
95
- ## Rails 4.2.7 (July 12, 2016) ##
62
+ Before:
96
63
 
97
- * Fixed `ActiveSupport::Logger.broadcast` so that calls to `#silence` now
98
- properly delegate to all loggers. Silencing now properly suppresses logging
99
- to both the log and the console.
64
+ Main is debug? false
65
+ Thread is debug? true
66
+ Main is debug? true
100
67
 
101
- *Kevin McPhillips*
68
+ After:
102
69
 
103
- * Backported `ActiveSupport::LoggerThreadSafeLevel`. Assigning the
104
- `Rails.logger.level` is now thread safe.
70
+ Main is debug? false
71
+ Thread is debug? true
72
+ Main is debug? false
105
73
 
106
- *Kevin McPhillips*
74
+ *Alexander Varnin*
107
75
 
108
- * Fixed a problem with ActiveSupport::SafeBuffer.titleize calling capitalize
109
- on nil.
110
76
 
111
- *Brian McManus*
77
+ ## Rails 5.2.3 (March 27, 2019) ##
112
78
 
113
- * Time zones: Ensure that the UTC offset reflects DST changes that occurred
114
- since the app started. Removes UTC offset caching, reducing performance,
115
- but this is still relatively quick and isn't in any hot paths.
79
+ * Add `ActiveSupport::HashWithIndifferentAccess#assoc`.
116
80
 
117
- *Alexey Shein*
81
+ `assoc` can now be called with either a string or a symbol.
118
82
 
119
- * Prevent `Marshal.load` from looping infinitely when trying to autoload a constant
120
- which resolves to a different name.
83
+ *Stefan Schüßler*
121
84
 
122
- *Olek Janiszewski*
85
+ * Fix `String#safe_constantize` throwing a `LoadError` for incorrectly cased constant references.
123
86
 
87
+ *Keenan Brock*
124
88
 
125
- ## Rails 4.2.6 (March 07, 2016) ##
89
+ * Allow Range#=== and Range#cover? on Range
126
90
 
127
- * No changes.
91
+ `Range#cover?` can now accept a range argument like `Range#include?` and
92
+ `Range#===`. `Range#===` works correctly on Ruby 2.6. `Range#include?` is moved
93
+ into a new file, with these two methods.
128
94
 
95
+ *utilum*
129
96
 
130
- ## Rails 4.2.5.2 (February 26, 2016) ##
97
+ * If the same block is `included` multiple times for a Concern, an exception is no longer raised.
131
98
 
132
- * No changes.
99
+ *Mark J. Titorenko*, *Vlad Bokov*
133
100
 
134
101
 
135
- ## Rails 4.2.5.1 (January 25, 2015) ##
102
+ ## Rails 5.2.2.1 (March 11, 2019) ##
136
103
 
137
104
  * No changes.
138
105
 
139
106
 
140
- ## Rails 4.2.5 (November 12, 2015) ##
107
+ ## Rails 5.2.2 (December 04, 2018) ##
141
108
 
142
- * Fix `TimeWithZone#eql?` to properly handle `TimeWithZone` created from `DateTime`:
143
- twz = DateTime.now.in_time_zone
144
- twz.eql?(twz.dup) => true
109
+ * Fix bug where `#to_options` for `ActiveSupport::HashWithIndifferentAccess`
110
+ would not act as alias for `#symbolize_keys`.
145
111
 
146
- Fixes #14178.
112
+ *Nick Weiland*
147
113
 
148
- *Roque Pinel*
114
+ * Improve the logic that detects non-autoloaded constants.
149
115
 
150
- * Handle invalid UTF-8 characters in `MessageVerifier.verify`.
116
+ *Jan Habermann*, *Xavier Noria*
151
117
 
152
- *Roque Pinel*, *Grey Baker*
118
+ * Fix bug where `URI.unescape` would fail with mixed Unicode/escaped character input:
153
119
 
120
+ URI.unescape("\xe3\x83\x90") # => "バ"
121
+ URI.unescape("%E3%83%90") # => "バ"
122
+ URI.unescape("\xe3\x83\x90%E3%83%90") # => Encoding::CompatibilityError
154
123
 
155
- ## Rails 4.2.4 (August 24, 2015) ##
124
+ *Ashe Connor*, *Aaron Patterson*
156
125
 
157
- * Fix a `SystemStackError` when encoding an `Enumerable` with `json` gem and
158
- with the Active Support JSON encoder loaded.
159
126
 
160
- Fixes #20775.
127
+ ## Rails 5.2.1.1 (November 27, 2018) ##
161
128
 
162
- *Sammy Larbi*, *Prathamesh Sonpatki*
129
+ * No changes.
163
130
 
164
- * Fix not calling `#default` on `HashWithIndifferentAcess#to_hash` when only
165
- `default_proc` is set, which could raise.
166
131
 
167
- *Simon Eskildsen*
132
+ ## Rails 5.2.1 (August 07, 2018) ##
168
133
 
169
- * Fix setting `default_proc` on `HashWithIndifferentAccess#dup`
134
+ * Redis cache store: `delete_matched` no longer blocks the Redis server.
135
+ (Switches from evaled Lua to a batched SCAN + DEL loop.)
170
136
 
171
- *Simon Eskildsen*
137
+ *Gleb Mazovetskiy*
172
138
 
139
+ * Fix bug where `ActiveSupport::Timezone.all` would fail when tzinfo data for
140
+ any timezone defined in `ActiveSupport::TimeZone::MAPPING` is missing.
173
141
 
174
- ## Rails 4.2.3 (June 25, 2015) ##
142
+ *Dominik Sander*
175
143
 
176
- * Fix a range of values for parameters of the Time#change
144
+ * Fix bug where `ActiveSupport::Cache` will massively inflate the storage
145
+ size when compression is enabled (which is true by default). This patch
146
+ does not attempt to repair existing data: please manually flush the cache
147
+ to clear out the problematic entries.
177
148
 
178
- *Nikolay Kondratyev*
149
+ *Godfrey Chan*
179
150
 
180
- * Add some missing `require 'active_support/deprecation'`
151
+ * Fix `ActiveSupport::Cache#read_multi` bug with local cache enabled that was
152
+ returning instances of `ActiveSupport::Cache::Entry` instead of the raw values.
181
153
 
182
- *Akira Matsuda*
154
+ *Jason Lee*
183
155
 
184
156
 
185
- ## Rails 4.2.2 (June 16, 2015) ##
157
+ ## Rails 5.2.0 (April 09, 2018) ##
186
158
 
187
- * Fix XSS vulnerability in `ActiveSupport::JSON.encode` method.
159
+ * Caching: MemCache and Redis `read_multi` and `fetch_multi` speedup.
160
+ Read from the local in-memory cache before consulting the backend.
188
161
 
189
- CVE-2015-3226.
162
+ *Gabriel Sobrinho*
190
163
 
191
- *Rafael Mendonça França*
164
+ * Return all mappings for a timezone identifier in `country_zones`.
192
165
 
193
- * Fix denial of service vulnerability in the XML processing.
166
+ Some timezones like `Europe/London` have multiple mappings in
167
+ `ActiveSupport::TimeZone::MAPPING` so return all of them instead
168
+ of the first one found by using `Hash#value`. e.g:
194
169
 
195
- CVE-2015-3227.
170
+ # Before
171
+ ActiveSupport::TimeZone.country_zones("GB") # => ["Edinburgh"]
196
172
 
197
- *Aaron Patterson*
173
+ # After
174
+ ActiveSupport::TimeZone.country_zones("GB") # => ["Edinburgh", "London"]
198
175
 
176
+ Fixes #31668.
199
177
 
200
- ## Rails 4.2.1 (March 19, 2015) ##
178
+ *Andrew White*
201
179
 
202
- * Fixed a problem where String#truncate_words would get stuck with a complex
203
- string.
180
+ * Add support for connection pooling on RedisCacheStore.
204
181
 
205
- *Henrik Nygren*
182
+ *fatkodima*
206
183
 
207
- * Fixed a roundtrip problem with AS::SafeBuffer where primitive-like strings
208
- will be dumped as primitives:
184
+ * Support hash as first argument in `assert_difference`. This allows to specify multiple
185
+ numeric differences in the same assertion.
209
186
 
210
- Before:
187
+ assert_difference ->{ Article.count } => 1, ->{ Post.count } => 2
211
188
 
212
- YAML.load ActiveSupport::SafeBuffer.new("Hello").to_yaml # => "Hello"
213
- YAML.load ActiveSupport::SafeBuffer.new("true").to_yaml # => true
214
- YAML.load ActiveSupport::SafeBuffer.new("false").to_yaml # => false
215
- YAML.load ActiveSupport::SafeBuffer.new("1").to_yaml # => 1
216
- YAML.load ActiveSupport::SafeBuffer.new("1.1").to_yaml # => 1.1
189
+ *Julien Meichelbeck*
217
190
 
218
- After:
191
+ * Add missing instrumentation for `read_multi` in `ActiveSupport::Cache::Store`.
219
192
 
220
- YAML.load ActiveSupport::SafeBuffer.new("Hello").to_yaml # => "Hello"
221
- YAML.load ActiveSupport::SafeBuffer.new("true").to_yaml # => "true"
222
- YAML.load ActiveSupport::SafeBuffer.new("false").to_yaml # => "false"
223
- YAML.load ActiveSupport::SafeBuffer.new("1").to_yaml # => "1"
224
- YAML.load ActiveSupport::SafeBuffer.new("1.1").to_yaml # => "1.1"
193
+ *Ignatius Reza Lesmana*
225
194
 
226
- *Godfrey Chan*
195
+ * `assert_changes` will always assert that the expression changes,
196
+ regardless of `from:` and `to:` argument combinations.
227
197
 
228
- * Replace fixed `:en` with `I18n.default_locale` in `Duration#inspect`.
198
+ *Daniel Ma*
229
199
 
230
- *Dominik Masur*
200
+ * Use SHA-1 to generate non-sensitive digests, such as the ETag header.
231
201
 
232
- * Add missing time zone definitions for Russian Federation and sync them
233
- with `zone.tab` file from tzdata version 2014j (latest).
202
+ Enabled by default for new apps; upgrading apps can opt in by setting
203
+ `config.active_support.use_sha1_digests = true`.
234
204
 
235
- *Andrey Novikov*
205
+ *Dmitri Dolguikh*, *Eugene Kenny*
236
206
 
207
+ * Changed default behaviour of `ActiveSupport::SecurityUtils.secure_compare`,
208
+ to make it not leak length information even for variable length string.
237
209
 
238
- ## Rails 4.2.0 (December 20, 2014) ##
210
+ Renamed old `ActiveSupport::SecurityUtils.secure_compare` to `fixed_length_secure_compare`,
211
+ and started raising `ArgumentError` in case of length mismatch of passed strings.
239
212
 
240
- * The decorated `load` and `require` methods are now kept private.
213
+ *Vipul A M*
241
214
 
242
- Fixes #17553.
215
+ * Make `ActiveSupport::TimeZone.all` return only time zones that are in
216
+ `ActiveSupport::TimeZone::MAPPING`.
243
217
 
244
- *Xavier Noria*
218
+ Fixes #7245.
245
219
 
246
- * `String#remove` and `String#remove!` accept multiple arguments.
220
+ *Chris LaRose*
247
221
 
248
- *Pavel Pravosud*
222
+ * MemCacheStore: Support expiring counters.
249
223
 
250
- * `TimeWithZone#strftime` now delegates every directive to `Time#strftime` except for '%Z',
251
- it also now correctly handles escaped '%' characters placed just before time zone related directives.
224
+ Pass `expires_in: [seconds]` to `#increment` and `#decrement` options
225
+ to set the Memcached TTL (time-to-live) if the counter doesn't exist.
226
+ If the counter exists, Memcached doesn't extend its expiry when it's
227
+ incremented or decremented.
252
228
 
253
- *Pablo Herrero*
229
+ ```
230
+ Rails.cache.increment("my_counter", 1, expires_in: 2.minutes)
231
+ ```
254
232
 
255
- * Corrected `Inflector#underscore` handling of multiple successive acroynms.
233
+ *Takumasa Ochi*
256
234
 
257
- *James Le Cuirot*
235
+ * Handle `TZInfo::AmbiguousTime` errors.
258
236
 
259
- * Delegation now works with ruby reserved words passed to `:to` option.
237
+ Make `ActiveSupport::TimeWithZone` match Ruby's handling of ambiguous
238
+ times by choosing the later period, e.g.
260
239
 
261
- Fixes #16956.
240
+ Ruby:
241
+ ```
242
+ ENV["TZ"] = "Europe/Moscow"
243
+ Time.local(2014, 10, 26, 1, 0, 0) # => 2014-10-26 01:00:00 +0300
244
+ ```
262
245
 
263
- *Agis Anastasopoulos*
246
+ Before:
247
+ ```
248
+ >> "2014-10-26 01:00:00".in_time_zone("Moscow")
249
+ TZInfo::AmbiguousTime: 26/10/2014 01:00 is an ambiguous local time.
250
+ ```
264
251
 
265
- * Added method `#eql?` to `ActiveSupport::Duration`, in addition to `#==`.
252
+ After:
253
+ ```
254
+ >> "2014-10-26 01:00:00".in_time_zone("Moscow")
255
+ => Sun, 26 Oct 2014 01:00:00 MSK +03:00
256
+ ```
266
257
 
267
- Currently, the following returns `false`, contrary to expectation:
258
+ Fixes #17395.
268
259
 
269
- 1.minute.eql?(1.minute)
260
+ *Andrew White*
270
261
 
271
- Adding method `#eql?` will make this behave like expected. Method `#eql?` is
272
- just a bit stricter than `#==`, as it checks whether the argument is also a duration. Their
273
- parts may be different though.
262
+ * Redis cache store.
274
263
 
275
- 1.minute.eql?(60.seconds) # => true
276
- 1.minute.eql?(60) # => false
264
+ ```
265
+ # Defaults to `redis://localhost:6379/0`. Only use for dev/test.
266
+ config.cache_store = :redis_cache_store
277
267
 
278
- *Joost Lubach*
268
+ # Supports all common cache store options (:namespace, :compress,
269
+ # :compress_threshold, :expires_in, :race_condition_ttl) and all
270
+ # Redis options.
271
+ cache_password = Rails.application.secrets.redis_cache_password
272
+ config.cache_store = :redis_cache_store, driver: :hiredis,
273
+ namespace: 'myapp-cache', compress: true, timeout: 1,
274
+ url: "redis://:#{cache_password}@myapp-cache-1:6379/0"
279
275
 
280
- * `Time#change` can now change nanoseconds (`:nsec`) as a higher-precision
281
- alternative to microseconds (`:usec`).
276
+ # Supports Redis::Distributed with multiple hosts
277
+ config.cache_store = :redis_cache_store, driver: :hiredis
278
+ namespace: 'myapp-cache', compress: true,
279
+ url: %w[
280
+ redis://myapp-cache-1:6379/0
281
+ redis://myapp-cache-1:6380/0
282
+ redis://myapp-cache-2:6379/0
283
+ redis://myapp-cache-2:6380/0
284
+ redis://myapp-cache-3:6379/0
285
+ redis://myapp-cache-3:6380/0
286
+ ]
282
287
 
283
- *Agis Anastasooulos*
288
+ # Or pass a builder block
289
+ config.cache_store = :redis_cache_store,
290
+ namespace: 'myapp-cache', compress: true,
291
+ redis: -> { Redis.new … }
292
+ ```
284
293
 
285
- * `MessageVerifier.new` raises an appropriate exception if the secret is `nil`.
286
- This prevents `MessageVerifier#generate` from raising a cryptic error later on.
294
+ Deployment note: Take care to use a *dedicated Redis cache* rather
295
+ than pointing this at your existing Redis server. It won't cope well
296
+ with mixed usage patterns and it won't expire cache entries by default.
287
297
 
288
- *Kostiantyn Kahanskyi*
298
+ Redis cache server setup guide: https://redis.io/topics/lru-cache
289
299
 
290
- * Introduced new configuration option `active_support.test_order` for
291
- specifying the order in which test cases are executed. This option currently defaults
292
- to `:sorted` but will be changed to `:random` in Rails 5.0.
300
+ *Jeremy Daer*
293
301
 
294
- *Akira Matsuda*, *Godfrey Chan*
302
+ * Cache: Enable compression by default for values > 1kB.
295
303
 
296
- * Fixed a bug in `Inflector#underscore` where acroynms in nested constant names
297
- are incorrectly parsed as camelCase.
304
+ Compression has long been available, but opt-in and at a 16kB threshold.
305
+ It wasn't enabled by default due to CPU cost. Today it's cheap and typical
306
+ cache data is eminently compressible, such as HTML or JSON fragments.
307
+ Compression dramatically reduces Memcached/Redis mem usage, which means
308
+ the same cache servers can store more data, which means higher hit rates.
298
309
 
299
- Fixes #8015.
310
+ To disable compression, pass `compress: false` to the initializer.
300
311
 
301
- *Fred Wu*, *Matthew Draper*
312
+ *Jeremy Daer*
302
313
 
303
- * Make `Time#change` throw an exception if the `:usec` option is out of range and
304
- the time has an offset other than UTC or local.
314
+ * Allow `Range#include?` on TWZ ranges.
305
315
 
306
- *Agis Anastasopoulos*
316
+ In #11474 we prevented TWZ ranges being iterated over which matched
317
+ Ruby's handling of Time ranges and as a consequence `include?`
318
+ stopped working with both Time ranges and TWZ ranges. However in
319
+ ruby/ruby@b061634 support was added for `include?` to use `cover?`
320
+ for 'linear' objects. Since we have no way of making Ruby consider
321
+ TWZ instances as 'linear' we have to override `Range#include?`.
307
322
 
308
- * `Method` objects now report themselves as not `duplicable?`. This allows
309
- hashes and arrays containing `Method` objects to be `deep_dup`ed.
323
+ Fixes #30799.
310
324
 
311
- *Peter Jaros*
325
+ *Andrew White*
312
326
 
313
- * `determine_constant_from_test_name` does no longer shadow `NameError`s
314
- which happens during constant autoloading.
327
+ * Fix acronym support in `humanize`.
315
328
 
316
- Fixes #9933.
329
+ Acronym inflections are stored with lowercase keys in the hash but
330
+ the match wasn't being lowercased before being looked up in the hash.
331
+ This shouldn't have any performance impact because before it would
332
+ fail to find the acronym and perform the `downcase` operation anyway.
317
333
 
318
- *Guo Xiang Tan*
334
+ Fixes #31052.
319
335
 
320
- * Added instance_eval version to Object#try and Object#try!, so you can do this:
336
+ *Andrew White*
321
337
 
322
- person.try { name.first }
338
+ * Add same method signature for `Time#prev_year` and `Time#next_year`
339
+ in accordance with `Date#prev_year`, `Date#next_year`.
323
340
 
324
- instead of:
341
+ Allows pass argument for `Time#prev_year` and `Time#next_year`.
325
342
 
326
- person.try { |person| person.name.first }
343
+ Before:
344
+ ```
345
+ Time.new(2017, 9, 16, 17, 0).prev_year # => 2016-09-16 17:00:00 +0300
346
+ Time.new(2017, 9, 16, 17, 0).prev_year(1)
347
+ # => ArgumentError: wrong number of arguments (given 1, expected 0)
327
348
 
328
- *DHH*, *Ari Pollak*
349
+ Time.new(2017, 9, 16, 17, 0).next_year # => 2018-09-16 17:00:00 +0300
350
+ Time.new(2017, 9, 16, 17, 0).next_year(1)
351
+ # => ArgumentError: wrong number of arguments (given 1, expected 0)
352
+ ```
329
353
 
330
- * Fix the `ActiveSupport::Duration#instance_of?` method to return the right
331
- value with the class itself since it was previously delegated to the
332
- internal value.
354
+ After:
355
+ ```
356
+ Time.new(2017, 9, 16, 17, 0).prev_year # => 2016-09-16 17:00:00 +0300
357
+ Time.new(2017, 9, 16, 17, 0).prev_year(1) # => 2016-09-16 17:00:00 +0300
333
358
 
334
- *Robin Dupret*
359
+ Time.new(2017, 9, 16, 17, 0).next_year # => 2018-09-16 17:00:00 +0300
360
+ Time.new(2017, 9, 16, 17, 0).next_year(1) # => 2018-09-16 17:00:00 +0300
361
+ ```
335
362
 
336
- * Fix rounding errors with `#travel_to` by resetting the usec on any passed time to zero, so we only travel
337
- with per-second precision, not anything deeper than that.
363
+ *bogdanvlviv*
338
364
 
339
- *DHH*
365
+ * Add same method signature for `Time#prev_month` and `Time#next_month`
366
+ in accordance with `Date#prev_month`, `Date#next_month`.
340
367
 
341
- * Fix DateTime comparison with `DateTime::Infinity` object.
368
+ Allows pass argument for `Time#prev_month` and `Time#next_month`.
342
369
 
343
- *Rafael Mendonça França*
370
+ Before:
371
+ ```
372
+ Time.new(2017, 9, 16, 17, 0).prev_month # => 2017-08-16 17:00:00 +0300
373
+ Time.new(2017, 9, 16, 17, 0).prev_month(1)
374
+ # => ArgumentError: wrong number of arguments (given 1, expected 0)
344
375
 
345
- * Added Object#itself which returns the object itself. Useful when dealing with a chaining scenario, like Active Record scopes:
376
+ Time.new(2017, 9, 16, 17, 0).next_month # => 2017-10-16 17:00:00 +0300
377
+ Time.new(2017, 9, 16, 17, 0).next_month(1)
378
+ # => ArgumentError: wrong number of arguments (given 1, expected 0)
379
+ ```
346
380
 
347
- Event.public_send(state.presence_in([ :trashed, :drafted ]) || :itself).order(:created_at)
381
+ After:
382
+ ```
383
+ Time.new(2017, 9, 16, 17, 0).prev_month # => 2017-08-16 17:00:00 +0300
384
+ Time.new(2017, 9, 16, 17, 0).prev_month(1) # => 2017-08-16 17:00:00 +0300
348
385
 
349
- *DHH*
386
+ Time.new(2017, 9, 16, 17, 0).next_month # => 2017-10-16 17:00:00 +0300
387
+ Time.new(2017, 9, 16, 17, 0).next_month(1) # => 2017-10-16 17:00:00 +0300
388
+ ```
350
389
 
351
- * `Object#with_options` executes block in merging option context when
352
- explicit receiver in not passed.
390
+ *bogdanvlviv*
353
391
 
354
- *Pavel Pravosud*
392
+ * Add same method signature for `Time#prev_day` and `Time#next_day`
393
+ in accordance with `Date#prev_day`, `Date#next_day`.
355
394
 
356
- * Fixed a compatibility issue with the `Oj` gem when cherry-picking the file
357
- `active_support/core_ext/object/json` without requiring `active_support/json`.
395
+ Allows pass argument for `Time#prev_day` and `Time#next_day`.
358
396
 
359
- Fixes #16131.
397
+ Before:
398
+ ```
399
+ Time.new(2017, 9, 16, 17, 0).prev_day # => 2017-09-15 17:00:00 +0300
400
+ Time.new(2017, 9, 16, 17, 0).prev_day(1)
401
+ # => ArgumentError: wrong number of arguments (given 1, expected 0)
360
402
 
361
- *Godfrey Chan*
403
+ Time.new(2017, 9, 16, 17, 0).next_day # => 2017-09-17 17:00:00 +0300
404
+ Time.new(2017, 9, 16, 17, 0).next_day(1)
405
+ # => ArgumentError: wrong number of arguments (given 1, expected 0)
406
+ ```
362
407
 
363
- * Make `Hash#with_indifferent_access` copy the default proc too.
408
+ After:
409
+ ```
410
+ Time.new(2017, 9, 16, 17, 0).prev_day # => 2017-09-15 17:00:00 +0300
411
+ Time.new(2017, 9, 16, 17, 0).prev_day(1) # => 2017-09-15 17:00:00 +0300
364
412
 
365
- *arthurnn*, *Xanders*
413
+ Time.new(2017, 9, 16, 17, 0).next_day # => 2017-09-17 17:00:00 +0300
414
+ Time.new(2017, 9, 16, 17, 0).next_day(1) # => 2017-09-17 17:00:00 +0300
415
+ ```
366
416
 
367
- * Add `String#truncate_words` to truncate a string by a number of words.
417
+ *bogdanvlviv*
368
418
 
369
- *Mohamed Osama*
419
+ * `IO#to_json` now returns the `to_s` representation, rather than
420
+ attempting to convert to an array. This fixes a bug where `IO#to_json`
421
+ would raise an `IOError` when called on an unreadable object.
370
422
 
371
- * Deprecate `capture` and `quietly`.
423
+ Fixes #26132.
372
424
 
373
- These methods are not thread safe and may cause issues when used in threaded environments.
374
- To avoid problems we are deprecating them.
425
+ *Paul Kuruvilla*
375
426
 
376
- *Tom Meier*
427
+ * Remove deprecated `halt_callback_chains_on_return_false` option.
377
428
 
378
- * `DateTime#to_f` now preserves the fractional seconds instead of always
379
- rounding to `.0`.
429
+ *Rafael Mendonça França*
380
430
 
381
- Fixes #15994.
431
+ * Remove deprecated `:if` and `:unless` string filter for callbacks.
382
432
 
383
- *John Paul Ashenfelter*
433
+ *Rafael Mendonça França*
384
434
 
385
- * Add `Hash#transform_values` to simplify a common pattern where the values of a
386
- hash must change, but the keys are left the same.
435
+ * `Hash#slice` now falls back to Ruby 2.5+'s built-in definition if defined.
387
436
 
388
- *Sean Griffin*
437
+ *Akira Matsuda*
389
438
 
390
- * Always instrument `ActiveSupport::Cache`.
439
+ * Deprecate `secrets.secret_token`.
391
440
 
392
- Since `ActiveSupport::Notifications` only instruments items when there
393
- are attached subscribers, we don't need to disable instrumentation.
441
+ The architecture for secrets had a big upgrade between Rails 3 and Rails 4,
442
+ when the default changed from using `secret_token` to `secret_key_base`.
394
443
 
395
- *Peter Wagenet*
444
+ `secret_token` has been soft deprecated in documentation for four years
445
+ but is still in place to support apps created before Rails 4.
446
+ Deprecation warnings have been added to help developers upgrade their
447
+ applications to `secret_key_base`.
396
448
 
397
- * Make the `apply_inflections` method case-insensitive when checking
398
- whether a word is uncountable or not.
449
+ *claudiob*, *Kasper Timm Hansen*
399
450
 
400
- *Robin Dupret*
451
+ * Return an instance of `HashWithIndifferentAccess` from `HashWithIndifferentAccess#transform_keys`.
401
452
 
402
- * Make Dependencies pass a name to NameError error.
453
+ *Yuji Yaginuma*
403
454
 
404
- *arthurnn*
455
+ * Add key rotation support to `MessageEncryptor` and `MessageVerifier`.
405
456
 
406
- * Fixed `ActiveSupport::Cache::FileStore` exploding with long paths.
457
+ This change introduces a `rotate` method to both the `MessageEncryptor` and
458
+ `MessageVerifier` classes. This method accepts the same arguments and
459
+ options as the given classes' constructor. The `encrypt_and_verify` method
460
+ for `MessageEncryptor` and the `verified` method for `MessageVerifier` also
461
+ accept an optional keyword argument `:on_rotation` block which is called
462
+ when a rotated instance is used to decrypt or verify the message.
407
463
 
408
- *Adam Panzer*, *Michael Grosser*
464
+ *Michael J Coyne*
409
465
 
410
- * Fixed `ActiveSupport::TimeWithZone#-` so precision is not unnecessarily lost
411
- when working with objects with a nanosecond component.
466
+ * Deprecate `Module#reachable?` method.
412
467
 
413
- `ActiveSupport::TimeWithZone#-` should return the same result as if we were
414
- using `Time#-`:
468
+ *bogdanvlviv*
415
469
 
416
- Time.now.end_of_day - Time.now.beginning_of_day # => 86399.999999999
470
+ * Add `config/credentials.yml.enc` to store production app secrets.
417
471
 
418
- Before:
472
+ Allows saving any authentication credentials for third party services
473
+ directly in repo encrypted with `config/master.key` or `ENV["RAILS_MASTER_KEY"]`.
419
474
 
420
- Time.zone.now.end_of_day.nsec # => 999999999
421
- Time.zone.now.end_of_day - Time.zone.now.beginning_of_day # => 86400.0
475
+ This will eventually replace `Rails.application.secrets` and the encrypted
476
+ secrets introduced in Rails 5.1.
422
477
 
423
- After:
478
+ *DHH*, *Kasper Timm Hansen*
424
479
 
425
- Time.zone.now.end_of_day - Time.zone.now.beginning_of_day
426
- # => 86399.999999999
480
+ * Add `ActiveSupport::EncryptedFile` and `ActiveSupport::EncryptedConfiguration`.
427
481
 
428
- *Gordon Chan*
482
+ Allows for stashing encrypted files or configuration directly in repo by
483
+ encrypting it with a key.
429
484
 
430
- * Fixed precision error in NumberHelper when using Rationals.
485
+ Backs the new credentials setup above, but can also be used independently.
431
486
 
432
- Before:
487
+ *DHH*, *Kasper Timm Hansen*
433
488
 
434
- ActiveSupport::NumberHelper.number_to_rounded Rational(1000, 3), precision: 2
435
- # => "330.00"
489
+ * `Module#delegate_missing_to` now raises `DelegationError` if target is nil,
490
+ similar to `Module#delegate`.
436
491
 
437
- After:
492
+ *Anton Khamets*
438
493
 
439
- ActiveSupport::NumberHelper.number_to_rounded Rational(1000, 3), precision: 2
440
- # => "333.33"
494
+ * Update `String#camelize` to provide feedback when wrong option is passed.
441
495
 
442
- See #15379.
496
+ `String#camelize` was returning nil without any feedback when an
497
+ invalid option was passed as a parameter.
443
498
 
444
- *Juanjo Bazán*
499
+ Previously:
445
500
 
446
- * Removed deprecated `Numeric#ago` and friends
501
+ 'one_two'.camelize(true)
502
+ # => nil
447
503
 
448
- Replacements:
504
+ Now:
449
505
 
450
- 5.ago => 5.seconds.ago
451
- 5.until => 5.seconds.until
452
- 5.since => 5.seconds.since
453
- 5.from_now => 5.seconds.from_now
506
+ 'one_two'.camelize(true)
507
+ # => ArgumentError: Invalid option, use either :upper or :lower.
454
508
 
455
- See #12389 for the history and rationale behind this.
509
+ *Ricardo Díaz*
456
510
 
457
- *Godfrey Chan*
511
+ * Fix modulo operations involving durations.
458
512
 
459
- * DateTime `advance` now supports partial days.
513
+ Rails 5.1 introduced `ActiveSupport::Duration::Scalar` as a wrapper
514
+ around numeric values as a way of ensuring a duration was the outcome of
515
+ an expression. However, the implementation was missing support for modulo
516
+ operations. This support has now been added and should result in a duration
517
+ being returned from expressions involving modulo operations.
460
518
 
461
- Before:
519
+ Prior to Rails 5.1:
462
520
 
463
- DateTime.now.advance(days: 1, hours: 12)
521
+ 5.minutes % 2.minutes
522
+ # => 60
464
523
 
465
- After:
524
+ Now:
466
525
 
467
- DateTime.now.advance(days: 1.5)
526
+ 5.minutes % 2.minutes
527
+ # => 1 minute
468
528
 
469
- Fixes #12005.
529
+ Fixes #29603 and #29743.
470
530
 
471
- *Shay Davidson*
531
+ *Sayan Chakraborty*, *Andrew White*
472
532
 
473
- * `Hash#deep_transform_keys` and `Hash#deep_transform_keys!` now transform hashes
474
- in nested arrays. This change also applies to `Hash#deep_stringify_keys`,
475
- `Hash#deep_stringify_keys!`, `Hash#deep_symbolize_keys` and
476
- `Hash#deep_symbolize_keys!`.
533
+ * Fix division where a duration is the denominator.
477
534
 
478
- *OZAWA Sakuro*
535
+ PR #29163 introduced a change in behavior when a duration was the denominator
536
+ in a calculation - this was incorrect as dividing by a duration should always
537
+ return a `Numeric`. The behavior of previous versions of Rails has been restored.
479
538
 
480
- * Fixed confusing `DelegationError` in `Module#delegate`.
539
+ Fixes #29592.
481
540
 
482
- See #15186.
541
+ *Andrew White*
483
542
 
484
- *Vladimir Yarotsky*
543
+ * Add purpose and expiry support to `ActiveSupport::MessageVerifier` and
544
+ `ActiveSupport::MessageEncryptor`.
485
545
 
486
- * Fixed `ActiveSupport::Subscriber` so that no duplicate subscriber is created
487
- when a subscriber method is redefined.
546
+ For instance, to ensure a message is only usable for one intended purpose:
488
547
 
489
- *Dennis Schön*
548
+ token = @verifier.generate("x", purpose: :shipping)
490
549
 
491
- * Remove deprecated string based terminators for `ActiveSupport::Callbacks`.
550
+ @verifier.verified(token, purpose: :shipping) # => "x"
551
+ @verifier.verified(token) # => nil
492
552
 
493
- *Eileen M. Uchitelle*
553
+ Or make it expire after a set time:
494
554
 
495
- * Fixed an issue when using
496
- `ActiveSupport::NumberHelper::NumberToDelimitedConverter` to
497
- convert a value that is an `ActiveSupport::SafeBuffer` introduced
498
- in 2da9d67.
555
+ @verifier.generate("x", expires_in: 1.month)
556
+ @verifier.generate("y", expires_at: Time.now.end_of_year)
499
557
 
500
- See #15064.
558
+ Showcased with `ActiveSupport::MessageVerifier`, but works the same for
559
+ `ActiveSupport::MessageEncryptor`'s `encrypt_and_sign` and `decrypt_and_verify`.
501
560
 
502
- *Mark J. Titorenko*
561
+ Pull requests: #29599, #29854
503
562
 
504
- * `TimeZone#parse` defaults the day of the month to '1' if any other date
505
- components are specified. This is more consistent with the behavior of
506
- `Time#parse`.
563
+ *Assain Jaleel*
507
564
 
508
- *Ulysse Carion*
565
+ * Make the order of `Hash#reverse_merge!` consistent with `HashWithIndifferentAccess`.
509
566
 
510
- * `humanize` strips leading underscores, if any.
567
+ *Erol Fornoles*
511
568
 
512
- Before:
569
+ * Add `freeze_time` helper which freezes time to `Time.now` in tests.
513
570
 
514
- '_id'.humanize # => ""
571
+ *Prathamesh Sonpatki*
515
572
 
516
- After:
573
+ * Default `ActiveSupport::MessageEncryptor` to use AES 256 GCM encryption.
574
+
575
+ On for new Rails 5.2 apps. Upgrading apps can find the config as a new
576
+ framework default.
577
+
578
+ *Assain Jaleel*
579
+
580
+ * Cache: `write_multi`.
581
+
582
+ Rails.cache.write_multi foo: 'bar', baz: 'qux'
583
+
584
+ Plus faster fetch_multi with stores that implement `write_multi_entries`.
585
+ Keys that aren't found may be written to the cache store in one shot
586
+ instead of separate writes.
517
587
 
518
- '_id'.humanize # => "Id"
588
+ The default implementation simply calls `write_entry` for each entry.
589
+ Stores may override if they're capable of one-shot bulk writes, like
590
+ Redis `MSET`.
519
591
 
520
- *Xavier Noria*
592
+ *Jeremy Daer*
521
593
 
522
- * Fixed backward compatibility issues introduced in 326e652.
594
+ * Add default option to module and class attribute accessors.
523
595
 
524
- Empty Hash or Array should not be present in serialization result.
596
+ mattr_accessor :settings, default: {}
525
597
 
526
- {a: []}.to_query # => ""
527
- {a: {}}.to_query # => ""
598
+ Works for `mattr_reader`, `mattr_writer`, `cattr_accessor`, `cattr_reader`,
599
+ and `cattr_writer` as well.
528
600
 
529
- For more info see #14948.
601
+ *Genadi Samokovarov*
530
602
 
531
- *Bogdan Gusiev*
603
+ * Add `Date#prev_occurring` and `Date#next_occurring` to return specified next/previous occurring day of week.
532
604
 
533
- * Add `Digest::UUID::uuid_v3` and `Digest::UUID::uuid_v5` to support stable
534
- UUID fixtures on PostgreSQL.
605
+ *Shota Iguchi*
535
606
 
536
- *Roderick van Domburg*
607
+ * Add default option to `class_attribute`.
537
608
 
538
- * Fixed `ActiveSupport::Duration#eql?` so that `1.second.eql?(1.second)` is
539
- true.
609
+ Before:
610
+
611
+ class_attribute :settings
612
+ self.settings = {}
540
613
 
541
- This fixes the current situation of:
614
+ Now:
542
615
 
543
- 1.second.eql?(1.second) # => false
616
+ class_attribute :settings, default: {}
544
617
 
545
- `eql?` also requires that the other object is an `ActiveSupport::Duration`.
546
- This requirement makes `ActiveSupport::Duration`'s behavior consistent with
547
- the behavior of Ruby's numeric types:
618
+ *DHH*
548
619
 
549
- 1.eql?(1.0) # => false
550
- 1.0.eql?(1) # => false
620
+ * `#singularize` and `#pluralize` now respect uncountables for the specified locale.
551
621
 
552
- 1.second.eql?(1) # => false (was true)
553
- 1.eql?(1.second) # => false
622
+ *Eilis Hamilton*
554
623
 
555
- { 1 => "foo", 1.0 => "bar" }
556
- # => { 1 => "foo", 1.0 => "bar" }
624
+ * Add `ActiveSupport::CurrentAttributes` to provide a thread-isolated attributes singleton.
625
+ Primary use case is keeping all the per-request attributes easily available to the whole system.
557
626
 
558
- { 1 => "foo", 1.second => "bar" }
559
- # now => { 1 => "foo", 1.second => "bar" }
560
- # was => { 1 => "bar" }
627
+ *DHH*
561
628
 
562
- And though the behavior of these hasn't changed, for reference:
629
+ * Fix implicit coercion calculations with scalars and durations.
563
630
 
564
- 1 == 1.0 # => true
565
- 1.0 == 1 # => true
631
+ Previously, calculations where the scalar is first would be converted to a duration
632
+ of seconds, but this causes issues with dates being converted to times, e.g:
566
633
 
567
- 1 == 1.second # => true
568
- 1.second == 1 # => true
634
+ Time.zone = "Beijing" # => Asia/Shanghai
635
+ date = Date.civil(2017, 5, 20) # => Mon, 20 May 2017
636
+ 2 * 1.day # => 172800 seconds
637
+ date + 2 * 1.day # => Mon, 22 May 2017 00:00:00 CST +08:00
569
638
 
570
- *Emily Dobervich*
639
+ Now, the `ActiveSupport::Duration::Scalar` calculation methods will try to maintain
640
+ the part structure of the duration where possible, e.g:
571
641
 
572
- * `ActiveSupport::SafeBuffer#prepend` acts like `String#prepend` and modifies
573
- instance in-place, returning self. `ActiveSupport::SafeBuffer#prepend!` is
574
- deprecated.
642
+ Time.zone = "Beijing" # => Asia/Shanghai
643
+ date = Date.civil(2017, 5, 20) # => Mon, 20 May 2017
644
+ 2 * 1.day # => 2 days
645
+ date + 2 * 1.day # => Mon, 22 May 2017
575
646
 
576
- *Pavel Pravosud*
647
+ Fixes #29160, #28970.
577
648
 
578
- * `HashWithIndifferentAccess` better respects `#to_hash` on objects it
579
- receives. In particular, `.new`, `#update`, `#merge`, and `#replace` accept
580
- objects which respond to `#to_hash`, even if those objects are not hashes
581
- directly.
649
+ *Andrew White*
582
650
 
583
- *Peter Jaros*
651
+ * Add support for versioned cache entries. This enables the cache stores to recycle cache keys, greatly saving
652
+ on storage in cases with frequent churn. Works together with the separation of `#cache_key` and `#cache_version`
653
+ in Active Record and its use in Action Pack's fragment caching.
584
654
 
585
- * Deprecate `Class#superclass_delegating_accessor`, use `Class#class_attribute` instead.
655
+ *DHH*
586
656
 
587
- *Akshay Vishnoi*
657
+ * Pass gem name and deprecation horizon to deprecation notifications.
588
658
 
589
- * Ensure classes which `include Enumerable` get `#to_json` in addition to
590
- `#as_json`.
659
+ *Willem van Bergen*
591
660
 
592
- *Sammy Larbi*
661
+ * Add support for `:offset` and `:zone` to `ActiveSupport::TimeWithZone#change`.
593
662
 
594
- * Change the signature of `fetch_multi` to return a hash rather than an
595
- array. This makes it consistent with the output of `read_multi`.
663
+ *Andrew White*
596
664
 
597
- *Parker Selbert*
665
+ * Add support for `:offset` to `Time#change`.
598
666
 
599
- * Introduce `Concern#class_methods` as a sleek alternative to clunky
600
- `module ClassMethods`. Add `Kernel#concern` to define at the toplevel
601
- without chunky `module Foo; extend ActiveSupport::Concern` boilerplate.
667
+ Fixes #28723.
602
668
 
603
- # app/models/concerns/authentication.rb
604
- concern :Authentication do
605
- included do
606
- after_create :generate_private_key
607
- end
669
+ *Andrew White*
608
670
 
609
- class_methods do
610
- def authenticate(credentials)
611
- # ...
612
- end
613
- end
671
+ * Add `fetch_values` for `HashWithIndifferentAccess`.
614
672
 
615
- def generate_private_key
616
- # ...
617
- end
618
- end
673
+ The method was originally added to `Hash` in Ruby 2.3.0.
619
674
 
620
- # app/models/user.rb
621
- class User < ActiveRecord::Base
622
- include Authentication
623
- end
675
+ *Josh Pencheon*
624
676
 
625
- *Jeremy Kemper*
626
677
 
627
- Please check [4-1-stable](https://github.com/rails/rails/blob/4-1-stable/activesupport/CHANGELOG.md) for previous changes.
678
+ Please check [5-1-stable](https://github.com/rails/rails/blob/5-1-stable/activesupport/CHANGELOG.md) for previous changes.