activesupport 5.2.5 → 6.0.4.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 +452 -398
- data/MIT-LICENSE +1 -1
- data/README.rdoc +4 -3
- data/lib/active_support/actionable_error.rb +48 -0
- data/lib/active_support/backtrace_cleaner.rb +27 -1
- data/lib/active_support/cache/file_store.rb +32 -32
- data/lib/active_support/cache/mem_cache_store.rb +12 -7
- data/lib/active_support/cache/memory_store.rb +15 -9
- data/lib/active_support/cache/null_store.rb +8 -3
- data/lib/active_support/cache/redis_cache_store.rb +47 -20
- data/lib/active_support/cache/strategy/local_cache.rb +22 -22
- data/lib/active_support/cache.rb +71 -48
- data/lib/active_support/callbacks.rb +16 -8
- data/lib/active_support/concern.rb +24 -1
- data/lib/active_support/concurrency/load_interlock_aware_monitor.rb +18 -0
- data/lib/active_support/concurrency/share_lock.rb +0 -1
- data/lib/active_support/configurable.rb +7 -11
- data/lib/active_support/core_ext/array/access.rb +18 -6
- data/lib/active_support/core_ext/array/conversions.rb +5 -5
- data/lib/active_support/core_ext/array/extract.rb +21 -0
- data/lib/active_support/core_ext/array/prepend_and_append.rb +2 -6
- data/lib/active_support/core_ext/array.rb +1 -1
- data/lib/active_support/core_ext/class/attribute.rb +11 -16
- data/lib/active_support/core_ext/class/subclasses.rb +1 -1
- data/lib/active_support/core_ext/date/calculations.rb +6 -5
- data/lib/active_support/core_ext/date_and_time/calculations.rb +24 -47
- data/lib/active_support/core_ext/date_and_time/zones.rb +0 -1
- data/lib/active_support/core_ext/date_time/calculations.rb +1 -1
- data/lib/active_support/core_ext/date_time/conversions.rb +0 -1
- data/lib/active_support/core_ext/enumerable.rb +97 -73
- data/lib/active_support/core_ext/hash/compact.rb +2 -26
- data/lib/active_support/core_ext/hash/conversions.rb +1 -1
- data/lib/active_support/core_ext/hash/deep_transform_values.rb +46 -0
- data/lib/active_support/core_ext/hash/except.rb +2 -2
- data/lib/active_support/core_ext/hash/keys.rb +0 -29
- data/lib/active_support/core_ext/hash/slice.rb +3 -25
- data/lib/active_support/core_ext/hash/transform_values.rb +2 -29
- data/lib/active_support/core_ext/hash.rb +1 -2
- data/lib/active_support/core_ext/integer/multiple.rb +1 -1
- data/lib/active_support/core_ext/kernel.rb +0 -1
- data/lib/active_support/core_ext/load_error.rb +1 -1
- data/lib/active_support/core_ext/module/attribute_accessors.rb +7 -10
- data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +13 -19
- data/lib/active_support/core_ext/module/delegation.rb +41 -8
- data/lib/active_support/core_ext/module/introspection.rb +38 -13
- data/lib/active_support/core_ext/module/reachable.rb +1 -6
- data/lib/active_support/core_ext/module/redefine_method.rb +8 -17
- data/lib/active_support/core_ext/module.rb +0 -1
- data/lib/active_support/core_ext/numeric/conversions.rb +124 -128
- data/lib/active_support/core_ext/numeric/inquiry.rb +2 -25
- data/lib/active_support/core_ext/numeric.rb +0 -1
- data/lib/active_support/core_ext/object/blank.rb +1 -2
- data/lib/active_support/core_ext/object/duplicable.rb +7 -114
- data/lib/active_support/core_ext/object/json.rb +2 -1
- data/lib/active_support/core_ext/object/try.rb +17 -7
- data/lib/active_support/core_ext/object/with_options.rb +1 -1
- data/lib/active_support/core_ext/range/compare_range.rb +28 -13
- data/lib/active_support/core_ext/range/conversions.rb +31 -29
- data/lib/active_support/core_ext/range/each.rb +0 -1
- data/lib/active_support/core_ext/range/include_range.rb +6 -0
- data/lib/active_support/core_ext/range/include_time_with_zone.rb +2 -2
- data/lib/active_support/core_ext/regexp.rb +0 -4
- data/lib/active_support/core_ext/securerandom.rb +23 -3
- data/lib/active_support/core_ext/string/access.rb +8 -0
- data/lib/active_support/core_ext/string/filters.rb +42 -1
- data/lib/active_support/core_ext/string/inflections.rb +7 -2
- data/lib/active_support/core_ext/string/multibyte.rb +4 -3
- data/lib/active_support/core_ext/string/output_safety.rb +68 -10
- data/lib/active_support/core_ext/string/strip.rb +3 -1
- data/lib/active_support/core_ext/time/calculations.rb +34 -3
- data/lib/active_support/core_ext/uri.rb +1 -0
- data/lib/active_support/current_attributes.rb +8 -0
- data/lib/active_support/dependencies/zeitwerk_integration.rb +117 -0
- data/lib/active_support/dependencies.rb +74 -18
- data/lib/active_support/deprecation/behaviors.rb +1 -1
- data/lib/active_support/deprecation/method_wrappers.rb +17 -23
- data/lib/active_support/deprecation/proxy_wrappers.rb +28 -5
- data/lib/active_support/deprecation.rb +1 -1
- data/lib/active_support/descendants_tracker.rb +55 -9
- data/lib/active_support/duration/iso8601_parser.rb +2 -4
- data/lib/active_support/duration/iso8601_serializer.rb +3 -5
- data/lib/active_support/duration.rb +7 -8
- data/lib/active_support/encrypted_configuration.rb +0 -4
- data/lib/active_support/encrypted_file.rb +3 -2
- data/lib/active_support/evented_file_update_checker.rb +39 -10
- data/lib/active_support/execution_wrapper.rb +1 -0
- data/lib/active_support/file_update_checker.rb +0 -1
- data/lib/active_support/gem_version.rb +4 -4
- data/lib/active_support/hash_with_indifferent_access.rb +22 -18
- data/lib/active_support/i18n.rb +1 -0
- data/lib/active_support/i18n_railtie.rb +13 -1
- data/lib/active_support/inflector/inflections.rb +1 -5
- data/lib/active_support/inflector/methods.rb +16 -29
- data/lib/active_support/inflector/transliterate.rb +47 -18
- data/lib/active_support/json/decoding.rb +23 -24
- data/lib/active_support/json/encoding.rb +6 -2
- data/lib/active_support/key_generator.rb +0 -32
- data/lib/active_support/lazy_load_hooks.rb +5 -2
- data/lib/active_support/locale/en.rb +33 -0
- data/lib/active_support/log_subscriber.rb +31 -9
- data/lib/active_support/logger.rb +1 -16
- data/lib/active_support/logger_silence.rb +28 -12
- data/lib/active_support/logger_thread_safe_level.rb +26 -4
- data/lib/active_support/message_encryptor.rb +4 -6
- data/lib/active_support/message_verifier.rb +5 -5
- data/lib/active_support/messages/metadata.rb +11 -2
- data/lib/active_support/messages/rotator.rb +4 -4
- data/lib/active_support/multibyte/chars.rb +29 -49
- data/lib/active_support/multibyte/unicode.rb +44 -282
- data/lib/active_support/notifications/fanout.rb +98 -13
- data/lib/active_support/notifications/instrumenter.rb +80 -9
- data/lib/active_support/notifications.rb +41 -4
- data/lib/active_support/number_helper/number_converter.rb +4 -5
- data/lib/active_support/number_helper/number_to_currency_converter.rb +4 -9
- data/lib/active_support/number_helper/number_to_delimited_converter.rb +3 -2
- data/lib/active_support/number_helper/number_to_human_converter.rb +3 -2
- data/lib/active_support/number_helper/number_to_human_size_converter.rb +3 -2
- data/lib/active_support/number_helper/number_to_percentage_converter.rb +3 -1
- data/lib/active_support/number_helper/number_to_phone_converter.rb +2 -1
- data/lib/active_support/number_helper/number_to_rounded_converter.rb +5 -4
- data/lib/active_support/number_helper/rounding_helper.rb +1 -1
- data/lib/active_support/number_helper.rb +11 -0
- data/lib/active_support/option_merger.rb +21 -3
- data/lib/active_support/ordered_hash.rb +1 -1
- data/lib/active_support/ordered_options.rb +5 -1
- data/lib/active_support/parameter_filter.rb +128 -0
- data/lib/active_support/rails.rb +0 -6
- data/lib/active_support/reloader.rb +4 -5
- data/lib/active_support/security_utils.rb +1 -1
- data/lib/active_support/string_inquirer.rb +0 -1
- data/lib/active_support/subscriber.rb +65 -26
- data/lib/active_support/tagged_logging.rb +13 -4
- data/lib/active_support/test_case.rb +91 -0
- data/lib/active_support/testing/assertions.rb +15 -1
- data/lib/active_support/testing/deprecation.rb +0 -1
- data/lib/active_support/testing/file_fixtures.rb +2 -0
- data/lib/active_support/testing/isolation.rb +2 -2
- data/lib/active_support/testing/method_call_assertions.rb +28 -1
- data/lib/active_support/testing/parallelization.rb +134 -0
- data/lib/active_support/testing/stream.rb +1 -2
- data/lib/active_support/testing/time_helpers.rb +7 -9
- data/lib/active_support/time_with_zone.rb +15 -5
- data/lib/active_support/values/time_zone.rb +12 -7
- data/lib/active_support/xml_mini/jdom.rb +2 -3
- data/lib/active_support/xml_mini/libxml.rb +2 -2
- data/lib/active_support/xml_mini/libxmlsax.rb +4 -4
- data/lib/active_support/xml_mini/nokogiri.rb +2 -2
- data/lib/active_support/xml_mini/nokogirisax.rb +3 -3
- data/lib/active_support/xml_mini/rexml.rb +2 -2
- data/lib/active_support/xml_mini.rb +2 -10
- data/lib/active_support.rb +2 -1
- metadata +40 -12
- data/lib/active_support/core_ext/kernel/agnostics.rb +0 -13
- data/lib/active_support/values/unicode_tables.dat +0 -0
@@ -4,137 +4,133 @@ require "active_support/core_ext/big_decimal/conversions"
|
|
4
4
|
require "active_support/number_helper"
|
5
5
|
require "active_support/core_ext/module/deprecation"
|
6
6
|
|
7
|
-
module ActiveSupport
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
#
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
#
|
36
|
-
|
37
|
-
#
|
38
|
-
|
39
|
-
#
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
#
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
#
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
#
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
#
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
7
|
+
module ActiveSupport
|
8
|
+
module NumericWithFormat
|
9
|
+
# Provides options for converting numbers into formatted strings.
|
10
|
+
# Options are provided for phone numbers, currency, percentage,
|
11
|
+
# precision, positional notation, file size and pretty printing.
|
12
|
+
#
|
13
|
+
# ==== Options
|
14
|
+
#
|
15
|
+
# For details on which formats use which options, see ActiveSupport::NumberHelper
|
16
|
+
#
|
17
|
+
# ==== Examples
|
18
|
+
#
|
19
|
+
# Phone Numbers:
|
20
|
+
# 5551234.to_s(:phone) # => "555-1234"
|
21
|
+
# 1235551234.to_s(:phone) # => "123-555-1234"
|
22
|
+
# 1235551234.to_s(:phone, area_code: true) # => "(123) 555-1234"
|
23
|
+
# 1235551234.to_s(:phone, delimiter: ' ') # => "123 555 1234"
|
24
|
+
# 1235551234.to_s(:phone, area_code: true, extension: 555) # => "(123) 555-1234 x 555"
|
25
|
+
# 1235551234.to_s(:phone, country_code: 1) # => "+1-123-555-1234"
|
26
|
+
# 1235551234.to_s(:phone, country_code: 1, extension: 1343, delimiter: '.')
|
27
|
+
# # => "+1.123.555.1234 x 1343"
|
28
|
+
#
|
29
|
+
# Currency:
|
30
|
+
# 1234567890.50.to_s(:currency) # => "$1,234,567,890.50"
|
31
|
+
# 1234567890.506.to_s(:currency) # => "$1,234,567,890.51"
|
32
|
+
# 1234567890.506.to_s(:currency, precision: 3) # => "$1,234,567,890.506"
|
33
|
+
# 1234567890.506.to_s(:currency, locale: :fr) # => "1 234 567 890,51 €"
|
34
|
+
# -1234567890.50.to_s(:currency, negative_format: '(%u%n)')
|
35
|
+
# # => "($1,234,567,890.50)"
|
36
|
+
# 1234567890.50.to_s(:currency, unit: '£', separator: ',', delimiter: '')
|
37
|
+
# # => "£1234567890,50"
|
38
|
+
# 1234567890.50.to_s(:currency, unit: '£', separator: ',', delimiter: '', format: '%n %u')
|
39
|
+
# # => "1234567890,50 £"
|
40
|
+
#
|
41
|
+
# Percentage:
|
42
|
+
# 100.to_s(:percentage) # => "100.000%"
|
43
|
+
# 100.to_s(:percentage, precision: 0) # => "100%"
|
44
|
+
# 1000.to_s(:percentage, delimiter: '.', separator: ',') # => "1.000,000%"
|
45
|
+
# 302.24398923423.to_s(:percentage, precision: 5) # => "302.24399%"
|
46
|
+
# 1000.to_s(:percentage, locale: :fr) # => "1 000,000%"
|
47
|
+
# 100.to_s(:percentage, format: '%n %') # => "100.000 %"
|
48
|
+
#
|
49
|
+
# Delimited:
|
50
|
+
# 12345678.to_s(:delimited) # => "12,345,678"
|
51
|
+
# 12345678.05.to_s(:delimited) # => "12,345,678.05"
|
52
|
+
# 12345678.to_s(:delimited, delimiter: '.') # => "12.345.678"
|
53
|
+
# 12345678.to_s(:delimited, delimiter: ',') # => "12,345,678"
|
54
|
+
# 12345678.05.to_s(:delimited, separator: ' ') # => "12,345,678 05"
|
55
|
+
# 12345678.05.to_s(:delimited, locale: :fr) # => "12 345 678,05"
|
56
|
+
# 98765432.98.to_s(:delimited, delimiter: ' ', separator: ',')
|
57
|
+
# # => "98 765 432,98"
|
58
|
+
#
|
59
|
+
# Rounded:
|
60
|
+
# 111.2345.to_s(:rounded) # => "111.235"
|
61
|
+
# 111.2345.to_s(:rounded, precision: 2) # => "111.23"
|
62
|
+
# 13.to_s(:rounded, precision: 5) # => "13.00000"
|
63
|
+
# 389.32314.to_s(:rounded, precision: 0) # => "389"
|
64
|
+
# 111.2345.to_s(:rounded, significant: true) # => "111"
|
65
|
+
# 111.2345.to_s(:rounded, precision: 1, significant: true) # => "100"
|
66
|
+
# 13.to_s(:rounded, precision: 5, significant: true) # => "13.000"
|
67
|
+
# 111.234.to_s(:rounded, locale: :fr) # => "111,234"
|
68
|
+
# 13.to_s(:rounded, precision: 5, significant: true, strip_insignificant_zeros: true)
|
69
|
+
# # => "13"
|
70
|
+
# 389.32314.to_s(:rounded, precision: 4, significant: true) # => "389.3"
|
71
|
+
# 1111.2345.to_s(:rounded, precision: 2, separator: ',', delimiter: '.')
|
72
|
+
# # => "1.111,23"
|
73
|
+
#
|
74
|
+
# Human-friendly size in Bytes:
|
75
|
+
# 123.to_s(:human_size) # => "123 Bytes"
|
76
|
+
# 1234.to_s(:human_size) # => "1.21 KB"
|
77
|
+
# 12345.to_s(:human_size) # => "12.1 KB"
|
78
|
+
# 1234567.to_s(:human_size) # => "1.18 MB"
|
79
|
+
# 1234567890.to_s(:human_size) # => "1.15 GB"
|
80
|
+
# 1234567890123.to_s(:human_size) # => "1.12 TB"
|
81
|
+
# 1234567890123456.to_s(:human_size) # => "1.1 PB"
|
82
|
+
# 1234567890123456789.to_s(:human_size) # => "1.07 EB"
|
83
|
+
# 1234567.to_s(:human_size, precision: 2) # => "1.2 MB"
|
84
|
+
# 483989.to_s(:human_size, precision: 2) # => "470 KB"
|
85
|
+
# 1234567.to_s(:human_size, precision: 2, separator: ',') # => "1,2 MB"
|
86
|
+
# 1234567890123.to_s(:human_size, precision: 5) # => "1.1228 TB"
|
87
|
+
# 524288000.to_s(:human_size, precision: 5) # => "500 MB"
|
88
|
+
#
|
89
|
+
# Human-friendly format:
|
90
|
+
# 123.to_s(:human) # => "123"
|
91
|
+
# 1234.to_s(:human) # => "1.23 Thousand"
|
92
|
+
# 12345.to_s(:human) # => "12.3 Thousand"
|
93
|
+
# 1234567.to_s(:human) # => "1.23 Million"
|
94
|
+
# 1234567890.to_s(:human) # => "1.23 Billion"
|
95
|
+
# 1234567890123.to_s(:human) # => "1.23 Trillion"
|
96
|
+
# 1234567890123456.to_s(:human) # => "1.23 Quadrillion"
|
97
|
+
# 1234567890123456789.to_s(:human) # => "1230 Quadrillion"
|
98
|
+
# 489939.to_s(:human, precision: 2) # => "490 Thousand"
|
99
|
+
# 489939.to_s(:human, precision: 4) # => "489.9 Thousand"
|
100
|
+
# 1234567.to_s(:human, precision: 4,
|
101
|
+
# significant: false) # => "1.2346 Million"
|
102
|
+
# 1234567.to_s(:human, precision: 1,
|
103
|
+
# separator: ',',
|
104
|
+
# significant: false) # => "1,2 Million"
|
105
|
+
def to_s(format = nil, options = nil)
|
106
|
+
case format
|
107
|
+
when nil
|
108
|
+
super()
|
109
|
+
when Integer, String
|
110
|
+
super(format)
|
111
|
+
when :phone
|
112
|
+
ActiveSupport::NumberHelper.number_to_phone(self, options || {})
|
113
|
+
when :currency
|
114
|
+
ActiveSupport::NumberHelper.number_to_currency(self, options || {})
|
115
|
+
when :percentage
|
116
|
+
ActiveSupport::NumberHelper.number_to_percentage(self, options || {})
|
117
|
+
when :delimited
|
118
|
+
ActiveSupport::NumberHelper.number_to_delimited(self, options || {})
|
119
|
+
when :rounded
|
120
|
+
ActiveSupport::NumberHelper.number_to_rounded(self, options || {})
|
121
|
+
when :human
|
122
|
+
ActiveSupport::NumberHelper.number_to_human(self, options || {})
|
123
|
+
when :human_size
|
124
|
+
ActiveSupport::NumberHelper.number_to_human_size(self, options || {})
|
125
|
+
when Symbol
|
126
|
+
super()
|
127
|
+
else
|
128
|
+
super(format)
|
129
|
+
end
|
128
130
|
end
|
129
131
|
end
|
130
132
|
end
|
131
133
|
|
132
|
-
|
133
|
-
if 0.class == Integer
|
134
|
-
Integer.prepend ActiveSupport::NumericWithFormat
|
135
|
-
else
|
136
|
-
Fixnum.prepend ActiveSupport::NumericWithFormat
|
137
|
-
Bignum.prepend ActiveSupport::NumericWithFormat
|
138
|
-
end
|
134
|
+
Integer.prepend ActiveSupport::NumericWithFormat
|
139
135
|
Float.prepend ActiveSupport::NumericWithFormat
|
140
136
|
BigDecimal.prepend ActiveSupport::NumericWithFormat
|
@@ -1,28 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
class Numeric
|
5
|
-
# Returns true if the number is positive.
|
6
|
-
#
|
7
|
-
# 1.positive? # => true
|
8
|
-
# 0.positive? # => false
|
9
|
-
# -1.positive? # => false
|
10
|
-
def positive?
|
11
|
-
self > 0
|
12
|
-
end
|
3
|
+
require "active_support/deprecation"
|
13
4
|
|
14
|
-
|
15
|
-
#
|
16
|
-
# -1.negative? # => true
|
17
|
-
# 0.negative? # => false
|
18
|
-
# 1.negative? # => false
|
19
|
-
def negative?
|
20
|
-
self < 0
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
class Complex
|
25
|
-
undef :positive?
|
26
|
-
undef :negative?
|
27
|
-
end
|
28
|
-
end
|
5
|
+
ActiveSupport::Deprecation.warn "Ruby 2.5+ (required by Rails 6) provides Numeric#positive? and Numeric#negative? natively, so requiring active_support/core_ext/numeric/inquiry is no longer necessary. Requiring it will raise LoadError in Rails 6.1."
|
@@ -1,11 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "active_support/core_ext/regexp"
|
4
3
|
require "concurrent/map"
|
5
4
|
|
6
5
|
class Object
|
7
6
|
# An object is blank if it's false, empty, or a whitespace string.
|
8
|
-
# For example, +
|
7
|
+
# For example, +nil+, '', ' ', [], {}, and +false+ are all blank.
|
9
8
|
#
|
10
9
|
# This simplifies
|
11
10
|
#
|
@@ -28,93 +28,6 @@ class Object
|
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
-
class NilClass
|
32
|
-
begin
|
33
|
-
nil.dup
|
34
|
-
rescue TypeError
|
35
|
-
|
36
|
-
# +nil+ is not duplicable:
|
37
|
-
#
|
38
|
-
# nil.duplicable? # => false
|
39
|
-
# nil.dup # => TypeError: can't dup NilClass
|
40
|
-
def duplicable?
|
41
|
-
false
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
class FalseClass
|
47
|
-
begin
|
48
|
-
false.dup
|
49
|
-
rescue TypeError
|
50
|
-
|
51
|
-
# +false+ is not duplicable:
|
52
|
-
#
|
53
|
-
# false.duplicable? # => false
|
54
|
-
# false.dup # => TypeError: can't dup FalseClass
|
55
|
-
def duplicable?
|
56
|
-
false
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
class TrueClass
|
62
|
-
begin
|
63
|
-
true.dup
|
64
|
-
rescue TypeError
|
65
|
-
|
66
|
-
# +true+ is not duplicable:
|
67
|
-
#
|
68
|
-
# true.duplicable? # => false
|
69
|
-
# true.dup # => TypeError: can't dup TrueClass
|
70
|
-
def duplicable?
|
71
|
-
false
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
class Symbol
|
77
|
-
begin
|
78
|
-
:symbol.dup # Ruby 2.4.x.
|
79
|
-
"symbol_from_string".to_sym.dup # Some symbols can't `dup` in Ruby 2.4.0.
|
80
|
-
rescue TypeError
|
81
|
-
|
82
|
-
# Symbols are not duplicable:
|
83
|
-
#
|
84
|
-
# :my_symbol.duplicable? # => false
|
85
|
-
# :my_symbol.dup # => TypeError: can't dup Symbol
|
86
|
-
def duplicable?
|
87
|
-
false
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
class Numeric
|
93
|
-
begin
|
94
|
-
1.dup
|
95
|
-
rescue TypeError
|
96
|
-
|
97
|
-
# Numbers are not duplicable:
|
98
|
-
#
|
99
|
-
# 3.duplicable? # => false
|
100
|
-
# 3.dup # => TypeError: can't dup Integer
|
101
|
-
def duplicable?
|
102
|
-
false
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
require "bigdecimal"
|
108
|
-
class BigDecimal
|
109
|
-
# BigDecimals are duplicable:
|
110
|
-
#
|
111
|
-
# BigDecimal("1.2").duplicable? # => true
|
112
|
-
# BigDecimal("1.2").dup # => #<BigDecimal:...,'0.12E1',18(18)>
|
113
|
-
def duplicable?
|
114
|
-
true
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
31
|
class Method
|
119
32
|
# Methods are not duplicable:
|
120
33
|
#
|
@@ -125,32 +38,12 @@ class Method
|
|
125
38
|
end
|
126
39
|
end
|
127
40
|
|
128
|
-
class
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
# Complex(1).duplicable? # => false
|
136
|
-
# Complex(1).dup # => TypeError: can't copy Complex
|
137
|
-
def duplicable?
|
138
|
-
false
|
139
|
-
end
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
class Rational
|
144
|
-
begin
|
145
|
-
Rational(1).dup
|
146
|
-
rescue TypeError
|
147
|
-
|
148
|
-
# Rationals are not duplicable:
|
149
|
-
#
|
150
|
-
# Rational(1).duplicable? # => false
|
151
|
-
# Rational(1).dup # => TypeError: can't copy Rational
|
152
|
-
def duplicable?
|
153
|
-
false
|
154
|
-
end
|
41
|
+
class UnboundMethod
|
42
|
+
# Unbound methods are not duplicable:
|
43
|
+
#
|
44
|
+
# method(:puts).unbind.duplicable? # => false
|
45
|
+
# method(:puts).unbind.dup # => TypeError: allocator undefined for UnboundMethod
|
46
|
+
def duplicable?
|
47
|
+
false
|
155
48
|
end
|
156
49
|
end
|
@@ -14,6 +14,7 @@ require "active_support/core_ext/time/conversions"
|
|
14
14
|
require "active_support/core_ext/date_time/conversions"
|
15
15
|
require "active_support/core_ext/date/conversions"
|
16
16
|
|
17
|
+
#--
|
17
18
|
# The JSON gem adds a few modules to Ruby core classes containing :to_json definition, overwriting
|
18
19
|
# their default behavior. That said, we need to define the basic to_json method in all of them,
|
19
20
|
# otherwise they will always use to_json gem implementation, which is backwards incompatible in
|
@@ -44,7 +45,7 @@ module ActiveSupport
|
|
44
45
|
end
|
45
46
|
end
|
46
47
|
|
47
|
-
[Object, Array, FalseClass, Float, Hash, Integer, NilClass, String, TrueClass
|
48
|
+
[Enumerable, Object, Array, FalseClass, Float, Hash, Integer, NilClass, String, TrueClass].reverse_each do |klass|
|
48
49
|
klass.prepend(ActiveSupport::ToJsonWithActiveSupportEncoder)
|
49
50
|
end
|
50
51
|
|
@@ -4,21 +4,31 @@ require "delegate"
|
|
4
4
|
|
5
5
|
module ActiveSupport
|
6
6
|
module Tryable #:nodoc:
|
7
|
-
def try(*
|
8
|
-
|
7
|
+
def try(method_name = nil, *args, &b)
|
8
|
+
if method_name.nil? && block_given?
|
9
|
+
if b.arity == 0
|
10
|
+
instance_eval(&b)
|
11
|
+
else
|
12
|
+
yield self
|
13
|
+
end
|
14
|
+
elsif respond_to?(method_name)
|
15
|
+
public_send(method_name, *args, &b)
|
16
|
+
end
|
9
17
|
end
|
18
|
+
ruby2_keywords(:try) if respond_to?(:ruby2_keywords, true)
|
10
19
|
|
11
|
-
def try!(*
|
12
|
-
if
|
20
|
+
def try!(method_name = nil, *args, &b)
|
21
|
+
if method_name.nil? && block_given?
|
13
22
|
if b.arity == 0
|
14
23
|
instance_eval(&b)
|
15
24
|
else
|
16
25
|
yield self
|
17
26
|
end
|
18
27
|
else
|
19
|
-
public_send(*
|
28
|
+
public_send(method_name, *args, &b)
|
20
29
|
end
|
21
30
|
end
|
31
|
+
ruby2_keywords(:try!) if respond_to?(:ruby2_keywords, true)
|
22
32
|
end
|
23
33
|
end
|
24
34
|
|
@@ -135,14 +145,14 @@ class NilClass
|
|
135
145
|
#
|
136
146
|
# With +try+
|
137
147
|
# @person.try(:children).try(:first).try(:name)
|
138
|
-
def try(*args)
|
148
|
+
def try(method_name = nil, *args)
|
139
149
|
nil
|
140
150
|
end
|
141
151
|
|
142
152
|
# Calling +try!+ on +nil+ always returns +nil+.
|
143
153
|
#
|
144
154
|
# nil.try!(:name) # => nil
|
145
|
-
def try!(*args)
|
155
|
+
def try!(method_name = nil, *args)
|
146
156
|
nil
|
147
157
|
end
|
148
158
|
end
|
@@ -68,7 +68,7 @@ class Object
|
|
68
68
|
# You can access these methods using the class name instead:
|
69
69
|
#
|
70
70
|
# class Phone < ActiveRecord::Base
|
71
|
-
# enum phone_number_type:
|
71
|
+
# enum phone_number_type: { home: 0, office: 1, mobile: 2 }
|
72
72
|
#
|
73
73
|
# with_options presence: true do
|
74
74
|
# validates :phone_number_type, inclusion: { in: Phone.phone_number_types.keys }
|
@@ -1,56 +1,71 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module ActiveSupport
|
4
|
-
module CompareWithRange
|
4
|
+
module CompareWithRange
|
5
5
|
# Extends the default Range#=== to support range comparisons.
|
6
|
-
# (1..5) === (1..5)
|
7
|
-
# (1..5) === (2..3)
|
8
|
-
# (1..5) === (
|
6
|
+
# (1..5) === (1..5) # => true
|
7
|
+
# (1..5) === (2..3) # => true
|
8
|
+
# (1..5) === (1...6) # => true
|
9
|
+
# (1..5) === (2..6) # => false
|
9
10
|
#
|
10
11
|
# The native Range#=== behavior is untouched.
|
11
12
|
# ('a'..'f') === ('c') # => true
|
12
13
|
# (5..9) === (11) # => false
|
14
|
+
#
|
15
|
+
# The given range must be fully bounded, with both start and end.
|
13
16
|
def ===(value)
|
14
17
|
if value.is_a?(::Range)
|
15
18
|
# 1...10 includes 1..9 but it does not include 1..10.
|
19
|
+
# 1..10 includes 1...11 but it does not include 1...12.
|
16
20
|
operator = exclude_end? && !value.exclude_end? ? :< : :<=
|
17
|
-
|
21
|
+
value_max = !exclude_end? && value.exclude_end? ? value.max : value.last
|
22
|
+
super(value.first) && (self.end.nil? || value_max.send(operator, last))
|
18
23
|
else
|
19
24
|
super
|
20
25
|
end
|
21
26
|
end
|
22
27
|
|
23
28
|
# Extends the default Range#include? to support range comparisons.
|
24
|
-
# (1..5).include?(1..5)
|
25
|
-
# (1..5).include?(2..3)
|
26
|
-
# (1..5).include?(
|
29
|
+
# (1..5).include?(1..5) # => true
|
30
|
+
# (1..5).include?(2..3) # => true
|
31
|
+
# (1..5).include?(1...6) # => true
|
32
|
+
# (1..5).include?(2..6) # => false
|
27
33
|
#
|
28
34
|
# The native Range#include? behavior is untouched.
|
29
35
|
# ('a'..'f').include?('c') # => true
|
30
36
|
# (5..9).include?(11) # => false
|
37
|
+
#
|
38
|
+
# The given range must be fully bounded, with both start and end.
|
31
39
|
def include?(value)
|
32
40
|
if value.is_a?(::Range)
|
33
41
|
# 1...10 includes 1..9 but it does not include 1..10.
|
42
|
+
# 1..10 includes 1...11 but it does not include 1...12.
|
34
43
|
operator = exclude_end? && !value.exclude_end? ? :< : :<=
|
35
|
-
|
44
|
+
value_max = !exclude_end? && value.exclude_end? ? value.max : value.last
|
45
|
+
super(value.first) && (self.end.nil? || value_max.send(operator, last))
|
36
46
|
else
|
37
47
|
super
|
38
48
|
end
|
39
49
|
end
|
40
50
|
|
41
51
|
# Extends the default Range#cover? to support range comparisons.
|
42
|
-
# (1..5).cover?(1..5)
|
43
|
-
# (1..5).cover?(2..3)
|
44
|
-
# (1..5).cover?(
|
52
|
+
# (1..5).cover?(1..5) # => true
|
53
|
+
# (1..5).cover?(2..3) # => true
|
54
|
+
# (1..5).cover?(1...6) # => true
|
55
|
+
# (1..5).cover?(2..6) # => false
|
45
56
|
#
|
46
57
|
# The native Range#cover? behavior is untouched.
|
47
58
|
# ('a'..'f').cover?('c') # => true
|
48
59
|
# (5..9).cover?(11) # => false
|
60
|
+
#
|
61
|
+
# The given range must be fully bounded, with both start and end.
|
49
62
|
def cover?(value)
|
50
63
|
if value.is_a?(::Range)
|
51
64
|
# 1...10 covers 1..9 but it does not cover 1..10.
|
65
|
+
# 1..10 covers 1...11 but it does not cover 1...12.
|
52
66
|
operator = exclude_end? && !value.exclude_end? ? :< : :<=
|
53
|
-
|
67
|
+
value_max = !exclude_end? && value.exclude_end? ? value.max : value.last
|
68
|
+
super(value.first) && (self.end.nil? || value_max.send(operator, last))
|
54
69
|
else
|
55
70
|
super
|
56
71
|
end
|