activesupport 6.1.4.1 → 7.0.8.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +325 -395
- data/MIT-LICENSE +1 -1
- data/README.rdoc +2 -2
- data/lib/active_support/actionable_error.rb +1 -1
- data/lib/active_support/array_inquirer.rb +0 -2
- data/lib/active_support/backtrace_cleaner.rb +2 -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 +148 -37
- data/lib/active_support/cache/memory_store.rb +24 -16
- data/lib/active_support/cache/null_store.rb +10 -2
- data/lib/active_support/cache/redis_cache_store.rb +68 -85
- data/lib/active_support/cache/strategy/local_cache.rb +38 -61
- data/lib/active_support/cache.rb +299 -147
- data/lib/active_support/callbacks.rb +184 -85
- 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 +8 -5
- 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 +13 -12
- 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/inquiry.rb +2 -2
- 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 +24 -9
- data/lib/active_support/core_ext/date/conversions.rb +14 -14
- data/lib/active_support/core_ext/date/deprecated_conversions.rb +40 -0
- data/lib/active_support/core_ext/date.rb +1 -0
- data/lib/active_support/core_ext/date_and_time/calculations.rb +4 -4
- 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/calculations.rb +4 -0
- data/lib/active_support/core_ext/date_time/conversions.rb +13 -13
- data/lib/active_support/core_ext/date_time/deprecated_conversions.rb +36 -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 +112 -38
- data/lib/active_support/core_ext/file/atomic.rb +3 -1
- data/lib/active_support/core_ext/hash/conversions.rb +0 -1
- data/lib/active_support/core_ext/hash/deep_transform_values.rb +3 -3
- data/lib/active_support/core_ext/hash/indifferent_access.rb +3 -3
- data/lib/active_support/core_ext/hash/keys.rb +4 -4
- data/lib/active_support/core_ext/integer/inflections.rb +12 -12
- data/lib/active_support/core_ext/kernel/reporting.rb +4 -4
- data/lib/active_support/core_ext/kernel/singleton_class.rb +1 -1
- 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 +80 -77
- 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 +15 -4
- data/lib/active_support/core_ext/object/json.rb +30 -25
- data/lib/active_support/core_ext/object/to_query.rb +2 -4
- data/lib/active_support/core_ext/object/try.rb +20 -20
- data/lib/active_support/core_ext/object/with_options.rb +21 -2
- 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 +36 -0
- data/lib/active_support/core_ext/range/each.rb +1 -1
- data/lib/active_support/core_ext/range/include_time_with_zone.rb +3 -26
- data/lib/active_support/core_ext/range/overlaps.rb +1 -1
- data/lib/active_support/core_ext/range.rb +1 -1
- data/lib/active_support/core_ext/securerandom.rb +1 -1
- data/lib/active_support/core_ext/string/conversions.rb +2 -2
- data/lib/active_support/core_ext/string/filters.rb +1 -1
- data/lib/active_support/core_ext/string/inflections.rb +1 -5
- data/lib/active_support/core_ext/string/inquiry.rb +1 -1
- data/lib/active_support/core_ext/string/output_safety.rb +94 -38
- data/lib/active_support/core_ext/symbol/starts_ends_with.rb +0 -8
- data/lib/active_support/core_ext/time/calculations.rb +13 -8
- data/lib/active_support/core_ext/time/conversions.rb +13 -12
- data/lib/active_support/core_ext/time/deprecated_conversions.rb +73 -0
- data/lib/active_support/core_ext/time/zones.rb +10 -26
- 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 +8 -5
- data/lib/active_support/deprecation/disallowed.rb +3 -3
- data/lib/active_support/deprecation/method_wrappers.rb +3 -3
- data/lib/active_support/deprecation/proxy_wrappers.rb +2 -2
- data/lib/active_support/deprecation.rb +2 -2
- 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 +45 -3
- data/lib/active_support/encrypted_file.rb +21 -10
- 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 +20 -7
- 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 +43 -21
- 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 +5 -5
- 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 +29 -55
- data/lib/active_support/inflector/transliterate.rb +1 -1
- data/lib/active_support/isolated_execution_state.rb +72 -0
- data/lib/active_support/json/encoding.rb +3 -3
- data/lib/active_support/key_generator.rb +22 -5
- data/lib/active_support/lazy_load_hooks.rb +28 -4
- data/lib/active_support/locale/en.yml +1 -1
- data/lib/active_support/log_subscriber/test_helper.rb +2 -2
- data/lib/active_support/log_subscriber.rb +15 -5
- data/lib/active_support/logger_thread_safe_level.rb +4 -13
- data/lib/active_support/message_encryptor.rb +12 -6
- 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 +23 -23
- 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 +4 -5
- data/lib/active_support/option_merger.rb +10 -18
- data/lib/active_support/ordered_hash.rb +1 -1
- data/lib/active_support/ordered_options.rb +1 -1
- data/lib/active_support/parameter_filter.rb +20 -11
- data/lib/active_support/per_thread_registry.rb +5 -0
- data/lib/active_support/railtie.rb +69 -19
- data/lib/active_support/reloader.rb +1 -1
- data/lib/active_support/rescuable.rb +12 -12
- data/lib/active_support/ruby_features.rb +7 -0
- data/lib/active_support/secure_compare_rotator.rb +2 -2
- 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 +13 -21
- data/lib/active_support/testing/assertions.rb +36 -6
- data/lib/active_support/testing/deprecation.rb +52 -1
- data/lib/active_support/testing/isolation.rb +30 -29
- 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 +43 -22
- data/lib/active_support/values/time_zone.rb +35 -14
- data/lib/active_support/version.rb +1 -1
- 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 +26 -23
- data/lib/active_support/core_ext/marshal.rb +0 -26
- data/lib/active_support/dependencies/zeitwerk_integration.rb +0 -117
@@ -7,7 +7,9 @@ module ActiveSupport
|
|
7
7
|
module NumericWithFormat
|
8
8
|
# Provides options for converting numbers into formatted strings.
|
9
9
|
# Options are provided for phone numbers, currency, percentage,
|
10
|
-
# precision, positional notation, file size and pretty printing.
|
10
|
+
# precision, positional notation, file size, and pretty printing.
|
11
|
+
#
|
12
|
+
# This method is aliased to <tt>to_formatted_s</tt>.
|
11
13
|
#
|
12
14
|
# ==== Options
|
13
15
|
#
|
@@ -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_fs(:phone) # => "555-1234"
|
22
|
+
# 1235551234.to_fs(:phone) # => "123-555-1234"
|
23
|
+
# 1235551234.to_fs(:phone, area_code: true) # => "(123) 555-1234"
|
24
|
+
# 1235551234.to_fs(:phone, delimiter: ' ') # => "123 555 1234"
|
25
|
+
# 1235551234.to_fs(:phone, area_code: true, extension: 555) # => "(123) 555-1234 x 555"
|
26
|
+
# 1235551234.to_fs(:phone, country_code: 1) # => "+1-123-555-1234"
|
27
|
+
# 1235551234.to_fs(: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_fs(:currency) # => "$1,234,567,890.50"
|
32
|
+
# 1234567890.506.to_fs(:currency) # => "$1,234,567,890.51"
|
33
|
+
# 1234567890.506.to_fs(:currency, precision: 3) # => "$1,234,567,890.506"
|
34
|
+
# 1234567890.506.to_fs(:currency, round_mode: :down) # => "$1,234,567,890.50"
|
35
|
+
# 1234567890.506.to_fs(:currency, locale: :fr) # => "1 234 567 890,51 €"
|
36
|
+
# -1234567890.50.to_fs(:currency, negative_format: '(%u%n)')
|
35
37
|
# # => "($1,234,567,890.50)"
|
36
|
-
# 1234567890.50.
|
38
|
+
# 1234567890.50.to_fs(:currency, unit: '£', separator: ',', delimiter: '')
|
37
39
|
# # => "£1234567890,50"
|
38
|
-
# 1234567890.50.
|
40
|
+
# 1234567890.50.to_fs(: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_fs(:percentage) # => "100.000%"
|
45
|
+
# 100.to_fs(:percentage, precision: 0) # => "100%"
|
46
|
+
# 1000.to_fs(:percentage, delimiter: '.', separator: ',') # => "1.000,000%"
|
47
|
+
# 302.24398923423.to_fs(:percentage, precision: 5) # => "302.24399%"
|
48
|
+
# 302.24398923423.to_fs(:percentage, round_mode: :down) # => "302.243%"
|
49
|
+
# 1000.to_fs(:percentage, locale: :fr) # => "1 000,000%"
|
50
|
+
# 100.to_fs(: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_fs(:delimited) # => "12,345,678"
|
54
|
+
# 12345678.05.to_fs(:delimited) # => "12,345,678.05"
|
55
|
+
# 12345678.to_fs(:delimited, delimiter: '.') # => "12.345.678"
|
56
|
+
# 12345678.to_fs(:delimited, delimiter: ',') # => "12,345,678"
|
57
|
+
# 12345678.05.to_fs(:delimited, separator: ' ') # => "12,345,678 05"
|
58
|
+
# 12345678.05.to_fs(:delimited, locale: :fr) # => "12 345 678,05"
|
59
|
+
# 98765432.98.to_fs(: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_fs(:rounded) # => "111.235"
|
64
|
+
# 111.2345.to_fs(:rounded, precision: 2) # => "111.23"
|
65
|
+
# 111.2345.to_fs(:rounded, precision: 2, round_mode: :up) # => "111.24"
|
66
|
+
# 13.to_fs(:rounded, precision: 5) # => "13.00000"
|
67
|
+
# 389.32314.to_fs(:rounded, precision: 0) # => "389"
|
68
|
+
# 111.2345.to_fs(:rounded, significant: true) # => "111"
|
69
|
+
# 111.2345.to_fs(:rounded, precision: 1, significant: true) # => "100"
|
70
|
+
# 13.to_fs(:rounded, precision: 5, significant: true) # => "13.000"
|
71
|
+
# 111.234.to_fs(:rounded, locale: :fr) # => "111,234"
|
72
|
+
# 13.to_fs(:rounded, precision: 5, significant: true, strip_insignificant_zeros: true)
|
71
73
|
# # => "13"
|
72
|
-
# 389.32314.
|
73
|
-
# 1111.2345.
|
74
|
+
# 389.32314.to_fs(:rounded, precision: 4, significant: true) # => "389.3"
|
75
|
+
# 1111.2345.to_fs(: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_fs(:human_size) # => "123 Bytes"
|
80
|
+
# 1234.to_fs(:human_size) # => "1.21 KB"
|
81
|
+
# 12345.to_fs(:human_size) # => "12.1 KB"
|
82
|
+
# 1234567.to_fs(:human_size) # => "1.18 MB"
|
83
|
+
# 1234567890.to_fs(:human_size) # => "1.15 GB"
|
84
|
+
# 1234567890123.to_fs(:human_size) # => "1.12 TB"
|
85
|
+
# 1234567890123456.to_fs(:human_size) # => "1.1 PB"
|
86
|
+
# 1234567890123456789.to_fs(:human_size) # => "1.07 EB"
|
87
|
+
# 1234567.to_fs(:human_size, precision: 2) # => "1.2 MB"
|
88
|
+
# 1234567.to_fs(:human_size, precision: 2, round_mode: :up) # => "1.3 MB"
|
89
|
+
# 483989.to_fs(:human_size, precision: 2) # => "470 KB"
|
90
|
+
# 1234567.to_fs(:human_size, precision: 2, separator: ',') # => "1,2 MB"
|
91
|
+
# 1234567890123.to_fs(:human_size, precision: 5) # => "1.1228 TB"
|
92
|
+
# 524288000.to_fs(: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_fs(:human) # => "123"
|
96
|
+
# 1234.to_fs(:human) # => "1.23 Thousand"
|
97
|
+
# 12345.to_fs(:human) # => "12.3 Thousand"
|
98
|
+
# 1234567.to_fs(:human) # => "1.23 Million"
|
99
|
+
# 1234567890.to_fs(:human) # => "1.23 Billion"
|
100
|
+
# 1234567890123.to_fs(:human) # => "1.23 Trillion"
|
101
|
+
# 1234567890123456.to_fs(:human) # => "1.23 Quadrillion"
|
102
|
+
# 1234567890123456789.to_fs(:human) # => "1230 Quadrillion"
|
103
|
+
# 489939.to_fs(:human, precision: 2) # => "490 Thousand"
|
104
|
+
# 489939.to_fs(:human, precision: 2, round_mode: :down) # => "480 Thousand"
|
105
|
+
# 489939.to_fs(:human, precision: 4) # => "489.9 Thousand"
|
106
|
+
# 1234567.to_fs(:human, precision: 4,
|
107
|
+
# significant: false) # => "1.2346 Million"
|
108
|
+
# 1234567.to_fs(:human, precision: 1,
|
107
109
|
# separator: ',',
|
108
|
-
# significant: false)
|
109
|
-
def
|
110
|
+
# significant: false) # => "1,2 Million"
|
111
|
+
def to_fs(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_formatted_s, :to_fs
|
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_fs(#{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_fs(#{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_fs(#{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_fs(#{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_fs(#{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_fs(#{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_fs(#{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_fs(#{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
|
@@ -31,8 +31,8 @@ end
|
|
31
31
|
class Method
|
32
32
|
# Methods are not duplicable:
|
33
33
|
#
|
34
|
-
#
|
35
|
-
#
|
34
|
+
# method(:puts).duplicable? # => false
|
35
|
+
# method(:puts).dup # => TypeError: allocator undefined for Method
|
36
36
|
def duplicable?
|
37
37
|
false
|
38
38
|
end
|
@@ -41,8 +41,19 @@ end
|
|
41
41
|
class UnboundMethod
|
42
42
|
# Unbound methods are not duplicable:
|
43
43
|
#
|
44
|
-
#
|
45
|
-
#
|
44
|
+
# method(:puts).unbind.duplicable? # => false
|
45
|
+
# method(:puts).unbind.dup # => TypeError: allocator undefined for UnboundMethod
|
46
|
+
def duplicable?
|
47
|
+
false
|
48
|
+
end
|
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
|
46
57
|
def duplicable?
|
47
58
|
false
|
48
59
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Hack to load json gem first so we can
|
3
|
+
# Hack to load json gem first so we can override its to_json.
|
4
4
|
require "json"
|
5
5
|
require "bigdecimal"
|
6
6
|
require "ipaddr"
|
@@ -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
|
@@ -72,14 +72,12 @@ class Hash
|
|
72
72
|
#
|
73
73
|
# The string pairs "key=value" that conform the query string
|
74
74
|
# are sorted lexicographically in ascending order.
|
75
|
-
#
|
76
|
-
# This method is also aliased as +to_param+.
|
77
75
|
def to_query(namespace = nil)
|
78
|
-
query =
|
76
|
+
query = filter_map do |key, value|
|
79
77
|
unless (value.is_a?(Hash) || value.is_a?(Array)) && value.empty?
|
80
78
|
value.to_query(namespace ? "#{namespace}[#{key}]" : key)
|
81
79
|
end
|
82
|
-
end
|
80
|
+
end
|
83
81
|
|
84
82
|
query.sort! unless namespace.to_s.include?("[]")
|
85
83
|
query.join("&")
|