activesupport 7.2.2.1 → 8.1.3

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 (137) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +422 -145
  3. data/README.rdoc +1 -1
  4. data/lib/active_support/backtrace_cleaner.rb +73 -2
  5. data/lib/active_support/benchmark.rb +21 -0
  6. data/lib/active_support/benchmarkable.rb +3 -2
  7. data/lib/active_support/broadcast_logger.rb +61 -74
  8. data/lib/active_support/cache/file_store.rb +14 -4
  9. data/lib/active_support/cache/mem_cache_store.rb +30 -29
  10. data/lib/active_support/cache/memory_store.rb +11 -5
  11. data/lib/active_support/cache/null_store.rb +2 -2
  12. data/lib/active_support/cache/redis_cache_store.rb +43 -34
  13. data/lib/active_support/cache/strategy/local_cache.rb +72 -27
  14. data/lib/active_support/cache/strategy/local_cache_middleware.rb +7 -7
  15. data/lib/active_support/cache.rb +88 -20
  16. data/lib/active_support/callbacks.rb +28 -13
  17. data/lib/active_support/class_attribute.rb +33 -0
  18. data/lib/active_support/code_generator.rb +9 -0
  19. data/lib/active_support/concurrency/load_interlock_aware_monitor.rb +8 -62
  20. data/lib/active_support/concurrency/share_lock.rb +0 -1
  21. data/lib/active_support/concurrency/thread_monitor.rb +55 -0
  22. data/lib/active_support/configurable.rb +34 -0
  23. data/lib/active_support/configuration_file.rb +15 -6
  24. data/lib/active_support/continuous_integration.rb +145 -0
  25. data/lib/active_support/core_ext/array/conversions.rb +3 -3
  26. data/lib/active_support/core_ext/array.rb +7 -7
  27. data/lib/active_support/core_ext/benchmark.rb +0 -15
  28. data/lib/active_support/core_ext/big_decimal.rb +1 -1
  29. data/lib/active_support/core_ext/class/attribute.rb +26 -20
  30. data/lib/active_support/core_ext/class.rb +2 -2
  31. data/lib/active_support/core_ext/date/conversions.rb +2 -0
  32. data/lib/active_support/core_ext/date.rb +5 -5
  33. data/lib/active_support/core_ext/date_and_time/compatibility.rb +0 -35
  34. data/lib/active_support/core_ext/date_time/compatibility.rb +3 -5
  35. data/lib/active_support/core_ext/date_time/conversions.rb +4 -2
  36. data/lib/active_support/core_ext/date_time.rb +5 -5
  37. data/lib/active_support/core_ext/digest.rb +1 -1
  38. data/lib/active_support/core_ext/enumerable.rb +25 -8
  39. data/lib/active_support/core_ext/erb/util.rb +5 -5
  40. data/lib/active_support/core_ext/file.rb +1 -1
  41. data/lib/active_support/core_ext/hash/deep_merge.rb +1 -0
  42. data/lib/active_support/core_ext/hash/except.rb +0 -12
  43. data/lib/active_support/core_ext/hash.rb +8 -8
  44. data/lib/active_support/core_ext/integer.rb +3 -3
  45. data/lib/active_support/core_ext/kernel.rb +3 -3
  46. data/lib/active_support/core_ext/module/attr_internal.rb +3 -4
  47. data/lib/active_support/core_ext/module/introspection.rb +3 -0
  48. data/lib/active_support/core_ext/module.rb +11 -11
  49. data/lib/active_support/core_ext/numeric.rb +3 -3
  50. data/lib/active_support/core_ext/object/json.rb +24 -11
  51. data/lib/active_support/core_ext/object/to_query.rb +7 -1
  52. data/lib/active_support/core_ext/object/try.rb +2 -2
  53. data/lib/active_support/core_ext/object.rb +13 -13
  54. data/lib/active_support/core_ext/pathname.rb +2 -2
  55. data/lib/active_support/core_ext/range/overlap.rb +3 -3
  56. data/lib/active_support/core_ext/range/sole.rb +17 -0
  57. data/lib/active_support/core_ext/range.rb +4 -4
  58. data/lib/active_support/core_ext/securerandom.rb +24 -8
  59. data/lib/active_support/core_ext/string/filters.rb +3 -3
  60. data/lib/active_support/core_ext/string/inflections.rb +1 -1
  61. data/lib/active_support/core_ext/string/multibyte.rb +12 -3
  62. data/lib/active_support/core_ext/string/output_safety.rb +29 -13
  63. data/lib/active_support/core_ext/string.rb +13 -13
  64. data/lib/active_support/core_ext/symbol.rb +1 -1
  65. data/lib/active_support/core_ext/thread/backtrace/location.rb +2 -7
  66. data/lib/active_support/core_ext/time/calculations.rb +7 -2
  67. data/lib/active_support/core_ext/time/compatibility.rb +2 -19
  68. data/lib/active_support/core_ext/time/conversions.rb +2 -0
  69. data/lib/active_support/core_ext/time.rb +5 -5
  70. data/lib/active_support/current_attributes/test_helper.rb +2 -2
  71. data/lib/active_support/current_attributes.rb +27 -17
  72. data/lib/active_support/delegation.rb +25 -44
  73. data/lib/active_support/dependencies/interlock.rb +11 -5
  74. data/lib/active_support/dependencies.rb +6 -2
  75. data/lib/active_support/deprecation/reporting.rb +4 -21
  76. data/lib/active_support/deprecation.rb +1 -1
  77. data/lib/active_support/duration.rb +14 -10
  78. data/lib/active_support/editor.rb +70 -0
  79. data/lib/active_support/encrypted_configuration.rb +20 -2
  80. data/lib/active_support/error_reporter.rb +81 -4
  81. data/lib/active_support/event_reporter/test_helper.rb +32 -0
  82. data/lib/active_support/event_reporter.rb +592 -0
  83. data/lib/active_support/evented_file_update_checker.rb +5 -2
  84. data/lib/active_support/execution_context.rb +75 -7
  85. data/lib/active_support/execution_wrapper.rb +1 -1
  86. data/lib/active_support/file_update_checker.rb +8 -6
  87. data/lib/active_support/gem_version.rb +4 -4
  88. data/lib/active_support/gzip.rb +1 -0
  89. data/lib/active_support/hash_with_indifferent_access.rb +61 -38
  90. data/lib/active_support/i18n_railtie.rb +19 -11
  91. data/lib/active_support/inflector/inflections.rb +34 -16
  92. data/lib/active_support/inflector/methods.rb +3 -3
  93. data/lib/active_support/inflector/transliterate.rb +6 -8
  94. data/lib/active_support/isolated_execution_state.rb +17 -17
  95. data/lib/active_support/json/decoding.rb +6 -4
  96. data/lib/active_support/json/encoding.rb +159 -21
  97. data/lib/active_support/lazy_load_hooks.rb +1 -1
  98. data/lib/active_support/log_subscriber.rb +2 -6
  99. data/lib/active_support/logger_thread_safe_level.rb +6 -3
  100. data/lib/active_support/message_encryptors.rb +54 -2
  101. data/lib/active_support/message_pack/extensions.rb +6 -1
  102. data/lib/active_support/message_verifier.rb +9 -0
  103. data/lib/active_support/message_verifiers.rb +57 -3
  104. data/lib/active_support/messages/rotation_coordinator.rb +9 -0
  105. data/lib/active_support/messages/rotator.rb +10 -0
  106. data/lib/active_support/multibyte/chars.rb +12 -2
  107. data/lib/active_support/multibyte.rb +4 -0
  108. data/lib/active_support/notifications/fanout.rb +64 -43
  109. data/lib/active_support/notifications/instrumenter.rb +1 -1
  110. data/lib/active_support/number_helper/number_converter.rb +1 -1
  111. data/lib/active_support/number_helper/number_to_delimited_converter.rb +17 -2
  112. data/lib/active_support/number_helper.rb +22 -0
  113. data/lib/active_support/railtie.rb +32 -9
  114. data/lib/active_support/structured_event_subscriber.rb +99 -0
  115. data/lib/active_support/subscriber.rb +0 -5
  116. data/lib/active_support/syntax_error_proxy.rb +7 -0
  117. data/lib/active_support/tagged_logging.rb +5 -0
  118. data/lib/active_support/test_case.rb +67 -6
  119. data/lib/active_support/testing/assertions.rb +118 -27
  120. data/lib/active_support/testing/autorun.rb +5 -0
  121. data/lib/active_support/testing/error_reporter_assertions.rb +17 -0
  122. data/lib/active_support/testing/event_reporter_assertions.rb +227 -0
  123. data/lib/active_support/testing/isolation.rb +0 -2
  124. data/lib/active_support/testing/notification_assertions.rb +92 -0
  125. data/lib/active_support/testing/parallelization/server.rb +15 -2
  126. data/lib/active_support/testing/parallelization/worker.rb +9 -3
  127. data/lib/active_support/testing/parallelization.rb +25 -1
  128. data/lib/active_support/testing/tests_without_assertions.rb +1 -1
  129. data/lib/active_support/testing/time_helpers.rb +9 -4
  130. data/lib/active_support/time_with_zone.rb +36 -23
  131. data/lib/active_support/values/time_zone.rb +19 -10
  132. data/lib/active_support/xml_mini.rb +3 -2
  133. data/lib/active_support.rb +21 -9
  134. metadata +35 -16
  135. data/lib/active_support/core_ext/range/each.rb +0 -24
  136. data/lib/active_support/proxy_object.rb +0 -20
  137. data/lib/active_support/testing/strict_warnings.rb +0 -43
@@ -9,6 +9,14 @@ require "active_support/testing/parallelization/worker"
9
9
  module ActiveSupport
10
10
  module Testing
11
11
  class Parallelization # :nodoc:
12
+ @@before_fork_hooks = []
13
+
14
+ def self.before_fork_hook(&blk)
15
+ @@before_fork_hooks << blk
16
+ end
17
+
18
+ cattr_reader :before_fork_hooks
19
+
12
20
  @@after_fork_hooks = []
13
21
 
14
22
  def self.after_fork_hook(&blk)
@@ -32,7 +40,12 @@ module ActiveSupport
32
40
  @url = DRb.start_service("drbunix:", @queue_server).uri
33
41
  end
34
42
 
43
+ def before_fork
44
+ Parallelization.before_fork_hooks.each(&:call)
45
+ end
46
+
35
47
  def start
48
+ before_fork
36
49
  @worker_pool = @worker_count.times.map do |worker|
37
50
  Worker.new(worker, @url).start
38
51
  end
@@ -47,8 +60,19 @@ module ActiveSupport
47
60
  end
48
61
 
49
62
  def shutdown
63
+ dead_worker_pids = @worker_pool.filter_map do |pid|
64
+ Process.waitpid(pid, Process::WNOHANG)
65
+ rescue Errno::ECHILD
66
+ pid
67
+ end
68
+ @queue_server.remove_dead_workers(dead_worker_pids)
69
+
50
70
  @queue_server.shutdown
51
- @worker_pool.each { |pid| Process.waitpid pid }
71
+ @worker_pool.each do |pid|
72
+ Process.waitpid(pid)
73
+ rescue Errno::ECHILD
74
+ nil
75
+ end
52
76
  end
53
77
  end
54
78
  end
@@ -11,7 +11,7 @@ module ActiveSupport
11
11
 
12
12
  if assertions.zero? && !skipped? && !error?
13
13
  file, line = method(name).source_location
14
- warn "Test is missing assertions: `#{name}` #{file}:#{line}"
14
+ warn "Test is missing assertions: `#{name}` #{File.expand_path(file)}:#{line}"
15
15
  end
16
16
  end
17
17
  end
@@ -166,9 +166,10 @@ module ActiveSupport
166
166
  else
167
167
  now = date_or_time
168
168
  now = now.to_time unless now.is_a?(Time)
169
- now = now.change(usec: 0) unless with_usec
170
169
  end
171
170
 
171
+ now = now.change(usec: 0) unless with_usec
172
+
172
173
  # +now+ must be in local system timezone, because +Time.at(now)+
173
174
  # and +now.to_date+ (see stubs below) will use +now+'s timezone too!
174
175
  now = now.getlocal
@@ -237,12 +238,16 @@ module ActiveSupport
237
238
  end
238
239
  alias_method :unfreeze_time, :travel_back
239
240
 
240
- # Calls +travel_to+ with +Time.now+. Forwards optional <tt>with_usec</tt> argument.
241
+ # Calls +travel_to+ with +date_or_time+, which defaults to +Time.now+.
242
+ # Forwards optional <tt>with_usec</tt> argument.
241
243
  #
242
244
  # Time.current # => Sun, 09 Jul 2017 15:34:49 EST -05:00
243
245
  # freeze_time
244
246
  # sleep(1)
245
247
  # Time.current # => Sun, 09 Jul 2017 15:34:49 EST -05:00
248
+ # freeze_time Time.current + 1.day
249
+ # sleep(1)
250
+ # Time.current # => Mon, 10 Jul 2017 15:34:49 EST -05:00
246
251
  #
247
252
  # This method also accepts a block, which will return the current time back to its original
248
253
  # state at the end of the block:
@@ -253,8 +258,8 @@ module ActiveSupport
253
258
  # User.create.created_at # => Sun, 09 Jul 2017 15:34:49 EST -05:00
254
259
  # end
255
260
  # Time.current # => Sun, 09 Jul 2017 15:34:50 EST -05:00
256
- def freeze_time(with_usec: false, &block)
257
- travel_to Time.now, with_usec: with_usec, &block
261
+ def freeze_time(date_or_time = Time.now, with_usec: false, &block)
262
+ travel_to date_or_time, with_usec: with_usec, &block
258
263
  end
259
264
 
260
265
  private
@@ -49,9 +49,15 @@ module ActiveSupport
49
49
  attr_reader :time_zone
50
50
 
51
51
  def initialize(utc_time, time_zone, local_time = nil, period = nil)
52
- @utc = utc_time ? transfer_time_values_to_utc_constructor(utc_time) : nil
53
52
  @time_zone, @time = time_zone, local_time
54
- @period = @utc ? period : get_period_and_ensure_valid_local_time(period)
53
+ if utc_time
54
+ @utc = transfer_time_values_to_utc_constructor(utc_time)
55
+ @period = period
56
+ else
57
+ @utc = nil
58
+ @period = get_period_and_ensure_valid_local_time(period)
59
+ end
60
+ @is_utc = zone == "UTC" || zone == "UCT"
55
61
  end
56
62
 
57
63
  # Returns a <tt>Time</tt> instance that represents the time in +time_zone+.
@@ -103,7 +109,7 @@ module ActiveSupport
103
109
  # Time.zone = 'Eastern Time (US & Canada)' # => 'Eastern Time (US & Canada)'
104
110
  # Time.zone.now.utc? # => false
105
111
  def utc?
106
- zone == "UTC" || zone == "UCT"
112
+ @is_utc
107
113
  end
108
114
  alias_method :gmt?, :utc?
109
115
 
@@ -136,9 +142,9 @@ module ActiveSupport
136
142
 
137
143
  # Returns a string of the object's date, time, zone, and offset from UTC.
138
144
  #
139
- # Time.zone.now.inspect # => "Thu, 04 Dec 2014 11:00:25.624541392 EST -05:00"
145
+ # Time.zone.now.inspect # => "2024-11-13 07:00:10.528054960 UTC +00:00"
140
146
  def inspect
141
- "#{time.strftime('%a, %d %b %Y %H:%M:%S.%9N')} #{zone} #{formatted_offset}"
147
+ "#{time.strftime('%F %H:%M:%S.%9N')} #{zone} #{formatted_offset}"
142
148
  end
143
149
 
144
150
  # Returns a string of the object's date and time in the ISO 8601 standard
@@ -146,7 +152,17 @@ module ActiveSupport
146
152
  #
147
153
  # Time.zone.now.xmlschema # => "2014-12-04T11:02:37-05:00"
148
154
  def xmlschema(fraction_digits = 0)
149
- "#{time.strftime(PRECISIONS[fraction_digits.to_i])}#{formatted_offset(true, 'Z')}"
155
+ precision = fraction_digits || 0
156
+
157
+ if @is_utc
158
+ utc.iso8601(precision)
159
+ else
160
+ str = time.iso8601(precision)
161
+ offset = formatted_offset(true, "Z")
162
+
163
+ str.sub!(/(Z|[+-]\d{2}:\d{2})\z/, offset)
164
+ str
165
+ end
150
166
  end
151
167
  alias_method :iso8601, :xmlschema
152
168
  alias_method :rfc3339, :xmlschema
@@ -157,15 +173,15 @@ module ActiveSupport
157
173
  # to +false+.
158
174
  #
159
175
  # # With ActiveSupport::JSON::Encoding.use_standard_json_time_format = true
160
- # Time.utc(2005,2,1,15,15,10).in_time_zone("Hawaii").to_json
176
+ # Time.utc(2005,2,1,15,15,10).in_time_zone("Hawaii").as_json
161
177
  # # => "2005-02-01T05:15:10.000-10:00"
162
178
  #
163
179
  # # With ActiveSupport::JSON::Encoding.use_standard_json_time_format = false
164
- # Time.utc(2005,2,1,15,15,10).in_time_zone("Hawaii").to_json
180
+ # Time.utc(2005,2,1,15,15,10).in_time_zone("Hawaii").as_json
165
181
  # # => "2005/02/01 05:15:10 -1000"
166
182
  def as_json(options = nil)
167
183
  if ActiveSupport::JSON::Encoding.use_standard_json_time_format
168
- xmlschema(ActiveSupport::JSON::Encoding.time_precision)
184
+ xmlschema(ActiveSupport::JSON::Encoding.time_precision).force_encoding(Encoding::UTF_8)
169
185
  else
170
186
  %(#{time.strftime("%Y/%m/%d %H:%M:%S")} #{formatted_offset(false)})
171
187
  end
@@ -215,8 +231,7 @@ module ActiveSupport
215
231
  elsif formatter = ::Time::DATE_FORMATS[format]
216
232
  formatter.respond_to?(:call) ? formatter.call(self).to_s : strftime(formatter)
217
233
  else
218
- # Change to to_s when deprecation is gone.
219
- "#{time.strftime("%Y-%m-%d %H:%M:%S")} #{formatted_offset(false, 'UTC')}"
234
+ to_s
220
235
  end
221
236
  end
222
237
  alias_method :to_formatted_s, :to_fs
@@ -300,7 +315,8 @@ module ActiveSupport
300
315
  if duration_of_variable_length?(other)
301
316
  method_missing(:+, other)
302
317
  else
303
- result = utc.acts_like?(:date) ? utc.since(other) : utc + other rescue utc.since(other)
318
+ result = utc + other
319
+
304
320
  result.in_time_zone(time_zone)
305
321
  end
306
322
  end
@@ -336,7 +352,7 @@ module ActiveSupport
336
352
  elsif duration_of_variable_length?(other)
337
353
  method_missing(:-, other)
338
354
  else
339
- result = utc.acts_like?(:date) ? utc.ago(other) : utc - other rescue utc.ago(other)
355
+ result = utc - other
340
356
  result.in_time_zone(time_zone)
341
357
  end
342
358
  end
@@ -479,15 +495,11 @@ module ActiveSupport
479
495
  @to_datetime ||= utc.to_datetime.new_offset(Rational(utc_offset, 86_400))
480
496
  end
481
497
 
482
- # Returns an instance of +Time+, either with the same UTC offset
483
- # as +self+ or in the local system timezone depending on the setting
484
- # of +ActiveSupport.to_time_preserves_timezone+.
498
+ # Returns an instance of +Time+, either with the same timezone as +self+,
499
+ # with the same UTC offset as +self+ or in the local system timezone
500
+ # depending on the setting of +ActiveSupport.to_time_preserves_timezone+.
485
501
  def to_time
486
- if preserve_timezone
487
- @to_time_with_instance_offset ||= getlocal(utc_offset)
488
- else
489
- @to_time_with_system_offset ||= getlocal
490
- end
502
+ @to_time_with_timezone ||= getlocal(time_zone)
491
503
  end
492
504
 
493
505
  # So that +self+ <tt>acts_like?(:time)</tt>.
@@ -535,7 +547,6 @@ module ActiveSupport
535
547
  # Ensure proxy class responds to all methods that underlying time instance
536
548
  # responds to.
537
549
  def respond_to_missing?(sym, include_priv)
538
- return false if sym.to_sym == :acts_like_date?
539
550
  time.respond_to?(sym, include_priv)
540
551
  end
541
552
 
@@ -551,7 +562,9 @@ module ActiveSupport
551
562
  SECONDS_PER_DAY = 86400
552
563
 
553
564
  def incorporate_utc_offset(time, offset)
554
- if time.kind_of?(Date)
565
+ if offset.zero?
566
+ time
567
+ elsif time.kind_of?(Date)
555
568
  time + Rational(offset, SECONDS_PER_DAY)
556
569
  else
557
570
  time + offset
@@ -57,13 +57,14 @@ module ActiveSupport
57
57
  "Caracas" => "America/Caracas",
58
58
  "La Paz" => "America/La_Paz",
59
59
  "Santiago" => "America/Santiago",
60
+ "Asuncion" => "America/Asuncion",
60
61
  "Newfoundland" => "America/St_Johns",
61
62
  "Brasilia" => "America/Sao_Paulo",
62
63
  "Buenos Aires" => "America/Argentina/Buenos_Aires",
63
64
  "Montevideo" => "America/Montevideo",
64
65
  "Georgetown" => "America/Guyana",
65
66
  "Puerto Rico" => "America/Puerto_Rico",
66
- "Greenland" => "America/Godthab",
67
+ "Greenland" => "America/Nuuk",
67
68
  "Mid-Atlantic" => "Atlantic/South_Georgia",
68
69
  "Azores" => "Atlantic/Azores",
69
70
  "Cape Verde Is." => "Atlantic/Cape_Verde",
@@ -208,9 +209,7 @@ module ActiveSupport
208
209
  TZInfo::Timezone.get(MAPPING[name] || name)
209
210
  end
210
211
 
211
- # :stopdoc:
212
- alias_method :create, :new
213
- # :startdoc:
212
+ alias_method :create, :new # :nodoc:
214
213
 
215
214
  # Returns a TimeZone instance with the given name, or +nil+ if no
216
215
  # such TimeZone instance exists. (This exists to support the use of
@@ -315,6 +314,12 @@ module ActiveSupport
315
314
  end
316
315
  # :startdoc:
317
316
 
317
+ # Returns a standard time zone name defined by IANA
318
+ # https://www.iana.org/time-zones
319
+ def standard_name
320
+ MAPPING[name] || name
321
+ end
322
+
318
323
  # Returns the offset of this time zone from UTC in seconds.
319
324
  def utc_offset
320
325
  @utc_offset || tzinfo&.current_period&.base_utc_offset
@@ -554,15 +559,11 @@ module ActiveSupport
554
559
  tzinfo.local_to_utc(time, dst)
555
560
  end
556
561
 
557
- # Available so that TimeZone instances respond like +TZInfo::Timezone+
558
- # instances.
559
- def period_for_utc(time)
562
+ def period_for_utc(time) # :nodoc:
560
563
  tzinfo.period_for_utc(time)
561
564
  end
562
565
 
563
- # Available so that TimeZone instances respond like +TZInfo::Timezone+
564
- # instances.
565
- def period_for_local(time, dst = true)
566
+ def period_for_local(time, dst = true) # :nodoc:
566
567
  tzinfo.period_for_local(time, dst) { |periods| periods.last }
567
568
  end
568
569
 
@@ -570,6 +571,14 @@ module ActiveSupport
570
571
  tzinfo.periods_for_local(time)
571
572
  end
572
573
 
574
+ def abbr(time) # :nodoc:
575
+ tzinfo.abbr(time)
576
+ end
577
+
578
+ def dst?(time) # :nodoc:
579
+ tzinfo.dst?(time)
580
+ end
581
+
573
582
  def init_with(coder) # :nodoc:
574
583
  initialize(coder["name"])
575
584
  end
@@ -62,11 +62,10 @@ module ActiveSupport
62
62
  "yaml" => Proc.new { |yaml| yaml.to_yaml }
63
63
  } unless defined?(FORMATTING)
64
64
 
65
- # TODO use regexp instead of Date.parse
66
65
  unless defined?(PARSING)
67
66
  PARSING = {
68
67
  "symbol" => Proc.new { |symbol| symbol.to_s.to_sym },
69
- "date" => Proc.new { |date| ::Date.parse(date) },
68
+ "date" => Proc.new { |date| ::Date.strptime(date, "%Y-%m-%d") },
70
69
  "datetime" => Proc.new { |time| Time.xmlschema(time).utc rescue ::DateTime.parse(time).utc },
71
70
  "duration" => Proc.new { |duration| Duration.parse(duration) },
72
71
  "integer" => Proc.new { |integer| integer.to_i },
@@ -74,6 +73,8 @@ module ActiveSupport
74
73
  "decimal" => Proc.new do |number|
75
74
  if String === number
76
75
  number.to_d
76
+ elsif Float === number
77
+ BigDecimal(number, 0)
77
78
  else
78
79
  BigDecimal(number)
79
80
  end
@@ -39,17 +39,22 @@ module ActiveSupport
39
39
  autoload :Concern
40
40
  autoload :CodeGenerator
41
41
  autoload :ActionableError
42
+ autoload :Configurable
42
43
  autoload :ConfigurationFile
44
+ autoload :ContinuousIntegration
43
45
  autoload :CurrentAttributes
44
46
  autoload :Dependencies
45
47
  autoload :DescendantsTracker
48
+ autoload :Editor
46
49
  autoload :ExecutionWrapper
47
50
  autoload :Executor
48
51
  autoload :ErrorReporter
52
+ autoload :EventReporter
49
53
  autoload :FileUpdateChecker
50
54
  autoload :EventedFileUpdateChecker
51
55
  autoload :ForkTracker
52
56
  autoload :LogSubscriber
57
+ autoload :StructuredEventSubscriber
53
58
  autoload :IsolatedExecutionState
54
59
  autoload :Notifications
55
60
  autoload :Reloader
@@ -57,11 +62,11 @@ module ActiveSupport
57
62
 
58
63
  eager_autoload do
59
64
  autoload :BacktraceCleaner
60
- autoload :ProxyObject
65
+ autoload :Benchmark
61
66
  autoload :Benchmarkable
62
67
  autoload :Cache
63
68
  autoload :Callbacks
64
- autoload :Configurable
69
+ autoload :ClassAttribute
65
70
  autoload :Deprecation
66
71
  autoload :Delegation
67
72
  autoload :Digest
@@ -98,10 +103,16 @@ module ActiveSupport
98
103
 
99
104
  cattr_accessor :test_order # :nodoc:
100
105
  cattr_accessor :test_parallelization_threshold, default: 50 # :nodoc:
106
+ cattr_accessor :parallelize_test_databases, default: true # :nodoc:
101
107
 
102
108
  @error_reporter = ActiveSupport::ErrorReporter.new
103
109
  singleton_class.attr_accessor :error_reporter # :nodoc:
104
110
 
111
+ @event_reporter = ActiveSupport::EventReporter.new
112
+ singleton_class.attr_accessor :event_reporter # :nodoc:
113
+
114
+ cattr_accessor :filter_parameters, default: [] # :nodoc:
115
+
105
116
  def self.cache_format_version
106
117
  Cache.format_version
107
118
  end
@@ -111,17 +122,18 @@ module ActiveSupport
111
122
  end
112
123
 
113
124
  def self.to_time_preserves_timezone
114
- DateAndTime::Compatibility.preserve_timezone
125
+ ActiveSupport.deprecator.warn(
126
+ "`config.active_support.to_time_preserves_timezone` is deprecated and will be removed in Rails 8.2"
127
+ )
128
+ @to_time_preserves_timezone
115
129
  end
116
130
 
117
131
  def self.to_time_preserves_timezone=(value)
118
- unless value
119
- ActiveSupport.deprecator.warn(
120
- "Support for the pre-Ruby 2.4 behavior of to_time has been deprecated and will be removed in Rails 8.0."
121
- )
122
- end
132
+ ActiveSupport.deprecator.warn(
133
+ "`config.active_support.to_time_preserves_timezone` is deprecated and will be removed in Rails 8.2"
134
+ )
123
135
 
124
- DateAndTime::Compatibility.preserve_timezone = value
136
+ @to_time_preserves_timezone = value
125
137
  end
126
138
 
127
139
  def self.utc_to_local_returns_utc_offset_times
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activesupport
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.2.2.1
4
+ version: 8.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Heinemeier Hansson
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2024-12-10 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: i18n
@@ -140,6 +139,20 @@ dependencies:
140
139
  - - ">="
141
140
  - !ruby/object:Gem::Version
142
141
  version: '0'
142
+ - !ruby/object:Gem::Dependency
143
+ name: json
144
+ requirement: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - ">="
147
+ - !ruby/object:Gem::Version
148
+ version: '0'
149
+ type: :runtime
150
+ prerelease: false
151
+ version_requirements: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - ">="
154
+ - !ruby/object:Gem::Version
155
+ version: '0'
143
156
  - !ruby/object:Gem::Dependency
144
157
  name: logger
145
158
  requirement: !ruby/object:Gem::Requirement
@@ -169,19 +182,19 @@ dependencies:
169
182
  - !ruby/object:Gem::Version
170
183
  version: '0.3'
171
184
  - !ruby/object:Gem::Dependency
172
- name: benchmark
185
+ name: uri
173
186
  requirement: !ruby/object:Gem::Requirement
174
187
  requirements:
175
188
  - - ">="
176
189
  - !ruby/object:Gem::Version
177
- version: '0.3'
190
+ version: 0.13.1
178
191
  type: :runtime
179
192
  prerelease: false
180
193
  version_requirements: !ruby/object:Gem::Requirement
181
194
  requirements:
182
195
  - - ">="
183
196
  - !ruby/object:Gem::Version
184
- version: '0.3'
197
+ version: 0.13.1
185
198
  description: A toolkit of support libraries and Ruby core extensions extracted from
186
199
  the Rails framework. Rich support for multibyte strings, internationalization, time
187
200
  zones, and testing.
@@ -198,6 +211,7 @@ files:
198
211
  - lib/active_support/all.rb
199
212
  - lib/active_support/array_inquirer.rb
200
213
  - lib/active_support/backtrace_cleaner.rb
214
+ - lib/active_support/benchmark.rb
201
215
  - lib/active_support/benchmarkable.rb
202
216
  - lib/active_support/broadcast_logger.rb
203
217
  - lib/active_support/builder.rb
@@ -213,13 +227,16 @@ files:
213
227
  - lib/active_support/cache/strategy/local_cache.rb
214
228
  - lib/active_support/cache/strategy/local_cache_middleware.rb
215
229
  - lib/active_support/callbacks.rb
230
+ - lib/active_support/class_attribute.rb
216
231
  - lib/active_support/code_generator.rb
217
232
  - lib/active_support/concern.rb
218
233
  - lib/active_support/concurrency/load_interlock_aware_monitor.rb
219
234
  - lib/active_support/concurrency/null_lock.rb
220
235
  - lib/active_support/concurrency/share_lock.rb
236
+ - lib/active_support/concurrency/thread_monitor.rb
221
237
  - lib/active_support/configurable.rb
222
238
  - lib/active_support/configuration_file.rb
239
+ - lib/active_support/continuous_integration.rb
223
240
  - lib/active_support/core_ext.rb
224
241
  - lib/active_support/core_ext/array.rb
225
242
  - lib/active_support/core_ext/array/access.rb
@@ -312,8 +329,8 @@ files:
312
329
  - lib/active_support/core_ext/range.rb
313
330
  - lib/active_support/core_ext/range/compare_range.rb
314
331
  - lib/active_support/core_ext/range/conversions.rb
315
- - lib/active_support/core_ext/range/each.rb
316
332
  - lib/active_support/core_ext/range/overlap.rb
333
+ - lib/active_support/core_ext/range/sole.rb
317
334
  - lib/active_support/core_ext/regexp.rb
318
335
  - lib/active_support/core_ext/securerandom.rb
319
336
  - lib/active_support/core_ext/string.rb
@@ -361,11 +378,14 @@ files:
361
378
  - lib/active_support/duration.rb
362
379
  - lib/active_support/duration/iso8601_parser.rb
363
380
  - lib/active_support/duration/iso8601_serializer.rb
381
+ - lib/active_support/editor.rb
364
382
  - lib/active_support/encrypted_configuration.rb
365
383
  - lib/active_support/encrypted_file.rb
366
384
  - lib/active_support/environment_inquirer.rb
367
385
  - lib/active_support/error_reporter.rb
368
386
  - lib/active_support/error_reporter/test_helper.rb
387
+ - lib/active_support/event_reporter.rb
388
+ - lib/active_support/event_reporter/test_helper.rb
369
389
  - lib/active_support/evented_file_update_checker.rb
370
390
  - lib/active_support/execution_context.rb
371
391
  - lib/active_support/execution_context/test_helper.rb
@@ -432,7 +452,6 @@ files:
432
452
  - lib/active_support/ordered_hash.rb
433
453
  - lib/active_support/ordered_options.rb
434
454
  - lib/active_support/parameter_filter.rb
435
- - lib/active_support/proxy_object.rb
436
455
  - lib/active_support/rails.rb
437
456
  - lib/active_support/railtie.rb
438
457
  - lib/active_support/reloader.rb
@@ -440,6 +459,7 @@ files:
440
459
  - lib/active_support/secure_compare_rotator.rb
441
460
  - lib/active_support/security_utils.rb
442
461
  - lib/active_support/string_inquirer.rb
462
+ - lib/active_support/structured_event_subscriber.rb
443
463
  - lib/active_support/subscriber.rb
444
464
  - lib/active_support/syntax_error_proxy.rb
445
465
  - lib/active_support/tagged_logging.rb
@@ -451,16 +471,17 @@ files:
451
471
  - lib/active_support/testing/declarative.rb
452
472
  - lib/active_support/testing/deprecation.rb
453
473
  - lib/active_support/testing/error_reporter_assertions.rb
474
+ - lib/active_support/testing/event_reporter_assertions.rb
454
475
  - lib/active_support/testing/file_fixtures.rb
455
476
  - lib/active_support/testing/isolation.rb
456
477
  - lib/active_support/testing/method_call_assertions.rb
478
+ - lib/active_support/testing/notification_assertions.rb
457
479
  - lib/active_support/testing/parallelization.rb
458
480
  - lib/active_support/testing/parallelization/server.rb
459
481
  - lib/active_support/testing/parallelization/worker.rb
460
482
  - lib/active_support/testing/parallelize_executor.rb
461
483
  - lib/active_support/testing/setup_and_teardown.rb
462
484
  - lib/active_support/testing/stream.rb
463
- - lib/active_support/testing/strict_warnings.rb
464
485
  - lib/active_support/testing/tagged_logging.rb
465
486
  - lib/active_support/testing/tests_without_assertions.rb
466
487
  - lib/active_support/testing/time_helpers.rb
@@ -480,12 +501,11 @@ licenses:
480
501
  - MIT
481
502
  metadata:
482
503
  bug_tracker_uri: https://github.com/rails/rails/issues
483
- changelog_uri: https://github.com/rails/rails/blob/v7.2.2.1/activesupport/CHANGELOG.md
484
- documentation_uri: https://api.rubyonrails.org/v7.2.2.1/
504
+ changelog_uri: https://github.com/rails/rails/blob/v8.1.3/activesupport/CHANGELOG.md
505
+ documentation_uri: https://api.rubyonrails.org/v8.1.3/
485
506
  mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
486
- source_code_uri: https://github.com/rails/rails/tree/v7.2.2.1/activesupport
507
+ source_code_uri: https://github.com/rails/rails/tree/v8.1.3/activesupport
487
508
  rubygems_mfa_required: 'true'
488
- post_install_message:
489
509
  rdoc_options:
490
510
  - "--encoding"
491
511
  - UTF-8
@@ -495,15 +515,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
495
515
  requirements:
496
516
  - - ">="
497
517
  - !ruby/object:Gem::Version
498
- version: 3.1.0
518
+ version: 3.2.0
499
519
  required_rubygems_version: !ruby/object:Gem::Requirement
500
520
  requirements:
501
521
  - - ">="
502
522
  - !ruby/object:Gem::Version
503
523
  version: '0'
504
524
  requirements: []
505
- rubygems_version: 3.5.22
506
- signing_key:
525
+ rubygems_version: 4.0.6
507
526
  specification_version: 4
508
527
  summary: A toolkit of support libraries and Ruby core extensions extracted from the
509
528
  Rails framework.
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "active_support/time_with_zone"
4
-
5
- module ActiveSupport
6
- module EachTimeWithZone # :nodoc:
7
- def each(&block)
8
- ensure_iteration_allowed
9
- super
10
- end
11
-
12
- def step(n = 1, &block)
13
- ensure_iteration_allowed
14
- super
15
- end
16
-
17
- private
18
- def ensure_iteration_allowed
19
- raise TypeError, "can't iterate from #{first.class}" if first.is_a?(TimeWithZone)
20
- end
21
- end
22
- end
23
-
24
- Range.prepend(ActiveSupport::EachTimeWithZone)
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ActiveSupport
4
- class ProxyObject < ::BasicObject # :nodoc:
5
- undef_method :==
6
- undef_method :equal?
7
-
8
- # Let ActiveSupport::ProxyObject at least raise exceptions.
9
- def raise(*args)
10
- ::Object.send(:raise, *args)
11
- end
12
-
13
- def self.inherited(_subclass)
14
- ::ActiveSupport.deprecator.warn(<<~MSG)
15
- ActiveSupport::ProxyObject is deprecated and will be removed in Rails 8.0.
16
- Use Ruby's built-in BasicObject instead.
17
- MSG
18
- end
19
- end
20
- end
@@ -1,43 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- $VERBOSE = true
4
- Warning[:deprecated] = true
5
-
6
- module ActiveSupport
7
- module RaiseWarnings # :nodoc:
8
- class WarningError < StandardError; end
9
-
10
- PROJECT_ROOT = File.expand_path("../../../../", __dir__)
11
- ALLOWED_WARNINGS = Regexp.union(
12
- /circular require considered harmful.*delayed_job/, # Bug in delayed job.
13
-
14
- # Expected non-verbose warning emitted by Rails.
15
- /Ignoring .*\.yml because it has expired/,
16
- /Failed to validate the schema cache because/,
17
-
18
- # TODO: We need to decide what to do with this.
19
- /Status code :unprocessable_entity is deprecated/
20
- )
21
-
22
- SUPPRESSED_WARNINGS = Regexp.union(
23
- # TODO: remove if https://github.com/mikel/mail/pull/1557 or similar fix
24
- %r{/lib/mail/parsers/.*statement not reached},
25
- %r{/lib/mail/parsers/.*assigned but unused variable - disp_type_s},
26
- %r{/lib/mail/parsers/.*assigned but unused variable - testEof}
27
- )
28
-
29
- def warn(message, ...)
30
- return if SUPPRESSED_WARNINGS.match?(message)
31
-
32
- super
33
-
34
- return unless message.include?(PROJECT_ROOT)
35
- return if ALLOWED_WARNINGS.match?(message)
36
- return unless ENV["RAILS_STRICT_WARNINGS"] || ENV["BUILDKITE"]
37
-
38
- raise WarningError.new(message)
39
- end
40
- end
41
- end
42
-
43
- Warning.singleton_class.prepend(ActiveSupport::RaiseWarnings)