activesupport 7.0.8 → 7.1.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (170) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +736 -293
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +4 -4
  5. data/lib/active_support/actionable_error.rb +3 -1
  6. data/lib/active_support/array_inquirer.rb +2 -0
  7. data/lib/active_support/backtrace_cleaner.rb +25 -5
  8. data/lib/active_support/benchmarkable.rb +1 -0
  9. data/lib/active_support/builder.rb +1 -1
  10. data/lib/active_support/cache/coder.rb +153 -0
  11. data/lib/active_support/cache/entry.rb +128 -0
  12. data/lib/active_support/cache/file_store.rb +36 -9
  13. data/lib/active_support/cache/mem_cache_store.rb +84 -68
  14. data/lib/active_support/cache/memory_store.rb +76 -24
  15. data/lib/active_support/cache/null_store.rb +6 -0
  16. data/lib/active_support/cache/redis_cache_store.rb +126 -131
  17. data/lib/active_support/cache/serializer_with_fallback.rb +175 -0
  18. data/lib/active_support/cache/strategy/local_cache.rb +20 -8
  19. data/lib/active_support/cache.rb +304 -246
  20. data/lib/active_support/callbacks.rb +38 -18
  21. data/lib/active_support/concern.rb +4 -2
  22. data/lib/active_support/concurrency/load_interlock_aware_monitor.rb +42 -3
  23. data/lib/active_support/concurrency/null_lock.rb +13 -0
  24. data/lib/active_support/configurable.rb +10 -0
  25. data/lib/active_support/core_ext/array/conversions.rb +2 -1
  26. data/lib/active_support/core_ext/array.rb +0 -1
  27. data/lib/active_support/core_ext/class/subclasses.rb +13 -10
  28. data/lib/active_support/core_ext/date/conversions.rb +1 -0
  29. data/lib/active_support/core_ext/date.rb +0 -1
  30. data/lib/active_support/core_ext/date_and_time/calculations.rb +10 -0
  31. data/lib/active_support/core_ext/date_time/conversions.rb +6 -2
  32. data/lib/active_support/core_ext/date_time.rb +0 -1
  33. data/lib/active_support/core_ext/digest/uuid.rb +1 -10
  34. data/lib/active_support/core_ext/enumerable.rb +3 -75
  35. data/lib/active_support/core_ext/erb/util.rb +196 -0
  36. data/lib/active_support/core_ext/hash/conversions.rb +1 -1
  37. data/lib/active_support/core_ext/module/attribute_accessors.rb +6 -0
  38. data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +34 -16
  39. data/lib/active_support/core_ext/module/delegation.rb +40 -11
  40. data/lib/active_support/core_ext/module/deprecation.rb +15 -12
  41. data/lib/active_support/core_ext/module/introspection.rb +0 -1
  42. data/lib/active_support/core_ext/numeric/bytes.rb +9 -0
  43. data/lib/active_support/core_ext/numeric/conversions.rb +2 -0
  44. data/lib/active_support/core_ext/numeric.rb +0 -1
  45. data/lib/active_support/core_ext/object/deep_dup.rb +16 -0
  46. data/lib/active_support/core_ext/object/inclusion.rb +13 -5
  47. data/lib/active_support/core_ext/object/instance_variables.rb +22 -12
  48. data/lib/active_support/core_ext/object/json.rb +10 -2
  49. data/lib/active_support/core_ext/object/with.rb +44 -0
  50. data/lib/active_support/core_ext/object/with_options.rb +3 -3
  51. data/lib/active_support/core_ext/object.rb +1 -0
  52. data/lib/active_support/core_ext/pathname/blank.rb +16 -0
  53. data/lib/active_support/core_ext/pathname/existence.rb +2 -0
  54. data/lib/active_support/core_ext/pathname.rb +1 -0
  55. data/lib/active_support/core_ext/range/conversions.rb +28 -7
  56. data/lib/active_support/core_ext/range/{overlaps.rb → overlap.rb} +5 -3
  57. data/lib/active_support/core_ext/range.rb +1 -2
  58. data/lib/active_support/core_ext/securerandom.rb +24 -12
  59. data/lib/active_support/core_ext/string/filters.rb +20 -14
  60. data/lib/active_support/core_ext/string/inflections.rb +16 -5
  61. data/lib/active_support/core_ext/string/output_safety.rb +38 -174
  62. data/lib/active_support/core_ext/thread/backtrace/location.rb +12 -0
  63. data/lib/active_support/core_ext/time/calculations.rb +18 -2
  64. data/lib/active_support/core_ext/time/conversions.rb +2 -2
  65. data/lib/active_support/core_ext/time/zones.rb +4 -4
  66. data/lib/active_support/core_ext/time.rb +0 -1
  67. data/lib/active_support/current_attributes.rb +15 -6
  68. data/lib/active_support/dependencies/autoload.rb +17 -12
  69. data/lib/active_support/deprecation/behaviors.rb +53 -32
  70. data/lib/active_support/deprecation/constant_accessor.rb +5 -4
  71. data/lib/active_support/deprecation/deprecators.rb +104 -0
  72. data/lib/active_support/deprecation/disallowed.rb +3 -5
  73. data/lib/active_support/deprecation/instance_delegator.rb +31 -4
  74. data/lib/active_support/deprecation/method_wrappers.rb +6 -23
  75. data/lib/active_support/deprecation/proxy_wrappers.rb +37 -22
  76. data/lib/active_support/deprecation/reporting.rb +35 -21
  77. data/lib/active_support/deprecation.rb +32 -5
  78. data/lib/active_support/deprecator.rb +7 -0
  79. data/lib/active_support/descendants_tracker.rb +104 -132
  80. data/lib/active_support/duration/iso8601_serializer.rb +0 -2
  81. data/lib/active_support/duration.rb +2 -1
  82. data/lib/active_support/encrypted_configuration.rb +30 -9
  83. data/lib/active_support/encrypted_file.rb +8 -3
  84. data/lib/active_support/environment_inquirer.rb +22 -2
  85. data/lib/active_support/error_reporter/test_helper.rb +15 -0
  86. data/lib/active_support/error_reporter.rb +121 -35
  87. data/lib/active_support/execution_wrapper.rb +4 -4
  88. data/lib/active_support/file_update_checker.rb +4 -2
  89. data/lib/active_support/fork_tracker.rb +10 -2
  90. data/lib/active_support/gem_version.rb +4 -4
  91. data/lib/active_support/gzip.rb +2 -0
  92. data/lib/active_support/hash_with_indifferent_access.rb +35 -17
  93. data/lib/active_support/i18n.rb +1 -1
  94. data/lib/active_support/i18n_railtie.rb +20 -13
  95. data/lib/active_support/inflector/inflections.rb +2 -0
  96. data/lib/active_support/inflector/methods.rb +22 -10
  97. data/lib/active_support/inflector/transliterate.rb +3 -1
  98. data/lib/active_support/isolated_execution_state.rb +26 -22
  99. data/lib/active_support/json/decoding.rb +2 -1
  100. data/lib/active_support/json/encoding.rb +25 -43
  101. data/lib/active_support/key_generator.rb +9 -1
  102. data/lib/active_support/lazy_load_hooks.rb +6 -4
  103. data/lib/active_support/locale/en.yml +2 -0
  104. data/lib/active_support/log_subscriber.rb +78 -33
  105. data/lib/active_support/logger.rb +1 -1
  106. data/lib/active_support/logger_thread_safe_level.rb +9 -21
  107. data/lib/active_support/message_encryptor.rb +197 -53
  108. data/lib/active_support/message_encryptors.rb +140 -0
  109. data/lib/active_support/message_pack/cache_serializer.rb +23 -0
  110. data/lib/active_support/message_pack/extensions.rb +292 -0
  111. data/lib/active_support/message_pack/serializer.rb +63 -0
  112. data/lib/active_support/message_pack.rb +50 -0
  113. data/lib/active_support/message_verifier.rb +212 -93
  114. data/lib/active_support/message_verifiers.rb +134 -0
  115. data/lib/active_support/messages/codec.rb +65 -0
  116. data/lib/active_support/messages/metadata.rb +111 -45
  117. data/lib/active_support/messages/rotation_coordinator.rb +93 -0
  118. data/lib/active_support/messages/rotator.rb +34 -32
  119. data/lib/active_support/messages/serializer_with_fallback.rb +158 -0
  120. data/lib/active_support/multibyte/chars.rb +2 -0
  121. data/lib/active_support/multibyte/unicode.rb +9 -37
  122. data/lib/active_support/notifications/fanout.rb +239 -81
  123. data/lib/active_support/notifications/instrumenter.rb +71 -14
  124. data/lib/active_support/notifications.rb +1 -1
  125. data/lib/active_support/number_helper/number_converter.rb +2 -2
  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 -0
  128. data/lib/active_support/ordered_hash.rb +3 -3
  129. data/lib/active_support/ordered_options.rb +14 -0
  130. data/lib/active_support/parameter_filter.rb +84 -69
  131. data/lib/active_support/proxy_object.rb +2 -0
  132. data/lib/active_support/railtie.rb +33 -21
  133. data/lib/active_support/reloader.rb +12 -4
  134. data/lib/active_support/rescuable.rb +2 -0
  135. data/lib/active_support/secure_compare_rotator.rb +16 -9
  136. data/lib/active_support/string_inquirer.rb +3 -1
  137. data/lib/active_support/subscriber.rb +9 -27
  138. data/lib/active_support/syntax_error_proxy.rb +49 -0
  139. data/lib/active_support/tagged_logging.rb +60 -24
  140. data/lib/active_support/test_case.rb +153 -6
  141. data/lib/active_support/testing/assertions.rb +25 -9
  142. data/lib/active_support/testing/autorun.rb +0 -2
  143. data/lib/active_support/testing/constant_stubbing.rb +32 -0
  144. data/lib/active_support/testing/deprecation.rb +25 -25
  145. data/lib/active_support/testing/error_reporter_assertions.rb +108 -0
  146. data/lib/active_support/testing/isolation.rb +1 -1
  147. data/lib/active_support/testing/method_call_assertions.rb +21 -8
  148. data/lib/active_support/testing/parallelize_executor.rb +8 -3
  149. data/lib/active_support/testing/stream.rb +1 -1
  150. data/lib/active_support/testing/strict_warnings.rb +38 -0
  151. data/lib/active_support/testing/time_helpers.rb +32 -14
  152. data/lib/active_support/time_with_zone.rb +4 -14
  153. data/lib/active_support/values/time_zone.rb +9 -7
  154. data/lib/active_support/version.rb +1 -1
  155. data/lib/active_support/xml_mini/jdom.rb +3 -10
  156. data/lib/active_support/xml_mini/nokogiri.rb +1 -1
  157. data/lib/active_support/xml_mini/nokogirisax.rb +1 -1
  158. data/lib/active_support/xml_mini/rexml.rb +1 -1
  159. data/lib/active_support/xml_mini.rb +2 -2
  160. data/lib/active_support.rb +13 -3
  161. metadata +102 -17
  162. data/lib/active_support/core_ext/array/deprecated_conversions.rb +0 -25
  163. data/lib/active_support/core_ext/date/deprecated_conversions.rb +0 -40
  164. data/lib/active_support/core_ext/date_time/deprecated_conversions.rb +0 -36
  165. data/lib/active_support/core_ext/numeric/deprecated_conversions.rb +0 -60
  166. data/lib/active_support/core_ext/range/deprecated_conversions.rb +0 -36
  167. data/lib/active_support/core_ext/range/include_time_with_zone.rb +0 -5
  168. data/lib/active_support/core_ext/time/deprecated_conversions.rb +0 -73
  169. data/lib/active_support/core_ext/uri.rb +0 -5
  170. data/lib/active_support/per_thread_registry.rb +0 -65
@@ -9,7 +9,9 @@ require "active_support/core_ext/object/blank"
9
9
  require "thread"
10
10
 
11
11
  module ActiveSupport
12
- # Callbacks are code hooks that are run at key points in an object's life cycle.
12
+ # = Active Support \Callbacks
13
+ #
14
+ # \Callbacks are code hooks that are run at key points in an object's life cycle.
13
15
  # The typical use case is to have a base class define a set of callbacks
14
16
  # relevant to the other functionality it supplies, so that subclasses can
15
17
  # install callbacks that enhance or modify the base functionality without
@@ -68,7 +70,7 @@ module ActiveSupport
68
70
  class_attribute :__callbacks, instance_writer: false, default: {}
69
71
  end
70
72
 
71
- CALLBACK_FILTER_TYPES = [:before, :after, :around]
73
+ CALLBACK_FILTER_TYPES = [:before, :after, :around].freeze
72
74
 
73
75
  # Runs the callbacks for the given event.
74
76
  #
@@ -92,14 +94,15 @@ module ActiveSupport
92
94
  # callback can be as noisy as it likes -- but when control has passed
93
95
  # smoothly through and into the supplied block, we want as little evidence
94
96
  # as possible that we were here.
95
- def run_callbacks(kind)
97
+ def run_callbacks(kind, type = nil)
96
98
  callbacks = __callbacks[kind.to_sym]
97
99
 
98
100
  if callbacks.empty?
99
101
  yield if block_given?
100
102
  else
101
103
  env = Filters::Environment.new(self, false, nil)
102
- next_sequence = callbacks.compile
104
+
105
+ next_sequence = callbacks.compile(type)
103
106
 
104
107
  # Common case: no 'around' callbacks defined
105
108
  if next_sequence.final?
@@ -612,7 +615,8 @@ module ActiveSupport
612
615
  terminator: default_terminator
613
616
  }.merge!(config)
614
617
  @chain = []
615
- @callbacks = nil
618
+ @all_callbacks = nil
619
+ @single_callbacks = {}
616
620
  @mutex = Mutex.new
617
621
  end
618
622
 
@@ -621,32 +625,45 @@ module ActiveSupport
621
625
  def empty?; @chain.empty?; end
622
626
 
623
627
  def insert(index, o)
624
- @callbacks = nil
628
+ @all_callbacks = nil
629
+ @single_callbacks.clear
625
630
  @chain.insert(index, o)
626
631
  end
627
632
 
628
633
  def delete(o)
629
- @callbacks = nil
634
+ @all_callbacks = nil
635
+ @single_callbacks.clear
630
636
  @chain.delete(o)
631
637
  end
632
638
 
633
639
  def clear
634
- @callbacks = nil
640
+ @all_callbacks = nil
641
+ @single_callbacks.clear
635
642
  @chain.clear
636
643
  self
637
644
  end
638
645
 
639
646
  def initialize_copy(other)
640
- @callbacks = nil
647
+ @all_callbacks = nil
648
+ @single_callbacks = {}
641
649
  @chain = other.chain.dup
642
650
  @mutex = Mutex.new
643
651
  end
644
652
 
645
- def compile
646
- @callbacks || @mutex.synchronize do
647
- final_sequence = CallbackSequence.new
648
- @callbacks ||= @chain.reverse.inject(final_sequence) do |callback_sequence, callback|
649
- callback.apply callback_sequence
653
+ def compile(type)
654
+ if type.nil?
655
+ @all_callbacks || @mutex.synchronize do
656
+ final_sequence = CallbackSequence.new
657
+ @all_callbacks ||= @chain.reverse.inject(final_sequence) do |callback_sequence, callback|
658
+ callback.apply(callback_sequence)
659
+ end
660
+ end
661
+ else
662
+ @single_callbacks[type] || @mutex.synchronize do
663
+ final_sequence = CallbackSequence.new
664
+ @single_callbacks[type] ||= @chain.reverse.inject(final_sequence) do |callback_sequence, callback|
665
+ type == callback.kind ? callback.apply(callback_sequence) : callback_sequence
666
+ end
650
667
  end
651
668
  end
652
669
  end
@@ -664,19 +681,22 @@ module ActiveSupport
664
681
 
665
682
  private
666
683
  def append_one(callback)
667
- @callbacks = nil
684
+ @all_callbacks = nil
685
+ @single_callbacks.clear
668
686
  remove_duplicates(callback)
669
687
  @chain.push(callback)
670
688
  end
671
689
 
672
690
  def prepend_one(callback)
673
- @callbacks = nil
691
+ @all_callbacks = nil
692
+ @single_callbacks.clear
674
693
  remove_duplicates(callback)
675
694
  @chain.unshift(callback)
676
695
  end
677
696
 
678
697
  def remove_duplicates(callback)
679
- @callbacks = nil
698
+ @all_callbacks = nil
699
+ @single_callbacks.clear
680
700
  @chain.delete_if { |c| callback.duplicates?(c) }
681
701
  end
682
702
 
@@ -703,7 +723,7 @@ module ActiveSupport
703
723
  # This is used internally to append, prepend and skip callbacks to the
704
724
  # CallbackChain.
705
725
  def __update_callbacks(name) # :nodoc:
706
- ([self] + self.descendants).reverse_each do |target|
726
+ self.descendants.prepend(self).reverse_each do |target|
707
727
  chain = target.get_callbacks name
708
728
  yield target, chain.dup
709
729
  end
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActiveSupport
4
+ # = Active Support \Concern
5
+ #
4
6
  # A typical module looks like this:
5
7
  #
6
8
  # module M
@@ -16,7 +18,7 @@ module ActiveSupport
16
18
  # end
17
19
  # end
18
20
  #
19
- # By using <tt>ActiveSupport::Concern</tt> the above module could instead be
21
+ # By using +ActiveSupport::Concern+ the above module could instead be
20
22
  # written as:
21
23
  #
22
24
  # require "active_support/concern"
@@ -73,7 +75,7 @@ module ActiveSupport
73
75
  # end
74
76
  #
75
77
  # Unfortunately this won't work, since when +Foo+ is included, its <tt>base</tt>
76
- # is the +Bar+ module, not the +Host+ class. With <tt>ActiveSupport::Concern</tt>,
78
+ # is the +Bar+ module, not the +Host+ class. With +ActiveSupport::Concern+,
77
79
  # module dependencies are properly resolved:
78
80
  #
79
81
  # require "active_support/concern"
@@ -4,9 +4,7 @@ require "monitor"
4
4
 
5
5
  module ActiveSupport
6
6
  module Concurrency
7
- # A monitor that will permit dependency loading while blocked waiting for
8
- # the lock.
9
- class LoadInterlockAwareMonitor < Monitor
7
+ module LoadInterlockAwareMonitorMixin # :nodoc:
10
8
  EXCEPTION_NEVER = { Exception => :never }.freeze
11
9
  EXCEPTION_IMMEDIATE = { Exception => :immediate }.freeze
12
10
  private_constant :EXCEPTION_NEVER, :EXCEPTION_IMMEDIATE
@@ -29,5 +27,46 @@ module ActiveSupport
29
27
  end
30
28
  end
31
29
  end
30
+ # A monitor that will permit dependency loading while blocked waiting for
31
+ # the lock.
32
+ class LoadInterlockAwareMonitor < Monitor
33
+ include LoadInterlockAwareMonitorMixin
34
+ end
35
+
36
+ class ThreadLoadInterlockAwareMonitor # :nodoc:
37
+ prepend LoadInterlockAwareMonitorMixin
38
+
39
+ def initialize
40
+ @owner = nil
41
+ @count = 0
42
+ @mutex = Mutex.new
43
+ end
44
+
45
+ private
46
+ def mon_try_enter
47
+ if @owner != Thread.current
48
+ return false unless @mutex.try_lock
49
+ @owner = Thread.current
50
+ end
51
+ @count += 1
52
+ end
53
+
54
+ def mon_enter
55
+ @mutex.lock if @owner != Thread.current
56
+ @owner = Thread.current
57
+ @count += 1
58
+ end
59
+
60
+ def mon_exit
61
+ unless @owner == Thread.current
62
+ raise ThreadError, "current thread not owner"
63
+ end
64
+
65
+ @count -= 1
66
+ return unless @count == 0
67
+ @owner = nil
68
+ @mutex.unlock
69
+ end
70
+ end
32
71
  end
33
72
  end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveSupport
4
+ module Concurrency
5
+ module NullLock # :nodoc:
6
+ extend self
7
+
8
+ def synchronize
9
+ yield
10
+ end
11
+ end
12
+ end
13
+ end
@@ -4,6 +4,8 @@ require "active_support/concern"
4
4
  require "active_support/ordered_options"
5
5
 
6
6
  module ActiveSupport
7
+ # = Active Support \Configurable
8
+ #
7
9
  # Configurable provides a <tt>config</tt> method to store and retrieve
8
10
  # configuration options as an OrderedOptions.
9
11
  module Configurable
@@ -125,6 +127,14 @@ module ActiveSupport
125
127
  end
126
128
  end
127
129
  private :config_accessor
130
+
131
+ private
132
+ def inherited(subclass)
133
+ super
134
+ subclass.class_eval do
135
+ @_config = nil
136
+ end
137
+ end
128
138
  end
129
139
 
130
140
  # Reads and writes attributes from a configuration OrderedOptions.
@@ -100,11 +100,12 @@ class Array
100
100
  collect(&:id).join(",")
101
101
  end
102
102
  else
103
- to_default_s
103
+ to_s
104
104
  end
105
105
  end
106
106
  alias_method :to_formatted_s, :to_fs
107
107
  alias_method :to_default_s, :to_s
108
+ deprecate to_default_s: :to_s, deprecator: ActiveSupport.deprecator
108
109
 
109
110
  # Returns a string that represents the array in XML by invoking +to_xml+
110
111
  # on each element. Active Record collections delegate their representation
@@ -3,7 +3,6 @@
3
3
  require "active_support/core_ext/array/wrap"
4
4
  require "active_support/core_ext/array/access"
5
5
  require "active_support/core_ext/array/conversions"
6
- require "active_support/core_ext/array/deprecated_conversions" unless ENV["RAILS_DISABLE_DEPRECATED_TO_S_CONVERSION"]
7
6
  require "active_support/core_ext/array/extract"
8
7
  require "active_support/core_ext/array/extract_options"
9
8
  require "active_support/core_ext/array/grouping"
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "active_support/ruby_features"
4
+ require "active_support/descendants_tracker"
4
5
 
5
6
  class Class
6
7
  if ActiveSupport::RubyFeatures::CLASS_SUBCLASSES
@@ -26,16 +27,18 @@ class Class
26
27
  k.singleton_class? || k == self
27
28
  end
28
29
  end
30
+
31
+ # Returns an array with the direct children of +self+.
32
+ #
33
+ # class Foo; end
34
+ # class Bar < Foo; end
35
+ # class Baz < Bar; end
36
+ #
37
+ # Foo.subclasses # => [Bar]
38
+ def subclasses
39
+ descendants.select { |descendant| descendant.superclass == self }
40
+ end
29
41
  end
30
42
 
31
- # Returns an array with the direct children of +self+.
32
- #
33
- # class Foo; end
34
- # class Bar < Foo; end
35
- # class Baz < Bar; end
36
- #
37
- # Foo.subclasses # => [Bar]
38
- def subclasses
39
- descendants.select { |descendant| descendant.superclass == self }
40
- end unless ActiveSupport::RubyFeatures::CLASS_SUBCLASSES
43
+ prepend ActiveSupport::DescendantsTracker::ReloadedClassesFiltering
41
44
  end
@@ -57,6 +57,7 @@ class Date
57
57
  end
58
58
  alias_method :to_formatted_s, :to_fs
59
59
  alias_method :to_default_s, :to_s
60
+ deprecate to_default_s: :to_s, deprecator: ActiveSupport.deprecator
60
61
 
61
62
  # Overrides the default inspect method with a human readable one, e.g., "Mon, 21 Feb 2005"
62
63
  def readable_inspect
@@ -4,5 +4,4 @@ require "active_support/core_ext/date/acts_like"
4
4
  require "active_support/core_ext/date/blank"
5
5
  require "active_support/core_ext/date/calculations"
6
6
  require "active_support/core_ext/date/conversions"
7
- require "active_support/core_ext/date/deprecated_conversions" unless ENV["RAILS_DISABLE_DEPRECATED_TO_S_CONVERSION"]
8
7
  require "active_support/core_ext/date/zones"
@@ -157,6 +157,16 @@ module DateAndTime
157
157
  end
158
158
  alias :at_end_of_quarter :end_of_quarter
159
159
 
160
+ # Returns the quarter for a date/time.
161
+ #
162
+ # Date.new(2010, 1, 31).quarter # => 1
163
+ # Date.new(2010, 4, 12).quarter # => 2
164
+ # Date.new(2010, 9, 15).quarter # => 3
165
+ # Date.new(2010, 12, 25).quarter # => 4
166
+ def quarter
167
+ (month / 3.0).ceil
168
+ end
169
+
160
170
  # Returns a new date/time at the beginning of the year.
161
171
  #
162
172
  # today = Date.today # => Fri, 10 Jul 2015
@@ -36,11 +36,15 @@ class DateTime
36
36
  if formatter = ::Time::DATE_FORMATS[format]
37
37
  formatter.respond_to?(:call) ? formatter.call(self).to_s : strftime(formatter)
38
38
  else
39
- to_default_s
39
+ to_s
40
40
  end
41
41
  end
42
42
  alias_method :to_formatted_s, :to_fs
43
- alias_method :to_default_s, :to_s if instance_methods(false).include?(:to_s)
43
+ if instance_methods(false).include?(:to_s)
44
+ alias_method :to_default_s, :to_s
45
+ deprecate to_default_s: :to_s, deprecator: ActiveSupport.deprecator
46
+ end
47
+
44
48
 
45
49
  # Returns a formatted string of the offset from UTC, or an alternative
46
50
  # string if the time zone is already UTC.
@@ -5,4 +5,3 @@ require "active_support/core_ext/date_time/blank"
5
5
  require "active_support/core_ext/date_time/calculations"
6
6
  require "active_support/core_ext/date_time/compatibility"
7
7
  require "active_support/core_ext/date_time/conversions"
8
- require "active_support/core_ext/date_time/deprecated_conversions" unless ENV["RAILS_DISABLE_DEPRECATED_TO_S_CONVERSION"]
@@ -10,8 +10,6 @@ module Digest
10
10
  OID_NAMESPACE = "k\xA7\xB8\x12\x9D\xAD\x11\xD1\x80\xB4\x00\xC0O\xD40\xC8" # :nodoc:
11
11
  X500_NAMESPACE = "k\xA7\xB8\x14\x9D\xAD\x11\xD1\x80\xB4\x00\xC0O\xD40\xC8" # :nodoc:
12
12
 
13
- mattr_accessor :use_rfc4122_namespaced_uuids, instance_accessor: false, default: false
14
-
15
13
  # Generates a v5 non-random UUID (Universally Unique IDentifier).
16
14
  #
17
15
  # Using OpenSSL::Digest::MD5 generates version 3 UUIDs; OpenSSL::Digest::SHA1 generates version 5 UUIDs.
@@ -58,19 +56,12 @@ module Digest
58
56
  def self.pack_uuid_namespace(namespace)
59
57
  if [DNS_NAMESPACE, OID_NAMESPACE, URL_NAMESPACE, X500_NAMESPACE].include?(namespace)
60
58
  namespace
61
- elsif use_rfc4122_namespaced_uuids == true
59
+ else
62
60
  match_data = namespace.match(/\A(\h{8})-(\h{4})-(\h{4})-(\h{4})-(\h{4})(\h{8})\z/)
63
61
 
64
62
  raise ArgumentError, "Only UUIDs are valid namespace identifiers" unless match_data.present?
65
63
 
66
64
  match_data.captures.map { |s| s.to_i(16) }.pack("NnnnnN")
67
- else
68
- ActiveSupport::Deprecation.warn <<~WARNING.squish
69
- Providing a namespace ID that is not one of the constants defined on Digest::UUID generates an incorrect UUID value according to RFC 4122.
70
- To enable the correct behavior, set the Rails.application.config.active_support.use_rfc4122_namespaced_uuids configuration option to true.
71
- WARNING
72
-
73
- namespace
74
65
  end
75
66
  end
76
67
 
@@ -25,18 +25,6 @@ module Enumerable
25
25
  ActiveSupport::EnumerableCoreExt::SoleItemExpectedError = remove_const(:SoleItemExpectedError)
26
26
  singleton_class.prepend(ActiveSupport::EnumerableCoreExt::Constants)
27
27
 
28
- # Enumerable#sum was added in Ruby 2.4, but it only works with Numeric elements
29
- # when we omit an identity.
30
-
31
- # :stopdoc:
32
-
33
- # We can't use Refinements here because Refinements with Module which will be prepended
34
- # doesn't work well https://bugs.ruby-lang.org/issues/13446
35
- alias :_original_sum_with_required_identity :sum
36
- private :_original_sum_with_required_identity
37
-
38
- # :startdoc:
39
-
40
28
  # Calculates the minimum from the extracted elements.
41
29
  #
42
30
  # payments = [Payment.new(5), Payment.new(15), Payment.new(10)]
@@ -53,50 +41,6 @@ module Enumerable
53
41
  map(&key).max
54
42
  end
55
43
 
56
- # Calculates a sum from the elements.
57
- #
58
- # payments.sum { |p| p.price * p.tax_rate }
59
- # payments.sum(&:price)
60
- #
61
- # The latter is a shortcut for:
62
- #
63
- # payments.inject(0) { |sum, p| sum + p.price }
64
- #
65
- # It can also calculate the sum without the use of a block.
66
- #
67
- # [5, 15, 10].sum # => 30
68
- # ['foo', 'bar'].sum('') # => "foobar"
69
- # [[1, 2], [3, 1, 5]].sum([]) # => [1, 2, 3, 1, 5]
70
- #
71
- # The default sum of an empty list is zero. You can override this default:
72
- #
73
- # [].sum(Payment.new(0)) { |i| i.amount } # => Payment.new(0)
74
- def sum(identity = nil, &block)
75
- if identity
76
- _original_sum_with_required_identity(identity, &block)
77
- elsif block_given?
78
- map(&block).sum
79
- else
80
- first = true
81
-
82
- reduce(nil) do |sum, value|
83
- if first
84
- first = false
85
-
86
- unless value.is_a?(Numeric) || value.respond_to?(:coerce)
87
- ActiveSupport::Deprecation.warn(<<-MSG.squish)
88
- Rails 7.0 has deprecated Enumerable.sum in favor of Ruby's native implementation available since 2.4.
89
- Sum of non-numeric elements requires an initial argument.
90
- MSG
91
- end
92
- value
93
- else
94
- sum + value
95
- end
96
- end || 0
97
- end
98
- end
99
-
100
44
  # Convert an enumerable to a hash, using the block result as the key and the
101
45
  # element as the value.
102
46
  #
@@ -289,38 +233,22 @@ end
289
233
  class Range # :nodoc:
290
234
  # Optimize range sum to use arithmetic progression if a block is not given and
291
235
  # we have a range of numeric values.
292
- def sum(identity = nil)
236
+ def sum(initial_value = 0)
293
237
  if block_given? || !(first.is_a?(Integer) && last.is_a?(Integer))
294
238
  super
295
239
  else
296
240
  actual_last = exclude_end? ? (last - 1) : last
297
241
  if actual_last >= first
298
- sum = identity || 0
242
+ sum = initial_value || 0
299
243
  sum + (actual_last - first + 1) * (actual_last + first) / 2
300
244
  else
301
- identity || 0
245
+ initial_value || 0
302
246
  end
303
247
  end
304
248
  end
305
249
  end
306
250
 
307
- # Using Refinements here in order not to expose our internal method
308
- using Module.new {
309
- refine Array do
310
- alias :orig_sum :sum
311
- end
312
- }
313
-
314
251
  class Array # :nodoc:
315
- def sum(init = nil, &block)
316
- if init.is_a?(Numeric) || first.is_a?(Numeric)
317
- init ||= 0
318
- orig_sum(init, &block)
319
- else
320
- super
321
- end
322
- end
323
-
324
252
  # Removes all blank elements from the +Array+ in place and returns self.
325
253
  # Uses Object#blank? for determining if an item is blank.
326
254
  #