activesupport 7.0.8 → 7.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +134 -446
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +4 -4
  5. data/lib/active_support/actionable_error.rb +3 -1
  6. data/lib/active_support/array_inquirer.rb +3 -1
  7. data/lib/active_support/backtrace_cleaner.rb +39 -7
  8. data/lib/active_support/benchmarkable.rb +1 -0
  9. data/lib/active_support/broadcast_logger.rb +251 -0
  10. data/lib/active_support/builder.rb +1 -1
  11. data/lib/active_support/cache/coder.rb +153 -0
  12. data/lib/active_support/cache/entry.rb +134 -0
  13. data/lib/active_support/cache/file_store.rb +49 -17
  14. data/lib/active_support/cache/mem_cache_store.rb +94 -128
  15. data/lib/active_support/cache/memory_store.rb +80 -25
  16. data/lib/active_support/cache/null_store.rb +6 -0
  17. data/lib/active_support/cache/redis_cache_store.rb +165 -152
  18. data/lib/active_support/cache/serializer_with_fallback.rb +152 -0
  19. data/lib/active_support/cache/strategy/local_cache.rb +29 -14
  20. data/lib/active_support/cache.rb +363 -291
  21. data/lib/active_support/callbacks.rb +118 -134
  22. data/lib/active_support/code_generator.rb +15 -10
  23. data/lib/active_support/concern.rb +4 -2
  24. data/lib/active_support/concurrency/load_interlock_aware_monitor.rb +42 -3
  25. data/lib/active_support/concurrency/null_lock.rb +13 -0
  26. data/lib/active_support/configurable.rb +10 -0
  27. data/lib/active_support/core_ext/array/conversions.rb +1 -2
  28. data/lib/active_support/core_ext/array.rb +0 -1
  29. data/lib/active_support/core_ext/class/subclasses.rb +17 -34
  30. data/lib/active_support/core_ext/date/blank.rb +4 -0
  31. data/lib/active_support/core_ext/date/conversions.rb +1 -2
  32. data/lib/active_support/core_ext/date.rb +0 -1
  33. data/lib/active_support/core_ext/date_and_time/calculations.rb +10 -0
  34. data/lib/active_support/core_ext/date_and_time/compatibility.rb +28 -1
  35. data/lib/active_support/core_ext/date_time/blank.rb +4 -0
  36. data/lib/active_support/core_ext/date_time/conversions.rb +2 -2
  37. data/lib/active_support/core_ext/date_time.rb +0 -1
  38. data/lib/active_support/core_ext/digest/uuid.rb +7 -10
  39. data/lib/active_support/core_ext/enumerable.rb +3 -75
  40. data/lib/active_support/core_ext/erb/util.rb +201 -0
  41. data/lib/active_support/core_ext/hash/conversions.rb +1 -1
  42. data/lib/active_support/core_ext/hash/deep_merge.rb +22 -14
  43. data/lib/active_support/core_ext/hash/keys.rb +4 -4
  44. data/lib/active_support/core_ext/module/attr_internal.rb +17 -6
  45. data/lib/active_support/core_ext/module/attribute_accessors.rb +6 -0
  46. data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +34 -16
  47. data/lib/active_support/core_ext/module/concerning.rb +6 -6
  48. data/lib/active_support/core_ext/module/delegation.rb +20 -119
  49. data/lib/active_support/core_ext/module/deprecation.rb +12 -12
  50. data/lib/active_support/core_ext/module/introspection.rb +0 -1
  51. data/lib/active_support/core_ext/numeric/bytes.rb +9 -0
  52. data/lib/active_support/core_ext/numeric/conversions.rb +5 -3
  53. data/lib/active_support/core_ext/numeric.rb +0 -1
  54. data/lib/active_support/core_ext/object/blank.rb +45 -1
  55. data/lib/active_support/core_ext/object/deep_dup.rb +16 -0
  56. data/lib/active_support/core_ext/object/duplicable.rb +24 -15
  57. data/lib/active_support/core_ext/object/inclusion.rb +13 -5
  58. data/lib/active_support/core_ext/object/instance_variables.rb +4 -2
  59. data/lib/active_support/core_ext/object/json.rb +12 -4
  60. data/lib/active_support/core_ext/object/with.rb +46 -0
  61. data/lib/active_support/core_ext/object/with_options.rb +4 -4
  62. data/lib/active_support/core_ext/object.rb +1 -0
  63. data/lib/active_support/core_ext/pathname/blank.rb +20 -0
  64. data/lib/active_support/core_ext/pathname/existence.rb +2 -0
  65. data/lib/active_support/core_ext/pathname.rb +1 -0
  66. data/lib/active_support/core_ext/range/conversions.rb +28 -7
  67. data/lib/active_support/core_ext/range/overlap.rb +40 -0
  68. data/lib/active_support/core_ext/range.rb +1 -2
  69. data/lib/active_support/core_ext/securerandom.rb +1 -5
  70. data/lib/active_support/core_ext/string/conversions.rb +1 -1
  71. data/lib/active_support/core_ext/string/filters.rb +21 -15
  72. data/lib/active_support/core_ext/string/indent.rb +1 -1
  73. data/lib/active_support/core_ext/string/inflections.rb +16 -5
  74. data/lib/active_support/core_ext/string/output_safety.rb +34 -177
  75. data/lib/active_support/core_ext/thread/backtrace/location.rb +12 -0
  76. data/lib/active_support/core_ext/time/calculations.rb +36 -30
  77. data/lib/active_support/core_ext/time/compatibility.rb +16 -0
  78. data/lib/active_support/core_ext/time/conversions.rb +1 -3
  79. data/lib/active_support/core_ext/time/zones.rb +4 -4
  80. data/lib/active_support/core_ext/time.rb +0 -1
  81. data/lib/active_support/core_ext.rb +0 -1
  82. data/lib/active_support/current_attributes.rb +48 -46
  83. data/lib/active_support/deep_mergeable.rb +53 -0
  84. data/lib/active_support/delegation.rb +202 -0
  85. data/lib/active_support/dependencies/autoload.rb +9 -16
  86. data/lib/active_support/deprecation/behaviors.rb +65 -42
  87. data/lib/active_support/deprecation/constant_accessor.rb +47 -25
  88. data/lib/active_support/deprecation/deprecators.rb +104 -0
  89. data/lib/active_support/deprecation/disallowed.rb +3 -5
  90. data/lib/active_support/deprecation/method_wrappers.rb +6 -23
  91. data/lib/active_support/deprecation/proxy_wrappers.rb +34 -22
  92. data/lib/active_support/deprecation/reporting.rb +48 -26
  93. data/lib/active_support/deprecation.rb +39 -9
  94. data/lib/active_support/deprecator.rb +7 -0
  95. data/lib/active_support/descendants_tracker.rb +66 -172
  96. data/lib/active_support/duration/iso8601_parser.rb +2 -2
  97. data/lib/active_support/duration/iso8601_serializer.rb +1 -4
  98. data/lib/active_support/duration.rb +13 -7
  99. data/lib/active_support/encrypted_configuration.rb +30 -9
  100. data/lib/active_support/encrypted_file.rb +8 -3
  101. data/lib/active_support/environment_inquirer.rb +22 -2
  102. data/lib/active_support/error_reporter/test_helper.rb +15 -0
  103. data/lib/active_support/error_reporter.rb +160 -36
  104. data/lib/active_support/evented_file_update_checker.rb +0 -1
  105. data/lib/active_support/execution_wrapper.rb +4 -5
  106. data/lib/active_support/file_update_checker.rb +5 -3
  107. data/lib/active_support/fork_tracker.rb +4 -32
  108. data/lib/active_support/gem_version.rb +3 -3
  109. data/lib/active_support/gzip.rb +2 -0
  110. data/lib/active_support/hash_with_indifferent_access.rb +41 -25
  111. data/lib/active_support/html_safe_translation.rb +19 -6
  112. data/lib/active_support/i18n.rb +1 -1
  113. data/lib/active_support/i18n_railtie.rb +20 -13
  114. data/lib/active_support/inflector/inflections.rb +2 -0
  115. data/lib/active_support/inflector/methods.rb +23 -11
  116. data/lib/active_support/inflector/transliterate.rb +3 -1
  117. data/lib/active_support/isolated_execution_state.rb +26 -22
  118. data/lib/active_support/json/decoding.rb +2 -1
  119. data/lib/active_support/json/encoding.rb +25 -43
  120. data/lib/active_support/key_generator.rb +9 -1
  121. data/lib/active_support/lazy_load_hooks.rb +6 -4
  122. data/lib/active_support/locale/en.yml +2 -0
  123. data/lib/active_support/log_subscriber.rb +74 -34
  124. data/lib/active_support/logger.rb +22 -60
  125. data/lib/active_support/logger_thread_safe_level.rb +10 -32
  126. data/lib/active_support/message_encryptor.rb +197 -53
  127. data/lib/active_support/message_encryptors.rb +141 -0
  128. data/lib/active_support/message_pack/cache_serializer.rb +23 -0
  129. data/lib/active_support/message_pack/extensions.rb +305 -0
  130. data/lib/active_support/message_pack/serializer.rb +63 -0
  131. data/lib/active_support/message_pack.rb +50 -0
  132. data/lib/active_support/message_verifier.rb +220 -89
  133. data/lib/active_support/message_verifiers.rb +135 -0
  134. data/lib/active_support/messages/codec.rb +65 -0
  135. data/lib/active_support/messages/metadata.rb +111 -45
  136. data/lib/active_support/messages/rotation_coordinator.rb +93 -0
  137. data/lib/active_support/messages/rotator.rb +34 -32
  138. data/lib/active_support/messages/serializer_with_fallback.rb +158 -0
  139. data/lib/active_support/multibyte/chars.rb +4 -2
  140. data/lib/active_support/multibyte/unicode.rb +9 -37
  141. data/lib/active_support/notifications/fanout.rb +248 -87
  142. data/lib/active_support/notifications/instrumenter.rb +93 -25
  143. data/lib/active_support/notifications.rb +29 -28
  144. data/lib/active_support/number_helper/number_converter.rb +16 -7
  145. data/lib/active_support/number_helper/number_to_currency_converter.rb +6 -6
  146. data/lib/active_support/number_helper/number_to_human_size_converter.rb +3 -3
  147. data/lib/active_support/number_helper/number_to_phone_converter.rb +1 -0
  148. data/lib/active_support/number_helper.rb +379 -318
  149. data/lib/active_support/option_merger.rb +2 -2
  150. data/lib/active_support/ordered_hash.rb +3 -3
  151. data/lib/active_support/ordered_options.rb +67 -15
  152. data/lib/active_support/parameter_filter.rb +84 -69
  153. data/lib/active_support/proxy_object.rb +8 -3
  154. data/lib/active_support/railtie.rb +25 -20
  155. data/lib/active_support/reloader.rb +12 -4
  156. data/lib/active_support/rescuable.rb +2 -0
  157. data/lib/active_support/secure_compare_rotator.rb +16 -9
  158. data/lib/active_support/string_inquirer.rb +4 -2
  159. data/lib/active_support/subscriber.rb +9 -27
  160. data/lib/active_support/syntax_error_proxy.rb +60 -0
  161. data/lib/active_support/tagged_logging.rb +64 -25
  162. data/lib/active_support/test_case.rb +156 -7
  163. data/lib/active_support/testing/assertions.rb +28 -12
  164. data/lib/active_support/testing/autorun.rb +0 -2
  165. data/lib/active_support/testing/constant_stubbing.rb +54 -0
  166. data/lib/active_support/testing/deprecation.rb +20 -27
  167. data/lib/active_support/testing/error_reporter_assertions.rb +107 -0
  168. data/lib/active_support/testing/isolation.rb +19 -9
  169. data/lib/active_support/testing/method_call_assertions.rb +7 -8
  170. data/lib/active_support/testing/parallelize_executor.rb +8 -3
  171. data/lib/active_support/testing/setup_and_teardown.rb +2 -0
  172. data/lib/active_support/testing/stream.rb +1 -1
  173. data/lib/active_support/testing/strict_warnings.rb +40 -0
  174. data/lib/active_support/testing/tests_without_assertions.rb +19 -0
  175. data/lib/active_support/testing/time_helpers.rb +38 -16
  176. data/lib/active_support/time_with_zone.rb +11 -17
  177. data/lib/active_support/values/time_zone.rb +19 -8
  178. data/lib/active_support/version.rb +1 -1
  179. data/lib/active_support/xml_mini/jdom.rb +3 -10
  180. data/lib/active_support/xml_mini/nokogiri.rb +1 -1
  181. data/lib/active_support/xml_mini/nokogirisax.rb +1 -1
  182. data/lib/active_support/xml_mini/rexml.rb +1 -1
  183. data/lib/active_support/xml_mini.rb +12 -3
  184. data/lib/active_support.rb +15 -3
  185. metadata +128 -21
  186. data/lib/active_support/core_ext/array/deprecated_conversions.rb +0 -25
  187. data/lib/active_support/core_ext/date/deprecated_conversions.rb +0 -40
  188. data/lib/active_support/core_ext/date_time/deprecated_conversions.rb +0 -36
  189. data/lib/active_support/core_ext/numeric/deprecated_conversions.rb +0 -60
  190. data/lib/active_support/core_ext/range/deprecated_conversions.rb +0 -36
  191. data/lib/active_support/core_ext/range/include_time_with_zone.rb +0 -5
  192. data/lib/active_support/core_ext/range/overlaps.rb +0 -10
  193. data/lib/active_support/core_ext/time/deprecated_conversions.rb +0 -73
  194. data/lib/active_support/core_ext/uri.rb +0 -5
  195. data/lib/active_support/deprecation/instance_delegator.rb +0 -38
  196. data/lib/active_support/per_thread_registry.rb +0 -65
  197. data/lib/active_support/ruby_features.rb +0 -7
@@ -1,60 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ActiveSupport
4
- module DeprecatedNumericWithFormat # :nodoc:
5
- def to_s(format = nil, options = nil)
6
- return super() if format.nil?
7
-
8
- case format
9
- when Integer, String
10
- super(format)
11
- when :phone
12
- ActiveSupport::Deprecation.warn(
13
- "#{self.class}#to_s(#{format.inspect}) is deprecated. Please use #{self.class}#to_fs(#{format.inspect}) instead."
14
- )
15
- ActiveSupport::NumberHelper.number_to_phone(self, options || {})
16
- when :currency
17
- ActiveSupport::Deprecation.warn(
18
- "#{self.class}#to_s(#{format.inspect}) is deprecated. Please use #{self.class}#to_fs(#{format.inspect}) instead."
19
- )
20
- ActiveSupport::NumberHelper.number_to_currency(self, options || {})
21
- when :percentage
22
- ActiveSupport::Deprecation.warn(
23
- "#{self.class}#to_s(#{format.inspect}) is deprecated. Please use #{self.class}#to_fs(#{format.inspect}) instead."
24
- )
25
- ActiveSupport::NumberHelper.number_to_percentage(self, options || {})
26
- when :delimited
27
- ActiveSupport::Deprecation.warn(
28
- "#{self.class}#to_s(#{format.inspect}) is deprecated. Please use #{self.class}#to_fs(#{format.inspect}) instead."
29
- )
30
- ActiveSupport::NumberHelper.number_to_delimited(self, options || {})
31
- when :rounded
32
- ActiveSupport::Deprecation.warn(
33
- "#{self.class}#to_s(#{format.inspect}) is deprecated. Please use #{self.class}#to_fs(#{format.inspect}) instead."
34
- )
35
- ActiveSupport::NumberHelper.number_to_rounded(self, options || {})
36
- when :human
37
- ActiveSupport::Deprecation.warn(
38
- "#{self.class}#to_s(#{format.inspect}) is deprecated. Please use #{self.class}#to_fs(#{format.inspect}) instead."
39
- )
40
- ActiveSupport::NumberHelper.number_to_human(self, options || {})
41
- when :human_size
42
- ActiveSupport::Deprecation.warn(
43
- "#{self.class}#to_s(#{format.inspect}) is deprecated. Please use #{self.class}#to_fs(#{format.inspect}) instead."
44
- )
45
- ActiveSupport::NumberHelper.number_to_human_size(self, options || {})
46
- when Symbol
47
- ActiveSupport::Deprecation.warn(
48
- "#{self.class}#to_s(#{format.inspect}) is deprecated. Please use #{self.class}#to_fs(#{format.inspect}) instead."
49
- )
50
- super()
51
- else
52
- super(format)
53
- end
54
- end
55
- end
56
- end
57
-
58
- Integer.prepend ActiveSupport::DeprecatedNumericWithFormat
59
- Float.prepend ActiveSupport::DeprecatedNumericWithFormat
60
- BigDecimal.prepend ActiveSupport::DeprecatedNumericWithFormat
@@ -1,36 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ActiveSupport
4
- module DeprecatedRangeWithFormat # :nodoc:
5
- NOT_SET = Object.new # :nodoc:
6
- def to_s(format = NOT_SET)
7
- if formatter = RangeWithFormat::RANGE_FORMATS[format]
8
- ActiveSupport::Deprecation.warn(
9
- "Range#to_s(#{format.inspect}) is deprecated. Please use Range#to_fs(#{format.inspect}) instead."
10
- )
11
- formatter.call(first, last)
12
- elsif format == NOT_SET
13
- if formatter = RangeWithFormat::RANGE_FORMATS[:default]
14
- ActiveSupport::Deprecation.warn(<<-MSG.squish)
15
- Using a :default format for Range#to_s is deprecated. Please use Range#to_fs instead. If you fixed all
16
- places inside your application that you see this deprecation, you can set
17
- `ENV['RAILS_DISABLE_DEPRECATED_TO_S_CONVERSION']` to `"true"` in the `config/application.rb` file before
18
- the `Bundler.require` call to fix all the callers outside of your application.
19
- MSG
20
- formatter.call(first, last)
21
- else
22
- super()
23
- end
24
- else
25
- ActiveSupport::Deprecation.warn(
26
- "Range#to_s(#{format.inspect}) is deprecated. Please use Range#to_fs(#{format.inspect}) instead."
27
- )
28
- super()
29
- end
30
- end
31
- alias_method :to_default_s, :to_s
32
- deprecate :to_default_s
33
- end
34
- end
35
-
36
- Range.prepend(ActiveSupport::DeprecatedRangeWithFormat)
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- ActiveSupport::Deprecation.warn(<<-MSG.squish)
4
- `active_support/core_ext/range/include_time_with_zone` is deprecated and will be removed in Rails 7.1.
5
- MSG
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Range
4
- # Compare two ranges and see if they overlap each other
5
- # (1..5).overlaps?(4..6) # => true
6
- # (1..5).overlaps?(7..9) # => false
7
- def overlaps?(other)
8
- other.begin == self.begin || cover?(other.begin) || other.cover?(self.begin)
9
- end
10
- end
@@ -1,73 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "time"
4
-
5
- class Time
6
- NOT_SET = Object.new # :nodoc:
7
- def to_s(format = NOT_SET) # :nodoc:
8
- if formatter = DATE_FORMATS[format]
9
- ActiveSupport::Deprecation.warn(
10
- "Time#to_s(#{format.inspect}) is deprecated. Please use Time#to_fs(#{format.inspect}) instead."
11
- )
12
- formatter.respond_to?(:call) ? formatter.call(self).to_s : strftime(formatter)
13
- elsif format == NOT_SET
14
- if formatter = ::Time::DATE_FORMATS[:default]
15
- ActiveSupport::Deprecation.warn(<<-MSG.squish)
16
- Using a :default format for Time#to_s is deprecated. Please use Time#to_fs instead. If you fixed all places
17
- inside your application that you see this deprecation, you can set
18
- `ENV['RAILS_DISABLE_DEPRECATED_TO_S_CONVERSION']` to `"true"` in the `config/application.rb` file before
19
- the `Bundler.require` call to fix all the callers outside of your application.
20
- MSG
21
- if formatter.respond_to?(:call)
22
- formatter.call(self).to_s
23
- else
24
- strftime(formatter)
25
- end
26
- else
27
- to_default_s
28
- end
29
- else
30
- ActiveSupport::Deprecation.warn(
31
- "Time#to_s(#{format.inspect}) is deprecated. Please use Time#to_fs(#{format.inspect}) instead."
32
- )
33
- to_default_s
34
- end
35
- end
36
- end
37
-
38
- module ActiveSupport
39
- class TimeWithZone
40
- NOT_SET = Object.new # :nodoc:
41
-
42
- def to_s(format = NOT_SET) # :nodoc:
43
- if format == :db
44
- ActiveSupport::Deprecation.warn(
45
- "TimeWithZone#to_s(:db) is deprecated. Please use TimeWithZone#to_fs(:db) instead."
46
- )
47
- utc.to_fs(format)
48
- elsif formatter = ::Time::DATE_FORMATS[format]
49
- ActiveSupport::Deprecation.warn(
50
- "TimeWithZone#to_s(#{format.inspect}) is deprecated. Please use TimeWithZone#to_fs(#{format.inspect}) instead."
51
- )
52
- formatter.respond_to?(:call) ? formatter.call(self).to_s : strftime(formatter)
53
- elsif format == NOT_SET
54
- if formatter = ::Time::DATE_FORMATS[:default]
55
- ActiveSupport::Deprecation.warn(<<-MSG.squish)
56
- Using a :default format for TimeWithZone#to_s is deprecated. Please use TimeWithZone#to_fs instead.
57
- If you fixed all places inside your application that you see this deprecation, you can set
58
- `ENV['RAILS_DISABLE_DEPRECATED_TO_S_CONVERSION']` to `"true"` in the `config/application.rb` file before
59
- the `Bundler.require` call to fix all the callers outside of your application.
60
- MSG
61
- formatter.respond_to?(:call) ? formatter.call(self).to_s : strftime(formatter)
62
- else
63
- "#{time.strftime("%Y-%m-%d %H:%M:%S")} #{formatted_offset(false, 'UTC')}" # mimicking Ruby Time#to_s format
64
- end
65
- else
66
- ActiveSupport::Deprecation.warn(
67
- "TimeWithZone#to_s(#{format.inspect}) is deprecated. Please use TimeWithZone#to_fs(#{format.inspect}) instead."
68
- )
69
- "#{time.strftime("%Y-%m-%d %H:%M:%S")} #{formatted_offset(false, 'UTC')}" # mimicking Ruby Time#to_s format
70
- end
71
- end
72
- end
73
- end
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- ActiveSupport::Deprecation.warn(<<-MSG.squish)
4
- `active_support/core_ext/uri` is deprecated and will be removed in Rails 7.1.
5
- MSG
@@ -1,38 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "active_support/core_ext/module/delegation"
4
-
5
- module ActiveSupport
6
- class Deprecation
7
- module InstanceDelegator # :nodoc:
8
- def self.included(base)
9
- base.extend(ClassMethods)
10
- base.singleton_class.prepend(OverrideDelegators)
11
- base.public_class_method :new
12
- end
13
-
14
- module ClassMethods # :nodoc:
15
- def include(included_module)
16
- included_module.instance_methods.each { |m| method_added(m) }
17
- super
18
- end
19
-
20
- def method_added(method_name)
21
- singleton_class.delegate(method_name, to: :instance)
22
- end
23
- end
24
-
25
- module OverrideDelegators # :nodoc:
26
- def warn(message = nil, callstack = nil)
27
- callstack ||= caller_locations(2)
28
- super
29
- end
30
-
31
- def deprecation_warning(deprecated_method_name, message = nil, caller_backtrace = nil)
32
- caller_backtrace ||= caller_locations(2)
33
- super
34
- end
35
- end
36
- end
37
- end
38
- end
@@ -1,65 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "active_support/core_ext/module/delegation"
4
-
5
- module ActiveSupport
6
- # NOTE: This approach has been deprecated for end-user code in favor of {thread_mattr_accessor}[rdoc-ref:Module#thread_mattr_accessor] and friends.
7
- # Please use that approach instead.
8
- #
9
- # This module is used to encapsulate access to thread local variables.
10
- #
11
- # Instead of polluting the thread locals namespace:
12
- #
13
- # Thread.current[:connection_handler]
14
- #
15
- # you define a class that extends this module:
16
- #
17
- # module ActiveRecord
18
- # class RuntimeRegistry
19
- # extend ActiveSupport::PerThreadRegistry
20
- #
21
- # attr_accessor :connection_handler
22
- # end
23
- # end
24
- #
25
- # and invoke the declared instance accessors as class methods. So
26
- #
27
- # ActiveRecord::RuntimeRegistry.connection_handler = connection_handler
28
- #
29
- # sets a connection handler local to the current thread, and
30
- #
31
- # ActiveRecord::RuntimeRegistry.connection_handler
32
- #
33
- # returns a connection handler local to the current thread.
34
- #
35
- # This feature is accomplished by instantiating the class and storing the
36
- # instance as a thread local keyed by the class name. In the example above
37
- # a key "ActiveRecord::RuntimeRegistry" is stored in <tt>Thread.current</tt>.
38
- # The class methods proxy to said thread local instance.
39
- #
40
- # If the class has an initializer, it must accept no arguments.
41
- module PerThreadRegistry
42
- def self.extended(object)
43
- ActiveSupport::Deprecation.warn(<<~MSG)
44
- ActiveSupport::PerThreadRegistry is deprecated and will be removed in Rails 7.1.
45
- Use `Module#thread_mattr_accessor` instead.
46
- MSG
47
- object.instance_variable_set :@per_thread_registry_key, object.name.freeze
48
- end
49
-
50
- def instance
51
- Thread.current[@per_thread_registry_key] ||= new
52
- end
53
-
54
- private
55
- def method_missing(name, *args, &block)
56
- # Caches the method definition as a singleton method of the receiver.
57
- #
58
- # By letting #delegate handle it, we avoid an enclosure that'll capture args.
59
- singleton_class.delegate name, to: :instance
60
-
61
- send(name, *args, &block)
62
- end
63
- ruby2_keywords(:method_missing)
64
- end
65
- end
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ActiveSupport
4
- module RubyFeatures # :nodoc:
5
- CLASS_SUBCLASSES = Class.method_defined?(:subclasses) # RUBY_VERSION >= "3.1"
6
- end
7
- end