activesupport 4.2.11.1 → 5.2.4

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