diff --git a/gems/activesupport/7.0/_test/test.rb b/gems/activesupport/7.0/_test/test.rb
index 7c28bb56..23060e98 100644
--- a/gems/activesupport/7.0/_test/test.rb
+++ b/gems/activesupport/7.0/_test/test.rb
@@ -22,6 +22,19 @@
ActiveSupport::TimeZone['Asia/Tokyo'].to_s
Time.find_zone(Object.name)
Time.zone.now.to_fs
+1234567890.50.to_fs(:currency)
+1234567890.506.to_fs(:currency, precision: 3)
+(1..10).to_fs(:db)
+(1..10).to_fs
+[1,2].to_fs(:db)
+[1,2].to_fs
+Time.now.to_fs(:db)
+Time.now.to_fs
+Date.today.to_fs(:db)
+Date.today.to_fs
+DateTime.today.to_fs(:db)
+DateTime.today.to_fs
+
Array.wrap(nil)
Array.wrap([1, 2, 3])
diff --git a/gems/activesupport/7.0/activesupport-7.0.rbs b/gems/activesupport/7.0/activesupport-7.0.rbs
index 2edf212d..29a6a905 100644
--- a/gems/activesupport/7.0/activesupport-7.0.rbs
+++ b/gems/activesupport/7.0/activesupport-7.0.rbs
@@ -138,3 +138,242 @@ end
class String
def downcase_first: () -> String
end
+
+# active_support/core_ext/array/conversions.rb
+class Array[unchecked out Elem]
+ # Extends Array#to_s to convert a collection of elements into a
+ # comma separated id list if :db argument is given as the format.
+ #
+ # This method is aliased to to_formatted_s.
+ #
+ # Blog.all.to_fs(:db) # => "1,2,3"
+ # Blog.none.to_fs(:db) # => "null"
+ # [1,2].to_fs # => "[1, 2]"
+ def to_fs: (?Symbol format) -> String
+end
+
+# active_support/core_ext/numeric/conversions.rb
+class Numeric
+ # \Numeric With Format
+ #
+ # Provides options for converting numbers into formatted strings.
+ # Options are provided for phone numbers, currency, percentage,
+ # precision, positional notation, file size, and pretty printing.
+ #
+ # This method is aliased to to_formatted_s.
+ #
+ # ==== Options
+ #
+ # For details on which formats use which options, see ActiveSupport::NumberHelper
+ #
+ # ==== Examples
+ #
+ # Phone Numbers:
+ # 5551234.to_fs(:phone) # => "555-1234"
+ # 1235551234.to_fs(:phone) # => "123-555-1234"
+ # 1235551234.to_fs(:phone, area_code: true) # => "(123) 555-1234"
+ # 1235551234.to_fs(:phone, delimiter: ' ') # => "123 555 1234"
+ # 1235551234.to_fs(:phone, area_code: true, extension: 555) # => "(123) 555-1234 x 555"
+ # 1235551234.to_fs(:phone, country_code: 1) # => "+1-123-555-1234"
+ # 1235551234.to_fs(:phone, country_code: 1, extension: 1343, delimiter: '.')
+ # # => "+1.123.555.1234 x 1343"
+ #
+ # Currency:
+ # 1234567890.50.to_fs(:currency) # => "$1,234,567,890.50"
+ # 1234567890.506.to_fs(:currency) # => "$1,234,567,890.51"
+ # 1234567890.506.to_fs(:currency, precision: 3) # => "$1,234,567,890.506"
+ # 1234567890.506.to_fs(:currency, round_mode: :down) # => "$1,234,567,890.50"
+ # 1234567890.506.to_fs(:currency, locale: :fr) # => "1 234 567 890,51 €"
+ # -1234567890.50.to_fs(:currency, negative_format: '(%u%n)')
+ # # => "($1,234,567,890.50)"
+ # 1234567890.50.to_fs(:currency, unit: '£', separator: ',', delimiter: '')
+ # # => "£1234567890,50"
+ # 1234567890.50.to_fs(:currency, unit: '£', separator: ',', delimiter: '', format: '%n %u')
+ # # => "1234567890,50 £"
+ #
+ # Percentage:
+ # 100.to_fs(:percentage) # => "100.000%"
+ # 100.to_fs(:percentage, precision: 0) # => "100%"
+ # 1000.to_fs(:percentage, delimiter: '.', separator: ',') # => "1.000,000%"
+ # 302.24398923423.to_fs(:percentage, precision: 5) # => "302.24399%"
+ # 302.24398923423.to_fs(:percentage, round_mode: :down) # => "302.243%"
+ # 1000.to_fs(:percentage, locale: :fr) # => "1 000,000%"
+ # 100.to_fs(:percentage, format: '%n %') # => "100.000 %"
+ #
+ # Delimited:
+ # 12345678.to_fs(:delimited) # => "12,345,678"
+ # 12345678.05.to_fs(:delimited) # => "12,345,678.05"
+ # 12345678.to_fs(:delimited, delimiter: '.') # => "12.345.678"
+ # 12345678.to_fs(:delimited, delimiter: ',') # => "12,345,678"
+ # 12345678.05.to_fs(:delimited, separator: ' ') # => "12,345,678 05"
+ # 12345678.05.to_fs(:delimited, locale: :fr) # => "12 345 678,05"
+ # 98765432.98.to_fs(:delimited, delimiter: ' ', separator: ',')
+ # # => "98 765 432,98"
+ #
+ # Rounded:
+ # 111.2345.to_fs(:rounded) # => "111.235"
+ # 111.2345.to_fs(:rounded, precision: 2) # => "111.23"
+ # 111.2345.to_fs(:rounded, precision: 2, round_mode: :up) # => "111.24"
+ # 13.to_fs(:rounded, precision: 5) # => "13.00000"
+ # 389.32314.to_fs(:rounded, precision: 0) # => "389"
+ # 111.2345.to_fs(:rounded, significant: true) # => "111"
+ # 111.2345.to_fs(:rounded, precision: 1, significant: true) # => "100"
+ # 13.to_fs(:rounded, precision: 5, significant: true) # => "13.000"
+ # 111.234.to_fs(:rounded, locale: :fr) # => "111,234"
+ # 13.to_fs(:rounded, precision: 5, significant: true, strip_insignificant_zeros: true)
+ # # => "13"
+ # 389.32314.to_fs(:rounded, precision: 4, significant: true) # => "389.3"
+ # 1111.2345.to_fs(:rounded, precision: 2, separator: ',', delimiter: '.')
+ # # => "1.111,23"
+ #
+ # Human-friendly size in Bytes:
+ # 123.to_fs(:human_size) # => "123 Bytes"
+ # 1234.to_fs(:human_size) # => "1.21 KB"
+ # 12345.to_fs(:human_size) # => "12.1 KB"
+ # 1234567.to_fs(:human_size) # => "1.18 MB"
+ # 1234567890.to_fs(:human_size) # => "1.15 GB"
+ # 1234567890123.to_fs(:human_size) # => "1.12 TB"
+ # 1234567890123456.to_fs(:human_size) # => "1.1 PB"
+ # 1234567890123456789.to_fs(:human_size) # => "1.07 EB"
+ # 1234567.to_fs(:human_size, precision: 2) # => "1.2 MB"
+ # 1234567.to_fs(:human_size, precision: 2, round_mode: :up) # => "1.3 MB"
+ # 483989.to_fs(:human_size, precision: 2) # => "470 KB"
+ # 1234567.to_fs(:human_size, precision: 2, separator: ',') # => "1,2 MB"
+ # 1234567890123.to_fs(:human_size, precision: 5) # => "1.1228 TB"
+ # 524288000.to_fs(:human_size, precision: 5) # => "500 MB"
+ #
+ # Human-friendly format:
+ # 123.to_fs(:human) # => "123"
+ # 1234.to_fs(:human) # => "1.23 Thousand"
+ # 12345.to_fs(:human) # => "12.3 Thousand"
+ # 1234567.to_fs(:human) # => "1.23 Million"
+ # 1234567890.to_fs(:human) # => "1.23 Billion"
+ # 1234567890123.to_fs(:human) # => "1.23 Trillion"
+ # 1234567890123456.to_fs(:human) # => "1.23 Quadrillion"
+ # 1234567890123456789.to_fs(:human) # => "1230 Quadrillion"
+ # 489939.to_fs(:human, precision: 2) # => "490 Thousand"
+ # 489939.to_fs(:human, precision: 2, round_mode: :down) # => "480 Thousand"
+ # 489939.to_fs(:human, precision: 4) # => "489.9 Thousand"
+ # 1234567.to_fs(:human, precision: 4,
+ # significant: false) # => "1.2346 Million"
+ # 1234567.to_fs(:human, precision: 1,
+ # separator: ',',
+ # significant: false) # => "1,2 Million"
+ def to_fs: (?Symbol format, **untyped) -> String
+end
+
+# active_support/core_ext/range/conversions.rb
+class Range[out Elem]
+ # Convert range to a formatted string. See RANGE_FORMATS for predefined formats.
+ #
+ # This method is aliased to to_formatted_s.
+ #
+ # range = (1..100) # => 1..100
+ #
+ # range.to_s # => "1..100"
+ # range.to_fs(:db) # => "BETWEEN '1' AND '100'"
+ #
+ # range = (1..) # => 1..
+ # range.to_fs(:db) # => ">= '1'"
+ #
+ # range = (..100) # => ..100
+ # range.to_fs(:db) # => "<= '100'"
+ #
+ # == Adding your own range formats to to_fs
+ # You can add your own formats to the Range::RANGE_FORMATS hash.
+ # Use the format name as the hash key and a Proc instance.
+ #
+ # # config/initializers/range_formats.rb
+ # Range::RANGE_FORMATS[:short] = ->(start, stop) { "Between #{start.to_fs(:db)} and #{stop.to_fs(:db)}" }
+ def to_fs: (?Symbol format) -> String
+end
+
+# active_support/core_ext/date/conversions.rb
+class Date
+ # Convert to a formatted string. See DATE_FORMATS for predefined formats.
+ #
+ # This method is aliased to to_formatted_s.
+ #
+ # date = Date.new(2007, 11, 10) # => Sat, 10 Nov 2007
+ #
+ # date.to_fs(:db) # => "2007-11-10"
+ # date.to_formatted_s(:db) # => "2007-11-10"
+ #
+ # date.to_fs(:short) # => "10 Nov"
+ # date.to_fs(:number) # => "20071110"
+ # date.to_fs(:long) # => "November 10, 2007"
+ # date.to_fs(:long_ordinal) # => "November 10th, 2007"
+ # date.to_fs(:rfc822) # => "10 Nov 2007"
+ # date.to_fs(:iso8601) # => "2007-11-10"
+ #
+ # == Adding your own date formats to to_fs
+ # You can add your own formats to the Date::DATE_FORMATS hash.
+ # Use the format name as the hash key and either a strftime string
+ # or Proc instance that takes a date argument as the value.
+ #
+ # # config/initializers/date_formats.rb
+ # Date::DATE_FORMATS[:month_and_year] = '%B %Y'
+ # Date::DATE_FORMATS[:short_ordinal] = ->(date) { date.strftime("%B #{date.day.ordinalize}") }
+ def to_fs: (?Symbol format) -> String
+end
+
+# active_support/core_ext/time/conversions.rb
+class Time
+ # Converts to a formatted string. See DATE_FORMATS for built-in formats.
+ #
+ # This method is aliased to to_formatted_s.
+ #
+ # time = Time.now # => 2007-01-18 06:10:17 -06:00
+ #
+ # time.to_fs(:time) # => "06:10"
+ # time.to_formatted_s(:time) # => "06:10"
+ #
+ # time.to_fs(:db) # => "2007-01-18 06:10:17"
+ # time.to_fs(:number) # => "20070118061017"
+ # time.to_fs(:short) # => "18 Jan 06:10"
+ # time.to_fs(:long) # => "January 18, 2007 06:10"
+ # time.to_fs(:long_ordinal) # => "January 18th, 2007 06:10"
+ # time.to_fs(:rfc822) # => "Thu, 18 Jan 2007 06:10:17 -0600"
+ # time.to_fs(:rfc2822) # => "Thu, 18 Jan 2007 06:10:17 -0600"
+ # time.to_fs(:iso8601) # => "2007-01-18T06:10:17-06:00"
+ #
+ # == Adding your own time formats to +to_fs+
+ # You can add your own formats to the Time::DATE_FORMATS hash.
+ # Use the format name as the hash key and either a strftime string
+ # or Proc instance that takes a time argument as the value.
+ #
+ # # config/initializers/time_formats.rb
+ # Time::DATE_FORMATS[:month_and_year] = '%B %Y'
+ # Time::DATE_FORMATS[:short_ordinal] = ->(time) { time.strftime("%B #{time.day.ordinalize}") }
+ def to_fs: (?Symbol format) -> String
+end
+
+# active_support/core_ext/date_time/conversions.rb
+class DateTime
+ # Convert to a formatted string. See Time::DATE_FORMATS for predefined formats.
+ #
+ # This method is aliased to to_formatted_s.
+ #
+ # === Examples
+ # datetime = DateTime.civil(2007, 12, 4, 0, 0, 0, 0) # => Tue, 04 Dec 2007 00:00:00 +0000
+ #
+ # datetime.to_fs(:db) # => "2007-12-04 00:00:00"
+ # datetime.to_formatted_s(:db) # => "2007-12-04 00:00:00"
+ # datetime.to_fs(:number) # => "20071204000000"
+ # datetime.to_fs(:short) # => "04 Dec 00:00"
+ # datetime.to_fs(:long) # => "December 04, 2007 00:00"
+ # datetime.to_fs(:long_ordinal) # => "December 4th, 2007 00:00"
+ # datetime.to_fs(:rfc822) # => "Tue, 04 Dec 2007 00:00:00 +0000"
+ # datetime.to_fs(:iso8601) # => "2007-12-04T00:00:00+00:00"
+ #
+ # == Adding your own datetime formats to to_fs
+ # DateTime formats are shared with Time. You can add your own to the
+ # Time::DATE_FORMATS hash. Use the format name as the hash key and
+ # either a strftime string or Proc instance that takes a time or
+ # datetime argument as the value.
+ #
+ # # config/initializers/time_formats.rb
+ # Time::DATE_FORMATS[:month_and_year] = '%B %Y'
+ # Time::DATE_FORMATS[:short_ordinal] = lambda { |time| time.strftime("%B #{time.day.ordinalize}") }
+ def to_fs: (?Symbol format) -> String
+end