activesupport 5.2.6 → 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 -544
- data/MIT-LICENSE +1 -1
- data/README.rdoc +1 -1
- data/lib/active_support.rb +1 -1
- data/lib/active_support/backtrace_cleaner.rb +23 -0
- data/lib/active_support/cache.rb +40 -18
- 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/callbacks.rb +16 -5
- data/lib/active_support/configurable.rb +4 -8
- data/lib/active_support/core_ext/array.rb +1 -1
- 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/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.rb +0 -2
- 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/integer/multiple.rb +1 -1
- data/lib/active_support/core_ext/load_error.rb +1 -1
- data/lib/active_support/core_ext/module.rb +0 -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/numeric.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/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.rb +1 -1
- 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/descendants_tracker.rb +6 -5
- data/lib/active_support/duration.rb +12 -14
- data/lib/active_support/duration/iso8601_parser.rb +2 -3
- data/lib/active_support/duration/iso8601_serializer.rb +3 -4
- 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 +1 -0
- 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.rb +32 -4
- data/lib/active_support/notifications/fanout.rb +42 -4
- data/lib/active_support/notifications/instrumenter.rb +73 -2
- data/lib/active_support/number_helper.rb +7 -0
- 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/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 +4 -5
- 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.rb +2 -9
- 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
- metadata +12 -10
- data/lib/active_support/core_ext/digest.rb +0 -3
- data/lib/active_support/values/unicode_tables.dat +0 -0
@@ -1,34 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class Hash
|
4
|
-
# Slices a hash to include only the given keys. Returns a hash containing
|
5
|
-
# the given keys.
|
6
|
-
#
|
7
|
-
# { a: 1, b: 2, c: 3, d: 4 }.slice(:a, :b)
|
8
|
-
# # => {:a=>1, :b=>2}
|
9
|
-
#
|
10
|
-
# This is useful for limiting an options hash to valid keys before
|
11
|
-
# passing to a method:
|
12
|
-
#
|
13
|
-
# def search(criteria = {})
|
14
|
-
# criteria.assert_valid_keys(:mass, :velocity, :time)
|
15
|
-
# end
|
16
|
-
#
|
17
|
-
# search(options.slice(:mass, :velocity, :time))
|
18
|
-
#
|
19
|
-
# If you have an array of keys you want to limit to, you should splat them:
|
20
|
-
#
|
21
|
-
# valid_keys = [:mass, :velocity, :time]
|
22
|
-
# search(options.slice(*valid_keys))
|
23
|
-
def slice(*keys)
|
24
|
-
keys.each_with_object(Hash.new) { |k, hash| hash[k] = self[k] if has_key?(k) }
|
25
|
-
end unless method_defined?(:slice)
|
26
|
-
|
27
4
|
# Replaces the hash with only the given keys.
|
28
5
|
# Returns a hash containing the removed key/value pairs.
|
29
6
|
#
|
30
|
-
# { a: 1, b: 2, c: 3, d: 4 }
|
31
|
-
# # => {:c=>3, :d=>4}
|
7
|
+
# hash = { a: 1, b: 2, c: 3, d: 4 }
|
8
|
+
# hash.slice!(:a, :b) # => {:c=>3, :d=>4}
|
9
|
+
# hash # => {:a=>1, :b=>2}
|
32
10
|
def slice!(*keys)
|
33
11
|
omit = slice(*self.keys - keys)
|
34
12
|
hash = slice(*keys)
|
@@ -1,32 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
# Returns a new hash with the results of running +block+ once for every value.
|
5
|
-
# The keys are unchanged.
|
6
|
-
#
|
7
|
-
# { a: 1, b: 2, c: 3 }.transform_values { |x| x * 2 } # => { a: 2, b: 4, c: 6 }
|
8
|
-
#
|
9
|
-
# If you do not provide a +block+, it will return an Enumerator
|
10
|
-
# for chaining with other methods:
|
11
|
-
#
|
12
|
-
# { a: 1, b: 2 }.transform_values.with_index { |v, i| [v, i].join.to_i } # => { a: 10, b: 21 }
|
13
|
-
def transform_values
|
14
|
-
return enum_for(:transform_values) { size } unless block_given?
|
15
|
-
return {} if empty?
|
16
|
-
result = self.class.new
|
17
|
-
each do |key, value|
|
18
|
-
result[key] = yield(value)
|
19
|
-
end
|
20
|
-
result
|
21
|
-
end unless method_defined? :transform_values
|
3
|
+
require "active_support/deprecation"
|
22
4
|
|
23
|
-
|
24
|
-
# Same as +transform_values+ but modifies +self+.
|
25
|
-
def transform_values!
|
26
|
-
return enum_for(:transform_values!) { size } unless block_given?
|
27
|
-
each do |key, value|
|
28
|
-
self[key] = yield(value)
|
29
|
-
end
|
30
|
-
end unless method_defined? :transform_values!
|
31
|
-
# TODO: Remove this file when supporting only Ruby 2.4+.
|
32
|
-
end
|
5
|
+
ActiveSupport::Deprecation.warn "Ruby 2.5+ (required by Rails 6) provides Hash#transform_values natively, so requiring active_support/core_ext/hash/transform_values is no longer necessary. Requiring it will raise LoadError in Rails 6.1."
|
@@ -4,6 +4,6 @@ class LoadError
|
|
4
4
|
# Returns true if the given path name (except perhaps for the ".rb"
|
5
5
|
# extension) is the missing file which caused the exception to be raised.
|
6
6
|
def is_missing?(location)
|
7
|
-
location.sub(/\.rb$/, ""
|
7
|
+
location.sub(/\.rb$/, "") == path.to_s.sub(/\.rb$/, "")
|
8
8
|
end
|
9
9
|
end
|
@@ -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"
|
@@ -1,8 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "active_support/core_ext/array/extract_options"
|
4
|
-
require "active_support/core_ext/regexp"
|
5
|
-
|
6
3
|
# Extends the module object with class/module and instance accessors for
|
7
4
|
# class/module attributes, just like the native attr* accessors for instance
|
8
5
|
# attributes.
|
@@ -163,10 +160,10 @@ class Module
|
|
163
160
|
# parent class. Similarly if parent class changes the value then that would
|
164
161
|
# change the value of subclasses too.
|
165
162
|
#
|
166
|
-
# class
|
163
|
+
# class Citizen < Person
|
167
164
|
# end
|
168
165
|
#
|
169
|
-
#
|
166
|
+
# Citizen.new.hair_colors << :blue
|
170
167
|
# Person.new.hair_colors # => [:brown, :black, :blonde, :red, :blue]
|
171
168
|
#
|
172
169
|
# To opt out of the instance writer method, pass <tt>instance_writer: false</tt>.
|
@@ -1,8 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "active_support/core_ext/array/extract_options"
|
4
|
-
require "active_support/core_ext/regexp"
|
5
|
-
|
6
3
|
# Extends the module object with class/module and instance accessors for
|
7
4
|
# class/module attributes, just like the native attr* accessors for instance
|
8
5
|
# attributes, but does so on a per-thread basis.
|
@@ -36,9 +33,7 @@ class Module
|
|
36
33
|
# end
|
37
34
|
#
|
38
35
|
# Current.new.user # => NoMethodError
|
39
|
-
def thread_mattr_reader(*syms) # :nodoc:
|
40
|
-
options = syms.extract_options!
|
41
|
-
|
36
|
+
def thread_mattr_reader(*syms, instance_reader: true, instance_accessor: true) # :nodoc:
|
42
37
|
syms.each do |sym|
|
43
38
|
raise NameError.new("invalid attribute name: #{sym}") unless /^[_A-Za-z]\w*$/.match?(sym)
|
44
39
|
|
@@ -50,7 +45,7 @@ class Module
|
|
50
45
|
end
|
51
46
|
EOS
|
52
47
|
|
53
|
-
|
48
|
+
if instance_reader && instance_accessor
|
54
49
|
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
|
55
50
|
def #{sym}
|
56
51
|
self.class.#{sym}
|
@@ -79,8 +74,7 @@ class Module
|
|
79
74
|
# end
|
80
75
|
#
|
81
76
|
# Current.new.user = "DHH" # => NoMethodError
|
82
|
-
def thread_mattr_writer(*syms) # :nodoc:
|
83
|
-
options = syms.extract_options!
|
77
|
+
def thread_mattr_writer(*syms, instance_writer: true, instance_accessor: true) # :nodoc:
|
84
78
|
syms.each do |sym|
|
85
79
|
raise NameError.new("invalid attribute name: #{sym}") unless /^[_A-Za-z]\w*$/.match?(sym)
|
86
80
|
|
@@ -92,7 +86,7 @@ class Module
|
|
92
86
|
end
|
93
87
|
EOS
|
94
88
|
|
95
|
-
|
89
|
+
if instance_writer && instance_accessor
|
96
90
|
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
|
97
91
|
def #{sym}=(obj)
|
98
92
|
self.class.#{sym} = obj
|
@@ -137,14 +131,14 @@ class Module
|
|
137
131
|
# Or pass <tt>instance_accessor: false</tt>, to opt out both instance methods.
|
138
132
|
#
|
139
133
|
# class Current
|
140
|
-
#
|
134
|
+
# thread_mattr_accessor :user, instance_accessor: false
|
141
135
|
# end
|
142
136
|
#
|
143
137
|
# Current.new.user = "DHH" # => NoMethodError
|
144
138
|
# Current.new.user # => NoMethodError
|
145
|
-
def thread_mattr_accessor(*syms)
|
146
|
-
thread_mattr_reader(*syms)
|
147
|
-
thread_mattr_writer(*syms)
|
139
|
+
def thread_mattr_accessor(*syms, instance_reader: true, instance_writer: true, instance_accessor: true)
|
140
|
+
thread_mattr_reader(*syms, instance_reader: instance_reader, instance_accessor: instance_accessor)
|
141
|
+
thread_mattr_writer(*syms, instance_writer: instance_writer, instance_accessor: instance_accessor)
|
148
142
|
end
|
149
143
|
alias :thread_cattr_accessor :thread_mattr_accessor
|
150
144
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "set"
|
4
|
-
require "active_support/core_ext/regexp"
|
5
4
|
|
6
5
|
class Module
|
7
6
|
# Error generated by +delegate+ when a method is called on +nil+ and +allow_nil+
|
@@ -20,10 +19,11 @@ class Module
|
|
20
19
|
# public methods as your own.
|
21
20
|
#
|
22
21
|
# ==== Options
|
23
|
-
# * <tt>:to</tt> - Specifies the target object
|
22
|
+
# * <tt>:to</tt> - Specifies the target object name as a symbol or string
|
24
23
|
# * <tt>:prefix</tt> - Prefixes the new method with the target name or a custom prefix
|
25
|
-
# * <tt>:allow_nil</tt> -
|
24
|
+
# * <tt>:allow_nil</tt> - If set to true, prevents a +Module::DelegationError+
|
26
25
|
# from being raised
|
26
|
+
# * <tt>:private</tt> - If set to true, changes method visibility to private
|
27
27
|
#
|
28
28
|
# The macro receives one or more method names (specified as symbols or
|
29
29
|
# strings) and the name of the target object via the <tt>:to</tt> option
|
@@ -114,6 +114,23 @@ class Module
|
|
114
114
|
# invoice.customer_name # => 'John Doe'
|
115
115
|
# invoice.customer_address # => 'Vimmersvej 13'
|
116
116
|
#
|
117
|
+
# The delegated methods are public by default.
|
118
|
+
# Pass <tt>private: true</tt> to change that.
|
119
|
+
#
|
120
|
+
# class User < ActiveRecord::Base
|
121
|
+
# has_one :profile
|
122
|
+
# delegate :first_name, to: :profile
|
123
|
+
# delegate :date_of_birth, to: :profile, private: true
|
124
|
+
#
|
125
|
+
# def age
|
126
|
+
# Date.today.year - date_of_birth.year
|
127
|
+
# end
|
128
|
+
# end
|
129
|
+
#
|
130
|
+
# User.new.first_name # => "Tomas"
|
131
|
+
# User.new.date_of_birth # => NoMethodError: private method `date_of_birth' called for #<User:0x00000008221340>
|
132
|
+
# User.new.age # => 2
|
133
|
+
#
|
117
134
|
# If the target is +nil+ and does not respond to the delegated method a
|
118
135
|
# +Module::DelegationError+ is raised. If you wish to instead return +nil+,
|
119
136
|
# use the <tt>:allow_nil</tt> option.
|
@@ -151,7 +168,7 @@ class Module
|
|
151
168
|
# Foo.new("Bar").name # raises NoMethodError: undefined method `name'
|
152
169
|
#
|
153
170
|
# The target method must be public, otherwise it will raise +NoMethodError+.
|
154
|
-
def delegate(*methods, to: nil, prefix: nil, allow_nil: nil)
|
171
|
+
def delegate(*methods, to: nil, prefix: nil, allow_nil: nil, private: nil)
|
155
172
|
unless to
|
156
173
|
raise ArgumentError, "Delegation needs a target. Supply an options hash with a :to key as the last argument (e.g. delegate :hello, to: :greeter)."
|
157
174
|
end
|
@@ -173,7 +190,7 @@ class Module
|
|
173
190
|
to = to.to_s
|
174
191
|
to = "self.#{to}" if DELEGATION_RESERVED_METHOD_NAMES.include?(to)
|
175
192
|
|
176
|
-
methods.map do |method|
|
193
|
+
method_names = methods.map do |method|
|
177
194
|
# Attribute writer methods only accept one argument. Makes sure []=
|
178
195
|
# methods still accept two arguments.
|
179
196
|
definition = /[^\]]=$/.match?(method) ? "arg" : "*args, &block"
|
@@ -213,6 +230,9 @@ class Module
|
|
213
230
|
|
214
231
|
module_eval(method_def, file, line)
|
215
232
|
end
|
233
|
+
|
234
|
+
private(*method_names) if private
|
235
|
+
method_names
|
216
236
|
end
|
217
237
|
|
218
238
|
# When building decorators, a common pattern may emerge:
|
@@ -223,7 +243,7 @@ class Module
|
|
223
243
|
# end
|
224
244
|
#
|
225
245
|
# def person
|
226
|
-
#
|
246
|
+
# detail.person || creator
|
227
247
|
# end
|
228
248
|
#
|
229
249
|
# private
|
@@ -246,7 +266,7 @@ class Module
|
|
246
266
|
# end
|
247
267
|
#
|
248
268
|
# def person
|
249
|
-
#
|
269
|
+
# detail.person || creator
|
250
270
|
# end
|
251
271
|
# end
|
252
272
|
#
|
@@ -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
|
|
@@ -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
|