activesupport 5.2.7 → 6.0.0.beta1
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 +182 -566
- data/MIT-LICENSE +1 -1
- data/README.rdoc +1 -1
- data/lib/active_support/backtrace_cleaner.rb +23 -0
- data/lib/active_support/cache/file_store.rb +19 -12
- data/lib/active_support/cache/mem_cache_store.rb +16 -2
- data/lib/active_support/cache/memory_store.rb +5 -0
- data/lib/active_support/cache/null_store.rb +5 -0
- data/lib/active_support/cache/redis_cache_store.rb +39 -20
- data/lib/active_support/cache.rb +40 -18
- data/lib/active_support/callbacks.rb +16 -5
- data/lib/active_support/configurable.rb +4 -8
- 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 +1 -1
- 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 -17
- data/lib/active_support/core_ext/date_time/calculations.rb +1 -1
- data/lib/active_support/core_ext/enumerable.rb +71 -67
- data/lib/active_support/core_ext/hash/compact.rb +2 -26
- 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 +0 -2
- data/lib/active_support/core_ext/integer/multiple.rb +1 -1
- data/lib/active_support/core_ext/load_error.rb +1 -1
- data/lib/active_support/core_ext/module/attribute_accessors.rb +2 -5
- data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +8 -14
- data/lib/active_support/core_ext/module/delegation.rb +27 -7
- data/lib/active_support/core_ext/module/introspection.rb +37 -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 +5 -2
- data/lib/active_support/core_ext/object/json.rb +1 -0
- data/lib/active_support/core_ext/object/try.rb +15 -7
- data/lib/active_support/core_ext/object/with_options.rb +1 -1
- data/lib/active_support/core_ext/range/compare_range.rb +1 -1
- data/lib/active_support/core_ext/range/conversions.rb +31 -29
- data/lib/active_support/core_ext/range/include_range.rb +6 -0
- 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 +41 -0
- data/lib/active_support/core_ext/string/multibyte.rb +4 -3
- data/lib/active_support/core_ext/string/output_safety.rb +16 -5
- data/lib/active_support/core_ext/string/strip.rb +3 -1
- data/lib/active_support/core_ext/uri.rb +1 -0
- data/lib/active_support/current_attributes.rb +2 -0
- data/lib/active_support/dependencies.rb +28 -11
- data/lib/active_support/deprecation/behaviors.rb +1 -1
- data/lib/active_support/deprecation/method_wrappers.rb +4 -5
- data/lib/active_support/deprecation/proxy_wrappers.rb +0 -2
- data/lib/active_support/deprecation.rb +1 -1
- data/lib/active_support/descendants_tracker.rb +6 -5
- data/lib/active_support/duration/iso8601_parser.rb +2 -3
- data/lib/active_support/duration/iso8601_serializer.rb +3 -4
- data/lib/active_support/duration.rb +12 -14
- data/lib/active_support/encrypted_configuration.rb +0 -4
- data/lib/active_support/evented_file_update_checker.rb +25 -7
- data/lib/active_support/execution_wrapper.rb +14 -16
- data/lib/active_support/gem_version.rb +4 -4
- data/lib/active_support/hash_with_indifferent_access.rb +16 -28
- data/lib/active_support/i18n.rb +1 -0
- data/lib/active_support/i18n_railtie.rb +8 -1
- data/lib/active_support/inflector/inflections.rb +1 -4
- data/lib/active_support/inflector/methods.rb +15 -27
- data/lib/active_support/inflector/transliterate.rb +6 -6
- data/lib/active_support/json/decoding.rb +23 -23
- 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 -1
- data/lib/active_support/locale/en.rb +31 -0
- data/lib/active_support/log_subscriber.rb +31 -8
- data/lib/active_support/logger.rb +0 -15
- data/lib/active_support/logger_silence.rb +28 -12
- data/lib/active_support/logger_thread_safe_level.rb +27 -6
- data/lib/active_support/message_encryptor.rb +2 -4
- data/lib/active_support/message_verifier.rb +2 -2
- data/lib/active_support/multibyte/chars.rb +29 -48
- data/lib/active_support/multibyte/unicode.rb +44 -281
- data/lib/active_support/notifications/fanout.rb +42 -4
- data/lib/active_support/notifications/instrumenter.rb +73 -2
- data/lib/active_support/notifications.rb +32 -4
- data/lib/active_support/number_helper/number_to_currency_converter.rb +2 -2
- data/lib/active_support/number_helper/number_to_delimited_converter.rb +3 -1
- data/lib/active_support/number_helper/number_to_human_converter.rb +3 -1
- data/lib/active_support/number_helper/number_to_human_size_converter.rb +3 -1
- 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 -0
- data/lib/active_support/number_helper/number_to_rounded_converter.rb +5 -3
- data/lib/active_support/number_helper.rb +7 -0
- data/lib/active_support/ordered_options.rb +1 -1
- data/lib/active_support/parameter_filter.rb +124 -0
- data/lib/active_support/rails.rb +0 -6
- data/lib/active_support/reloader.rb +5 -6
- data/lib/active_support/subscriber.rb +16 -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 +109 -0
- data/lib/active_support/testing/stream.rb +1 -1
- data/lib/active_support/testing/time_helpers.rb +7 -7
- 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 -2
- 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 -9
- data/lib/active_support.rb +1 -1
- metadata +12 -10
- data/lib/active_support/core_ext/digest.rb +0 -3
- data/lib/active_support/values/unicode_tables.dat +0 -0
@@ -5,8 +5,8 @@ require "active_support/inflector"
|
|
5
5
|
class Module
|
6
6
|
# Returns the name of the module containing this one.
|
7
7
|
#
|
8
|
-
# M::N.
|
9
|
-
def
|
8
|
+
# M::N.module_parent_name # => "M"
|
9
|
+
def module_parent_name
|
10
10
|
if defined?(@parent_name)
|
11
11
|
@parent_name
|
12
12
|
else
|
@@ -16,6 +16,14 @@ class Module
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
+
def parent_name
|
20
|
+
ActiveSupport::Deprecation.warn(<<-MSG.squish)
|
21
|
+
`Module#parent_name` has been renamed to `module_parent_name`.
|
22
|
+
`parent_name` is deprecated and will be removed in Rails 6.1.
|
23
|
+
MSG
|
24
|
+
module_parent_name
|
25
|
+
end
|
26
|
+
|
19
27
|
# Returns the module which contains this one according to its name.
|
20
28
|
#
|
21
29
|
# module M
|
@@ -24,15 +32,23 @@ class Module
|
|
24
32
|
# end
|
25
33
|
# X = M::N
|
26
34
|
#
|
27
|
-
# M::N.
|
28
|
-
# X.
|
35
|
+
# M::N.module_parent # => M
|
36
|
+
# X.module_parent # => M
|
29
37
|
#
|
30
38
|
# The parent of top-level and anonymous modules is Object.
|
31
39
|
#
|
32
|
-
# M.
|
33
|
-
# Module.new.
|
40
|
+
# M.module_parent # => Object
|
41
|
+
# Module.new.module_parent # => Object
|
42
|
+
def module_parent
|
43
|
+
module_parent_name ? ActiveSupport::Inflector.constantize(module_parent_name) : Object
|
44
|
+
end
|
45
|
+
|
34
46
|
def parent
|
35
|
-
|
47
|
+
ActiveSupport::Deprecation.warn(<<-MSG.squish)
|
48
|
+
`Module#parent` has been renamed to `module_parent`.
|
49
|
+
`parent` is deprecated and will be removed in Rails 6.1.
|
50
|
+
MSG
|
51
|
+
module_parent
|
36
52
|
end
|
37
53
|
|
38
54
|
# Returns all the parents of this module according to its name, ordered from
|
@@ -44,13 +60,13 @@ class Module
|
|
44
60
|
# end
|
45
61
|
# X = M::N
|
46
62
|
#
|
47
|
-
# M.
|
48
|
-
# M::N.
|
49
|
-
# X.
|
50
|
-
def
|
63
|
+
# M.module_parents # => [Object]
|
64
|
+
# M::N.module_parents # => [M, Object]
|
65
|
+
# X.module_parents # => [M, Object]
|
66
|
+
def module_parents
|
51
67
|
parents = []
|
52
|
-
if
|
53
|
-
parts =
|
68
|
+
if module_parent_name
|
69
|
+
parts = module_parent_name.split("::")
|
54
70
|
until parts.empty?
|
55
71
|
parents << ActiveSupport::Inflector.constantize(parts * "::")
|
56
72
|
parts.pop
|
@@ -59,4 +75,12 @@ class Module
|
|
59
75
|
parents << Object unless parents.include? Object
|
60
76
|
parents
|
61
77
|
end
|
78
|
+
|
79
|
+
def parents
|
80
|
+
ActiveSupport::Deprecation.warn(<<-MSG.squish)
|
81
|
+
`Module#parents` has been renamed to `module_parents`.
|
82
|
+
`parents` is deprecated and will be removed in Rails 6.1.
|
83
|
+
MSG
|
84
|
+
module_parents
|
85
|
+
end
|
62
86
|
end
|
@@ -3,9 +3,4 @@
|
|
3
3
|
require "active_support/core_ext/module/anonymous"
|
4
4
|
require "active_support/core_ext/string/inflections"
|
5
5
|
|
6
|
-
|
7
|
-
def reachable? #:nodoc:
|
8
|
-
!anonymous? && name.safe_constantize.equal?(self)
|
9
|
-
end
|
10
|
-
deprecate :reachable?
|
11
|
-
end
|
6
|
+
ActiveSupport::Deprecation.warn("reachable is deprecated and will be removed from the framework.")
|
@@ -1,23 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class Module
|
4
|
-
if
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
alias_method method, method
|
13
|
-
end
|
14
|
-
end
|
15
|
-
else
|
16
|
-
def silence_redefinition_of_method(method)
|
17
|
-
if method_defined?(method) || private_method_defined?(method)
|
18
|
-
alias_method :__rails_redefine, method
|
19
|
-
remove_method :__rails_redefine
|
20
|
-
end
|
4
|
+
# Marks the named method as intended to be redefined, if it exists.
|
5
|
+
# Suppresses the Ruby method redefinition warning. Prefer
|
6
|
+
# #redefine_method where possible.
|
7
|
+
def silence_redefinition_of_method(method)
|
8
|
+
if method_defined?(method) || private_method_defined?(method)
|
9
|
+
# This suppresses the "method redefined" warning; the self-alias
|
10
|
+
# looks odd, but means we don't need to generate a unique name
|
11
|
+
alias_method method, method
|
21
12
|
end
|
22
13
|
end
|
23
14
|
|
@@ -3,7 +3,6 @@
|
|
3
3
|
require "active_support/core_ext/module/aliasing"
|
4
4
|
require "active_support/core_ext/module/introspection"
|
5
5
|
require "active_support/core_ext/module/anonymous"
|
6
|
-
require "active_support/core_ext/module/reachable"
|
7
6
|
require "active_support/core_ext/module/attribute_accessors"
|
8
7
|
require "active_support/core_ext/module/attribute_accessors_per_thread"
|
9
8
|
require "active_support/core_ext/module/attr_internal"
|
@@ -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
|
#
|
@@ -75,8 +75,11 @@ end
|
|
75
75
|
|
76
76
|
class Symbol
|
77
77
|
begin
|
78
|
-
:symbol.dup
|
79
|
-
|
78
|
+
:symbol.dup
|
79
|
+
|
80
|
+
# Some symbols couldn't be duped in Ruby 2.4.0 only, due to a bug.
|
81
|
+
# This feature check catches any regression.
|
82
|
+
"symbol_from_string".to_sym.dup
|
80
83
|
rescue TypeError
|
81
84
|
|
82
85
|
# Symbols are not duplicable:
|
@@ -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
|
@@ -4,19 +4,27 @@ 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
|
10
18
|
|
11
|
-
def try!(*
|
12
|
-
if
|
19
|
+
def try!(method_name = nil, *args, &b)
|
20
|
+
if method_name.nil? && block_given?
|
13
21
|
if b.arity == 0
|
14
22
|
instance_eval(&b)
|
15
23
|
else
|
16
24
|
yield self
|
17
25
|
end
|
18
26
|
else
|
19
|
-
public_send(*
|
27
|
+
public_send(method_name, *args, &b)
|
20
28
|
end
|
21
29
|
end
|
22
30
|
end
|
@@ -135,14 +143,14 @@ class NilClass
|
|
135
143
|
#
|
136
144
|
# With +try+
|
137
145
|
# @person.try(:children).try(:first).try(:name)
|
138
|
-
def try(*args)
|
146
|
+
def try(method_name = nil, *args)
|
139
147
|
nil
|
140
148
|
end
|
141
149
|
|
142
150
|
# Calling +try!+ on +nil+ always returns +nil+.
|
143
151
|
#
|
144
152
|
# nil.try!(:name) # => nil
|
145
|
-
def try!(*args)
|
153
|
+
def try!(method_name = nil, *args)
|
146
154
|
nil
|
147
155
|
end
|
148
156
|
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,39 +1,41 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
module ActiveSupport
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
3
|
+
module ActiveSupport
|
4
|
+
module RangeWithFormat
|
5
|
+
RANGE_FORMATS = {
|
6
|
+
db: -> (start, stop) do
|
7
|
+
case start
|
8
|
+
when String then "BETWEEN '#{start}' AND '#{stop}'"
|
9
|
+
else
|
10
|
+
"BETWEEN '#{start.to_s(:db)}' AND '#{stop.to_s(:db)}'"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
}
|
14
|
+
|
15
|
+
# Convert range to a formatted string. See RANGE_FORMATS for predefined formats.
|
16
|
+
#
|
17
|
+
# range = (1..100) # => 1..100
|
18
|
+
#
|
19
|
+
# range.to_s # => "1..100"
|
20
|
+
# range.to_s(:db) # => "BETWEEN '1' AND '100'"
|
21
|
+
#
|
22
|
+
# == Adding your own range formats to to_s
|
23
|
+
# You can add your own formats to the Range::RANGE_FORMATS hash.
|
24
|
+
# Use the format name as the hash key and a Proc instance.
|
25
|
+
#
|
26
|
+
# # config/initializers/range_formats.rb
|
27
|
+
# Range::RANGE_FORMATS[:short] = ->(start, stop) { "Between #{start.to_s(:db)} and #{stop.to_s(:db)}" }
|
28
|
+
def to_s(format = :default)
|
29
|
+
if formatter = RANGE_FORMATS[format]
|
30
|
+
formatter.call(first, last)
|
8
31
|
else
|
9
|
-
|
32
|
+
super()
|
10
33
|
end
|
11
34
|
end
|
12
|
-
}
|
13
35
|
|
14
|
-
|
15
|
-
|
16
|
-
# range = (1..100) # => 1..100
|
17
|
-
#
|
18
|
-
# range.to_s # => "1..100"
|
19
|
-
# range.to_s(:db) # => "BETWEEN '1' AND '100'"
|
20
|
-
#
|
21
|
-
# == Adding your own range formats to to_s
|
22
|
-
# You can add your own formats to the Range::RANGE_FORMATS hash.
|
23
|
-
# Use the format name as the hash key and a Proc instance.
|
24
|
-
#
|
25
|
-
# # config/initializers/range_formats.rb
|
26
|
-
# Range::RANGE_FORMATS[:short] = ->(start, stop) { "Between #{start.to_s(:db)} and #{stop.to_s(:db)}" }
|
27
|
-
def to_s(format = :default)
|
28
|
-
if formatter = RANGE_FORMATS[format]
|
29
|
-
formatter.call(first, last)
|
30
|
-
else
|
31
|
-
super()
|
32
|
-
end
|
36
|
+
alias_method :to_default_s, :to_s
|
37
|
+
alias_method :to_formatted_s, :to_s
|
33
38
|
end
|
34
|
-
|
35
|
-
alias_method :to_default_s, :to_s
|
36
|
-
alias_method :to_formatted_s, :to_s
|
37
39
|
end
|
38
40
|
|
39
41
|
Range.prepend(ActiveSupport::RangeWithFormat)
|