activesupport 7.2.2.2 → 8.1.2

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 (135) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +368 -152
  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 +27 -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 +4 -14
  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/multibyte.rb +12 -3
  61. data/lib/active_support/core_ext/string/output_safety.rb +19 -12
  62. data/lib/active_support/core_ext/string.rb +13 -13
  63. data/lib/active_support/core_ext/symbol.rb +1 -1
  64. data/lib/active_support/core_ext/thread/backtrace/location.rb +2 -7
  65. data/lib/active_support/core_ext/time/calculations.rb +7 -2
  66. data/lib/active_support/core_ext/time/compatibility.rb +2 -19
  67. data/lib/active_support/core_ext/time/conversions.rb +2 -0
  68. data/lib/active_support/core_ext/time.rb +5 -5
  69. data/lib/active_support/core_ext.rb +1 -1
  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 +64 -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 +3 -3
  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 +32 -15
  92. data/lib/active_support/inflector/methods.rb +2 -2
  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 +157 -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.rb +22 -0
  111. data/lib/active_support/railtie.rb +32 -9
  112. data/lib/active_support/structured_event_subscriber.rb +99 -0
  113. data/lib/active_support/subscriber.rb +0 -5
  114. data/lib/active_support/syntax_error_proxy.rb +7 -0
  115. data/lib/active_support/tagged_logging.rb +5 -0
  116. data/lib/active_support/test_case.rb +67 -6
  117. data/lib/active_support/testing/assertions.rb +115 -27
  118. data/lib/active_support/testing/autorun.rb +5 -0
  119. data/lib/active_support/testing/error_reporter_assertions.rb +18 -1
  120. data/lib/active_support/testing/event_reporter_assertions.rb +227 -0
  121. data/lib/active_support/testing/isolation.rb +0 -2
  122. data/lib/active_support/testing/notification_assertions.rb +92 -0
  123. data/lib/active_support/testing/parallelization/server.rb +15 -2
  124. data/lib/active_support/testing/parallelization/worker.rb +8 -4
  125. data/lib/active_support/testing/parallelization.rb +25 -1
  126. data/lib/active_support/testing/tests_without_assertions.rb +1 -1
  127. data/lib/active_support/testing/time_helpers.rb +9 -4
  128. data/lib/active_support/time_with_zone.rb +36 -23
  129. data/lib/active_support/values/time_zone.rb +19 -10
  130. data/lib/active_support/xml_mini.rb +3 -2
  131. data/lib/active_support.rb +21 -9
  132. metadata +34 -12
  133. data/lib/active_support/core_ext/range/each.rb +0 -24
  134. data/lib/active_support/proxy_object.rb +0 -20
  135. 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,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activesupport
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.2.2.2
4
+ version: 8.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Heinemeier Hansson
@@ -139,6 +139,20 @@ dependencies:
139
139
  - - ">="
140
140
  - !ruby/object:Gem::Version
141
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'
142
156
  - !ruby/object:Gem::Dependency
143
157
  name: logger
144
158
  requirement: !ruby/object:Gem::Requirement
@@ -168,19 +182,19 @@ dependencies:
168
182
  - !ruby/object:Gem::Version
169
183
  version: '0.3'
170
184
  - !ruby/object:Gem::Dependency
171
- name: benchmark
185
+ name: uri
172
186
  requirement: !ruby/object:Gem::Requirement
173
187
  requirements:
174
188
  - - ">="
175
189
  - !ruby/object:Gem::Version
176
- version: '0.3'
190
+ version: 0.13.1
177
191
  type: :runtime
178
192
  prerelease: false
179
193
  version_requirements: !ruby/object:Gem::Requirement
180
194
  requirements:
181
195
  - - ">="
182
196
  - !ruby/object:Gem::Version
183
- version: '0.3'
197
+ version: 0.13.1
184
198
  description: A toolkit of support libraries and Ruby core extensions extracted from
185
199
  the Rails framework. Rich support for multibyte strings, internationalization, time
186
200
  zones, and testing.
@@ -197,6 +211,7 @@ files:
197
211
  - lib/active_support/all.rb
198
212
  - lib/active_support/array_inquirer.rb
199
213
  - lib/active_support/backtrace_cleaner.rb
214
+ - lib/active_support/benchmark.rb
200
215
  - lib/active_support/benchmarkable.rb
201
216
  - lib/active_support/broadcast_logger.rb
202
217
  - lib/active_support/builder.rb
@@ -212,13 +227,16 @@ files:
212
227
  - lib/active_support/cache/strategy/local_cache.rb
213
228
  - lib/active_support/cache/strategy/local_cache_middleware.rb
214
229
  - lib/active_support/callbacks.rb
230
+ - lib/active_support/class_attribute.rb
215
231
  - lib/active_support/code_generator.rb
216
232
  - lib/active_support/concern.rb
217
233
  - lib/active_support/concurrency/load_interlock_aware_monitor.rb
218
234
  - lib/active_support/concurrency/null_lock.rb
219
235
  - lib/active_support/concurrency/share_lock.rb
236
+ - lib/active_support/concurrency/thread_monitor.rb
220
237
  - lib/active_support/configurable.rb
221
238
  - lib/active_support/configuration_file.rb
239
+ - lib/active_support/continuous_integration.rb
222
240
  - lib/active_support/core_ext.rb
223
241
  - lib/active_support/core_ext/array.rb
224
242
  - lib/active_support/core_ext/array/access.rb
@@ -311,8 +329,8 @@ files:
311
329
  - lib/active_support/core_ext/range.rb
312
330
  - lib/active_support/core_ext/range/compare_range.rb
313
331
  - lib/active_support/core_ext/range/conversions.rb
314
- - lib/active_support/core_ext/range/each.rb
315
332
  - lib/active_support/core_ext/range/overlap.rb
333
+ - lib/active_support/core_ext/range/sole.rb
316
334
  - lib/active_support/core_ext/regexp.rb
317
335
  - lib/active_support/core_ext/securerandom.rb
318
336
  - lib/active_support/core_ext/string.rb
@@ -360,11 +378,14 @@ files:
360
378
  - lib/active_support/duration.rb
361
379
  - lib/active_support/duration/iso8601_parser.rb
362
380
  - lib/active_support/duration/iso8601_serializer.rb
381
+ - lib/active_support/editor.rb
363
382
  - lib/active_support/encrypted_configuration.rb
364
383
  - lib/active_support/encrypted_file.rb
365
384
  - lib/active_support/environment_inquirer.rb
366
385
  - lib/active_support/error_reporter.rb
367
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
368
389
  - lib/active_support/evented_file_update_checker.rb
369
390
  - lib/active_support/execution_context.rb
370
391
  - lib/active_support/execution_context/test_helper.rb
@@ -431,7 +452,6 @@ files:
431
452
  - lib/active_support/ordered_hash.rb
432
453
  - lib/active_support/ordered_options.rb
433
454
  - lib/active_support/parameter_filter.rb
434
- - lib/active_support/proxy_object.rb
435
455
  - lib/active_support/rails.rb
436
456
  - lib/active_support/railtie.rb
437
457
  - lib/active_support/reloader.rb
@@ -439,6 +459,7 @@ files:
439
459
  - lib/active_support/secure_compare_rotator.rb
440
460
  - lib/active_support/security_utils.rb
441
461
  - lib/active_support/string_inquirer.rb
462
+ - lib/active_support/structured_event_subscriber.rb
442
463
  - lib/active_support/subscriber.rb
443
464
  - lib/active_support/syntax_error_proxy.rb
444
465
  - lib/active_support/tagged_logging.rb
@@ -450,16 +471,17 @@ files:
450
471
  - lib/active_support/testing/declarative.rb
451
472
  - lib/active_support/testing/deprecation.rb
452
473
  - lib/active_support/testing/error_reporter_assertions.rb
474
+ - lib/active_support/testing/event_reporter_assertions.rb
453
475
  - lib/active_support/testing/file_fixtures.rb
454
476
  - lib/active_support/testing/isolation.rb
455
477
  - lib/active_support/testing/method_call_assertions.rb
478
+ - lib/active_support/testing/notification_assertions.rb
456
479
  - lib/active_support/testing/parallelization.rb
457
480
  - lib/active_support/testing/parallelization/server.rb
458
481
  - lib/active_support/testing/parallelization/worker.rb
459
482
  - lib/active_support/testing/parallelize_executor.rb
460
483
  - lib/active_support/testing/setup_and_teardown.rb
461
484
  - lib/active_support/testing/stream.rb
462
- - lib/active_support/testing/strict_warnings.rb
463
485
  - lib/active_support/testing/tagged_logging.rb
464
486
  - lib/active_support/testing/tests_without_assertions.rb
465
487
  - lib/active_support/testing/time_helpers.rb
@@ -479,10 +501,10 @@ licenses:
479
501
  - MIT
480
502
  metadata:
481
503
  bug_tracker_uri: https://github.com/rails/rails/issues
482
- changelog_uri: https://github.com/rails/rails/blob/v7.2.2.2/activesupport/CHANGELOG.md
483
- documentation_uri: https://api.rubyonrails.org/v7.2.2.2/
504
+ changelog_uri: https://github.com/rails/rails/blob/v8.1.2/activesupport/CHANGELOG.md
505
+ documentation_uri: https://api.rubyonrails.org/v8.1.2/
484
506
  mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
485
- source_code_uri: https://github.com/rails/rails/tree/v7.2.2.2/activesupport
507
+ source_code_uri: https://github.com/rails/rails/tree/v8.1.2/activesupport
486
508
  rubygems_mfa_required: 'true'
487
509
  rdoc_options:
488
510
  - "--encoding"
@@ -493,14 +515,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
493
515
  requirements:
494
516
  - - ">="
495
517
  - !ruby/object:Gem::Version
496
- version: 3.1.0
518
+ version: 3.2.0
497
519
  required_rubygems_version: !ruby/object:Gem::Requirement
498
520
  requirements:
499
521
  - - ">="
500
522
  - !ruby/object:Gem::Version
501
523
  version: '0'
502
524
  requirements: []
503
- rubygems_version: 3.6.9
525
+ rubygems_version: 4.0.3
504
526
  specification_version: 4
505
527
  summary: A toolkit of support libraries and Ruby core extensions extracted from the
506
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)