activesupport 6.1.1 → 7.0.2.3

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 (168) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +231 -383
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +1 -1
  5. data/lib/active_support/actionable_error.rb +1 -1
  6. data/lib/active_support/array_inquirer.rb +0 -2
  7. data/lib/active_support/benchmarkable.rb +2 -2
  8. data/lib/active_support/cache/file_store.rb +16 -10
  9. data/lib/active_support/cache/mem_cache_store.rb +133 -34
  10. data/lib/active_support/cache/memory_store.rb +23 -15
  11. data/lib/active_support/cache/null_store.rb +10 -2
  12. data/lib/active_support/cache/redis_cache_store.rb +42 -67
  13. data/lib/active_support/cache/strategy/local_cache.rb +35 -61
  14. data/lib/active_support/cache.rb +196 -46
  15. data/lib/active_support/callbacks.rb +180 -81
  16. data/lib/active_support/code_generator.rb +65 -0
  17. data/lib/active_support/concern.rb +5 -5
  18. data/lib/active_support/concurrency/load_interlock_aware_monitor.rb +2 -4
  19. data/lib/active_support/concurrency/share_lock.rb +2 -2
  20. data/lib/active_support/configurable.rb +6 -3
  21. data/lib/active_support/configuration_file.rb +7 -2
  22. data/lib/active_support/core_ext/array/access.rb +1 -5
  23. data/lib/active_support/core_ext/array/conversions.rb +13 -11
  24. data/lib/active_support/core_ext/array/deprecated_conversions.rb +25 -0
  25. data/lib/active_support/core_ext/array/grouping.rb +6 -6
  26. data/lib/active_support/core_ext/array.rb +1 -0
  27. data/lib/active_support/core_ext/big_decimal/conversions.rb +1 -1
  28. data/lib/active_support/core_ext/class/subclasses.rb +25 -17
  29. data/lib/active_support/core_ext/date/blank.rb +1 -1
  30. data/lib/active_support/core_ext/date/calculations.rb +4 -4
  31. data/lib/active_support/core_ext/date/conversions.rb +11 -11
  32. data/lib/active_support/core_ext/date/deprecated_conversions.rb +26 -0
  33. data/lib/active_support/core_ext/date.rb +1 -0
  34. data/lib/active_support/core_ext/date_and_time/compatibility.rb +1 -1
  35. data/lib/active_support/core_ext/date_time/blank.rb +1 -1
  36. data/lib/active_support/core_ext/date_time/conversions.rb +13 -13
  37. data/lib/active_support/core_ext/date_time/deprecated_conversions.rb +22 -0
  38. data/lib/active_support/core_ext/date_time.rb +1 -0
  39. data/lib/active_support/core_ext/digest/uuid.rb +39 -13
  40. data/lib/active_support/core_ext/enumerable.rb +78 -26
  41. data/lib/active_support/core_ext/file/atomic.rb +3 -1
  42. data/lib/active_support/core_ext/hash/keys.rb +1 -1
  43. data/lib/active_support/core_ext/kernel/reporting.rb +4 -4
  44. data/lib/active_support/core_ext/module/attribute_accessors.rb +2 -0
  45. data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +19 -10
  46. data/lib/active_support/core_ext/module/delegation.rb +2 -8
  47. data/lib/active_support/core_ext/name_error.rb +2 -8
  48. data/lib/active_support/core_ext/numeric/conversions.rb +79 -76
  49. data/lib/active_support/core_ext/numeric/deprecated_conversions.rb +60 -0
  50. data/lib/active_support/core_ext/numeric.rb +1 -0
  51. data/lib/active_support/core_ext/object/acts_like.rb +29 -5
  52. data/lib/active_support/core_ext/object/blank.rb +2 -2
  53. data/lib/active_support/core_ext/object/deep_dup.rb +1 -1
  54. data/lib/active_support/core_ext/object/duplicable.rb +11 -0
  55. data/lib/active_support/core_ext/object/json.rb +29 -24
  56. data/lib/active_support/core_ext/object/to_query.rb +2 -2
  57. data/lib/active_support/core_ext/object/try.rb +20 -20
  58. data/lib/active_support/core_ext/object/with_options.rb +20 -1
  59. data/lib/active_support/core_ext/pathname/existence.rb +21 -0
  60. data/lib/active_support/core_ext/pathname.rb +3 -0
  61. data/lib/active_support/core_ext/range/compare_range.rb +0 -25
  62. data/lib/active_support/core_ext/range/conversions.rb +8 -8
  63. data/lib/active_support/core_ext/range/deprecated_conversions.rb +26 -0
  64. data/lib/active_support/core_ext/range/each.rb +1 -1
  65. data/lib/active_support/core_ext/range/include_time_with_zone.rb +4 -25
  66. data/lib/active_support/core_ext/range.rb +1 -1
  67. data/lib/active_support/core_ext/string/filters.rb +1 -1
  68. data/lib/active_support/core_ext/string/inflections.rb +1 -1
  69. data/lib/active_support/core_ext/string/output_safety.rb +60 -36
  70. data/lib/active_support/core_ext/symbol/starts_ends_with.rb +0 -8
  71. data/lib/active_support/core_ext/time/calculations.rb +7 -5
  72. data/lib/active_support/core_ext/time/conversions.rb +13 -12
  73. data/lib/active_support/core_ext/time/deprecated_conversions.rb +22 -0
  74. data/lib/active_support/core_ext/time/zones.rb +4 -19
  75. data/lib/active_support/core_ext/time.rb +1 -0
  76. data/lib/active_support/core_ext/uri.rb +3 -27
  77. data/lib/active_support/core_ext.rb +1 -0
  78. data/lib/active_support/current_attributes.rb +32 -14
  79. data/lib/active_support/dependencies/interlock.rb +10 -18
  80. data/lib/active_support/dependencies/require_dependency.rb +28 -0
  81. data/lib/active_support/dependencies.rb +58 -788
  82. data/lib/active_support/deprecation/behaviors.rb +4 -1
  83. data/lib/active_support/deprecation/method_wrappers.rb +3 -3
  84. data/lib/active_support/deprecation/proxy_wrappers.rb +1 -1
  85. data/lib/active_support/deprecation.rb +1 -1
  86. data/lib/active_support/descendants_tracker.rb +174 -68
  87. data/lib/active_support/digest.rb +5 -3
  88. data/lib/active_support/duration/iso8601_parser.rb +3 -3
  89. data/lib/active_support/duration/iso8601_serializer.rb +9 -1
  90. data/lib/active_support/duration.rb +81 -51
  91. data/lib/active_support/encrypted_configuration.rb +13 -2
  92. data/lib/active_support/encrypted_file.rb +1 -1
  93. data/lib/active_support/environment_inquirer.rb +1 -1
  94. data/lib/active_support/error_reporter.rb +117 -0
  95. data/lib/active_support/evented_file_update_checker.rb +1 -1
  96. data/lib/active_support/execution_context/test_helper.rb +13 -0
  97. data/lib/active_support/execution_context.rb +53 -0
  98. data/lib/active_support/execution_wrapper.rb +43 -21
  99. data/lib/active_support/executor/test_helper.rb +7 -0
  100. data/lib/active_support/fork_tracker.rb +19 -10
  101. data/lib/active_support/gem_version.rb +4 -4
  102. data/lib/active_support/hash_with_indifferent_access.rb +9 -2
  103. data/lib/active_support/html_safe_translation.rb +43 -0
  104. data/lib/active_support/i18n.rb +1 -0
  105. data/lib/active_support/i18n_railtie.rb +1 -1
  106. data/lib/active_support/inflector/inflections.rb +23 -7
  107. data/lib/active_support/inflector/methods.rb +24 -48
  108. data/lib/active_support/isolated_execution_state.rb +64 -0
  109. data/lib/active_support/json/encoding.rb +3 -3
  110. data/lib/active_support/key_generator.rb +18 -1
  111. data/lib/active_support/locale/en.yml +2 -2
  112. data/lib/active_support/log_subscriber.rb +13 -3
  113. data/lib/active_support/logger_thread_safe_level.rb +4 -13
  114. data/lib/active_support/message_encryptor.rb +8 -3
  115. data/lib/active_support/message_verifier.rb +46 -14
  116. data/lib/active_support/messages/metadata.rb +2 -2
  117. data/lib/active_support/multibyte/chars.rb +10 -11
  118. data/lib/active_support/multibyte/unicode.rb +0 -12
  119. data/lib/active_support/multibyte.rb +1 -1
  120. data/lib/active_support/notifications/fanout.rb +91 -65
  121. data/lib/active_support/notifications/instrumenter.rb +32 -15
  122. data/lib/active_support/notifications.rb +16 -22
  123. data/lib/active_support/number_helper/number_converter.rb +1 -3
  124. data/lib/active_support/number_helper/number_to_currency_converter.rb +11 -6
  125. data/lib/active_support/number_helper/number_to_delimited_converter.rb +1 -1
  126. data/lib/active_support/number_helper/number_to_human_size_converter.rb +1 -1
  127. data/lib/active_support/number_helper/number_to_phone_converter.rb +1 -1
  128. data/lib/active_support/number_helper/number_to_rounded_converter.rb +10 -6
  129. data/lib/active_support/number_helper/rounding_helper.rb +2 -6
  130. data/lib/active_support/number_helper.rb +0 -2
  131. data/lib/active_support/option_merger.rb +8 -16
  132. data/lib/active_support/ordered_hash.rb +1 -1
  133. data/lib/active_support/parameter_filter.rb +6 -1
  134. data/lib/active_support/per_thread_registry.rb +5 -0
  135. data/lib/active_support/railtie.rb +69 -19
  136. data/lib/active_support/reloader.rb +1 -1
  137. data/lib/active_support/rescuable.rb +2 -2
  138. data/lib/active_support/ruby_features.rb +7 -0
  139. data/lib/active_support/secure_compare_rotator.rb +1 -1
  140. data/lib/active_support/security_utils.rb +1 -1
  141. data/lib/active_support/string_inquirer.rb +0 -2
  142. data/lib/active_support/subscriber.rb +7 -18
  143. data/lib/active_support/tagged_logging.rb +2 -2
  144. data/lib/active_support/test_case.rb +9 -21
  145. data/lib/active_support/testing/assertions.rb +35 -5
  146. data/lib/active_support/testing/deprecation.rb +52 -1
  147. data/lib/active_support/testing/isolation.rb +2 -2
  148. data/lib/active_support/testing/method_call_assertions.rb +5 -5
  149. data/lib/active_support/testing/parallelization/server.rb +4 -0
  150. data/lib/active_support/testing/parallelization/worker.rb +3 -0
  151. data/lib/active_support/testing/parallelization.rb +4 -0
  152. data/lib/active_support/testing/parallelize_executor.rb +76 -0
  153. data/lib/active_support/testing/stream.rb +3 -5
  154. data/lib/active_support/testing/tagged_logging.rb +1 -1
  155. data/lib/active_support/testing/time_helpers.rb +13 -2
  156. data/lib/active_support/time_with_zone.rb +55 -14
  157. data/lib/active_support/values/time_zone.rb +31 -10
  158. data/lib/active_support/xml_mini/jdom.rb +1 -1
  159. data/lib/active_support/xml_mini/libxml.rb +5 -5
  160. data/lib/active_support/xml_mini/libxmlsax.rb +1 -1
  161. data/lib/active_support/xml_mini/nokogiri.rb +4 -4
  162. data/lib/active_support/xml_mini/nokogirisax.rb +1 -1
  163. data/lib/active_support/xml_mini/rexml.rb +1 -1
  164. data/lib/active_support/xml_mini.rb +5 -4
  165. data/lib/active_support.rb +17 -1
  166. metadata +26 -23
  167. data/lib/active_support/core_ext/marshal.rb +0 -26
  168. data/lib/active_support/dependencies/zeitwerk_integration.rb +0 -117
@@ -130,7 +130,7 @@ class Numeric
130
130
  end
131
131
  end
132
132
 
133
- module ActiveSupport #:nodoc:
133
+ module ActiveSupport # :nodoc:
134
134
  class SafeBuffer < String
135
135
  UNSAFE_STRING_METHODS = %w(
136
136
  capitalize chomp chop delete delete_prefix delete_suffix
@@ -184,27 +184,30 @@ module ActiveSupport #:nodoc:
184
184
  end
185
185
 
186
186
  def concat(value)
187
- super(html_escape_interpolated_argument(value))
187
+ unless value.nil?
188
+ super(implicit_html_escape_interpolated_argument(value))
189
+ end
190
+ self
188
191
  end
189
192
  alias << concat
190
193
 
191
194
  def insert(index, value)
192
- super(index, html_escape_interpolated_argument(value))
195
+ super(index, implicit_html_escape_interpolated_argument(value))
193
196
  end
194
197
 
195
198
  def prepend(value)
196
- super(html_escape_interpolated_argument(value))
199
+ super(implicit_html_escape_interpolated_argument(value))
197
200
  end
198
201
 
199
202
  def replace(value)
200
- super(html_escape_interpolated_argument(value))
203
+ super(implicit_html_escape_interpolated_argument(value))
201
204
  end
202
205
 
203
206
  def []=(*args)
204
207
  if args.length == 3
205
- super(args[0], args[1], html_escape_interpolated_argument(args[2]))
208
+ super(args[0], args[1], implicit_html_escape_interpolated_argument(args[2]))
206
209
  else
207
- super(args[0], html_escape_interpolated_argument(args[1]))
210
+ super(args[0], implicit_html_escape_interpolated_argument(args[1]))
208
211
  end
209
212
  end
210
213
 
@@ -222,9 +225,9 @@ module ActiveSupport #:nodoc:
222
225
  def %(args)
223
226
  case args
224
227
  when Hash
225
- escaped_args = args.transform_values { |arg| html_escape_interpolated_argument(arg) }
228
+ escaped_args = args.transform_values { |arg| explicit_html_escape_interpolated_argument(arg) }
226
229
  else
227
- escaped_args = Array(args).map { |arg| html_escape_interpolated_argument(arg) }
230
+ escaped_args = Array(args).map { |arg| explicit_html_escape_interpolated_argument(arg) }
228
231
  end
229
232
 
230
233
  self.class.new(super(escaped_args))
@@ -262,39 +265,60 @@ module ActiveSupport #:nodoc:
262
265
  end
263
266
 
264
267
  UNSAFE_STRING_METHODS_WITH_BACKREF.each do |unsafe_method|
265
- if unsafe_method.respond_to?(unsafe_method)
266
- class_eval <<-EOT, __FILE__, __LINE__ + 1
267
- def #{unsafe_method}(*args, &block) # def gsub(*args, &block)
268
- if block # if block
269
- to_str.#{unsafe_method}(*args) { |*params| # to_str.gsub(*args) { |*params|
270
- set_block_back_references(block, $~) # set_block_back_references(block, $~)
271
- block.call(*params) # block.call(*params)
272
- } # }
273
- else # else
274
- to_str.#{unsafe_method}(*args) # to_str.gsub(*args)
275
- end # end
276
- end # end
277
-
278
- def #{unsafe_method}!(*args, &block) # def gsub!(*args, &block)
279
- @html_safe = false # @html_safe = false
280
- if block # if block
281
- super(*args) { |*params| # super(*args) { |*params|
282
- set_block_back_references(block, $~) # set_block_back_references(block, $~)
283
- block.call(*params) # block.call(*params)
284
- } # }
285
- else # else
286
- super # super
287
- end # end
288
- end # end
289
- EOT
290
- end
268
+ class_eval <<-EOT, __FILE__, __LINE__ + 1
269
+ def #{unsafe_method}(*args, &block) # def gsub(*args, &block)
270
+ if block # if block
271
+ to_str.#{unsafe_method}(*args) { |*params| # to_str.gsub(*args) { |*params|
272
+ set_block_back_references(block, $~) # set_block_back_references(block, $~)
273
+ block.call(*params) # block.call(*params)
274
+ } # }
275
+ else # else
276
+ to_str.#{unsafe_method}(*args) # to_str.gsub(*args)
277
+ end # end
278
+ end # end
279
+
280
+ def #{unsafe_method}!(*args, &block) # def gsub!(*args, &block)
281
+ @html_safe = false # @html_safe = false
282
+ if block # if block
283
+ super(*args) { |*params| # super(*args) { |*params|
284
+ set_block_back_references(block, $~) # set_block_back_references(block, $~)
285
+ block.call(*params) # block.call(*params)
286
+ } # }
287
+ else # else
288
+ super # super
289
+ end # end
290
+ end # end
291
+ EOT
291
292
  end
292
293
 
293
294
  private
294
- def html_escape_interpolated_argument(arg)
295
+ def explicit_html_escape_interpolated_argument(arg)
295
296
  (!html_safe? || arg.html_safe?) ? arg : CGI.escapeHTML(arg.to_s)
296
297
  end
297
298
 
299
+ def implicit_html_escape_interpolated_argument(arg)
300
+ if !html_safe? || arg.html_safe?
301
+ arg
302
+ else
303
+ arg_string = begin
304
+ arg.to_str
305
+ rescue NoMethodError => error
306
+ if error.name == :to_str
307
+ str = arg.to_s
308
+ ActiveSupport::Deprecation.warn <<~MSG.squish
309
+ Implicit conversion of #{arg.class} into String by ActiveSupport::SafeBuffer
310
+ is deprecated and will be removed in Rails 7.1.
311
+ You must explicitly cast it to a String.
312
+ MSG
313
+ str
314
+ else
315
+ raise
316
+ end
317
+ end
318
+ CGI.escapeHTML(arg_string)
319
+ end
320
+ end
321
+
298
322
  def set_block_back_references(block, match_data)
299
323
  block.binding.eval("proc { |m| $~ = m }").call(match_data)
300
324
  rescue ArgumentError
@@ -1,14 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Symbol
4
- def start_with?(*prefixes)
5
- to_s.start_with?(*prefixes)
6
- end unless method_defined?(:start_with?)
7
-
8
- def end_with?(*suffixes)
9
- to_s.end_with?(*suffixes)
10
- end unless method_defined?(:end_with?)
11
-
12
4
  alias :starts_with? :start_with?
13
5
  alias :ends_with? :end_with?
14
6
  end
@@ -42,8 +42,8 @@ class Time
42
42
 
43
43
  # Layers additional behavior on Time.at so that ActiveSupport::TimeWithZone and DateTime
44
44
  # instances can be used when called with a single argument
45
- def at_with_coercion(*args)
46
- return at_without_coercion(*args) if args.size != 1
45
+ def at_with_coercion(*args, **kwargs)
46
+ return at_without_coercion(*args, **kwargs) if args.size != 1 || !kwargs.empty?
47
47
 
48
48
  # Time.at can be called with a time or numerical value
49
49
  time_or_number = args.first
@@ -159,6 +159,8 @@ class Time
159
159
  ::Time.new(new_year, new_month, new_day, new_hour, new_min, new_sec, new_offset)
160
160
  elsif utc?
161
161
  ::Time.utc(new_year, new_month, new_day, new_hour, new_min, new_sec)
162
+ elsif zone&.respond_to?(:utc_to_local)
163
+ ::Time.new(new_year, new_month, new_day, new_hour, new_min, new_sec, zone)
162
164
  elsif zone
163
165
  ::Time.local(new_year, new_month, new_day, new_hour, new_min, new_sec)
164
166
  else
@@ -275,7 +277,7 @@ class Time
275
277
  end
276
278
  alias :at_end_of_minute :end_of_minute
277
279
 
278
- def plus_with_duration(other) #:nodoc:
280
+ def plus_with_duration(other) # :nodoc:
279
281
  if ActiveSupport::Duration === other
280
282
  other.since(self)
281
283
  else
@@ -285,7 +287,7 @@ class Time
285
287
  alias_method :plus_without_duration, :+
286
288
  alias_method :+, :plus_with_duration
287
289
 
288
- def minus_with_duration(other) #:nodoc:
290
+ def minus_with_duration(other) # :nodoc:
289
291
  if ActiveSupport::Duration === other
290
292
  other.until(self)
291
293
  else
@@ -303,7 +305,7 @@ class Time
303
305
  other.is_a?(DateTime) ? to_f - other.to_f : minus_without_coercion(other)
304
306
  end
305
307
  alias_method :minus_without_coercion, :-
306
- alias_method :-, :minus_with_coercion
308
+ alias_method :-, :minus_with_coercion # rubocop:disable Lint/DuplicateMethods
307
309
 
308
310
  # Layers additional behavior on Time#<=> so that DateTime and ActiveSupport::TimeWithZone instances
309
311
  # can be chronologically compared with a Time
@@ -27,22 +27,22 @@ class Time
27
27
 
28
28
  # Converts to a formatted string. See DATE_FORMATS for built-in formats.
29
29
  #
30
- # This method is aliased to <tt>to_s</tt>.
30
+ # This method is aliased to <tt>to_formatted_s</tt>.
31
31
  #
32
32
  # time = Time.now # => 2007-01-18 06:10:17 -06:00
33
33
  #
34
+ # time.to_fs(:time) # => "06:10"
34
35
  # time.to_formatted_s(:time) # => "06:10"
35
- # time.to_s(:time) # => "06:10"
36
36
  #
37
- # time.to_formatted_s(:db) # => "2007-01-18 06:10:17"
38
- # time.to_formatted_s(:number) # => "20070118061017"
39
- # time.to_formatted_s(:short) # => "18 Jan 06:10"
40
- # time.to_formatted_s(:long) # => "January 18, 2007 06:10"
41
- # time.to_formatted_s(:long_ordinal) # => "January 18th, 2007 06:10"
42
- # time.to_formatted_s(:rfc822) # => "Thu, 18 Jan 2007 06:10:17 -0600"
43
- # time.to_formatted_s(:iso8601) # => "2007-01-18T06:10:17-06:00"
37
+ # time.to_fs(:db) # => "2007-01-18 06:10:17"
38
+ # time.to_fs(:number) # => "20070118061017"
39
+ # time.to_fs(:short) # => "18 Jan 06:10"
40
+ # time.to_fs(:long) # => "January 18, 2007 06:10"
41
+ # time.to_fs(:long_ordinal) # => "January 18th, 2007 06:10"
42
+ # time.to_fs(:rfc822) # => "Thu, 18 Jan 2007 06:10:17 -0600"
43
+ # time.to_fs(:iso8601) # => "2007-01-18T06:10:17-06:00"
44
44
  #
45
- # == Adding your own time formats to +to_formatted_s+
45
+ # == Adding your own time formats to +to_fs+
46
46
  # You can add your own formats to the Time::DATE_FORMATS hash.
47
47
  # Use the format name as the hash key and either a strftime string
48
48
  # or Proc instance that takes a time argument as the value.
@@ -50,15 +50,16 @@ class Time
50
50
  # # config/initializers/time_formats.rb
51
51
  # Time::DATE_FORMATS[:month_and_year] = '%B %Y'
52
52
  # Time::DATE_FORMATS[:short_ordinal] = ->(time) { time.strftime("%B #{time.day.ordinalize}") }
53
- def to_formatted_s(format = :default)
53
+ def to_fs(format = :default)
54
54
  if formatter = DATE_FORMATS[format]
55
55
  formatter.respond_to?(:call) ? formatter.call(self).to_s : strftime(formatter)
56
56
  else
57
+ # Change to `to_s` when deprecation is gone. Also deprecate `to_default_s`.
57
58
  to_default_s
58
59
  end
59
60
  end
61
+ alias_method :to_formatted_s, :to_fs
60
62
  alias_method :to_default_s, :to_s
61
- alias_method :to_s, :to_formatted_s
62
63
 
63
64
  # Returns a formatted string of the offset from UTC, or an alternative
64
65
  # string if the time zone is already UTC.
@@ -0,0 +1,22 @@
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
+ to_default_s
15
+ else
16
+ ActiveSupport::Deprecation.warn(
17
+ "Time#to_s(#{format.inspect}) is deprecated. Please use Time#to_fs(#{format.inspect}) instead."
18
+ )
19
+ to_default_s
20
+ end
21
+ end
22
+ end
@@ -12,7 +12,7 @@ class Time
12
12
  # Returns the TimeZone for the current request, if this has been set (via Time.zone=).
13
13
  # If <tt>Time.zone</tt> has not been set for the current request, returns the TimeZone specified in <tt>config.time_zone</tt>.
14
14
  def zone
15
- Thread.current[:time_zone] || zone_default
15
+ ::ActiveSupport::IsolatedExecutionState[:time_zone] || zone_default
16
16
  end
17
17
 
18
18
  # Sets <tt>Time.zone</tt> to a TimeZone object for the current request/thread.
@@ -39,7 +39,7 @@ class Time
39
39
  # end
40
40
  # end
41
41
  def zone=(time_zone)
42
- Thread.current[:time_zone] = find_zone!(time_zone)
42
+ ::ActiveSupport::IsolatedExecutionState[:time_zone] = find_zone!(time_zone)
43
43
  end
44
44
 
45
45
  # Allows override of <tt>Time.zone</tt> locally inside supplied block;
@@ -80,24 +80,9 @@ class Time
80
80
  # Time.find_zone! false # => false
81
81
  # Time.find_zone! "NOT-A-TIMEZONE" # => ArgumentError: Invalid Timezone: NOT-A-TIMEZONE
82
82
  def find_zone!(time_zone)
83
- if !time_zone || time_zone.is_a?(ActiveSupport::TimeZone)
84
- time_zone
85
- else
86
- # Look up the timezone based on the identifier (unless we've been
87
- # passed a TZInfo::Timezone)
88
- unless time_zone.respond_to?(:period_for_local)
89
- time_zone = ActiveSupport::TimeZone[time_zone] || TZInfo::Timezone.get(time_zone)
90
- end
83
+ return time_zone unless time_zone
91
84
 
92
- # Return if a TimeZone instance, or wrap in a TimeZone instance if a TZInfo::Timezone
93
- if time_zone.is_a?(ActiveSupport::TimeZone)
94
- time_zone
95
- else
96
- ActiveSupport::TimeZone.create(time_zone.name, nil, time_zone)
97
- end
98
- end
99
- rescue TZInfo::InvalidTimezoneIdentifier
100
- raise ArgumentError, "Invalid Timezone: #{time_zone}"
85
+ ActiveSupport::TimeZone[time_zone] || raise(ArgumentError, "Invalid Timezone: #{time_zone}")
101
86
  end
102
87
 
103
88
  # Returns a TimeZone instance matching the time zone provided.
@@ -4,4 +4,5 @@ require "active_support/core_ext/time/acts_like"
4
4
  require "active_support/core_ext/time/calculations"
5
5
  require "active_support/core_ext/time/compatibility"
6
6
  require "active_support/core_ext/time/conversions"
7
+ require "active_support/core_ext/time/deprecated_conversions" unless ENV["RAILS_DISABLE_DEPRECATED_TO_S_CONVERSION"]
7
8
  require "active_support/core_ext/time/zones"
@@ -1,29 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "uri"
4
-
5
- if RUBY_VERSION < "2.6.0"
6
- require "active_support/core_ext/module/redefine_method"
7
- URI::Parser.class_eval do
8
- silence_redefinition_of_method :unescape
9
- def unescape(str, escaped = /%[a-fA-F\d]{2}/)
10
- # TODO: Are we actually sure that ASCII == UTF-8?
11
- # YK: My initial experiments say yes, but let's be sure please
12
- enc = str.encoding
13
- enc = Encoding::UTF_8 if enc == Encoding::US_ASCII
14
- str.dup.force_encoding(Encoding::ASCII_8BIT).gsub(escaped) { |match| [match[1, 2].hex].pack("C") }.force_encoding(enc)
15
- end
16
- end
17
- end
18
-
19
- module URI
20
- class << self
21
- def parser
22
- ActiveSupport::Deprecation.warn(<<-MSG.squish)
23
- URI.parser is deprecated and will be removed in Rails 6.2.
24
- Use `URI::DEFAULT_PARSER` instead.
25
- MSG
26
- URI::DEFAULT_PARSER
27
- end
28
- end
29
- end
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,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  Dir.glob(File.expand_path("core_ext/*.rb", __dir__)).sort.each do |path|
4
+ next if path.end_with?("core_ext/uri.rb")
4
5
  require path
5
6
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "active_support/callbacks"
4
4
  require "active_support/core_ext/enumerable"
5
+ require "active_support/core_ext/module/delegation"
5
6
 
6
7
  module ActiveSupport
7
8
  # Abstract super class that provides a thread-isolated attributes singleton, which resets automatically
@@ -97,25 +98,37 @@ module ActiveSupport
97
98
 
98
99
  # Declares one or more attributes that will be given both class and instance accessor methods.
99
100
  def attribute(*names)
100
- generated_attribute_methods.module_eval do
101
+ ActiveSupport::CodeGenerator.batch(generated_attribute_methods, __FILE__, __LINE__) do |owner|
101
102
  names.each do |name|
102
- define_method(name) do
103
- attributes[name.to_sym]
103
+ owner.define_cached_method(name, namespace: :current_attributes) do |batch|
104
+ batch <<
105
+ "def #{name}" <<
106
+ "attributes[:#{name}]" <<
107
+ "end"
104
108
  end
105
-
106
- define_method("#{name}=") do |attribute|
107
- attributes[name.to_sym] = attribute
109
+ owner.define_cached_method("#{name}=", namespace: :current_attributes) do |batch|
110
+ batch <<
111
+ "def #{name}=(value)" <<
112
+ "attributes[:#{name}] = value" <<
113
+ "end"
108
114
  end
109
115
  end
110
116
  end
111
117
 
112
- names.each do |name|
113
- define_singleton_method(name) do
114
- instance.public_send(name)
115
- end
116
-
117
- define_singleton_method("#{name}=") do |attribute|
118
- instance.public_send("#{name}=", attribute)
118
+ ActiveSupport::CodeGenerator.batch(singleton_class, __FILE__, __LINE__) do |owner|
119
+ names.each do |name|
120
+ owner.define_cached_method(name, namespace: :current_attributes_delegation) do |batch|
121
+ batch <<
122
+ "def #{name}" <<
123
+ "instance.#{name}" <<
124
+ "end"
125
+ end
126
+ owner.define_cached_method("#{name}=", namespace: :current_attributes_delegation) do |batch|
127
+ batch <<
128
+ "def #{name}=(value)" <<
129
+ "instance.#{name} = value" <<
130
+ "end"
131
+ end
119
132
  end
120
133
  end
121
134
  end
@@ -148,7 +161,7 @@ module ActiveSupport
148
161
  end
149
162
 
150
163
  def current_instances
151
- Thread.current[:current_attributes_instances] ||= {}
164
+ IsolatedExecutionState[:current_attributes_instances] ||= {}
152
165
  end
153
166
 
154
167
  def current_instances_key
@@ -163,6 +176,11 @@ module ActiveSupport
163
176
 
164
177
  send(name, *args, &block)
165
178
  end
179
+ ruby2_keywords(:method_missing)
180
+
181
+ def respond_to_missing?(name, _)
182
+ super || instance.respond_to?(name)
183
+ end
166
184
  end
167
185
 
168
186
  attr_accessor :attributes
@@ -2,23 +2,19 @@
2
2
 
3
3
  require "active_support/concurrency/share_lock"
4
4
 
5
- module ActiveSupport #:nodoc:
6
- module Dependencies #:nodoc:
5
+ module ActiveSupport # :nodoc:
6
+ module Dependencies # :nodoc:
7
7
  class Interlock
8
8
  def initialize # :nodoc:
9
9
  @lock = ActiveSupport::Concurrency::ShareLock.new
10
10
  end
11
11
 
12
- def loading
13
- @lock.exclusive(purpose: :load, compatible: [:load], after_compatible: [:load]) do
14
- yield
15
- end
12
+ def loading(&block)
13
+ @lock.exclusive(purpose: :load, compatible: [:load], after_compatible: [:load], &block)
16
14
  end
17
15
 
18
- def unloading
19
- @lock.exclusive(purpose: :unload, compatible: [:load, :unload], after_compatible: [:load, :unload]) do
20
- yield
21
- end
16
+ def unloading(&block)
17
+ @lock.exclusive(purpose: :unload, compatible: [:load, :unload], after_compatible: [:load, :unload], &block)
22
18
  end
23
19
 
24
20
  def start_unloading
@@ -37,16 +33,12 @@ module ActiveSupport #:nodoc:
37
33
  @lock.stop_sharing
38
34
  end
39
35
 
40
- def running
41
- @lock.sharing do
42
- yield
43
- end
36
+ def running(&block)
37
+ @lock.sharing(&block)
44
38
  end
45
39
 
46
- def permit_concurrent_loads
47
- @lock.yield_shares(compatible: [:load]) do
48
- yield
49
- end
40
+ def permit_concurrent_loads(&block)
41
+ @lock.yield_shares(compatible: [:load], &block)
50
42
  end
51
43
 
52
44
  def raw_state(&block) # :nodoc:
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveSupport::Dependencies::RequireDependency
4
+ # <b>Warning:</b> This method is obsolete. The semantics of the autoloader
5
+ # match Ruby's and you do not need to be defensive with load order anymore.
6
+ # Just refer to classes and modules normally.
7
+ #
8
+ # Engines that do not control the mode in which their parent application runs
9
+ # should call +require_dependency+ where needed in case the runtime mode is
10
+ # +:classic+.
11
+ def require_dependency(filename)
12
+ filename = filename.to_path if filename.respond_to?(:to_path)
13
+
14
+ unless filename.is_a?(String)
15
+ raise ArgumentError, "the file name must be either a String or implement #to_path -- you passed #{filename.inspect}"
16
+ end
17
+
18
+ if abspath = ActiveSupport::Dependencies.search_for_file(filename)
19
+ require abspath
20
+ else
21
+ require filename
22
+ end
23
+ end
24
+
25
+ # We could define require_dependency in Object directly, but a module makes
26
+ # the extension apparent if you list ancestors.
27
+ Object.prepend(self)
28
+ end