activesupport 6.1.3 → 6.1.7.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +185 -1
  3. data/MIT-LICENSE +1 -1
  4. data/lib/active_support/cache/file_store.rb +1 -1
  5. data/lib/active_support/cache/mem_cache_store.rb +1 -1
  6. data/lib/active_support/cache.rb +7 -1
  7. data/lib/active_support/configuration_file.rb +6 -1
  8. data/lib/active_support/core_ext/digest/uuid.rb +1 -0
  9. data/lib/active_support/core_ext/string/output_safety.rb +32 -0
  10. data/lib/active_support/core_ext/time/calculations.rb +5 -8
  11. data/lib/active_support/core_ext/uri.rb +1 -1
  12. data/lib/active_support/current_attributes.rb +2 -0
  13. data/lib/active_support/dependencies/zeitwerk_integration.rb +4 -1
  14. data/lib/active_support/deprecation.rb +1 -1
  15. data/lib/active_support/digest.rb +2 -0
  16. data/lib/active_support/duration.rb +4 -3
  17. data/lib/active_support/encrypted_file.rb +8 -9
  18. data/lib/active_support/execution_wrapper.rb +16 -13
  19. data/lib/active_support/fork_tracker.rb +2 -0
  20. data/lib/active_support/gem_version.rb +2 -2
  21. data/lib/active_support/hash_with_indifferent_access.rb +5 -0
  22. data/lib/active_support/inflector/methods.rb +1 -2
  23. data/lib/active_support/locale/en.yml +1 -1
  24. data/lib/active_support/multibyte/unicode.rb +2 -2
  25. data/lib/active_support/number_helper/number_to_rounded_converter.rb +10 -6
  26. data/lib/active_support/number_helper/rounding_helper.rb +1 -1
  27. data/lib/active_support/per_thread_registry.rb +1 -0
  28. data/lib/active_support/railtie.rb +1 -1
  29. data/lib/active_support/reloader.rb +1 -1
  30. data/lib/active_support/security_utils.rb +1 -1
  31. data/lib/active_support/tagged_logging.rb +1 -1
  32. data/lib/active_support/testing/assertions.rb +1 -1
  33. data/lib/active_support/values/time_zone.rb +2 -0
  34. data/lib/active_support.rb +1 -1
  35. metadata +10 -9
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0fd56b6e7b594d2bb95b107f35ff63359e6c2d20e57d009a23ac27b53bbaf22a
4
- data.tar.gz: 4f2942e1edf853a4096aa0b305cbe79dc1f7cb4e3757e65937e98e8616d26288
3
+ metadata.gz: 6d11e7add09b8c7e3de38aa8b0f5a2f6e82920e1a933dbe470eb1436541f9413
4
+ data.tar.gz: 75a53790ba8b139edd4744c4e20cdbc75c185e5a6737b6f5ffb01da9fcbcec84
5
5
  SHA512:
6
- metadata.gz: 2e0f1c3e75c7b2cbe2cc418e037200d219c54308ddf5dbacbc4d48f540f7bbf131fe7bb875550e519f292fcdc5617ef08c231bc82fa89a3f5235bee0ce4ee476
7
- data.tar.gz: 4febcb65ed635c37dc00ff243c22b0328523b9c5ff56feab13efc7c4647de1c4dcdf6c4c24fb7b80e22b57367343bfe2a4f994aab1c612b82a37719110e10f54
6
+ metadata.gz: 766b6574b39a45ef1d1030249546e0561a93a51212c615c61b5619f2d722c750b27164bf6635e699eb1157533fc5e73de87abc89e0e9e18a544868cf87a9ca1e
7
+ data.tar.gz: 765934ca6dc427f1ad29dc81cb4450f7e0fff58178837e7369761006eb9cc5d72d2acc548c5245a6828a10b0403367da4ab6b3529525885fca353ec9bbcd1454
data/CHANGELOG.md CHANGED
@@ -1,3 +1,187 @@
1
+ ## Rails 6.1.7.10 (October 23, 2024) ##
2
+
3
+ * No changes.
4
+
5
+
6
+ ## Rails 6.1.7.9 (October 15, 2024) ##
7
+
8
+ * No changes.
9
+
10
+
11
+ ## Rails 6.1.7.8 (June 04, 2024) ##
12
+
13
+ * No changes.
14
+
15
+
16
+ ## Rails 6.1.7.7 (February 21, 2024) ##
17
+
18
+ * No changes.
19
+
20
+
21
+ ## Rails 6.1.7.6 (August 22, 2023) ##
22
+
23
+ * No changes.
24
+
25
+
26
+ ## Rails 6.1.7.5 (August 22, 2023) ##
27
+
28
+ * Use a temporary file for storing unencrypted files while editing
29
+
30
+ [CVE-2023-38037]
31
+
32
+
33
+ ## Rails 6.1.7.4 (June 26, 2023) ##
34
+
35
+ * No changes.
36
+
37
+
38
+ ## Rails 6.1.7.3 (March 13, 2023) ##
39
+
40
+ * Implement SafeBuffer#bytesplice
41
+
42
+ [CVE-2023-28120]
43
+
44
+
45
+ ## Rails 6.1.7.2 (January 24, 2023) ##
46
+
47
+ * No changes.
48
+
49
+
50
+ ## Rails 6.1.7.1 (January 17, 2023) ##
51
+
52
+ * Avoid regex backtracking in Inflector.underscore
53
+
54
+ [CVE-2023-22796]
55
+
56
+
57
+ ## Rails 6.1.7 (September 09, 2022) ##
58
+
59
+ * No changes.
60
+
61
+
62
+ ## Rails 6.1.6.1 (July 12, 2022) ##
63
+
64
+ * No changes.
65
+
66
+
67
+ ## Rails 6.1.6 (May 09, 2022) ##
68
+
69
+ * No changes.
70
+
71
+
72
+ ## Rails 6.1.5.1 (April 26, 2022) ##
73
+
74
+ * Fix and add protections for XSS in `ActionView::Helpers` and `ERB::Util`.
75
+
76
+ Add the method `ERB::Util.xml_name_escape` to escape dangerous characters
77
+ in names of tags and names of attributes, following the specification of XML.
78
+
79
+ *Álvaro Martín Fraguas*
80
+
81
+ ## Rails 6.1.5 (March 09, 2022) ##
82
+
83
+ * Fix `ActiveSupport::Duration.build` to support negative values.
84
+
85
+ The algorithm to collect the `parts` of the `ActiveSupport::Duration`
86
+ ignored the sign of the `value` and accumulated incorrect part values. This
87
+ impacted `ActiveSupport::Duration#sum` (which is dependent on `parts`) but
88
+ not `ActiveSupport::Duration#eql?` (which is dependent on `value`).
89
+
90
+ *Caleb Buxton*, *Braden Staudacher*
91
+
92
+ * `Time#change` and methods that call it (eg. `Time#advance`) will now
93
+ return a `Time` with the timezone argument provided, if the caller was
94
+ initialized with a timezone argument.
95
+
96
+ Fixes [#42467](https://github.com/rails/rails/issues/42467).
97
+
98
+ *Alex Ghiculescu*
99
+
100
+ * Clone to keep extended Logger methods for tagged logger.
101
+
102
+ *Orhan Toy*
103
+
104
+ * `assert_changes` works on including `ActiveSupport::Assertions` module.
105
+
106
+ *Pedro Medeiros*
107
+
108
+
109
+ ## Rails 6.1.4.7 (March 08, 2022) ##
110
+
111
+ * No changes.
112
+
113
+
114
+ ## Rails 6.1.4.6 (February 11, 2022) ##
115
+
116
+ * Fix Reloader method signature to work with the new Executor signature
117
+
118
+
119
+ ## Rails 6.1.4.5 (February 11, 2022) ##
120
+
121
+ * No changes.
122
+
123
+
124
+ ## Rails 6.1.4.4 (December 15, 2021) ##
125
+
126
+ * No changes.
127
+
128
+
129
+ ## Rails 6.1.4.3 (December 14, 2021) ##
130
+
131
+ * No changes.
132
+
133
+
134
+ ## Rails 6.1.4.2 (December 14, 2021) ##
135
+
136
+ * No changes.
137
+
138
+
139
+ ## Rails 6.1.4.1 (August 19, 2021) ##
140
+
141
+ * No changes.
142
+
143
+
144
+ ## Rails 6.1.4 (June 24, 2021) ##
145
+
146
+ * MemCacheStore: convert any underlying value (including `false`) to an `Entry`.
147
+
148
+ See [#42559](https://github.com/rails/rails/pull/42559).
149
+
150
+ *Alex Ghiculescu*
151
+
152
+ * Fix bug in `number_with_precision` when using large `BigDecimal` values.
153
+
154
+ Fixes #42302.
155
+
156
+ *Federico Aldunate*, *Zachary Scott*
157
+
158
+ * Check byte size instead of length on `secure_compare`.
159
+
160
+ *Tietew*
161
+
162
+ * Fix `Time.at` to not lose `:in` option.
163
+
164
+ *Ryuta Kamizono*
165
+
166
+ * Require a path for `config.cache_store = :file_store`.
167
+
168
+ *Alex Ghiculescu*
169
+
170
+ * Avoid having to store complex object in the default translation file.
171
+
172
+ *Rafael Mendonça França*
173
+
174
+
175
+ ## Rails 6.1.3.2 (May 05, 2021) ##
176
+
177
+ * No changes.
178
+
179
+
180
+ ## Rails 6.1.3.1 (March 26, 2021) ##
181
+
182
+ * No changes.
183
+
184
+
1
185
  ## Rails 6.1.3 (February 17, 2021) ##
2
186
 
3
187
  * No changes.
@@ -232,7 +416,7 @@
232
416
 
233
417
  *Max Gurewitz*
234
418
 
235
- * `URI.parser` is deprecated and will be removed in Rails 6.2. Use
419
+ * `URI.parser` is deprecated and will be removed in Rails 7.0. Use
236
420
  `URI::DEFAULT_PARSER` instead.
237
421
 
238
422
  *Jean Boussier*
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2005-2020 David Heinemeier Hansson
1
+ Copyright (c) 2005-2022 David Heinemeier Hansson
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
@@ -20,7 +20,7 @@ module ActiveSupport
20
20
  FILEPATH_MAX_SIZE = 900 # max is 1024, plus some room
21
21
  GITKEEP_FILES = [".gitkeep", ".keep"].freeze
22
22
 
23
- def initialize(cache_path, options = nil)
23
+ def initialize(cache_path, **options)
24
24
  super(options)
25
25
  @cache_path = cache_path.to_s
26
26
  end
@@ -198,7 +198,7 @@ module ActiveSupport
198
198
 
199
199
  def deserialize_entry(payload)
200
200
  entry = super
201
- entry = Entry.new(entry, compress: false) if entry && !entry.is_a?(Entry)
201
+ entry = Entry.new(entry, compress: false) unless entry.nil? || entry.is_a?(Entry)
202
202
  entry
203
203
  end
204
204
 
@@ -58,7 +58,13 @@ module ActiveSupport
58
58
  case store
59
59
  when Symbol
60
60
  options = parameters.extract_options!
61
- retrieve_store_class(store).new(*parameters, **options)
61
+ # clean this up once Ruby 2.7 support is dropped
62
+ # see https://github.com/rails/rails/pull/41522#discussion_r581186602
63
+ if options.empty?
64
+ retrieve_store_class(store).new(*parameters)
65
+ else
66
+ retrieve_store_class(store).new(*parameters, **options)
67
+ end
62
68
  when Array
63
69
  lookup_store(*store)
64
70
  when nil
@@ -19,7 +19,12 @@ module ActiveSupport
19
19
  end
20
20
 
21
21
  def parse(context: nil, **options)
22
- YAML.load(render(context), **options) || {}
22
+ source = render(context)
23
+ if YAML.respond_to?(:unsafe_load)
24
+ YAML.unsafe_load(source, **options) || {}
25
+ else
26
+ YAML.load(source, **options) || {}
27
+ end
23
28
  rescue Psych::SyntaxError => error
24
29
  raise "YAML syntax error occurred while parsing #{@content_path}. " \
25
30
  "Please note that YAML must be consistently indented using spaces. Tabs are not allowed. " \
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "securerandom"
4
+ require "digest"
4
5
 
5
6
  module Digest
6
7
  module UUID
@@ -11,6 +11,14 @@ class ERB
11
11
  HTML_ESCAPE_ONCE_REGEXP = /["><']|&(?!([a-zA-Z]+|(#\d+)|(#[xX][\dA-Fa-f]+));)/
12
12
  JSON_ESCAPE_REGEXP = /[\u2028\u2029&><]/u
13
13
 
14
+ # Following XML requirements: https://www.w3.org/TR/REC-xml/#NT-Name
15
+ TAG_NAME_START_REGEXP_SET = "@:A-Z_a-z\u{C0}-\u{D6}\u{D8}-\u{F6}\u{F8}-\u{2FF}\u{370}-\u{37D}\u{37F}-\u{1FFF}" \
16
+ "\u{200C}-\u{200D}\u{2070}-\u{218F}\u{2C00}-\u{2FEF}\u{3001}-\u{D7FF}\u{F900}-\u{FDCF}" \
17
+ "\u{FDF0}-\u{FFFD}\u{10000}-\u{EFFFF}"
18
+ TAG_NAME_START_REGEXP = /[^#{TAG_NAME_START_REGEXP_SET}]/
19
+ TAG_NAME_FOLLOWING_REGEXP = /[^#{TAG_NAME_START_REGEXP_SET}\-.0-9\u{B7}\u{0300}-\u{036F}\u{203F}-\u{2040}]/
20
+ TAG_NAME_REPLACEMENT_CHAR = "_"
21
+
14
22
  # A utility method for escaping HTML tag characters.
15
23
  # This method is also aliased as <tt>h</tt>.
16
24
  #
@@ -115,6 +123,26 @@ class ERB
115
123
  end
116
124
 
117
125
  module_function :json_escape
126
+
127
+ # A utility method for escaping XML names of tags and names of attributes.
128
+ #
129
+ # xml_name_escape('1 < 2 & 3')
130
+ # # => "1___2___3"
131
+ #
132
+ # It follows the requirements of the specification: https://www.w3.org/TR/REC-xml/#NT-Name
133
+ def xml_name_escape(name)
134
+ name = name.to_s
135
+ return "" if name.blank?
136
+
137
+ starting_char = name[0].gsub(TAG_NAME_START_REGEXP, TAG_NAME_REPLACEMENT_CHAR)
138
+
139
+ return starting_char if name.size == 1
140
+
141
+ following_chars = name[1..-1].gsub(TAG_NAME_FOLLOWING_REGEXP, TAG_NAME_REPLACEMENT_CHAR)
142
+
143
+ starting_char + following_chars
144
+ end
145
+ module_function :xml_name_escape
118
146
  end
119
147
  end
120
148
 
@@ -188,6 +216,10 @@ module ActiveSupport #:nodoc:
188
216
  end
189
217
  alias << concat
190
218
 
219
+ def bytesplice(*args, value)
220
+ super(*args, implicit_html_escape_interpolated_argument(value))
221
+ end
222
+
191
223
  def insert(index, value)
192
224
  super(index, html_escape_interpolated_argument(value))
193
225
  end
@@ -42,14 +42,8 @@ class Time
42
42
 
43
43
  # Layers additional behavior on Time.at so that ActiveSupport::TimeWithZone and DateTime
44
44
  # instances can be used when called with a single argument
45
- def at_with_coercion(*args, **kwargs)
46
- if args.size != 1
47
- if kwargs.empty?
48
- return at_without_coercion(*args)
49
- else
50
- return at_without_coercion(*args, **kwargs)
51
- end
52
- end
45
+ def at_with_coercion(*args)
46
+ return at_without_coercion(*args) if args.size != 1
53
47
 
54
48
  # Time.at can be called with a time or numerical value
55
49
  time_or_number = args.first
@@ -62,6 +56,7 @@ class Time
62
56
  at_without_coercion(time_or_number)
63
57
  end
64
58
  end
59
+ ruby2_keywords(:at_with_coercion) if respond_to?(:ruby2_keywords, true)
65
60
  alias_method :at_without_coercion, :at
66
61
  alias_method :at, :at_with_coercion
67
62
 
@@ -165,6 +160,8 @@ class Time
165
160
  ::Time.new(new_year, new_month, new_day, new_hour, new_min, new_sec, new_offset)
166
161
  elsif utc?
167
162
  ::Time.utc(new_year, new_month, new_day, new_hour, new_min, new_sec)
163
+ elsif zone&.respond_to?(:utc_to_local)
164
+ ::Time.new(new_year, new_month, new_day, new_hour, new_min, new_sec, zone)
168
165
  elsif zone
169
166
  ::Time.local(new_year, new_month, new_day, new_hour, new_min, new_sec)
170
167
  else
@@ -20,7 +20,7 @@ module URI
20
20
  class << self
21
21
  def parser
22
22
  ActiveSupport::Deprecation.warn(<<-MSG.squish)
23
- URI.parser is deprecated and will be removed in Rails 6.2.
23
+ URI.parser is deprecated and will be removed in Rails 7.0.
24
24
  Use `URI::DEFAULT_PARSER` instead.
25
25
  MSG
26
26
  URI::DEFAULT_PARSER
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "active_support/callbacks"
4
4
  require "active_support/core_ext/enumerable"
5
+ require "active_support/core_ext/module/delegation"
5
6
 
6
7
  module ActiveSupport
7
8
  # Abstract super class that provides a thread-isolated attributes singleton, which resets automatically
@@ -163,6 +164,7 @@ module ActiveSupport
163
164
 
164
165
  send(name, *args, &block)
165
166
  end
167
+ ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true)
166
168
  end
167
169
 
168
170
  attr_accessor :attributes
@@ -89,7 +89,10 @@ module ActiveSupport
89
89
  end
90
90
 
91
91
  Rails.autoloaders.main.enable_reloading if enable_reloading
92
- Rails.autoloaders.each(&:setup)
92
+
93
+ # Order matters.
94
+ Rails.autoloaders.once.setup
95
+ Rails.autoloaders.main.setup
93
96
  end
94
97
 
95
98
  def autoload_once?(autoload_path)
@@ -38,7 +38,7 @@ module ActiveSupport
38
38
  # and the second is a library name.
39
39
  #
40
40
  # ActiveSupport::Deprecation.new('2.0', 'MyLibrary')
41
- def initialize(deprecation_horizon = "6.2", gem_name = "Rails")
41
+ def initialize(deprecation_horizon = "7.0", gem_name = "Rails")
42
42
  self.gem_name = gem_name
43
43
  self.deprecation_horizon = deprecation_horizon
44
44
  # By default, warnings are not silenced and debugging is off.
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "digest"
4
+
3
5
  module ActiveSupport
4
6
  class Digest #:nodoc:
5
7
  class <<self
@@ -186,17 +186,18 @@ module ActiveSupport
186
186
  end
187
187
 
188
188
  parts = {}
189
- remainder = value.round(9)
189
+ remainder_sign = value <=> 0
190
+ remainder = value.round(9).abs
190
191
 
191
192
  PARTS.each do |part|
192
193
  unless part == :seconds
193
194
  part_in_seconds = PARTS_IN_SECONDS[part]
194
- parts[part] = remainder.div(part_in_seconds)
195
+ parts[part] = remainder.div(part_in_seconds) * remainder_sign
195
196
  remainder %= part_in_seconds
196
197
  end
197
198
  end unless value == 0
198
199
 
199
- parts[:seconds] = remainder
200
+ parts[:seconds] = remainder * remainder_sign
200
201
 
201
202
  new(value, parts)
202
203
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "pathname"
4
- require "tmpdir"
4
+ require "tempfile"
5
5
  require "active_support/message_encryptor"
6
6
 
7
7
  module ActiveSupport
@@ -69,17 +69,16 @@ module ActiveSupport
69
69
 
70
70
  private
71
71
  def writing(contents)
72
- tmp_file = "#{Process.pid}.#{content_path.basename.to_s.chomp('.enc')}"
73
- tmp_path = Pathname.new File.join(Dir.tmpdir, tmp_file)
74
- tmp_path.binwrite contents
72
+ Tempfile.create(["", "-" + content_path.basename.to_s.chomp(".enc")]) do |tmp_file|
73
+ tmp_path = Pathname.new(tmp_file)
74
+ tmp_path.binwrite contents
75
75
 
76
- yield tmp_path
76
+ yield tmp_path
77
77
 
78
- updated_contents = tmp_path.binread
78
+ updated_contents = tmp_path.binread
79
79
 
80
- write(updated_contents) if updated_contents != contents
81
- ensure
82
- FileUtils.rm(tmp_path) if tmp_path&.exist?
80
+ write(updated_contents) if updated_contents != contents
81
+ end
83
82
  end
84
83
 
85
84
 
@@ -63,18 +63,21 @@ module ActiveSupport
63
63
  # after the work has been performed.
64
64
  #
65
65
  # Where possible, prefer +wrap+.
66
- def self.run!
67
- if active?
68
- Null
66
+ def self.run!(reset: false)
67
+ if reset
68
+ lost_instance = active.delete(Thread.current)
69
+ lost_instance&.complete!
69
70
  else
70
- new.tap do |instance|
71
- success = nil
72
- begin
73
- instance.run!
74
- success = true
75
- ensure
76
- instance.complete! unless success
77
- end
71
+ return Null if active?
72
+ end
73
+
74
+ new.tap do |instance|
75
+ success = nil
76
+ begin
77
+ instance.run!
78
+ success = true
79
+ ensure
80
+ instance.complete! unless success
78
81
  end
79
82
  end
80
83
  end
@@ -103,11 +106,11 @@ module ActiveSupport
103
106
  self.active = Concurrent::Hash.new
104
107
 
105
108
  def self.active? # :nodoc:
106
- @active[Thread.current]
109
+ @active.key?(Thread.current)
107
110
  end
108
111
 
109
112
  def run! # :nodoc:
110
- self.class.active[Thread.current] = true
113
+ self.class.active[Thread.current] = self
111
114
  run_callbacks(:run)
112
115
  end
113
116
 
@@ -16,6 +16,7 @@ module ActiveSupport
16
16
  pid
17
17
  end
18
18
  end
19
+ ruby2_keywords(:fork) if respond_to?(:ruby2_keywords, true)
19
20
  end
20
21
 
21
22
  module CoreExtPrivate
@@ -25,6 +26,7 @@ module ActiveSupport
25
26
  def fork(*)
26
27
  super
27
28
  end
29
+ ruby2_keywords(:fork) if respond_to?(:ruby2_keywords, true)
28
30
  end
29
31
 
30
32
  @pid = Process.pid
@@ -9,8 +9,8 @@ module ActiveSupport
9
9
  module VERSION
10
10
  MAJOR = 6
11
11
  MINOR = 1
12
- TINY = 3
13
- PRE = nil
12
+ TINY = 7
13
+ PRE = "10"
14
14
 
15
15
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
16
16
  end
@@ -3,6 +3,7 @@
3
3
  require "active_support/core_ext/hash/keys"
4
4
  require "active_support/core_ext/hash/reverse_merge"
5
5
  require "active_support/core_ext/hash/except"
6
+ require "active_support/core_ext/hash/slice"
6
7
 
7
8
  module ActiveSupport
8
9
  # Implements a hash where keys <tt>:foo</tt> and <tt>"foo"</tt> are considered
@@ -293,6 +294,10 @@ module ActiveSupport
293
294
  super(convert_key(key))
294
295
  end
295
296
 
297
+ # Returns a hash with indifferent access that includes everything except given keys.
298
+ # hash = { a: "x", b: "y", c: 10 }.with_indifferent_access
299
+ # hash.except(:a, "b") # => {c: 10}.with_indifferent_access
300
+ # hash # => { a: "x", b: "y", c: 10 }.with_indifferent_access
296
301
  def except(*keys)
297
302
  slice(*self.keys - keys.map { |key| convert_key(key) })
298
303
  end
@@ -93,8 +93,7 @@ module ActiveSupport
93
93
  return camel_cased_word unless /[A-Z-]|::/.match?(camel_cased_word)
94
94
  word = camel_cased_word.to_s.gsub("::", "/")
95
95
  word.gsub!(inflections.acronyms_underscore_regex) { "#{$1 && '_' }#{$2.downcase}" }
96
- word.gsub!(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2')
97
- word.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
96
+ word.gsub!(/([A-Z])(?=[A-Z][a-z])|([a-z\d])(?=[A-Z])/) { ($1 || $2) << "_" }
98
97
  word.tr!("-", "_")
99
98
  word.downcase!
100
99
  word
@@ -45,7 +45,7 @@ en:
45
45
  # Number of decimals, behind the separator (the number 1 with a precision of 2 gives: 1.00)
46
46
  precision: 3
47
47
  # Determine how rounding is performed (see BigDecimal::mode)
48
- round_mode: !ruby/sym default
48
+ round_mode: default
49
49
  # If set to true, precision will mean the number of significant digits instead
50
50
  # of the number of decimal digits (1234 with precision 2 becomes 1200, 1.23543 becomes 1.2)
51
51
  significant: false
@@ -10,13 +10,13 @@ module ActiveSupport
10
10
 
11
11
  def default_normalization_form
12
12
  ActiveSupport::Deprecation.warn(
13
- "ActiveSupport::Multibyte::Unicode.default_normalization_form is deprecated and will be removed in Rails 6.2."
13
+ "ActiveSupport::Multibyte::Unicode.default_normalization_form is deprecated and will be removed in Rails 7.0."
14
14
  )
15
15
  end
16
16
 
17
17
  def default_normalization_form=(_)
18
18
  ActiveSupport::Deprecation.warn(
19
- "ActiveSupport::Multibyte::Unicode.default_normalization_form= is deprecated and will be removed in Rails 6.2."
19
+ "ActiveSupport::Multibyte::Unicode.default_normalization_form= is deprecated and will be removed in Rails 7.0."
20
20
  )
21
21
  end
22
22
 
@@ -20,14 +20,18 @@ module ActiveSupport
20
20
  end
21
21
 
22
22
  formatted_string =
23
- if rounded_number.nan? || rounded_number.infinite? || rounded_number == rounded_number.to_i
24
- "%00.#{precision}f" % rounded_number
25
- else
23
+ if rounded_number.finite?
26
24
  s = rounded_number.to_s("F")
27
- s << "0" * precision
28
25
  a, b = s.split(".", 2)
29
- a << "."
30
- a << b[0, precision]
26
+ if precision != 0
27
+ b << "0" * precision
28
+ a << "."
29
+ a << b[0, precision]
30
+ end
31
+ a
32
+ else
33
+ # Infinity/NaN
34
+ "%f" % rounded_number
31
35
  end
32
36
  else
33
37
  formatted_string = rounded_number
@@ -13,7 +13,7 @@ module ActiveSupport
13
13
  precision = absolute_precision(number)
14
14
  return number unless precision
15
15
 
16
- rounded_number = convert_to_decimal(number).round(precision, options.fetch(:round_mode, :default))
16
+ rounded_number = convert_to_decimal(number).round(precision, options.fetch(:round_mode, :default).to_sym)
17
17
  rounded_number.zero? ? rounded_number.abs : rounded_number # prevent showing negative zeros
18
18
  end
19
19
 
@@ -56,5 +56,6 @@ module ActiveSupport
56
56
 
57
57
  send(name, *args, &block)
58
58
  end
59
+ ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true)
59
60
  end
60
61
  end
@@ -87,7 +87,7 @@ module ActiveSupport
87
87
  if app.config.active_support.use_sha1_digests
88
88
  ActiveSupport::Deprecation.warn(<<-MSG.squish)
89
89
  config.active_support.use_sha1_digests is deprecated and will
90
- be removed from Rails 6.2. Use
90
+ be removed from Rails 7.0. Use
91
91
  config.active_support.hash_digest_class = ::Digest::SHA1 instead.
92
92
  MSG
93
93
  ActiveSupport::Digest.hash_digest_class = ::Digest::SHA1
@@ -58,7 +58,7 @@ module ActiveSupport
58
58
  prepare!
59
59
  end
60
60
 
61
- def self.run! # :nodoc:
61
+ def self.run!(reset: false) # :nodoc:
62
62
  if check!
63
63
  super
64
64
  else
@@ -31,7 +31,7 @@ module ActiveSupport
31
31
  # the secret length. This should be considered when using secure_compare
32
32
  # to compare weak, short secrets to user input.
33
33
  def secure_compare(a, b)
34
- a.length == b.length && fixed_length_secure_compare(a, b)
34
+ a.bytesize == b.bytesize && fixed_length_secure_compare(a, b)
35
35
  end
36
36
  module_function :secure_compare
37
37
  end
@@ -79,7 +79,7 @@ module ActiveSupport
79
79
  end
80
80
 
81
81
  def self.new(logger)
82
- logger = logger.dup
82
+ logger = logger.clone
83
83
 
84
84
  if logger.formatter
85
85
  logger.formatter = logger.formatter.dup
@@ -189,7 +189,7 @@ module ActiveSupport
189
189
  error = "#{expression.inspect} didn't change"
190
190
  error = "#{error}. It was already #{to}" if before == to
191
191
  error = "#{message}.\n#{error}" if message
192
- assert_not_equal before, after, error
192
+ refute_equal before, after, error
193
193
 
194
194
  unless to == UNTRACKED
195
195
  error = "Expected change to #{to}\n"
@@ -381,6 +381,8 @@ module ActiveSupport
381
381
  # If the string is invalid then an +ArgumentError+ will be raised unlike +parse+
382
382
  # which usually returns +nil+ when given an invalid date string.
383
383
  def iso8601(str)
384
+ raise ArgumentError, "invalid date" if str.nil?
385
+
384
386
  parts = Date._iso8601(str)
385
387
 
386
388
  raise ArgumentError, "invalid date" if parts.empty?
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  #--
4
- # Copyright (c) 2005-2020 David Heinemeier Hansson
4
+ # Copyright (c) 2005-2022 David Heinemeier Hansson
5
5
  #
6
6
  # Permission is hereby granted, free of charge, to any person obtaining
7
7
  # a copy of this software and associated documentation files (the
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activesupport
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.1.3
4
+ version: 6.1.7.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Heinemeier Hansson
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-17 00:00:00.000000000 Z
11
+ date: 2024-10-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: i18n
@@ -357,11 +357,12 @@ licenses:
357
357
  - MIT
358
358
  metadata:
359
359
  bug_tracker_uri: https://github.com/rails/rails/issues
360
- changelog_uri: https://github.com/rails/rails/blob/v6.1.3/activesupport/CHANGELOG.md
361
- documentation_uri: https://api.rubyonrails.org/v6.1.3/
360
+ changelog_uri: https://github.com/rails/rails/blob/v6.1.7.10/activesupport/CHANGELOG.md
361
+ documentation_uri: https://api.rubyonrails.org/v6.1.7.10/
362
362
  mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
363
- source_code_uri: https://github.com/rails/rails/tree/v6.1.3/activesupport
364
- post_install_message:
363
+ source_code_uri: https://github.com/rails/rails/tree/v6.1.7.10/activesupport
364
+ rubygems_mfa_required: 'true'
365
+ post_install_message:
365
366
  rdoc_options:
366
367
  - "--encoding"
367
368
  - UTF-8
@@ -378,8 +379,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
378
379
  - !ruby/object:Gem::Version
379
380
  version: '0'
380
381
  requirements: []
381
- rubygems_version: 3.2.3
382
- signing_key:
382
+ rubygems_version: 3.5.16
383
+ signing_key:
383
384
  specification_version: 4
384
385
  summary: A toolkit of support libraries and Ruby core extensions extracted from the
385
386
  Rails framework.