activesupport 7.2.0.beta2 → 7.2.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +29 -0
- data/lib/active_support/code_generator.rb +15 -10
- data/lib/active_support/core_ext/securerandom.rb +8 -24
- data/lib/active_support/core_ext/time/calculations.rb +6 -1
- data/lib/active_support/core_ext/time/compatibility.rb +16 -0
- data/lib/active_support/delegation.rb +39 -25
- data/lib/active_support/deprecation/constant_accessor.rb +47 -24
- data/lib/active_support/gem_version.rb +1 -1
- data/lib/active_support/logger_thread_safe_level.rb +0 -8
- data/lib/active_support/message_verifier.rb +12 -0
- data/lib/active_support/syntax_error_proxy.rb +1 -11
- data/lib/active_support/tagged_logging.rb +0 -1
- data/lib/active_support/testing/time_helpers.rb +3 -3
- data/lib/active_support/time_with_zone.rb +1 -1
- metadata +36 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2aaa473f08555b8cff31f1badf96b6db12166e0d598ce8b686ed9eb47c25ff16
|
4
|
+
data.tar.gz: f184db8c521f40286828664b6aadf74823179b793a4f02edb447e181810a71f9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fcd73b0e3c374fd484e6cf12240ce61910b889ebfcf8715db0307f30db54778aa9cbf309411a4246b1c092ea41935f8c3c93f5b597b36375441f9ecf9d497efc
|
7
|
+
data.tar.gz: 6206ed420d950a2051a7c60a3c98b30813f6fd85c1a63c85f2cd4432b8a8bed9473ee85468f0ebe580f3ec4d4aae08a4cee6dde571ba04638735ca604af9f5f4
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,32 @@
|
|
1
|
+
## Rails 7.2.0.rc1 (August 06, 2024) ##
|
2
|
+
|
3
|
+
* Fix `delegate_missing_to allow_nil: true` when called with implict self
|
4
|
+
|
5
|
+
```ruby
|
6
|
+
class Person
|
7
|
+
delegate_missing_to :address, allow_nil: true
|
8
|
+
|
9
|
+
def address
|
10
|
+
nil
|
11
|
+
end
|
12
|
+
|
13
|
+
def berliner?
|
14
|
+
city == "Berlin"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
Person.new.city # => nil
|
19
|
+
Person.new.berliner? # undefined local variable or method `city' for an instance of Person (NameError)
|
20
|
+
```
|
21
|
+
|
22
|
+
*Jean Boussier*
|
23
|
+
|
24
|
+
## Rails 7.2.0.beta3 (July 11, 2024) ##
|
25
|
+
|
26
|
+
* Add `logger` as a dependency since it is a bundled gem candidate for Ruby 3.5
|
27
|
+
|
28
|
+
*Earlopain*
|
29
|
+
|
1
30
|
## Rails 7.2.0.beta2 (June 04, 2024) ##
|
2
31
|
|
3
32
|
* Define `Digest::UUID.nil_uuid`, which returns the so-called nil UUID.
|
@@ -9,16 +9,19 @@ module ActiveSupport
|
|
9
9
|
@cache = METHOD_CACHES[namespace]
|
10
10
|
@sources = []
|
11
11
|
@methods = {}
|
12
|
+
@canonical_methods = {}
|
12
13
|
end
|
13
14
|
|
14
|
-
def define_cached_method(
|
15
|
-
|
16
|
-
as = as.to_sym
|
17
|
-
|
18
|
-
|
15
|
+
def define_cached_method(canonical_name, as: nil)
|
16
|
+
canonical_name = canonical_name.to_sym
|
17
|
+
as = (as || canonical_name).to_sym
|
18
|
+
|
19
|
+
@methods.fetch(as) do
|
20
|
+
unless @cache.method_defined?(canonical_name) || @canonical_methods[canonical_name]
|
19
21
|
yield @sources
|
20
22
|
end
|
21
|
-
@
|
23
|
+
@canonical_methods[canonical_name] = true
|
24
|
+
@methods[as] = canonical_name
|
22
25
|
end
|
23
26
|
end
|
24
27
|
|
@@ -26,8 +29,10 @@ module ActiveSupport
|
|
26
29
|
unless @sources.empty?
|
27
30
|
@cache.module_eval("# frozen_string_literal: true\n" + @sources.join(";"), path, line)
|
28
31
|
end
|
29
|
-
@
|
30
|
-
|
32
|
+
@canonical_methods.clear
|
33
|
+
|
34
|
+
@methods.each do |as, canonical_name|
|
35
|
+
owner.define_method(as, @cache.instance_method(canonical_name))
|
31
36
|
end
|
32
37
|
end
|
33
38
|
end
|
@@ -52,8 +57,8 @@ module ActiveSupport
|
|
52
57
|
@namespaces = Hash.new { |h, k| h[k] = MethodSet.new(k) }
|
53
58
|
end
|
54
59
|
|
55
|
-
def define_cached_method(
|
56
|
-
@namespaces[namespace].define_cached_method(
|
60
|
+
def define_cached_method(canonical_name, namespace:, as: nil, &block)
|
61
|
+
@namespaces[namespace].define_cached_method(canonical_name, as: as, &block)
|
57
62
|
end
|
58
63
|
|
59
64
|
def execute
|
@@ -16,18 +16,8 @@ module SecureRandom
|
|
16
16
|
#
|
17
17
|
# p SecureRandom.base58 # => "4kUgL2pdQMSCQtjE"
|
18
18
|
# p SecureRandom.base58(24) # => "77TMHrHJFvFDwodq8w7Ev2m7"
|
19
|
-
|
20
|
-
|
21
|
-
SecureRandom.alphanumeric(n, chars: BASE58_ALPHABET)
|
22
|
-
end
|
23
|
-
else
|
24
|
-
def self.base58(n = 16)
|
25
|
-
SecureRandom.random_bytes(n).unpack("C*").map do |byte|
|
26
|
-
idx = byte % 64
|
27
|
-
idx = SecureRandom.random_number(58) if idx >= 58
|
28
|
-
BASE58_ALPHABET[idx]
|
29
|
-
end.join
|
30
|
-
end
|
19
|
+
def self.base58(n = 16)
|
20
|
+
SecureRandom.alphanumeric(n, chars: BASE58_ALPHABET)
|
31
21
|
end
|
32
22
|
|
33
23
|
# SecureRandom.base36 generates a random base36 string in lowercase.
|
@@ -41,17 +31,11 @@ module SecureRandom
|
|
41
31
|
#
|
42
32
|
# p SecureRandom.base36 # => "4kugl2pdqmscqtje"
|
43
33
|
# p SecureRandom.base36(24) # => "77tmhrhjfvfdwodq8w7ev2m7"
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
SecureRandom.random_bytes(n).unpack("C*").map do |byte|
|
51
|
-
idx = byte % 64
|
52
|
-
idx = SecureRandom.random_number(36) if idx >= 36
|
53
|
-
BASE36_ALPHABET[idx]
|
54
|
-
end.join
|
55
|
-
end
|
34
|
+
def self.base36(n = 16)
|
35
|
+
SecureRandom.random_bytes(n).unpack("C*").map do |byte|
|
36
|
+
idx = byte % 64
|
37
|
+
idx = SecureRandom.random_number(36) if idx >= 36
|
38
|
+
BASE36_ALPHABET[idx]
|
39
|
+
end.join
|
56
40
|
end
|
57
41
|
end
|
@@ -319,7 +319,12 @@ class Time
|
|
319
319
|
if other.class == Time
|
320
320
|
compare_without_coercion(other)
|
321
321
|
elsif other.is_a?(Time)
|
322
|
-
|
322
|
+
# also avoid ActiveSupport::TimeWithZone#to_time before Rails 8.0
|
323
|
+
if other.respond_to?(:comparable_time)
|
324
|
+
compare_without_coercion(other.comparable_time)
|
325
|
+
else
|
326
|
+
compare_without_coercion(other.to_time)
|
327
|
+
end
|
323
328
|
else
|
324
329
|
to_datetime <=> other
|
325
330
|
end
|
@@ -13,4 +13,20 @@ class Time
|
|
13
13
|
def to_time
|
14
14
|
preserve_timezone ? self : getlocal
|
15
15
|
end
|
16
|
+
|
17
|
+
def preserve_timezone # :nodoc:
|
18
|
+
active_support_local_zone == zone || super
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
@@active_support_local_tz = nil
|
23
|
+
|
24
|
+
def active_support_local_zone
|
25
|
+
@@active_support_local_zone = nil if @@active_support_local_tz != ENV["TZ"]
|
26
|
+
@@active_support_local_zone ||=
|
27
|
+
begin
|
28
|
+
@@active_support_local_tz = ENV["TZ"]
|
29
|
+
Time.new.zone
|
30
|
+
end
|
31
|
+
end
|
16
32
|
end
|
@@ -151,37 +151,51 @@ module ActiveSupport
|
|
151
151
|
|
152
152
|
def generate_method_missing(owner, target, allow_nil: nil)
|
153
153
|
target = target.to_s
|
154
|
-
target = "self.#{target}" if RESERVED_METHOD_NAMES.include?(target)
|
154
|
+
target = "self.#{target}" if RESERVED_METHOD_NAMES.include?(target) || target == "__target"
|
155
155
|
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
156
|
+
if allow_nil
|
157
|
+
owner.module_eval <<~RUBY, __FILE__, __LINE__ + 1
|
158
|
+
def respond_to_missing?(name, include_private = false)
|
159
|
+
# It may look like an oversight, but we deliberately do not pass
|
160
|
+
# +include_private+, because they do not get delegated.
|
160
161
|
|
161
|
-
|
162
|
-
|
163
|
-
|
162
|
+
return false if name == :marshal_dump || name == :_dump
|
163
|
+
#{target}.respond_to?(name) || super
|
164
|
+
end
|
164
165
|
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
166
|
+
def method_missing(method, ...)
|
167
|
+
__target = #{target}
|
168
|
+
if __target.nil? && !nil.respond_to?(method)
|
169
|
+
nil
|
170
|
+
elsif __target.respond_to?(method)
|
171
|
+
__target.public_send(method, ...)
|
172
|
+
else
|
170
173
|
super
|
171
|
-
rescue NoMethodError
|
172
|
-
if #{target}.nil?
|
173
|
-
if #{allow_nil == true}
|
174
|
-
nil
|
175
|
-
else
|
176
|
-
raise ::ActiveSupport::DelegationError.nil_target(method, :'#{target}')
|
177
|
-
end
|
178
|
-
else
|
179
|
-
raise
|
180
|
-
end
|
181
174
|
end
|
182
175
|
end
|
183
|
-
|
184
|
-
|
176
|
+
RUBY
|
177
|
+
else
|
178
|
+
owner.module_eval <<~RUBY, __FILE__, __LINE__ + 1
|
179
|
+
def respond_to_missing?(name, include_private = false)
|
180
|
+
# It may look like an oversight, but we deliberately do not pass
|
181
|
+
# +include_private+, because they do not get delegated.
|
182
|
+
|
183
|
+
return false if name == :marshal_dump || name == :_dump
|
184
|
+
#{target}.respond_to?(name) || super
|
185
|
+
end
|
186
|
+
|
187
|
+
def method_missing(method, ...)
|
188
|
+
__target = #{target}
|
189
|
+
if __target.nil? && !nil.respond_to?(method)
|
190
|
+
raise ::ActiveSupport::DelegationError.nil_target(method, :'#{target}')
|
191
|
+
elsif __target.respond_to?(method)
|
192
|
+
__target.public_send(method, ...)
|
193
|
+
else
|
194
|
+
super
|
195
|
+
end
|
196
|
+
end
|
197
|
+
RUBY
|
198
|
+
end
|
185
199
|
end
|
186
200
|
end
|
187
201
|
end
|
@@ -2,28 +2,6 @@
|
|
2
2
|
|
3
3
|
module ActiveSupport
|
4
4
|
class Deprecation
|
5
|
-
# DeprecatedConstantAccessor transforms a constant into a deprecated one by
|
6
|
-
# hooking +const_missing+.
|
7
|
-
#
|
8
|
-
# It takes the names of an old (deprecated) constant and of a new constant
|
9
|
-
# (both in string form) and a deprecator.
|
10
|
-
#
|
11
|
-
# The deprecated constant now returns the same object as the new one rather
|
12
|
-
# than a proxy object, so it can be used transparently in +rescue+ blocks
|
13
|
-
# etc.
|
14
|
-
#
|
15
|
-
# PLANETS = %w(mercury venus earth mars jupiter saturn uranus neptune pluto)
|
16
|
-
#
|
17
|
-
# # (In a later update, the original implementation of `PLANETS` has been removed.)
|
18
|
-
#
|
19
|
-
# PLANETS_POST_2006 = %w(mercury venus earth mars jupiter saturn uranus neptune)
|
20
|
-
# include ActiveSupport::Deprecation::DeprecatedConstantAccessor
|
21
|
-
# deprecate_constant 'PLANETS', 'PLANETS_POST_2006', deprecator: ActiveSupport::Deprecation.new
|
22
|
-
#
|
23
|
-
# PLANETS.map { |planet| planet.capitalize }
|
24
|
-
# # => DEPRECATION WARNING: PLANETS is deprecated! Use PLANETS_POST_2006 instead.
|
25
|
-
# (Backtrace information…)
|
26
|
-
# ["Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune"]
|
27
5
|
module DeprecatedConstantAccessor
|
28
6
|
def self.included(base)
|
29
7
|
require "active_support/inflector/methods"
|
@@ -39,9 +17,54 @@ module ActiveSupport
|
|
39
17
|
super
|
40
18
|
end
|
41
19
|
|
42
|
-
|
20
|
+
# Provides a way to rename constants with a deprecation cycle in which
|
21
|
+
# both the old and new names work, but using the old one prints a
|
22
|
+
# deprecation message.
|
23
|
+
#
|
24
|
+
# In order to rename <tt>A::B</tt> to <tt>C::D</tt>, you need to delete the
|
25
|
+
# definition of <tt>A::B</tt> and declare the deprecation in +A+:
|
26
|
+
#
|
27
|
+
# require "active_support/deprecation"
|
28
|
+
#
|
29
|
+
# module A
|
30
|
+
# include ActiveSupport::Deprecation::DeprecatedConstantAccessor
|
31
|
+
#
|
32
|
+
# deprecate_constant "B", "C::D", deprecator: ActiveSupport::Deprecation.new
|
33
|
+
# end
|
34
|
+
#
|
35
|
+
# The first argument is a constant name (no colons). It is the name of
|
36
|
+
# the constant you want to deprecate in the enclosing class or module.
|
37
|
+
#
|
38
|
+
# The second argument is the constant path of the replacement. That
|
39
|
+
# has to be a full path even if the replacement is defined in the same
|
40
|
+
# namespace as the deprecated one was.
|
41
|
+
#
|
42
|
+
# In both cases, strings and symbols are supported.
|
43
|
+
#
|
44
|
+
# The +deprecator+ keyword argument is the object that will print the
|
45
|
+
# deprecation message, an instance of ActiveSupport::Deprecation.
|
46
|
+
#
|
47
|
+
# With that in place, references to <tt>A::B</tt> still work, they
|
48
|
+
# evaluate to <tt>C::D</tt> now, and trigger a deprecation warning:
|
49
|
+
#
|
50
|
+
# DEPRECATION WARNING: A::B is deprecated! Use C::D instead.
|
51
|
+
# (called from ...)
|
52
|
+
#
|
53
|
+
# The message can be customized with the optional +message+ keyword
|
54
|
+
# argument.
|
55
|
+
#
|
56
|
+
# For this to work, a +const_missing+ hook is installed. When client
|
57
|
+
# code references the deprecated constant, the callback prints the
|
58
|
+
# message and constantizes the replacement.
|
59
|
+
#
|
60
|
+
# Caveat: If the deprecated constant name is reachable in a different
|
61
|
+
# namespace and Ruby constant lookup finds it, the hook won't be
|
62
|
+
# called and the deprecation won't work as intended. This may happen,
|
63
|
+
# for example, if an ancestor of the enclosing namespace has a
|
64
|
+
# constant with the same name. This is an unsupported edge case.
|
65
|
+
def deprecate_constant(old_constant_name, new_constant_path, deprecator:, message: nil)
|
43
66
|
class_variable_set(:@@_deprecated_constants, {}) unless class_variable_defined?(:@@_deprecated_constants)
|
44
|
-
class_variable_get(:@@_deprecated_constants)[
|
67
|
+
class_variable_get(:@@_deprecated_constants)[old_constant_name.to_s] = { new: new_constant_path, message: message, deprecator: deprecator }
|
45
68
|
end
|
46
69
|
end
|
47
70
|
base.singleton_class.prepend extension
|
@@ -7,14 +7,6 @@ module ActiveSupport
|
|
7
7
|
module LoggerThreadSafeLevel # :nodoc:
|
8
8
|
extend ActiveSupport::Concern
|
9
9
|
|
10
|
-
Logger::Severity.constants.each do |severity|
|
11
|
-
class_eval(<<-EOT, __FILE__, __LINE__ + 1)
|
12
|
-
def #{severity.downcase}? # def debug?
|
13
|
-
Logger::#{severity} >= level # DEBUG >= level
|
14
|
-
end # end
|
15
|
-
EOT
|
16
|
-
end
|
17
|
-
|
18
10
|
def local_level
|
19
11
|
IsolatedExecutionState[local_level_key]
|
20
12
|
end
|
@@ -30,6 +30,18 @@ module ActiveSupport
|
|
30
30
|
# self.current_user = User.find(id)
|
31
31
|
# end
|
32
32
|
#
|
33
|
+
# === Signing is not encryption
|
34
|
+
#
|
35
|
+
# The signed messages are not encrypted. The payload is merely encoded (Base64 by default) and can be decoded by
|
36
|
+
# anyone. The signature is just assuring that the message wasn't tampered with. For example:
|
37
|
+
#
|
38
|
+
# message = Rails.application.message_verifier('my_purpose').generate('never put secrets here')
|
39
|
+
# # => "BAhJIhtuZXZlciBwdXQgc2VjcmV0cyBoZXJlBjoGRVQ=--a0c1c0827919da5e949e989c971249355735e140"
|
40
|
+
# Base64.decode64(message.split("--").first) # no key needed
|
41
|
+
# # => 'never put secrets here'
|
42
|
+
#
|
43
|
+
# If you also need to encrypt the contents, you must use ActiveSupport::MessageEncryptor instead.
|
44
|
+
#
|
33
45
|
# === Confine messages to a specific purpose
|
34
46
|
#
|
35
47
|
# It's not recommended to use the same verifier for different purposes in your application.
|
@@ -45,7 +45,7 @@ module ActiveSupport
|
|
45
45
|
|
46
46
|
private
|
47
47
|
def parse_message_for_trace
|
48
|
-
if
|
48
|
+
if __getobj__.to_s.start_with?("(eval")
|
49
49
|
# If the exception is coming from a call to eval, we need to keep
|
50
50
|
# the path of the file in which eval was called to ensure we can
|
51
51
|
# return the right source fragment to show the location of the
|
@@ -56,15 +56,5 @@ module ActiveSupport
|
|
56
56
|
__getobj__.to_s.split("\n")
|
57
57
|
end
|
58
58
|
end
|
59
|
-
|
60
|
-
if SyntaxError.method_defined?(:path) # Ruby 3.3+
|
61
|
-
def source_location_eval?
|
62
|
-
__getobj__.path.start_with?("(eval")
|
63
|
-
end
|
64
|
-
else # 3.2 and older versions of Ruby
|
65
|
-
def source_location_eval?
|
66
|
-
__getobj__.to_s.start_with?("(eval")
|
67
|
-
end
|
68
|
-
end
|
69
59
|
end
|
70
60
|
end
|
@@ -163,10 +163,10 @@ module ActiveSupport
|
|
163
163
|
now = date_or_time.midnight.to_time
|
164
164
|
elsif date_or_time.is_a?(String)
|
165
165
|
now = Time.zone.parse(date_or_time)
|
166
|
-
elsif with_usec
|
167
|
-
now = date_or_time.to_time
|
168
166
|
else
|
169
|
-
now = date_or_time
|
167
|
+
now = date_or_time
|
168
|
+
now = now.to_time unless now.is_a?(Time)
|
169
|
+
now = now.change(usec: 0) unless with_usec
|
170
170
|
end
|
171
171
|
|
172
172
|
# +now+ must be in local system timezone, because +Time.at(now)+
|
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: 7.2.0.
|
4
|
+
version: 7.2.0.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Heinemeier Hansson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-06
|
11
|
+
date: 2024-08-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: i18n
|
@@ -140,6 +140,34 @@ dependencies:
|
|
140
140
|
- - ">="
|
141
141
|
- !ruby/object:Gem::Version
|
142
142
|
version: '0'
|
143
|
+
- !ruby/object:Gem::Dependency
|
144
|
+
name: logger
|
145
|
+
requirement: !ruby/object:Gem::Requirement
|
146
|
+
requirements:
|
147
|
+
- - ">="
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: 1.4.2
|
150
|
+
type: :runtime
|
151
|
+
prerelease: false
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
requirements:
|
154
|
+
- - ">="
|
155
|
+
- !ruby/object:Gem::Version
|
156
|
+
version: 1.4.2
|
157
|
+
- !ruby/object:Gem::Dependency
|
158
|
+
name: securerandom
|
159
|
+
requirement: !ruby/object:Gem::Requirement
|
160
|
+
requirements:
|
161
|
+
- - ">="
|
162
|
+
- !ruby/object:Gem::Version
|
163
|
+
version: '0.3'
|
164
|
+
type: :runtime
|
165
|
+
prerelease: false
|
166
|
+
version_requirements: !ruby/object:Gem::Requirement
|
167
|
+
requirements:
|
168
|
+
- - ">="
|
169
|
+
- !ruby/object:Gem::Version
|
170
|
+
version: '0.3'
|
143
171
|
description: A toolkit of support libraries and Ruby core extensions extracted from
|
144
172
|
the Rails framework. Rich support for multibyte strings, internationalization, time
|
145
173
|
zones, and testing.
|
@@ -438,10 +466,10 @@ licenses:
|
|
438
466
|
- MIT
|
439
467
|
metadata:
|
440
468
|
bug_tracker_uri: https://github.com/rails/rails/issues
|
441
|
-
changelog_uri: https://github.com/rails/rails/blob/v7.2.0.
|
442
|
-
documentation_uri: https://api.rubyonrails.org/v7.2.0.
|
469
|
+
changelog_uri: https://github.com/rails/rails/blob/v7.2.0.rc1/activesupport/CHANGELOG.md
|
470
|
+
documentation_uri: https://api.rubyonrails.org/v7.2.0.rc1/
|
443
471
|
mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
|
444
|
-
source_code_uri: https://github.com/rails/rails/tree/v7.2.0.
|
472
|
+
source_code_uri: https://github.com/rails/rails/tree/v7.2.0.rc1/activesupport
|
445
473
|
rubygems_mfa_required: 'true'
|
446
474
|
post_install_message:
|
447
475
|
rdoc_options:
|
@@ -456,11 +484,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
456
484
|
version: 3.1.0
|
457
485
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
458
486
|
requirements:
|
459
|
-
- - "
|
487
|
+
- - ">="
|
460
488
|
- !ruby/object:Gem::Version
|
461
|
-
version:
|
489
|
+
version: '0'
|
462
490
|
requirements: []
|
463
|
-
rubygems_version: 3.
|
491
|
+
rubygems_version: 3.5.11
|
464
492
|
signing_key:
|
465
493
|
specification_version: 4
|
466
494
|
summary: A toolkit of support libraries and Ruby core extensions extracted from the
|