activesupport 5.1.1 → 6.1.1

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 (262) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +360 -442
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +5 -4
  5. data/lib/active_support/actionable_error.rb +48 -0
  6. data/lib/active_support/all.rb +2 -0
  7. data/lib/active_support/array_inquirer.rb +6 -2
  8. data/lib/active_support/backtrace_cleaner.rb +31 -3
  9. data/lib/active_support/benchmarkable.rb +3 -1
  10. data/lib/active_support/builder.rb +2 -0
  11. data/lib/active_support/cache/file_store.rb +37 -36
  12. data/lib/active_support/cache/mem_cache_store.rb +65 -53
  13. data/lib/active_support/cache/memory_store.rb +61 -33
  14. data/lib/active_support/cache/null_store.rb +10 -3
  15. data/lib/active_support/cache/redis_cache_store.rb +493 -0
  16. data/lib/active_support/cache/strategy/local_cache.rb +68 -22
  17. data/lib/active_support/cache/strategy/local_cache_middleware.rb +2 -0
  18. data/lib/active_support/cache.rb +305 -127
  19. data/lib/active_support/callbacks.rb +106 -98
  20. data/lib/active_support/concern.rb +79 -6
  21. data/lib/active_support/concurrency/load_interlock_aware_monitor.rb +35 -0
  22. data/lib/active_support/concurrency/share_lock.rb +2 -1
  23. data/lib/active_support/configurable.rb +12 -14
  24. data/lib/active_support/configuration_file.rb +46 -0
  25. data/lib/active_support/core_ext/array/access.rb +21 -7
  26. data/lib/active_support/core_ext/array/conversions.rb +7 -5
  27. data/lib/active_support/core_ext/array/extract.rb +21 -0
  28. data/lib/active_support/core_ext/array/extract_options.rb +2 -0
  29. data/lib/active_support/core_ext/array/grouping.rb +2 -0
  30. data/lib/active_support/core_ext/array/inquiry.rb +2 -0
  31. data/lib/active_support/core_ext/array/wrap.rb +2 -0
  32. data/lib/active_support/core_ext/array.rb +3 -1
  33. data/lib/active_support/core_ext/benchmark.rb +4 -2
  34. data/lib/active_support/core_ext/big_decimal/conversions.rb +2 -0
  35. data/lib/active_support/core_ext/big_decimal.rb +2 -0
  36. data/lib/active_support/core_ext/class/attribute.rb +50 -47
  37. data/lib/active_support/core_ext/class/attribute_accessors.rb +2 -0
  38. data/lib/active_support/core_ext/class/subclasses.rb +18 -40
  39. data/lib/active_support/core_ext/class.rb +2 -0
  40. data/lib/active_support/core_ext/date/acts_like.rb +2 -0
  41. data/lib/active_support/core_ext/date/blank.rb +2 -0
  42. data/lib/active_support/core_ext/date/calculations.rb +8 -5
  43. data/lib/active_support/core_ext/date/conversions.rb +12 -10
  44. data/lib/active_support/core_ext/date/zones.rb +2 -0
  45. data/lib/active_support/core_ext/date.rb +2 -0
  46. data/lib/active_support/core_ext/date_and_time/calculations.rb +61 -37
  47. data/lib/active_support/core_ext/date_and_time/compatibility.rb +18 -1
  48. data/lib/active_support/core_ext/date_and_time/zones.rb +2 -1
  49. data/lib/active_support/core_ext/date_time/acts_like.rb +2 -0
  50. data/lib/active_support/core_ext/date_time/blank.rb +2 -0
  51. data/lib/active_support/core_ext/date_time/calculations.rb +3 -1
  52. data/lib/active_support/core_ext/date_time/compatibility.rb +7 -5
  53. data/lib/active_support/core_ext/date_time/conversions.rb +2 -1
  54. data/lib/active_support/core_ext/date_time.rb +2 -0
  55. data/lib/active_support/core_ext/digest/uuid.rb +3 -1
  56. data/lib/active_support/core_ext/digest.rb +3 -0
  57. data/lib/active_support/core_ext/enumerable.rb +174 -71
  58. data/lib/active_support/core_ext/file/atomic.rb +3 -1
  59. data/lib/active_support/core_ext/file.rb +2 -0
  60. data/lib/active_support/core_ext/hash/conversions.rb +7 -5
  61. data/lib/active_support/core_ext/hash/deep_merge.rb +8 -12
  62. data/lib/active_support/core_ext/hash/deep_transform_values.rb +46 -0
  63. data/lib/active_support/core_ext/hash/except.rb +4 -2
  64. data/lib/active_support/core_ext/hash/indifferent_access.rb +2 -0
  65. data/lib/active_support/core_ext/hash/keys.rb +3 -30
  66. data/lib/active_support/core_ext/hash/reverse_merge.rb +5 -2
  67. data/lib/active_support/core_ext/hash/slice.rb +8 -29
  68. data/lib/active_support/core_ext/hash.rb +3 -2
  69. data/lib/active_support/core_ext/integer/inflections.rb +2 -0
  70. data/lib/active_support/core_ext/integer/multiple.rb +3 -1
  71. data/lib/active_support/core_ext/integer/time.rb +7 -14
  72. data/lib/active_support/core_ext/integer.rb +2 -0
  73. data/lib/active_support/core_ext/kernel/concern.rb +2 -0
  74. data/lib/active_support/core_ext/kernel/reporting.rb +2 -0
  75. data/lib/active_support/core_ext/kernel/singleton_class.rb +2 -0
  76. data/lib/active_support/core_ext/kernel.rb +2 -1
  77. data/lib/active_support/core_ext/load_error.rb +3 -8
  78. data/lib/active_support/core_ext/marshal.rb +4 -0
  79. data/lib/active_support/core_ext/module/aliasing.rb +2 -0
  80. data/lib/active_support/core_ext/module/anonymous.rb +2 -0
  81. data/lib/active_support/core_ext/module/attr_internal.rb +4 -2
  82. data/lib/active_support/core_ext/module/attribute_accessors.rb +44 -56
  83. data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +18 -18
  84. data/lib/active_support/core_ext/module/concerning.rb +15 -10
  85. data/lib/active_support/core_ext/module/delegation.rb +103 -58
  86. data/lib/active_support/core_ext/module/deprecation.rb +2 -0
  87. data/lib/active_support/core_ext/module/introspection.rb +18 -15
  88. data/lib/active_support/core_ext/module/redefine_method.rb +40 -0
  89. data/lib/active_support/core_ext/module/remove_method.rb +5 -23
  90. data/lib/active_support/core_ext/module.rb +3 -1
  91. data/lib/active_support/core_ext/name_error.rb +36 -2
  92. data/lib/active_support/core_ext/numeric/bytes.rb +2 -0
  93. data/lib/active_support/core_ext/numeric/conversions.rb +131 -129
  94. data/lib/active_support/core_ext/numeric/time.rb +7 -15
  95. data/lib/active_support/core_ext/numeric.rb +2 -1
  96. data/lib/active_support/core_ext/object/acts_like.rb +12 -1
  97. data/lib/active_support/core_ext/object/blank.rb +13 -3
  98. data/lib/active_support/core_ext/object/conversions.rb +2 -0
  99. data/lib/active_support/core_ext/object/deep_dup.rb +3 -1
  100. data/lib/active_support/core_ext/object/duplicable.rb +6 -101
  101. data/lib/active_support/core_ext/object/inclusion.rb +2 -0
  102. data/lib/active_support/core_ext/object/instance_variables.rb +2 -0
  103. data/lib/active_support/core_ext/object/json.rb +22 -2
  104. data/lib/active_support/core_ext/object/to_param.rb +2 -0
  105. data/lib/active_support/core_ext/object/to_query.rb +7 -2
  106. data/lib/active_support/core_ext/object/try.rb +19 -7
  107. data/lib/active_support/core_ext/object/with_options.rb +4 -2
  108. data/lib/active_support/core_ext/object.rb +2 -0
  109. data/lib/active_support/core_ext/range/compare_range.rb +82 -0
  110. data/lib/active_support/core_ext/range/conversions.rb +35 -25
  111. data/lib/active_support/core_ext/range/each.rb +5 -2
  112. data/lib/active_support/core_ext/range/include_time_with_zone.rb +28 -0
  113. data/lib/active_support/core_ext/range/overlaps.rb +2 -0
  114. data/lib/active_support/core_ext/range.rb +4 -1
  115. data/lib/active_support/core_ext/regexp.rb +10 -5
  116. data/lib/active_support/core_ext/securerandom.rb +25 -3
  117. data/lib/active_support/core_ext/string/access.rb +7 -16
  118. data/lib/active_support/core_ext/string/behavior.rb +2 -0
  119. data/lib/active_support/core_ext/string/conversions.rb +3 -0
  120. data/lib/active_support/core_ext/string/exclude.rb +2 -0
  121. data/lib/active_support/core_ext/string/filters.rb +44 -1
  122. data/lib/active_support/core_ext/string/indent.rb +2 -0
  123. data/lib/active_support/core_ext/string/inflections.rb +69 -16
  124. data/lib/active_support/core_ext/string/inquiry.rb +3 -0
  125. data/lib/active_support/core_ext/string/multibyte.rb +9 -4
  126. data/lib/active_support/core_ext/string/output_safety.rb +76 -20
  127. data/lib/active_support/core_ext/string/starts_ends_with.rb +4 -2
  128. data/lib/active_support/core_ext/string/strip.rb +5 -1
  129. data/lib/active_support/core_ext/string/zones.rb +2 -0
  130. data/lib/active_support/core_ext/string.rb +2 -0
  131. data/lib/active_support/core_ext/symbol/starts_ends_with.rb +14 -0
  132. data/lib/active_support/core_ext/symbol.rb +3 -0
  133. data/lib/active_support/core_ext/time/acts_like.rb +2 -0
  134. data/lib/active_support/core_ext/time/calculations.rb +73 -18
  135. data/lib/active_support/core_ext/time/compatibility.rb +4 -2
  136. data/lib/active_support/core_ext/time/conversions.rb +4 -0
  137. data/lib/active_support/core_ext/time/zones.rb +6 -4
  138. data/lib/active_support/core_ext/time.rb +2 -0
  139. data/lib/active_support/core_ext/uri.rb +11 -6
  140. data/lib/active_support/core_ext.rb +3 -1
  141. data/lib/active_support/current_attributes/test_helper.rb +13 -0
  142. data/lib/active_support/current_attributes.rb +208 -0
  143. data/lib/active_support/dependencies/autoload.rb +2 -0
  144. data/lib/active_support/dependencies/interlock.rb +2 -0
  145. data/lib/active_support/dependencies/zeitwerk_integration.rb +117 -0
  146. data/lib/active_support/dependencies.rb +135 -60
  147. data/lib/active_support/deprecation/behaviors.rb +43 -11
  148. data/lib/active_support/deprecation/constant_accessor.rb +4 -2
  149. data/lib/active_support/deprecation/disallowed.rb +56 -0
  150. data/lib/active_support/deprecation/instance_delegator.rb +2 -1
  151. data/lib/active_support/deprecation/method_wrappers.rb +30 -15
  152. data/lib/active_support/deprecation/proxy_wrappers.rb +32 -6
  153. data/lib/active_support/deprecation/reporting.rb +54 -9
  154. data/lib/active_support/deprecation.rb +9 -2
  155. data/lib/active_support/descendants_tracker.rb +61 -9
  156. data/lib/active_support/digest.rb +20 -0
  157. data/lib/active_support/duration/iso8601_parser.rb +6 -6
  158. data/lib/active_support/duration/iso8601_serializer.rb +20 -14
  159. data/lib/active_support/duration.rb +179 -41
  160. data/lib/active_support/encrypted_configuration.rb +45 -0
  161. data/lib/active_support/encrypted_file.rb +117 -0
  162. data/lib/active_support/environment_inquirer.rb +20 -0
  163. data/lib/active_support/evented_file_update_checker.rb +84 -117
  164. data/lib/active_support/execution_wrapper.rb +3 -0
  165. data/lib/active_support/executor.rb +2 -0
  166. data/lib/active_support/file_update_checker.rb +2 -1
  167. data/lib/active_support/fork_tracker.rb +62 -0
  168. data/lib/active_support/gem_version.rb +3 -1
  169. data/lib/active_support/gzip.rb +2 -0
  170. data/lib/active_support/hash_with_indifferent_access.rb +134 -37
  171. data/lib/active_support/i18n.rb +4 -1
  172. data/lib/active_support/i18n_railtie.rb +20 -11
  173. data/lib/active_support/inflections.rb +2 -0
  174. data/lib/active_support/inflector/inflections.rb +19 -8
  175. data/lib/active_support/inflector/methods.rb +87 -77
  176. data/lib/active_support/inflector/transliterate.rb +56 -18
  177. data/lib/active_support/inflector.rb +2 -0
  178. data/lib/active_support/json/decoding.rb +27 -26
  179. data/lib/active_support/json/encoding.rb +13 -3
  180. data/lib/active_support/json.rb +2 -0
  181. data/lib/active_support/key_generator.rb +3 -33
  182. data/lib/active_support/lazy_load_hooks.rb +33 -10
  183. data/lib/active_support/locale/en.rb +33 -0
  184. data/lib/active_support/locale/en.yml +7 -3
  185. data/lib/active_support/log_subscriber/test_helper.rb +2 -0
  186. data/lib/active_support/log_subscriber.rb +46 -13
  187. data/lib/active_support/logger.rb +4 -17
  188. data/lib/active_support/logger_silence.rb +13 -20
  189. data/lib/active_support/logger_thread_safe_level.rb +54 -7
  190. data/lib/active_support/message_encryptor.rb +101 -33
  191. data/lib/active_support/message_verifier.rb +85 -14
  192. data/lib/active_support/messages/metadata.rb +80 -0
  193. data/lib/active_support/messages/rotation_configuration.rb +23 -0
  194. data/lib/active_support/messages/rotator.rb +57 -0
  195. data/lib/active_support/multibyte/chars.rb +12 -68
  196. data/lib/active_support/multibyte/unicode.rb +17 -327
  197. data/lib/active_support/multibyte.rb +2 -0
  198. data/lib/active_support/notifications/fanout.rb +118 -16
  199. data/lib/active_support/notifications/instrumenter.rb +73 -9
  200. data/lib/active_support/notifications.rb +74 -8
  201. data/lib/active_support/number_helper/number_converter.rb +7 -6
  202. data/lib/active_support/number_helper/number_to_currency_converter.rb +6 -9
  203. data/lib/active_support/number_helper/number_to_delimited_converter.rb +5 -2
  204. data/lib/active_support/number_helper/number_to_human_converter.rb +8 -7
  205. data/lib/active_support/number_helper/number_to_human_size_converter.rb +6 -3
  206. data/lib/active_support/number_helper/number_to_percentage_converter.rb +5 -1
  207. data/lib/active_support/number_helper/number_to_phone_converter.rb +5 -2
  208. data/lib/active_support/number_helper/number_to_rounded_converter.rb +16 -53
  209. data/lib/active_support/number_helper/rounding_helper.rb +50 -0
  210. data/lib/active_support/number_helper.rb +41 -12
  211. data/lib/active_support/option_merger.rb +24 -3
  212. data/lib/active_support/ordered_hash.rb +3 -1
  213. data/lib/active_support/ordered_options.rb +17 -5
  214. data/lib/active_support/parameter_filter.rb +133 -0
  215. data/lib/active_support/per_thread_registry.rb +3 -1
  216. data/lib/active_support/proxy_object.rb +2 -0
  217. data/lib/active_support/rails.rb +3 -10
  218. data/lib/active_support/railtie.rb +60 -9
  219. data/lib/active_support/reloader.rb +11 -10
  220. data/lib/active_support/rescuable.rb +7 -6
  221. data/lib/active_support/secure_compare_rotator.rb +51 -0
  222. data/lib/active_support/security_utils.rb +26 -15
  223. data/lib/active_support/string_inquirer.rb +6 -3
  224. data/lib/active_support/subscriber.rb +74 -24
  225. data/lib/active_support/tagged_logging.rb +44 -8
  226. data/lib/active_support/test_case.rb +94 -2
  227. data/lib/active_support/testing/assertions.rb +58 -20
  228. data/lib/active_support/testing/autorun.rb +2 -4
  229. data/lib/active_support/testing/constant_lookup.rb +2 -0
  230. data/lib/active_support/testing/declarative.rb +2 -0
  231. data/lib/active_support/testing/deprecation.rb +2 -1
  232. data/lib/active_support/testing/file_fixtures.rb +4 -0
  233. data/lib/active_support/testing/isolation.rb +8 -4
  234. data/lib/active_support/testing/method_call_assertions.rb +30 -1
  235. data/lib/active_support/testing/parallelization/server.rb +78 -0
  236. data/lib/active_support/testing/parallelization/worker.rb +100 -0
  237. data/lib/active_support/testing/parallelization.rb +51 -0
  238. data/lib/active_support/testing/setup_and_teardown.rb +12 -7
  239. data/lib/active_support/testing/stream.rb +3 -2
  240. data/lib/active_support/testing/tagged_logging.rb +2 -0
  241. data/lib/active_support/testing/time_helpers.rb +78 -13
  242. data/lib/active_support/time.rb +2 -0
  243. data/lib/active_support/time_with_zone.rb +113 -41
  244. data/lib/active_support/values/time_zone.rb +55 -25
  245. data/lib/active_support/version.rb +2 -0
  246. data/lib/active_support/xml_mini/jdom.rb +5 -4
  247. data/lib/active_support/xml_mini/libxml.rb +4 -2
  248. data/lib/active_support/xml_mini/libxmlsax.rb +6 -4
  249. data/lib/active_support/xml_mini/nokogiri.rb +4 -2
  250. data/lib/active_support/xml_mini/nokogirisax.rb +5 -3
  251. data/lib/active_support/xml_mini/rexml.rb +12 -3
  252. data/lib/active_support/xml_mini.rb +5 -11
  253. data/lib/active_support.rb +18 -13
  254. metadata +81 -35
  255. data/lib/active_support/core_ext/array/prepend_and_append.rb +0 -7
  256. data/lib/active_support/core_ext/hash/compact.rb +0 -27
  257. data/lib/active_support/core_ext/hash/transform_values.rb +0 -30
  258. data/lib/active_support/core_ext/kernel/agnostics.rb +0 -11
  259. data/lib/active_support/core_ext/module/reachable.rb +0 -8
  260. data/lib/active_support/core_ext/numeric/inquiry.rb +0 -26
  261. data/lib/active_support/core_ext/range/include_range.rb +0 -23
  262. data/lib/active_support/values/unicode_tables.dat +0 -0
@@ -1,14 +1,14 @@
1
- require "active_support/core_ext/module/aliasing"
1
+ # frozen_string_literal: true
2
+
2
3
  require "active_support/core_ext/array/extract_options"
4
+ require "active_support/core_ext/module/redefine_method"
3
5
 
4
6
  module ActiveSupport
5
7
  class Deprecation
6
8
  module MethodWrapper
7
9
  # Declare that a method has been deprecated.
8
10
  #
9
- # module Fred
10
- # extend self
11
- #
11
+ # class Fred
12
12
  # def aaa; end
13
13
  # def bbb; end
14
14
  # def ccc; end
@@ -20,15 +20,15 @@ module ActiveSupport
20
20
  # ActiveSupport::Deprecation.deprecate_methods(Fred, :aaa, bbb: :zzz, ccc: 'use Bar#ccc instead')
21
21
  # # => Fred
22
22
  #
23
- # Fred.aaa
23
+ # Fred.new.aaa
24
24
  # # DEPRECATION WARNING: aaa is deprecated and will be removed from Rails 5.1. (called from irb_binding at (irb):10)
25
25
  # # => nil
26
26
  #
27
- # Fred.bbb
27
+ # Fred.new.bbb
28
28
  # # DEPRECATION WARNING: bbb is deprecated and will be removed from Rails 5.1 (use zzz instead). (called from irb_binding at (irb):11)
29
29
  # # => nil
30
30
  #
31
- # Fred.ccc
31
+ # Fred.new.ccc
32
32
  # # DEPRECATION WARNING: ccc is deprecated and will be removed from Rails 5.1 (use Bar#ccc instead). (called from irb_binding at (irb):12)
33
33
  # # => nil
34
34
  #
@@ -37,7 +37,7 @@ module ActiveSupport
37
37
  # ActiveSupport::Deprecation.deprecate_methods(Fred, ddd: :zzz, deprecator: custom_deprecator)
38
38
  # # => [:ddd]
39
39
  #
40
- # Fred.ddd
40
+ # Fred.new.ddd
41
41
  # DEPRECATION WARNING: ddd is deprecated and will be removed from MyGem next-release (use zzz instead). (called from irb_binding at (irb):15)
42
42
  # # => nil
43
43
  #
@@ -46,24 +46,39 @@ module ActiveSupport
46
46
  # custom_deprecator.deprecate_methods(Fred, eee: :zzz)
47
47
  # # => [:eee]
48
48
  #
49
- # Fred.eee
49
+ # Fred.new.eee
50
50
  # DEPRECATION WARNING: eee is deprecated and will be removed from MyGem next-release (use zzz instead). (called from irb_binding at (irb):18)
51
51
  # # => nil
52
52
  def deprecate_methods(target_module, *method_names)
53
53
  options = method_names.extract_options!
54
54
  deprecator = options.delete(:deprecator) || self
55
55
  method_names += options.keys
56
+ mod = nil
56
57
 
57
- mod = Module.new do
58
- method_names.each do |method_name|
59
- define_method(method_name) do |*args, &block|
60
- deprecator.deprecation_warning(method_name, options[method_name])
61
- super(*args, &block)
58
+ method_names.each do |method_name|
59
+ message = options[method_name]
60
+ if target_module.method_defined?(method_name) || target_module.private_method_defined?(method_name)
61
+ method = target_module.instance_method(method_name)
62
+ target_module.module_eval do
63
+ redefine_method(method_name) do |*args, &block|
64
+ deprecator.deprecation_warning(method_name, message)
65
+ method.bind(self).call(*args, &block)
66
+ end
67
+ ruby2_keywords(method_name) if respond_to?(:ruby2_keywords, true)
68
+ end
69
+ else
70
+ mod ||= Module.new
71
+ mod.module_eval do
72
+ define_method(method_name) do |*args, &block|
73
+ deprecator.deprecation_warning(method_name, message)
74
+ super(*args, &block)
75
+ end
76
+ ruby2_keywords(method_name) if respond_to?(:ruby2_keywords, true)
62
77
  end
63
78
  end
64
79
  end
65
80
 
66
- target_module.prepend(mod)
81
+ target_module.prepend(mod) if mod
67
82
  end
68
83
  end
69
84
  end
@@ -1,5 +1,4 @@
1
- require "active_support/inflector/methods"
2
- require "active_support/core_ext/regexp"
1
+ # frozen_string_literal: true
3
2
 
4
3
  module ActiveSupport
5
4
  class Deprecation
@@ -112,7 +111,7 @@ module ActiveSupport
112
111
  #
113
112
  # PLANETS = %w(mercury venus earth mars jupiter saturn uranus neptune pluto)
114
113
  #
115
- # (In a later update, the original implementation of `PLANETS` has been removed.)
114
+ # # (In a later update, the original implementation of `PLANETS` has been removed.)
116
115
  #
117
116
  # PLANETS_POST_2006 = %w(mercury venus earth mars jupiter saturn uranus neptune)
118
117
  # PLANETS = ActiveSupport::Deprecation::DeprecatedConstantProxy.new('PLANETS', 'PLANETS_POST_2006')
@@ -121,14 +120,35 @@ module ActiveSupport
121
120
  # # => DEPRECATION WARNING: PLANETS is deprecated! Use PLANETS_POST_2006 instead.
122
121
  # (Backtrace information…)
123
122
  # ["Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune"]
124
- class DeprecatedConstantProxy < DeprecationProxy
123
+ class DeprecatedConstantProxy < Module
124
+ def self.new(*args, **options, &block)
125
+ object = args.first
126
+
127
+ return object unless object
128
+ super
129
+ end
130
+
125
131
  def initialize(old_const, new_const, deprecator = ActiveSupport::Deprecation.instance, message: "#{old_const} is deprecated! Use #{new_const} instead.")
132
+ Kernel.require "active_support/inflector/methods"
133
+
126
134
  @old_const = old_const
127
135
  @new_const = new_const
128
136
  @deprecator = deprecator
129
137
  @message = message
130
138
  end
131
139
 
140
+ instance_methods.each { |m| undef_method m unless /^__|^object_id$/.match?(m) }
141
+
142
+ # Don't give a deprecation warning on inspect since test/unit and error
143
+ # logs rely on it for diagnostics.
144
+ def inspect
145
+ target.inspect
146
+ end
147
+
148
+ # Don't give a deprecation warning on methods that IRB may invoke
149
+ # during tab-completion.
150
+ delegate :hash, :instance_methods, :name, :respond_to?, to: :target
151
+
132
152
  # Returns the class of the new constant.
133
153
  #
134
154
  # PLANETS_POST_2006 = %w(mercury venus earth mars jupiter saturn uranus neptune)
@@ -143,8 +163,14 @@ module ActiveSupport
143
163
  ActiveSupport::Inflector.constantize(@new_const.to_s)
144
164
  end
145
165
 
146
- def warn(callstack, called, args)
147
- @deprecator.warn(@message, callstack)
166
+ def const_missing(name)
167
+ @deprecator.warn(@message, caller_locations)
168
+ target.const_get(name)
169
+ end
170
+
171
+ def method_missing(called, *args, &block)
172
+ @deprecator.warn(@message, caller_locations)
173
+ target.__send__(called, *args, &block)
148
174
  end
149
175
  end
150
176
  end
@@ -1,10 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "rbconfig"
2
4
 
3
5
  module ActiveSupport
4
6
  class Deprecation
5
7
  module Reporting
6
8
  # Whether to print a message (silent mode)
7
- attr_accessor :silenced
9
+ attr_writer :silenced
8
10
  # Name of gem where method is deprecated
9
11
  attr_accessor :gem_name
10
12
 
@@ -18,7 +20,11 @@ module ActiveSupport
18
20
 
19
21
  callstack ||= caller_locations(2)
20
22
  deprecation_message(callstack, message).tap do |m|
21
- behavior.each { |b| b.call(m, callstack) }
23
+ if deprecation_disallowed?(message)
24
+ disallowed_behavior.each { |b| b.call(m, callstack, deprecation_horizon, gem_name) }
25
+ else
26
+ behavior.each { |b| b.call(m, callstack, deprecation_horizon, gem_name) }
27
+ end
22
28
  end
23
29
  end
24
30
 
@@ -31,11 +37,50 @@ module ActiveSupport
31
37
  # ActiveSupport::Deprecation.warn('something broke!')
32
38
  # end
33
39
  # # => nil
34
- def silence
35
- old_silenced, @silenced = @silenced, true
36
- yield
37
- ensure
38
- @silenced = old_silenced
40
+ def silence(&block)
41
+ @silenced_thread.bind(true, &block)
42
+ end
43
+
44
+ # Allow previously disallowed deprecation warnings within the block.
45
+ # <tt>allowed_warnings</tt> can be an array containing strings, symbols, or regular
46
+ # expressions. (Symbols are treated as strings). These are compared against
47
+ # the text of deprecation warning messages generated within the block.
48
+ # Matching warnings will be exempt from the rules set by
49
+ # +ActiveSupport::Deprecation.disallowed_warnings+
50
+ #
51
+ # The optional <tt>if:</tt> argument accepts a truthy/falsy value or an object that
52
+ # responds to <tt>.call</tt>. If truthy, then matching warnings will be allowed.
53
+ # If falsey then the method yields to the block without allowing the warning.
54
+ #
55
+ # ActiveSupport::Deprecation.disallowed_behavior = :raise
56
+ # ActiveSupport::Deprecation.disallowed_warnings = [
57
+ # "something broke"
58
+ # ]
59
+ #
60
+ # ActiveSupport::Deprecation.warn('something broke!')
61
+ # # => ActiveSupport::DeprecationException
62
+ #
63
+ # ActiveSupport::Deprecation.allow ['something broke'] do
64
+ # ActiveSupport::Deprecation.warn('something broke!')
65
+ # end
66
+ # # => nil
67
+ #
68
+ # ActiveSupport::Deprecation.allow ['something broke'], if: Rails.env.production? do
69
+ # ActiveSupport::Deprecation.warn('something broke!')
70
+ # end
71
+ # # => ActiveSupport::DeprecationException for dev/test, nil for production
72
+ def allow(allowed_warnings = :all, if: true, &block)
73
+ conditional = binding.local_variable_get(:if)
74
+ conditional = conditional.call if conditional.respond_to?(:call)
75
+ if conditional
76
+ @explicitly_allowed_warnings.bind(allowed_warnings, &block)
77
+ else
78
+ yield
79
+ end
80
+ end
81
+
82
+ def silenced
83
+ @silenced || @silenced_thread.value
39
84
  end
40
85
 
41
86
  def deprecation_warning(deprecated_method_name, message = nil, caller_backtrace = nil)
@@ -59,7 +104,7 @@ module ActiveSupport
59
104
  case message
60
105
  when Symbol then "#{warning} (use #{message} instead)"
61
106
  when String then "#{warning} (#{message})"
62
- else warning
107
+ else warning
63
108
  end
64
109
  end
65
110
 
@@ -102,7 +147,7 @@ module ActiveSupport
102
147
  end
103
148
  end
104
149
 
105
- RAILS_GEM_ROOT = File.expand_path("../../../../..", __FILE__) + "/"
150
+ RAILS_GEM_ROOT = File.expand_path("../../../..", __dir__) + "/"
106
151
 
107
152
  def ignored_callstack(path)
108
153
  path.start_with?(RAILS_GEM_ROOT) || path.start_with?(RbConfig::CONFIG["rubylibdir"])
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "singleton"
2
4
 
3
5
  module ActiveSupport
@@ -15,30 +17,35 @@ module ActiveSupport
15
17
  require "active_support/deprecation/instance_delegator"
16
18
  require "active_support/deprecation/behaviors"
17
19
  require "active_support/deprecation/reporting"
20
+ require "active_support/deprecation/disallowed"
18
21
  require "active_support/deprecation/constant_accessor"
19
22
  require "active_support/deprecation/method_wrappers"
20
23
  require "active_support/deprecation/proxy_wrappers"
21
24
  require "active_support/core_ext/module/deprecation"
25
+ require "concurrent/atomic/thread_local_var"
22
26
 
23
27
  include Singleton
24
28
  include InstanceDelegator
25
29
  include Behavior
26
30
  include Reporting
31
+ include Disallowed
27
32
  include MethodWrapper
28
33
 
29
34
  # The version number in which the deprecated behavior will be removed, by default.
30
35
  attr_accessor :deprecation_horizon
31
36
 
32
37
  # It accepts two parameters on initialization. The first is a version of library
33
- # and the second is a library name
38
+ # and the second is a library name.
34
39
  #
35
40
  # ActiveSupport::Deprecation.new('2.0', 'MyLibrary')
36
- def initialize(deprecation_horizon = "5.2", gem_name = "Rails")
41
+ def initialize(deprecation_horizon = "6.2", gem_name = "Rails")
37
42
  self.gem_name = gem_name
38
43
  self.deprecation_horizon = deprecation_horizon
39
44
  # By default, warnings are not silenced and debugging is off.
40
45
  self.silenced = false
41
46
  self.debug = false
47
+ @silenced_thread = Concurrent::ThreadLocalVar.new(false)
48
+ @explicitly_allowed_warnings = Concurrent::ThreadLocalVar.new(nil)
42
49
  end
43
50
  end
44
51
  end
@@ -1,3 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "weakref"
4
+
1
5
  module ActiveSupport
2
6
  # This module provides an internal implementation to track descendants
3
7
  # which is faster than iterating through ObjectSpace.
@@ -6,8 +10,10 @@ module ActiveSupport
6
10
 
7
11
  class << self
8
12
  def direct_descendants(klass)
9
- @@direct_descendants[klass] || []
13
+ descendants = @@direct_descendants[klass]
14
+ descendants ? descendants.to_a : []
10
15
  end
16
+ alias_method :subclasses, :direct_descendants
11
17
 
12
18
  def descendants(klass)
13
19
  arr = []
@@ -18,10 +24,10 @@ module ActiveSupport
18
24
  def clear
19
25
  if defined? ActiveSupport::Dependencies
20
26
  @@direct_descendants.each do |klass, descendants|
21
- if ActiveSupport::Dependencies.autoloaded?(klass)
27
+ if Dependencies.autoloaded?(klass)
22
28
  @@direct_descendants.delete(klass)
23
29
  else
24
- descendants.reject! { |v| ActiveSupport::Dependencies.autoloaded?(v) }
30
+ descendants.reject! { |v| Dependencies.autoloaded?(v) }
25
31
  end
26
32
  end
27
33
  else
@@ -32,16 +38,18 @@ module ActiveSupport
32
38
  # This is the only method that is not thread safe, but is only ever called
33
39
  # during the eager loading phase.
34
40
  def store_inherited(klass, descendant)
35
- (@@direct_descendants[klass] ||= []) << descendant
41
+ (@@direct_descendants[klass] ||= DescendantsArray.new) << descendant
36
42
  end
37
43
 
38
44
  private
39
- def accumulate_descendants(klass, acc)
40
- if direct_descendants = @@direct_descendants[klass]
41
- acc.concat(direct_descendants)
42
- direct_descendants.each { |direct_descendant| accumulate_descendants(direct_descendant, acc) }
45
+ def accumulate_descendants(klass, acc)
46
+ if direct_descendants = @@direct_descendants[klass]
47
+ direct_descendants.each do |direct_descendant|
48
+ acc << direct_descendant
49
+ accumulate_descendants(direct_descendant, acc)
50
+ end
51
+ end
43
52
  end
44
- end
45
53
  end
46
54
 
47
55
  def inherited(base)
@@ -52,9 +60,53 @@ module ActiveSupport
52
60
  def direct_descendants
53
61
  DescendantsTracker.direct_descendants(self)
54
62
  end
63
+ alias_method :subclasses, :direct_descendants
55
64
 
56
65
  def descendants
57
66
  DescendantsTracker.descendants(self)
58
67
  end
68
+
69
+ # DescendantsArray is an array that contains weak references to classes.
70
+ class DescendantsArray # :nodoc:
71
+ include Enumerable
72
+
73
+ def initialize
74
+ @refs = []
75
+ end
76
+
77
+ def initialize_copy(orig)
78
+ @refs = @refs.dup
79
+ end
80
+
81
+ def <<(klass)
82
+ @refs << WeakRef.new(klass)
83
+ end
84
+
85
+ def each
86
+ @refs.reject! do |ref|
87
+ yield ref.__getobj__
88
+ false
89
+ rescue WeakRef::RefError
90
+ true
91
+ end
92
+ self
93
+ end
94
+
95
+ def refs_size
96
+ @refs.size
97
+ end
98
+
99
+ def cleanup!
100
+ @refs.delete_if { |ref| !ref.weakref_alive? }
101
+ end
102
+
103
+ def reject!
104
+ @refs.reject! do |ref|
105
+ yield ref.__getobj__
106
+ rescue WeakRef::RefError
107
+ true
108
+ end
109
+ end
110
+ end
59
111
  end
60
112
  end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveSupport
4
+ class Digest #:nodoc:
5
+ class <<self
6
+ def hash_digest_class
7
+ @hash_digest_class ||= ::Digest::MD5
8
+ end
9
+
10
+ def hash_digest_class=(klass)
11
+ raise ArgumentError, "#{klass} is expected to implement hexdigest class method" unless klass.respond_to?(:hexdigest)
12
+ @hash_digest_class = klass
13
+ end
14
+
15
+ def hexdigest(arg)
16
+ hash_digest_class.hexdigest(arg)[0...32]
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,19 +1,20 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "strscan"
2
- require "active_support/core_ext/regexp"
3
4
 
4
5
  module ActiveSupport
5
6
  class Duration
6
7
  # Parses a string formatted according to ISO 8601 Duration into the hash.
7
8
  #
8
- # See {ISO 8601}[http://en.wikipedia.org/wiki/ISO_8601#Durations] for more information.
9
+ # See {ISO 8601}[https://en.wikipedia.org/wiki/ISO_8601#Durations] for more information.
9
10
  #
10
11
  # This parser allows negative parts to be present in pattern.
11
12
  class ISO8601Parser # :nodoc:
12
13
  class ParsingError < ::ArgumentError; end
13
14
 
14
15
  PERIOD_OR_COMMA = /\.|,/
15
- PERIOD = ".".freeze
16
- COMMA = ",".freeze
16
+ PERIOD = "."
17
+ COMMA = ","
17
18
 
18
19
  SIGN_MARKER = /\A\-|\+|/
19
20
  DATE_MARKER = /P/
@@ -79,7 +80,6 @@ module ActiveSupport
79
80
  end
80
81
 
81
82
  private
82
-
83
83
  def finished?
84
84
  scanner.eos?
85
85
  end
@@ -116,7 +116,7 @@ module ActiveSupport
116
116
  raise_parsing_error "(only last part can be fractional)"
117
117
  end
118
118
 
119
- return true
119
+ true
120
120
  end
121
121
  end
122
122
  end
@@ -1,10 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "active_support/core_ext/object/blank"
2
- require "active_support/core_ext/hash/transform_values"
3
4
 
4
5
  module ActiveSupport
5
6
  class Duration
6
7
  # Serializes duration to string according to ISO 8601 Duration format.
7
8
  class ISO8601Serializer # :nodoc:
9
+ DATE_COMPONENTS = %i(years months days)
10
+
8
11
  def initialize(duration, precision: nil)
9
12
  @duration = duration
10
13
  @precision = precision
@@ -12,26 +15,25 @@ module ActiveSupport
12
15
 
13
16
  # Builds and returns output string.
14
17
  def serialize
15
- parts, sign = normalize
16
- return "PT0S".freeze if parts.empty?
18
+ parts = normalize
19
+ return "PT0S" if parts.empty?
17
20
 
18
- output = "P"
21
+ output = +"P"
19
22
  output << "#{parts[:years]}Y" if parts.key?(:years)
20
23
  output << "#{parts[:months]}M" if parts.key?(:months)
21
- output << "#{parts[:weeks]}W" if parts.key?(:weeks)
22
24
  output << "#{parts[:days]}D" if parts.key?(:days)
23
- time = ""
25
+ output << "#{parts[:weeks]}W" if parts.key?(:weeks)
26
+ time = +""
24
27
  time << "#{parts[:hours]}H" if parts.key?(:hours)
25
28
  time << "#{parts[:minutes]}M" if parts.key?(:minutes)
26
29
  if parts.key?(:seconds)
27
30
  time << "#{sprintf(@precision ? "%0.0#{@precision}f" : '%g', parts[:seconds])}S"
28
31
  end
29
32
  output << "T#{time}" unless time.empty?
30
- "#{sign}#{output}"
33
+ output
31
34
  end
32
35
 
33
36
  private
34
-
35
37
  # Return pair of duration's parts and whole duration sign.
36
38
  # Parts are summarized (as they can become repetitive due to addition, etc).
37
39
  # Zero parts are removed as not significant.
@@ -40,13 +42,17 @@ module ActiveSupport
40
42
  parts = @duration.parts.each_with_object(Hash.new(0)) do |(k, v), p|
41
43
  p[k] += v unless v.zero?
42
44
  end
43
- # If all parts are negative - let's make a negative duration
44
- sign = ""
45
- if parts.values.all? { |v| v < 0 }
46
- sign = "-"
47
- parts.transform_values!(&:-@)
45
+
46
+ # Convert weeks to days and remove weeks if mixed with date parts
47
+ if week_mixed_with_date?(parts)
48
+ parts[:days] += parts.delete(:weeks) * SECONDS_PER_WEEK / SECONDS_PER_DAY
48
49
  end
49
- [parts, sign]
50
+
51
+ parts
52
+ end
53
+
54
+ def week_mixed_with_date?(parts)
55
+ parts.key?(:weeks) && (parts.keys & DATE_COMPONENTS).any?
50
56
  end
51
57
  end
52
58
  end