activesupport 6.1.4.1 → 7.0.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of activesupport might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +216 -473
- data/MIT-LICENSE +1 -1
- data/lib/active_support/actionable_error.rb +1 -1
- data/lib/active_support/array_inquirer.rb +0 -2
- data/lib/active_support/benchmarkable.rb +2 -2
- data/lib/active_support/cache/file_store.rb +15 -9
- data/lib/active_support/cache/mem_cache_store.rb +127 -32
- data/lib/active_support/cache/memory_store.rb +23 -15
- data/lib/active_support/cache/null_store.rb +10 -2
- data/lib/active_support/cache/redis_cache_store.rb +42 -67
- data/lib/active_support/cache/strategy/local_cache.rb +35 -61
- data/lib/active_support/cache.rb +189 -45
- data/lib/active_support/callbacks.rb +180 -81
- data/lib/active_support/code_generator.rb +65 -0
- data/lib/active_support/concern.rb +5 -5
- data/lib/active_support/concurrency/load_interlock_aware_monitor.rb +2 -4
- data/lib/active_support/concurrency/share_lock.rb +2 -2
- data/lib/active_support/configurable.rb +6 -3
- data/lib/active_support/configuration_file.rb +1 -1
- data/lib/active_support/core_ext/array/access.rb +1 -5
- data/lib/active_support/core_ext/array/conversions.rb +9 -7
- data/lib/active_support/core_ext/array/deprecated_conversions.rb +25 -0
- data/lib/active_support/core_ext/array/grouping.rb +6 -6
- data/lib/active_support/core_ext/array.rb +1 -0
- data/lib/active_support/core_ext/big_decimal/conversions.rb +1 -1
- data/lib/active_support/core_ext/class/subclasses.rb +25 -17
- data/lib/active_support/core_ext/date/blank.rb +1 -1
- data/lib/active_support/core_ext/date/calculations.rb +4 -4
- data/lib/active_support/core_ext/date/conversions.rb +3 -3
- data/lib/active_support/core_ext/date/deprecated_conversions.rb +26 -0
- data/lib/active_support/core_ext/date.rb +1 -0
- data/lib/active_support/core_ext/date_and_time/compatibility.rb +1 -1
- data/lib/active_support/core_ext/date_time/blank.rb +1 -1
- data/lib/active_support/core_ext/date_time/conversions.rb +5 -5
- data/lib/active_support/core_ext/date_time/deprecated_conversions.rb +22 -0
- data/lib/active_support/core_ext/date_time.rb +1 -0
- data/lib/active_support/core_ext/digest/uuid.rb +39 -13
- data/lib/active_support/core_ext/enumerable.rb +64 -12
- data/lib/active_support/core_ext/file/atomic.rb +1 -1
- data/lib/active_support/core_ext/hash/keys.rb +1 -1
- data/lib/active_support/core_ext/kernel/reporting.rb +4 -4
- data/lib/active_support/core_ext/module/attribute_accessors.rb +2 -0
- data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +19 -10
- data/lib/active_support/core_ext/module/delegation.rb +2 -8
- data/lib/active_support/core_ext/name_error.rb +2 -8
- data/lib/active_support/core_ext/numeric/conversions.rb +79 -76
- data/lib/active_support/core_ext/numeric/deprecated_conversions.rb +60 -0
- data/lib/active_support/core_ext/numeric.rb +1 -0
- data/lib/active_support/core_ext/object/acts_like.rb +29 -5
- data/lib/active_support/core_ext/object/blank.rb +2 -2
- data/lib/active_support/core_ext/object/deep_dup.rb +1 -1
- data/lib/active_support/core_ext/object/duplicable.rb +11 -0
- data/lib/active_support/core_ext/object/json.rb +29 -24
- data/lib/active_support/core_ext/object/to_query.rb +2 -2
- data/lib/active_support/core_ext/object/try.rb +20 -20
- data/lib/active_support/core_ext/object/with_options.rb +20 -1
- data/lib/active_support/core_ext/pathname/existence.rb +21 -0
- data/lib/active_support/core_ext/pathname.rb +3 -0
- data/lib/active_support/core_ext/range/compare_range.rb +0 -25
- data/lib/active_support/core_ext/range/conversions.rb +8 -8
- data/lib/active_support/core_ext/range/deprecated_conversions.rb +26 -0
- data/lib/active_support/core_ext/range/each.rb +1 -1
- data/lib/active_support/core_ext/range/include_time_with_zone.rb +4 -25
- data/lib/active_support/core_ext/range.rb +1 -1
- data/lib/active_support/core_ext/string/filters.rb +1 -1
- data/lib/active_support/core_ext/string/inflections.rb +1 -1
- data/lib/active_support/core_ext/string/output_safety.rb +60 -36
- data/lib/active_support/core_ext/symbol/starts_ends_with.rb +0 -8
- data/lib/active_support/core_ext/time/calculations.rb +7 -6
- data/lib/active_support/core_ext/time/conversions.rb +4 -3
- data/lib/active_support/core_ext/time/deprecated_conversions.rb +22 -0
- data/lib/active_support/core_ext/time/zones.rb +4 -19
- data/lib/active_support/core_ext/time.rb +1 -0
- data/lib/active_support/core_ext/uri.rb +3 -27
- data/lib/active_support/core_ext.rb +1 -0
- data/lib/active_support/current_attributes.rb +31 -14
- data/lib/active_support/dependencies/interlock.rb +10 -18
- data/lib/active_support/dependencies/require_dependency.rb +28 -0
- data/lib/active_support/dependencies.rb +58 -788
- data/lib/active_support/deprecation/behaviors.rb +4 -1
- data/lib/active_support/deprecation/method_wrappers.rb +3 -3
- data/lib/active_support/deprecation/proxy_wrappers.rb +1 -1
- data/lib/active_support/deprecation.rb +1 -1
- data/lib/active_support/descendants_tracker.rb +174 -68
- data/lib/active_support/digest.rb +5 -3
- data/lib/active_support/duration/iso8601_parser.rb +3 -3
- data/lib/active_support/duration/iso8601_serializer.rb +9 -1
- data/lib/active_support/duration.rb +81 -51
- data/lib/active_support/encrypted_configuration.rb +11 -1
- data/lib/active_support/encrypted_file.rb +1 -1
- data/lib/active_support/environment_inquirer.rb +1 -1
- data/lib/active_support/error_reporter.rb +117 -0
- data/lib/active_support/evented_file_update_checker.rb +1 -1
- data/lib/active_support/execution_context/test_helper.rb +13 -0
- data/lib/active_support/execution_context.rb +53 -0
- data/lib/active_support/execution_wrapper.rb +30 -4
- data/lib/active_support/executor/test_helper.rb +7 -0
- data/lib/active_support/fork_tracker.rb +19 -12
- data/lib/active_support/gem_version.rb +4 -4
- data/lib/active_support/hash_with_indifferent_access.rb +3 -1
- data/lib/active_support/html_safe_translation.rb +43 -0
- data/lib/active_support/i18n.rb +1 -0
- data/lib/active_support/i18n_railtie.rb +1 -1
- data/lib/active_support/inflector/inflections.rb +23 -7
- data/lib/active_support/inflector/methods.rb +24 -48
- data/lib/active_support/isolated_execution_state.rb +56 -0
- data/lib/active_support/json/encoding.rb +3 -3
- data/lib/active_support/key_generator.rb +18 -1
- data/lib/active_support/locale/en.yml +1 -1
- data/lib/active_support/log_subscriber.rb +13 -3
- data/lib/active_support/logger_thread_safe_level.rb +4 -13
- data/lib/active_support/message_encryptor.rb +8 -3
- data/lib/active_support/message_verifier.rb +46 -14
- data/lib/active_support/messages/metadata.rb +2 -2
- data/lib/active_support/multibyte/chars.rb +10 -11
- data/lib/active_support/multibyte/unicode.rb +0 -12
- data/lib/active_support/multibyte.rb +1 -1
- data/lib/active_support/notifications/fanout.rb +91 -65
- data/lib/active_support/notifications/instrumenter.rb +32 -15
- data/lib/active_support/notifications.rb +15 -21
- data/lib/active_support/number_helper/number_converter.rb +1 -3
- data/lib/active_support/number_helper/number_to_currency_converter.rb +11 -6
- data/lib/active_support/number_helper/number_to_delimited_converter.rb +1 -1
- data/lib/active_support/number_helper/number_to_human_size_converter.rb +1 -1
- data/lib/active_support/number_helper/number_to_phone_converter.rb +1 -1
- data/lib/active_support/number_helper/rounding_helper.rb +1 -5
- data/lib/active_support/number_helper.rb +0 -2
- data/lib/active_support/option_merger.rb +8 -16
- data/lib/active_support/ordered_hash.rb +1 -1
- data/lib/active_support/parameter_filter.rb +5 -0
- data/lib/active_support/per_thread_registry.rb +5 -0
- data/lib/active_support/railtie.rb +69 -19
- data/lib/active_support/rescuable.rb +2 -2
- data/lib/active_support/ruby_features.rb +7 -0
- data/lib/active_support/secure_compare_rotator.rb +1 -1
- data/lib/active_support/string_inquirer.rb +0 -2
- data/lib/active_support/subscriber.rb +7 -18
- data/lib/active_support/tagged_logging.rb +2 -2
- data/lib/active_support/test_case.rb +9 -21
- data/lib/active_support/testing/assertions.rb +35 -5
- data/lib/active_support/testing/deprecation.rb +52 -1
- data/lib/active_support/testing/isolation.rb +2 -2
- data/lib/active_support/testing/method_call_assertions.rb +5 -5
- data/lib/active_support/testing/parallelization/server.rb +4 -0
- data/lib/active_support/testing/parallelization/worker.rb +3 -0
- data/lib/active_support/testing/parallelization.rb +4 -0
- data/lib/active_support/testing/parallelize_executor.rb +76 -0
- data/lib/active_support/testing/stream.rb +3 -5
- data/lib/active_support/testing/tagged_logging.rb +1 -1
- data/lib/active_support/testing/time_helpers.rb +13 -2
- data/lib/active_support/time_with_zone.rb +53 -12
- data/lib/active_support/values/time_zone.rb +30 -9
- data/lib/active_support/xml_mini/jdom.rb +1 -1
- data/lib/active_support/xml_mini/libxml.rb +5 -5
- data/lib/active_support/xml_mini/libxmlsax.rb +1 -1
- data/lib/active_support/xml_mini/nokogiri.rb +4 -4
- data/lib/active_support/xml_mini/nokogirisax.rb +1 -1
- data/lib/active_support/xml_mini/rexml.rb +1 -1
- data/lib/active_support/xml_mini.rb +5 -4
- data/lib/active_support.rb +17 -1
- metadata +29 -26
- data/lib/active_support/core_ext/marshal.rb +0 -26
- data/lib/active_support/dependencies/zeitwerk_integration.rb +0 -117
@@ -199,13 +199,7 @@ class Module
|
|
199
199
|
|
200
200
|
# Attribute writer methods only accept one argument. Makes sure []=
|
201
201
|
# methods still accept two arguments.
|
202
|
-
definition =
|
203
|
-
"arg"
|
204
|
-
elsif RUBY_VERSION >= "2.7"
|
205
|
-
"..."
|
206
|
-
else
|
207
|
-
"*args, &block"
|
208
|
-
end
|
202
|
+
definition = /[^\]]=\z/.match?(method) ? "arg" : "..."
|
209
203
|
|
210
204
|
# The following generated method calls the target exactly once, storing
|
211
205
|
# the returned value in a dummy variable.
|
@@ -324,7 +318,7 @@ class Module
|
|
324
318
|
end
|
325
319
|
end
|
326
320
|
end
|
327
|
-
ruby2_keywords(:method_missing)
|
321
|
+
ruby2_keywords(:method_missing)
|
328
322
|
RUBY
|
329
323
|
end
|
330
324
|
end
|
@@ -53,13 +53,7 @@ class NameError
|
|
53
53
|
UNBOUND_METHOD_MODULE_NAME = Module.instance_method(:name)
|
54
54
|
private_constant :UNBOUND_METHOD_MODULE_NAME
|
55
55
|
|
56
|
-
|
57
|
-
|
58
|
-
UNBOUND_METHOD_MODULE_NAME.bind_call(mod)
|
59
|
-
end
|
60
|
-
else
|
61
|
-
def real_mod_name(mod)
|
62
|
-
UNBOUND_METHOD_MODULE_NAME.bind(mod).call
|
63
|
-
end
|
56
|
+
def real_mod_name(mod)
|
57
|
+
UNBOUND_METHOD_MODULE_NAME.bind_call(mod)
|
64
58
|
end
|
65
59
|
end
|
@@ -9,6 +9,8 @@ module ActiveSupport
|
|
9
9
|
# Options are provided for phone numbers, currency, percentage,
|
10
10
|
# precision, positional notation, file size and pretty printing.
|
11
11
|
#
|
12
|
+
# This method is aliased to <tt>to_fs</tt>.
|
13
|
+
#
|
12
14
|
# ==== Options
|
13
15
|
#
|
14
16
|
# For details on which formats use which options, see ActiveSupport::NumberHelper
|
@@ -16,102 +18,102 @@ module ActiveSupport
|
|
16
18
|
# ==== Examples
|
17
19
|
#
|
18
20
|
# Phone Numbers:
|
19
|
-
# 5551234.
|
20
|
-
# 1235551234.
|
21
|
-
# 1235551234.
|
22
|
-
# 1235551234.
|
23
|
-
# 1235551234.
|
24
|
-
# 1235551234.
|
25
|
-
# 1235551234.
|
21
|
+
# 5551234.to_formatted_s(:phone) # => "555-1234"
|
22
|
+
# 1235551234.to_formatted_s(:phone) # => "123-555-1234"
|
23
|
+
# 1235551234.to_formatted_s(:phone, area_code: true) # => "(123) 555-1234"
|
24
|
+
# 1235551234.to_formatted_s(:phone, delimiter: ' ') # => "123 555 1234"
|
25
|
+
# 1235551234.to_formatted_s(:phone, area_code: true, extension: 555) # => "(123) 555-1234 x 555"
|
26
|
+
# 1235551234.to_formatted_s(:phone, country_code: 1) # => "+1-123-555-1234"
|
27
|
+
# 1235551234.to_formatted_s(:phone, country_code: 1, extension: 1343, delimiter: '.')
|
26
28
|
# # => "+1.123.555.1234 x 1343"
|
27
29
|
#
|
28
30
|
# Currency:
|
29
|
-
# 1234567890.50.
|
30
|
-
# 1234567890.506.
|
31
|
-
# 1234567890.506.
|
32
|
-
# 1234567890.506.
|
33
|
-
# 1234567890.506.
|
34
|
-
# -1234567890.50.
|
31
|
+
# 1234567890.50.to_formatted_s(:currency) # => "$1,234,567,890.50"
|
32
|
+
# 1234567890.506.to_formatted_s(:currency) # => "$1,234,567,890.51"
|
33
|
+
# 1234567890.506.to_formatted_s(:currency, precision: 3) # => "$1,234,567,890.506"
|
34
|
+
# 1234567890.506.to_formatted_s(:currency, round_mode: :down) # => "$1,234,567,890.50"
|
35
|
+
# 1234567890.506.to_formatted_s(:currency, locale: :fr) # => "1 234 567 890,51 €"
|
36
|
+
# -1234567890.50.to_formatted_s(:currency, negative_format: '(%u%n)')
|
35
37
|
# # => "($1,234,567,890.50)"
|
36
|
-
# 1234567890.50.
|
38
|
+
# 1234567890.50.to_formatted_s(:currency, unit: '£', separator: ',', delimiter: '')
|
37
39
|
# # => "£1234567890,50"
|
38
|
-
# 1234567890.50.
|
40
|
+
# 1234567890.50.to_formatted_s(:currency, unit: '£', separator: ',', delimiter: '', format: '%n %u')
|
39
41
|
# # => "1234567890,50 £"
|
40
42
|
#
|
41
43
|
# Percentage:
|
42
|
-
# 100.
|
43
|
-
# 100.
|
44
|
-
# 1000.
|
45
|
-
# 302.24398923423.
|
46
|
-
# 302.24398923423.
|
47
|
-
# 1000.
|
48
|
-
# 100.
|
44
|
+
# 100.to_formatted_s(:percentage) # => "100.000%"
|
45
|
+
# 100.to_formatted_s(:percentage, precision: 0) # => "100%"
|
46
|
+
# 1000.to_formatted_s(:percentage, delimiter: '.', separator: ',') # => "1.000,000%"
|
47
|
+
# 302.24398923423.to_formatted_s(:percentage, precision: 5) # => "302.24399%"
|
48
|
+
# 302.24398923423.to_formatted_s(:percentage, round_mode: :down) # => "302.243%"
|
49
|
+
# 1000.to_formatted_s(:percentage, locale: :fr) # => "1 000,000%"
|
50
|
+
# 100.to_formatted_s(:percentage, format: '%n %') # => "100.000 %"
|
49
51
|
#
|
50
52
|
# Delimited:
|
51
|
-
# 12345678.
|
52
|
-
# 12345678.05.
|
53
|
-
# 12345678.
|
54
|
-
# 12345678.
|
55
|
-
# 12345678.05.
|
56
|
-
# 12345678.05.
|
57
|
-
# 98765432.98.
|
53
|
+
# 12345678.to_formatted_s(:delimited) # => "12,345,678"
|
54
|
+
# 12345678.05.to_formatted_s(:delimited) # => "12,345,678.05"
|
55
|
+
# 12345678.to_formatted_s(:delimited, delimiter: '.') # => "12.345.678"
|
56
|
+
# 12345678.to_formatted_s(:delimited, delimiter: ',') # => "12,345,678"
|
57
|
+
# 12345678.05.to_formatted_s(:delimited, separator: ' ') # => "12,345,678 05"
|
58
|
+
# 12345678.05.to_formatted_s(:delimited, locale: :fr) # => "12 345 678,05"
|
59
|
+
# 98765432.98.to_formatted_s(:delimited, delimiter: ' ', separator: ',')
|
58
60
|
# # => "98 765 432,98"
|
59
61
|
#
|
60
62
|
# Rounded:
|
61
|
-
# 111.2345.
|
62
|
-
# 111.2345.
|
63
|
-
# 111.2345.
|
64
|
-
# 13.
|
65
|
-
# 389.32314.
|
66
|
-
# 111.2345.
|
67
|
-
# 111.2345.
|
68
|
-
# 13.
|
69
|
-
# 111.234.
|
70
|
-
# 13.
|
63
|
+
# 111.2345.to_formatted_s(:rounded) # => "111.235"
|
64
|
+
# 111.2345.to_formatted_s(:rounded, precision: 2) # => "111.23"
|
65
|
+
# 111.2345.to_formatted_s(:rounded, precision: 2, round_mode: :up) # => "111.24"
|
66
|
+
# 13.to_formatted_s(:rounded, precision: 5) # => "13.00000"
|
67
|
+
# 389.32314.to_formatted_s(:rounded, precision: 0) # => "389"
|
68
|
+
# 111.2345.to_formatted_s(:rounded, significant: true) # => "111"
|
69
|
+
# 111.2345.to_formatted_s(:rounded, precision: 1, significant: true) # => "100"
|
70
|
+
# 13.to_formatted_s(:rounded, precision: 5, significant: true) # => "13.000"
|
71
|
+
# 111.234.to_formatted_s(:rounded, locale: :fr) # => "111,234"
|
72
|
+
# 13.to_formatted_s(:rounded, precision: 5, significant: true, strip_insignificant_zeros: true)
|
71
73
|
# # => "13"
|
72
|
-
# 389.32314.
|
73
|
-
# 1111.2345.
|
74
|
+
# 389.32314.to_formatted_s(:rounded, precision: 4, significant: true) # => "389.3"
|
75
|
+
# 1111.2345.to_formatted_s(:rounded, precision: 2, separator: ',', delimiter: '.')
|
74
76
|
# # => "1.111,23"
|
75
77
|
#
|
76
78
|
# Human-friendly size in Bytes:
|
77
|
-
# 123.
|
78
|
-
# 1234.
|
79
|
-
# 12345.
|
80
|
-
# 1234567.
|
81
|
-
# 1234567890.
|
82
|
-
# 1234567890123.
|
83
|
-
# 1234567890123456.
|
84
|
-
# 1234567890123456789.
|
85
|
-
# 1234567.
|
86
|
-
# 1234567.
|
87
|
-
# 483989.
|
88
|
-
# 1234567.
|
89
|
-
# 1234567890123.
|
90
|
-
# 524288000.
|
79
|
+
# 123.to_formatted_s(:human_size) # => "123 Bytes"
|
80
|
+
# 1234.to_formatted_s(:human_size) # => "1.21 KB"
|
81
|
+
# 12345.to_formatted_s(:human_size) # => "12.1 KB"
|
82
|
+
# 1234567.to_formatted_s(:human_size) # => "1.18 MB"
|
83
|
+
# 1234567890.to_formatted_s(:human_size) # => "1.15 GB"
|
84
|
+
# 1234567890123.to_formatted_s(:human_size) # => "1.12 TB"
|
85
|
+
# 1234567890123456.to_formatted_s(:human_size) # => "1.1 PB"
|
86
|
+
# 1234567890123456789.to_formatted_s(:human_size) # => "1.07 EB"
|
87
|
+
# 1234567.to_formatted_s(:human_size, precision: 2) # => "1.2 MB"
|
88
|
+
# 1234567.to_formatted_s(:human_size, precision: 2, round_mode: :up) # => "1.3 MB"
|
89
|
+
# 483989.to_formatted_s(:human_size, precision: 2) # => "470 KB"
|
90
|
+
# 1234567.to_formatted_s(:human_size, precision: 2, separator: ',') # => "1,2 MB"
|
91
|
+
# 1234567890123.to_formatted_s(:human_size, precision: 5) # => "1.1228 TB"
|
92
|
+
# 524288000.to_formatted_s(:human_size, precision: 5) # => "500 MB"
|
91
93
|
#
|
92
94
|
# Human-friendly format:
|
93
|
-
# 123.
|
94
|
-
# 1234.
|
95
|
-
# 12345.
|
96
|
-
# 1234567.
|
97
|
-
# 1234567890.
|
98
|
-
# 1234567890123.
|
99
|
-
# 1234567890123456.
|
100
|
-
# 1234567890123456789.
|
101
|
-
# 489939.
|
102
|
-
# 489939.
|
103
|
-
# 489939.
|
104
|
-
# 1234567.
|
105
|
-
# significant: false)
|
106
|
-
# 1234567.
|
95
|
+
# 123.to_formatted_s(:human) # => "123"
|
96
|
+
# 1234.to_formatted_s(:human) # => "1.23 Thousand"
|
97
|
+
# 12345.to_formatted_s(:human) # => "12.3 Thousand"
|
98
|
+
# 1234567.to_formatted_s(:human) # => "1.23 Million"
|
99
|
+
# 1234567890.to_formatted_s(:human) # => "1.23 Billion"
|
100
|
+
# 1234567890123.to_formatted_s(:human) # => "1.23 Trillion"
|
101
|
+
# 1234567890123456.to_formatted_s(:human) # => "1.23 Quadrillion"
|
102
|
+
# 1234567890123456789.to_formatted_s(:human) # => "1230 Quadrillion"
|
103
|
+
# 489939.to_formatted_s(:human, precision: 2) # => "490 Thousand"
|
104
|
+
# 489939.to_formatted_s(:human, precision: 2, round_mode: :down) # => "480 Thousand"
|
105
|
+
# 489939.to_formatted_s(:human, precision: 4) # => "489.9 Thousand"
|
106
|
+
# 1234567.to_formatted_s(:human, precision: 4,
|
107
|
+
# significant: false) # => "1.2346 Million"
|
108
|
+
# 1234567.to_formatted_s(:human, precision: 1,
|
107
109
|
# separator: ',',
|
108
|
-
# significant: false)
|
109
|
-
def
|
110
|
+
# significant: false) # => "1,2 Million"
|
111
|
+
def to_formatted_s(format = nil, options = nil)
|
112
|
+
return to_s if format.nil?
|
113
|
+
|
110
114
|
case format
|
111
|
-
when nil
|
112
|
-
super()
|
113
115
|
when Integer, String
|
114
|
-
|
116
|
+
to_s(format)
|
115
117
|
when :phone
|
116
118
|
ActiveSupport::NumberHelper.number_to_phone(self, options || {})
|
117
119
|
when :currency
|
@@ -127,11 +129,12 @@ module ActiveSupport
|
|
127
129
|
when :human_size
|
128
130
|
ActiveSupport::NumberHelper.number_to_human_size(self, options || {})
|
129
131
|
when Symbol
|
130
|
-
|
132
|
+
to_s
|
131
133
|
else
|
132
|
-
|
134
|
+
to_s(format)
|
133
135
|
end
|
134
136
|
end
|
137
|
+
alias_method :to_fs, :to_formatted_s
|
135
138
|
end
|
136
139
|
end
|
137
140
|
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveSupport
|
4
|
+
module DeprecatedNumericWithFormat # :nodoc:
|
5
|
+
def to_s(format = nil, options = nil)
|
6
|
+
return super() if format.nil?
|
7
|
+
|
8
|
+
case format
|
9
|
+
when Integer, String
|
10
|
+
super(format)
|
11
|
+
when :phone
|
12
|
+
ActiveSupport::Deprecation.warn(
|
13
|
+
"#{self.class}#to_s(#{format.inspect}) is deprecated. Please use #{self.class}#to_formatted_s(#{format.inspect}) instead."
|
14
|
+
)
|
15
|
+
ActiveSupport::NumberHelper.number_to_phone(self, options || {})
|
16
|
+
when :currency
|
17
|
+
ActiveSupport::Deprecation.warn(
|
18
|
+
"#{self.class}#to_s(#{format.inspect}) is deprecated. Please use #{self.class}#to_formatted_s(#{format.inspect}) instead."
|
19
|
+
)
|
20
|
+
ActiveSupport::NumberHelper.number_to_currency(self, options || {})
|
21
|
+
when :percentage
|
22
|
+
ActiveSupport::Deprecation.warn(
|
23
|
+
"#{self.class}#to_s(#{format.inspect}) is deprecated. Please use #{self.class}#to_formatted_s(#{format.inspect}) instead."
|
24
|
+
)
|
25
|
+
ActiveSupport::NumberHelper.number_to_percentage(self, options || {})
|
26
|
+
when :delimited
|
27
|
+
ActiveSupport::Deprecation.warn(
|
28
|
+
"#{self.class}#to_s(#{format.inspect}) is deprecated. Please use #{self.class}#to_formatted_s(#{format.inspect}) instead."
|
29
|
+
)
|
30
|
+
ActiveSupport::NumberHelper.number_to_delimited(self, options || {})
|
31
|
+
when :rounded
|
32
|
+
ActiveSupport::Deprecation.warn(
|
33
|
+
"#{self.class}#to_s(#{format.inspect}) is deprecated. Please use #{self.class}#to_formatted_s(#{format.inspect}) instead."
|
34
|
+
)
|
35
|
+
ActiveSupport::NumberHelper.number_to_rounded(self, options || {})
|
36
|
+
when :human
|
37
|
+
ActiveSupport::Deprecation.warn(
|
38
|
+
"#{self.class}#to_s(#{format.inspect}) is deprecated. Please use #{self.class}#to_formatted_s(#{format.inspect}) instead."
|
39
|
+
)
|
40
|
+
ActiveSupport::NumberHelper.number_to_human(self, options || {})
|
41
|
+
when :human_size
|
42
|
+
ActiveSupport::Deprecation.warn(
|
43
|
+
"#{self.class}#to_s(#{format.inspect}) is deprecated. Please use #{self.class}#to_formatted_s(#{format.inspect}) instead."
|
44
|
+
)
|
45
|
+
ActiveSupport::NumberHelper.number_to_human_size(self, options || {})
|
46
|
+
when Symbol
|
47
|
+
ActiveSupport::Deprecation.warn(
|
48
|
+
"#{self.class}#to_s(#{format.inspect}) is deprecated. Please use #{self.class}#to_formatted_s(#{format.inspect}) instead."
|
49
|
+
)
|
50
|
+
super()
|
51
|
+
else
|
52
|
+
super(format)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
Integer.prepend ActiveSupport::DeprecatedNumericWithFormat
|
59
|
+
Float.prepend ActiveSupport::DeprecatedNumericWithFormat
|
60
|
+
BigDecimal.prepend ActiveSupport::DeprecatedNumericWithFormat
|
@@ -3,3 +3,4 @@
|
|
3
3
|
require "active_support/core_ext/numeric/bytes"
|
4
4
|
require "active_support/core_ext/numeric/time"
|
5
5
|
require "active_support/core_ext/numeric/conversions"
|
6
|
+
require "active_support/core_ext/numeric/deprecated_conversions" unless ENV["RAILS_DISABLE_DEPRECATED_TO_S_CONVERSION"]
|
@@ -1,11 +1,35 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class Object
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
# <tt>
|
8
|
-
#
|
4
|
+
# Provides a way to check whether some class acts like some other class based on the existence of
|
5
|
+
# an appropriately-named marker method.
|
6
|
+
#
|
7
|
+
# A class that provides the same interface as <tt>SomeClass</tt> may define a marker method named
|
8
|
+
# <tt>acts_like_some_class?</tt> to signal its compatibility to callers of
|
9
|
+
# <tt>acts_like?(:some_class)</tt>.
|
10
|
+
#
|
11
|
+
# For example, Active Support extends <tt>Date</tt> to define an <tt>acts_like_date?</tt> method,
|
12
|
+
# and extends <tt>Time</tt> to define <tt>acts_like_time?</tt>. As a result, developers can call
|
13
|
+
# <tt>x.acts_like?(:time)</tt> and <tt>x.acts_like?(:date)</tt> to test duck-type compatibility,
|
14
|
+
# and classes that are able to act like <tt>Time</tt> can also define an <tt>acts_like_time?</tt>
|
15
|
+
# method to interoperate.
|
16
|
+
#
|
17
|
+
# Note that the marker method is only expected to exist. It isn't called, so its body or return
|
18
|
+
# value are irrelevant.
|
19
|
+
#
|
20
|
+
# ==== Example: A class that provides the same interface as <tt>String</tt>
|
21
|
+
#
|
22
|
+
# This class may define:
|
23
|
+
#
|
24
|
+
# class Stringish
|
25
|
+
# def acts_like_string?
|
26
|
+
# end
|
27
|
+
# end
|
28
|
+
#
|
29
|
+
# Then client code can query for duck-type-safeness this way:
|
30
|
+
#
|
31
|
+
# Stringish.new.acts_like?(:string) # => true
|
32
|
+
#
|
9
33
|
def acts_like?(duck)
|
10
34
|
case duck
|
11
35
|
when :time
|
@@ -131,7 +131,7 @@ class String
|
|
131
131
|
end
|
132
132
|
end
|
133
133
|
|
134
|
-
class Numeric
|
134
|
+
class Numeric # :nodoc:
|
135
135
|
# No number is blank:
|
136
136
|
#
|
137
137
|
# 1.blank? # => false
|
@@ -143,7 +143,7 @@ class Numeric #:nodoc:
|
|
143
143
|
end
|
144
144
|
end
|
145
145
|
|
146
|
-
class Time
|
146
|
+
class Time # :nodoc:
|
147
147
|
# No Time is blank:
|
148
148
|
#
|
149
149
|
# Time.now.blank? # => false
|
@@ -47,3 +47,14 @@ class UnboundMethod
|
|
47
47
|
false
|
48
48
|
end
|
49
49
|
end
|
50
|
+
|
51
|
+
require "singleton"
|
52
|
+
|
53
|
+
module Singleton
|
54
|
+
# Singleton instances are not duplicable:
|
55
|
+
#
|
56
|
+
# Class.new.include(Singleton).instance.dup # TypeError (can't dup instance of singleton
|
57
|
+
def duplicable?
|
58
|
+
false
|
59
|
+
end
|
60
|
+
end
|
@@ -19,8 +19,7 @@ require "active_support/core_ext/date/conversions"
|
|
19
19
|
# The JSON gem adds a few modules to Ruby core classes containing :to_json definition, overwriting
|
20
20
|
# their default behavior. That said, we need to define the basic to_json method in all of them,
|
21
21
|
# otherwise they will always use to_json gem implementation, which is backwards incompatible in
|
22
|
-
# several cases (for instance, the JSON implementation for Hash does not work) with inheritance
|
23
|
-
# and consequently classes as ActiveSupport::OrderedHash cannot be serialized to json.
|
22
|
+
# several cases (for instance, the JSON implementation for Hash does not work) with inheritance.
|
24
23
|
#
|
25
24
|
# On the other hand, we should avoid conflict with ::JSON.{generate,dump}(obj). Unfortunately, the
|
26
25
|
# JSON gem's encoder relies on its own to_json implementation to encode objects. Since it always
|
@@ -50,8 +49,14 @@ end
|
|
50
49
|
klass.prepend(ActiveSupport::ToJsonWithActiveSupportEncoder)
|
51
50
|
end
|
52
51
|
|
52
|
+
class Module
|
53
|
+
def as_json(options = nil) # :nodoc:
|
54
|
+
name
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
53
58
|
class Object
|
54
|
-
def as_json(options = nil)
|
59
|
+
def as_json(options = nil) # :nodoc:
|
55
60
|
if respond_to?(:to_hash)
|
56
61
|
to_hash.as_json(options)
|
57
62
|
else
|
@@ -60,44 +65,44 @@ class Object
|
|
60
65
|
end
|
61
66
|
end
|
62
67
|
|
63
|
-
class Struct
|
68
|
+
class Struct # :nodoc:
|
64
69
|
def as_json(options = nil)
|
65
70
|
Hash[members.zip(values)].as_json(options)
|
66
71
|
end
|
67
72
|
end
|
68
73
|
|
69
74
|
class TrueClass
|
70
|
-
def as_json(options = nil)
|
75
|
+
def as_json(options = nil) # :nodoc:
|
71
76
|
self
|
72
77
|
end
|
73
78
|
end
|
74
79
|
|
75
80
|
class FalseClass
|
76
|
-
def as_json(options = nil)
|
81
|
+
def as_json(options = nil) # :nodoc:
|
77
82
|
self
|
78
83
|
end
|
79
84
|
end
|
80
85
|
|
81
86
|
class NilClass
|
82
|
-
def as_json(options = nil)
|
87
|
+
def as_json(options = nil) # :nodoc:
|
83
88
|
self
|
84
89
|
end
|
85
90
|
end
|
86
91
|
|
87
92
|
class String
|
88
|
-
def as_json(options = nil)
|
93
|
+
def as_json(options = nil) # :nodoc:
|
89
94
|
self
|
90
95
|
end
|
91
96
|
end
|
92
97
|
|
93
98
|
class Symbol
|
94
|
-
def as_json(options = nil)
|
99
|
+
def as_json(options = nil) # :nodoc:
|
95
100
|
to_s
|
96
101
|
end
|
97
102
|
end
|
98
103
|
|
99
104
|
class Numeric
|
100
|
-
def as_json(options = nil)
|
105
|
+
def as_json(options = nil) # :nodoc:
|
101
106
|
self
|
102
107
|
end
|
103
108
|
end
|
@@ -105,7 +110,7 @@ end
|
|
105
110
|
class Float
|
106
111
|
# Encoding Infinity or NaN to JSON should return "null". The default returns
|
107
112
|
# "Infinity" or "NaN" which are not valid JSON.
|
108
|
-
def as_json(options = nil)
|
113
|
+
def as_json(options = nil) # :nodoc:
|
109
114
|
finite? ? self : nil
|
110
115
|
end
|
111
116
|
end
|
@@ -120,43 +125,43 @@ class BigDecimal
|
|
120
125
|
# if the other end knows by contract that the data is supposed to be a
|
121
126
|
# BigDecimal, it still has the chance to post-process the string and get the
|
122
127
|
# real value.
|
123
|
-
def as_json(options = nil)
|
128
|
+
def as_json(options = nil) # :nodoc:
|
124
129
|
finite? ? to_s : nil
|
125
130
|
end
|
126
131
|
end
|
127
132
|
|
128
133
|
class Regexp
|
129
|
-
def as_json(options = nil)
|
134
|
+
def as_json(options = nil) # :nodoc:
|
130
135
|
to_s
|
131
136
|
end
|
132
137
|
end
|
133
138
|
|
134
139
|
module Enumerable
|
135
|
-
def as_json(options = nil)
|
140
|
+
def as_json(options = nil) # :nodoc:
|
136
141
|
to_a.as_json(options)
|
137
142
|
end
|
138
143
|
end
|
139
144
|
|
140
145
|
class IO
|
141
|
-
def as_json(options = nil)
|
146
|
+
def as_json(options = nil) # :nodoc:
|
142
147
|
to_s
|
143
148
|
end
|
144
149
|
end
|
145
150
|
|
146
151
|
class Range
|
147
|
-
def as_json(options = nil)
|
152
|
+
def as_json(options = nil) # :nodoc:
|
148
153
|
to_s
|
149
154
|
end
|
150
155
|
end
|
151
156
|
|
152
157
|
class Array
|
153
|
-
def as_json(options = nil)
|
158
|
+
def as_json(options = nil) # :nodoc:
|
154
159
|
map { |v| options ? v.as_json(options.dup) : v.as_json }
|
155
160
|
end
|
156
161
|
end
|
157
162
|
|
158
163
|
class Hash
|
159
|
-
def as_json(options = nil)
|
164
|
+
def as_json(options = nil) # :nodoc:
|
160
165
|
# create a subset of the hash by applying :only or :except
|
161
166
|
subset = if options
|
162
167
|
if attrs = options[:only]
|
@@ -179,7 +184,7 @@ class Hash
|
|
179
184
|
end
|
180
185
|
|
181
186
|
class Time
|
182
|
-
def as_json(options = nil)
|
187
|
+
def as_json(options = nil) # :nodoc:
|
183
188
|
if ActiveSupport::JSON::Encoding.use_standard_json_time_format
|
184
189
|
xmlschema(ActiveSupport::JSON::Encoding.time_precision)
|
185
190
|
else
|
@@ -189,7 +194,7 @@ class Time
|
|
189
194
|
end
|
190
195
|
|
191
196
|
class Date
|
192
|
-
def as_json(options = nil)
|
197
|
+
def as_json(options = nil) # :nodoc:
|
193
198
|
if ActiveSupport::JSON::Encoding.use_standard_json_time_format
|
194
199
|
strftime("%Y-%m-%d")
|
195
200
|
else
|
@@ -199,7 +204,7 @@ class Date
|
|
199
204
|
end
|
200
205
|
|
201
206
|
class DateTime
|
202
|
-
def as_json(options = nil)
|
207
|
+
def as_json(options = nil) # :nodoc:
|
203
208
|
if ActiveSupport::JSON::Encoding.use_standard_json_time_format
|
204
209
|
xmlschema(ActiveSupport::JSON::Encoding.time_precision)
|
205
210
|
else
|
@@ -208,13 +213,13 @@ class DateTime
|
|
208
213
|
end
|
209
214
|
end
|
210
215
|
|
211
|
-
class URI::Generic
|
216
|
+
class URI::Generic # :nodoc:
|
212
217
|
def as_json(options = nil)
|
213
218
|
to_s
|
214
219
|
end
|
215
220
|
end
|
216
221
|
|
217
|
-
class Pathname
|
222
|
+
class Pathname # :nodoc:
|
218
223
|
def as_json(options = nil)
|
219
224
|
to_s
|
220
225
|
end
|
@@ -226,7 +231,7 @@ class IPAddr # :nodoc:
|
|
226
231
|
end
|
227
232
|
end
|
228
233
|
|
229
|
-
class Process::Status
|
234
|
+
class Process::Status # :nodoc:
|
230
235
|
def as_json(options = nil)
|
231
236
|
{ exitstatus: exitstatus, pid: pid }
|
232
237
|
end
|
@@ -75,11 +75,11 @@ class Hash
|
|
75
75
|
#
|
76
76
|
# This method is also aliased as +to_param+.
|
77
77
|
def to_query(namespace = nil)
|
78
|
-
query =
|
78
|
+
query = filter_map do |key, value|
|
79
79
|
unless (value.is_a?(Hash) || value.is_a?(Array)) && value.empty?
|
80
80
|
value.to_query(namespace ? "#{namespace}[#{key}]" : key)
|
81
81
|
end
|
82
|
-
end
|
82
|
+
end
|
83
83
|
|
84
84
|
query.sort! unless namespace.to_s.include?("[]")
|
85
85
|
query.join("&")
|