activesupport 5.1.6 → 5.2.0
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 +5 -5
- data/CHANGELOG.md +325 -576
- data/MIT-LICENSE +1 -1
- data/README.rdoc +3 -3
- data/lib/active_support/all.rb +2 -0
- data/lib/active_support/array_inquirer.rb +2 -0
- data/lib/active_support/backtrace_cleaner.rb +2 -0
- data/lib/active_support/benchmarkable.rb +2 -0
- data/lib/active_support/builder.rb +2 -0
- data/lib/active_support/cache/file_store.rb +5 -4
- data/lib/active_support/cache/mem_cache_store.rb +37 -27
- data/lib/active_support/cache/memory_store.rb +2 -0
- data/lib/active_support/cache/null_store.rb +2 -0
- data/lib/active_support/cache/redis_cache_store.rb +454 -0
- data/lib/active_support/cache/strategy/local_cache.rb +33 -2
- data/lib/active_support/cache/strategy/local_cache_middleware.rb +2 -0
- data/lib/active_support/cache.rb +181 -64
- data/lib/active_support/callbacks.rb +28 -39
- data/lib/active_support/concern.rb +3 -1
- data/lib/active_support/concurrency/share_lock.rb +2 -0
- data/lib/active_support/configurable.rb +2 -0
- data/lib/active_support/core_ext/array/access.rb +4 -2
- data/lib/active_support/core_ext/array/conversions.rb +2 -0
- data/lib/active_support/core_ext/array/extract_options.rb +2 -0
- data/lib/active_support/core_ext/array/grouping.rb +2 -0
- data/lib/active_support/core_ext/array/inquiry.rb +2 -0
- data/lib/active_support/core_ext/array/prepend_and_append.rb +4 -2
- data/lib/active_support/core_ext/array/wrap.rb +2 -0
- data/lib/active_support/core_ext/array.rb +2 -0
- data/lib/active_support/core_ext/benchmark.rb +2 -0
- data/lib/active_support/core_ext/big_decimal/conversions.rb +2 -0
- data/lib/active_support/core_ext/big_decimal.rb +2 -0
- data/lib/active_support/core_ext/class/attribute.rb +34 -16
- data/lib/active_support/core_ext/class/attribute_accessors.rb +2 -0
- data/lib/active_support/core_ext/class/subclasses.rb +1 -2
- data/lib/active_support/core_ext/class.rb +2 -0
- data/lib/active_support/core_ext/date/acts_like.rb +2 -0
- data/lib/active_support/core_ext/date/blank.rb +2 -0
- data/lib/active_support/core_ext/date/calculations.rb +2 -0
- data/lib/active_support/core_ext/date/conversions.rb +10 -9
- data/lib/active_support/core_ext/date/zones.rb +2 -0
- data/lib/active_support/core_ext/date.rb +2 -0
- data/lib/active_support/core_ext/date_and_time/calculations.rb +50 -16
- data/lib/active_support/core_ext/date_and_time/compatibility.rb +3 -1
- data/lib/active_support/core_ext/date_and_time/zones.rb +2 -0
- data/lib/active_support/core_ext/date_time/acts_like.rb +2 -0
- data/lib/active_support/core_ext/date_time/blank.rb +2 -0
- data/lib/active_support/core_ext/date_time/calculations.rb +2 -0
- data/lib/active_support/core_ext/date_time/compatibility.rb +7 -5
- data/lib/active_support/core_ext/date_time/conversions.rb +2 -0
- data/lib/active_support/core_ext/date_time.rb +2 -0
- data/lib/active_support/core_ext/digest/uuid.rb +3 -1
- data/lib/active_support/core_ext/enumerable.rb +3 -1
- data/lib/active_support/core_ext/file/atomic.rb +2 -0
- data/lib/active_support/core_ext/file.rb +2 -0
- data/lib/active_support/core_ext/hash/compact.rb +2 -0
- data/lib/active_support/core_ext/hash/conversions.rb +4 -2
- data/lib/active_support/core_ext/hash/deep_merge.rb +8 -12
- data/lib/active_support/core_ext/hash/except.rb +2 -0
- data/lib/active_support/core_ext/hash/indifferent_access.rb +2 -0
- data/lib/active_support/core_ext/hash/keys.rb +2 -0
- data/lib/active_support/core_ext/hash/reverse_merge.rb +5 -2
- data/lib/active_support/core_ext/hash/slice.rb +4 -4
- data/lib/active_support/core_ext/hash/transform_values.rb +2 -0
- data/lib/active_support/core_ext/hash.rb +2 -0
- data/lib/active_support/core_ext/integer/inflections.rb +2 -0
- data/lib/active_support/core_ext/integer/multiple.rb +2 -0
- data/lib/active_support/core_ext/integer/time.rb +7 -14
- data/lib/active_support/core_ext/integer.rb +2 -0
- data/lib/active_support/core_ext/kernel/agnostics.rb +2 -0
- data/lib/active_support/core_ext/kernel/concern.rb +2 -0
- data/lib/active_support/core_ext/kernel/reporting.rb +2 -0
- data/lib/active_support/core_ext/kernel/singleton_class.rb +2 -0
- data/lib/active_support/core_ext/kernel.rb +2 -0
- data/lib/active_support/core_ext/load_error.rb +2 -7
- data/lib/active_support/core_ext/marshal.rb +2 -0
- data/lib/active_support/core_ext/module/aliasing.rb +2 -0
- data/lib/active_support/core_ext/module/anonymous.rb +2 -0
- data/lib/active_support/core_ext/module/attr_internal.rb +2 -0
- data/lib/active_support/core_ext/module/attribute_accessors.rb +21 -24
- data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +2 -0
- data/lib/active_support/core_ext/module/concerning.rb +7 -8
- data/lib/active_support/core_ext/module/delegation.rb +31 -29
- data/lib/active_support/core_ext/module/deprecation.rb +2 -0
- data/lib/active_support/core_ext/module/introspection.rb +2 -0
- data/lib/active_support/core_ext/module/reachable.rb +3 -0
- data/lib/active_support/core_ext/module/redefine_method.rb +49 -0
- data/lib/active_support/core_ext/module/remove_method.rb +5 -23
- data/lib/active_support/core_ext/module.rb +3 -0
- data/lib/active_support/core_ext/name_error.rb +7 -0
- data/lib/active_support/core_ext/numeric/bytes.rb +2 -0
- data/lib/active_support/core_ext/numeric/conversions.rb +9 -7
- data/lib/active_support/core_ext/numeric/inquiry.rb +2 -0
- data/lib/active_support/core_ext/numeric/time.rb +7 -15
- data/lib/active_support/core_ext/numeric.rb +2 -0
- data/lib/active_support/core_ext/object/acts_like.rb +12 -1
- data/lib/active_support/core_ext/object/blank.rb +12 -1
- data/lib/active_support/core_ext/object/conversions.rb +2 -0
- data/lib/active_support/core_ext/object/deep_dup.rb +2 -0
- data/lib/active_support/core_ext/object/duplicable.rb +10 -8
- data/lib/active_support/core_ext/object/inclusion.rb +2 -0
- data/lib/active_support/core_ext/object/instance_variables.rb +2 -0
- data/lib/active_support/core_ext/object/json.rb +8 -0
- data/lib/active_support/core_ext/object/to_param.rb +2 -0
- data/lib/active_support/core_ext/object/to_query.rb +2 -0
- data/lib/active_support/core_ext/object/try.rb +2 -0
- data/lib/active_support/core_ext/object/with_options.rb +3 -1
- data/lib/active_support/core_ext/object.rb +2 -0
- data/lib/active_support/core_ext/range/conversions.rb +9 -1
- data/lib/active_support/core_ext/range/each.rb +5 -1
- data/lib/active_support/core_ext/range/include_range.rb +2 -0
- data/lib/active_support/core_ext/range/include_time_with_zone.rb +23 -0
- data/lib/active_support/core_ext/range/overlaps.rb +2 -0
- data/lib/active_support/core_ext/range.rb +3 -0
- data/lib/active_support/core_ext/regexp.rb +2 -0
- data/lib/active_support/core_ext/securerandom.rb +2 -0
- data/lib/active_support/core_ext/string/access.rb +2 -0
- data/lib/active_support/core_ext/string/behavior.rb +2 -0
- data/lib/active_support/core_ext/string/conversions.rb +2 -0
- data/lib/active_support/core_ext/string/exclude.rb +2 -0
- data/lib/active_support/core_ext/string/filters.rb +2 -0
- data/lib/active_support/core_ext/string/indent.rb +2 -0
- data/lib/active_support/core_ext/string/inflections.rb +26 -12
- data/lib/active_support/core_ext/string/inquiry.rb +2 -0
- data/lib/active_support/core_ext/string/multibyte.rb +4 -0
- data/lib/active_support/core_ext/string/output_safety.rb +6 -7
- data/lib/active_support/core_ext/string/starts_ends_with.rb +2 -0
- data/lib/active_support/core_ext/string/strip.rb +2 -0
- data/lib/active_support/core_ext/string/zones.rb +2 -0
- data/lib/active_support/core_ext/string.rb +2 -0
- data/lib/active_support/core_ext/time/acts_like.rb +2 -0
- data/lib/active_support/core_ext/time/calculations.rb +23 -15
- data/lib/active_support/core_ext/time/compatibility.rb +4 -2
- data/lib/active_support/core_ext/time/conversions.rb +2 -0
- data/lib/active_support/core_ext/time/zones.rb +6 -4
- data/lib/active_support/core_ext/time.rb +2 -0
- data/lib/active_support/core_ext/uri.rb +4 -1
- data/lib/active_support/core_ext.rb +3 -1
- data/lib/active_support/current_attributes.rb +195 -0
- data/lib/active_support/dependencies/autoload.rb +2 -0
- data/lib/active_support/dependencies/interlock.rb +2 -0
- data/lib/active_support/dependencies.rb +16 -25
- data/lib/active_support/deprecation/behaviors.rb +24 -9
- data/lib/active_support/deprecation/constant_accessor.rb +4 -2
- data/lib/active_support/deprecation/instance_delegator.rb +2 -0
- data/lib/active_support/deprecation/method_wrappers.rb +8 -8
- data/lib/active_support/deprecation/proxy_wrappers.rb +5 -2
- data/lib/active_support/deprecation/reporting.rb +5 -3
- data/lib/active_support/deprecation.rb +4 -2
- data/lib/active_support/descendants_tracker.rb +2 -0
- data/lib/active_support/digest.rb +20 -0
- data/lib/active_support/duration/iso8601_parser.rb +4 -2
- data/lib/active_support/duration/iso8601_serializer.rb +4 -2
- data/lib/active_support/duration.rb +11 -7
- data/lib/active_support/encrypted_configuration.rb +49 -0
- data/lib/active_support/encrypted_file.rb +99 -0
- data/lib/active_support/evented_file_update_checker.rb +2 -0
- data/lib/active_support/execution_wrapper.rb +2 -0
- data/lib/active_support/executor.rb +2 -0
- data/lib/active_support/file_update_checker.rb +2 -0
- data/lib/active_support/gem_version.rb +4 -2
- data/lib/active_support/gzip.rb +2 -0
- data/lib/active_support/hash_with_indifferent_access.rb +41 -1
- data/lib/active_support/i18n.rb +3 -1
- data/lib/active_support/i18n_railtie.rb +4 -6
- data/lib/active_support/inflections.rb +2 -0
- data/lib/active_support/inflector/inflections.rb +20 -4
- data/lib/active_support/inflector/methods.rb +41 -24
- data/lib/active_support/inflector/transliterate.rb +17 -8
- data/lib/active_support/inflector.rb +2 -0
- data/lib/active_support/json/decoding.rb +2 -0
- data/lib/active_support/json/encoding.rb +2 -0
- data/lib/active_support/json.rb +2 -0
- data/lib/active_support/key_generator.rb +3 -1
- data/lib/active_support/lazy_load_hooks.rb +2 -0
- data/lib/active_support/log_subscriber/test_helper.rb +2 -0
- data/lib/active_support/log_subscriber.rb +3 -2
- data/lib/active_support/logger.rb +2 -0
- data/lib/active_support/logger_silence.rb +3 -2
- data/lib/active_support/logger_thread_safe_level.rb +2 -0
- data/lib/active_support/message_encryptor.rb +95 -22
- data/lib/active_support/message_verifier.rb +78 -7
- data/lib/active_support/messages/metadata.rb +71 -0
- data/lib/active_support/messages/rotation_configuration.rb +22 -0
- data/lib/active_support/messages/rotator.rb +56 -0
- data/lib/active_support/multibyte/chars.rb +2 -0
- data/lib/active_support/multibyte/unicode.rb +4 -2
- data/lib/active_support/multibyte.rb +2 -0
- data/lib/active_support/notifications/fanout.rb +2 -0
- data/lib/active_support/notifications/instrumenter.rb +2 -0
- data/lib/active_support/notifications.rb +2 -0
- data/lib/active_support/number_helper/number_converter.rb +2 -0
- data/lib/active_support/number_helper/number_to_currency_converter.rb +2 -0
- data/lib/active_support/number_helper/number_to_delimited_converter.rb +2 -0
- data/lib/active_support/number_helper/number_to_human_converter.rb +2 -0
- data/lib/active_support/number_helper/number_to_human_size_converter.rb +2 -0
- data/lib/active_support/number_helper/number_to_percentage_converter.rb +2 -0
- data/lib/active_support/number_helper/number_to_phone_converter.rb +3 -1
- data/lib/active_support/number_helper/number_to_rounded_converter.rb +2 -20
- data/lib/active_support/number_helper/rounding_helper.rb +6 -4
- data/lib/active_support/number_helper.rb +2 -0
- data/lib/active_support/option_merger.rb +2 -0
- data/lib/active_support/ordered_hash.rb +2 -0
- data/lib/active_support/ordered_options.rb +4 -2
- data/lib/active_support/per_thread_registry.rb +2 -0
- data/lib/active_support/proxy_object.rb +2 -0
- data/lib/active_support/rails.rb +2 -0
- data/lib/active_support/railtie.rb +37 -8
- data/lib/active_support/reloader.rb +7 -5
- data/lib/active_support/rescuable.rb +3 -2
- data/lib/active_support/security_utils.rb +15 -11
- data/lib/active_support/string_inquirer.rb +2 -0
- data/lib/active_support/subscriber.rb +2 -0
- data/lib/active_support/tagged_logging.rb +2 -0
- data/lib/active_support/test_case.rb +2 -1
- data/lib/active_support/testing/assertions.rb +31 -14
- data/lib/active_support/testing/autorun.rb +2 -0
- data/lib/active_support/testing/constant_lookup.rb +2 -0
- data/lib/active_support/testing/declarative.rb +2 -0
- data/lib/active_support/testing/deprecation.rb +2 -0
- data/lib/active_support/testing/file_fixtures.rb +2 -0
- data/lib/active_support/testing/isolation.rb +3 -1
- data/lib/active_support/testing/method_call_assertions.rb +2 -0
- data/lib/active_support/testing/setup_and_teardown.rb +10 -1
- data/lib/active_support/testing/stream.rb +2 -0
- data/lib/active_support/testing/tagged_logging.rb +2 -0
- data/lib/active_support/testing/time_helpers.rb +33 -3
- data/lib/active_support/time.rb +2 -0
- data/lib/active_support/time_with_zone.rb +38 -0
- data/lib/active_support/values/time_zone.rb +19 -8
- data/lib/active_support/version.rb +2 -0
- data/lib/active_support/xml_mini/jdom.rb +4 -2
- data/lib/active_support/xml_mini/libxml.rb +3 -1
- data/lib/active_support/xml_mini/libxmlsax.rb +4 -2
- data/lib/active_support/xml_mini/nokogiri.rb +3 -1
- data/lib/active_support/xml_mini/nokogirisax.rb +3 -1
- data/lib/active_support/xml_mini/rexml.rb +3 -1
- data/lib/active_support/xml_mini.rb +3 -1
- data/lib/active_support.rb +5 -13
- metadata +15 -5
@@ -1,27 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "active_support/duration"
|
2
4
|
require "active_support/core_ext/numeric/time"
|
3
5
|
|
4
6
|
class Integer
|
5
|
-
#
|
6
|
-
# 2.hours + 4.years</tt>.
|
7
|
-
#
|
8
|
-
# These methods use Time#advance for precise date calculations when using
|
9
|
-
# <tt>from_now</tt>, +ago+, etc. as well as adding or subtracting their
|
10
|
-
# results from a Time object.
|
11
|
-
#
|
12
|
-
# # equivalent to Time.now.advance(months: 1)
|
13
|
-
# 1.month.from_now
|
7
|
+
# Returns a Duration instance matching the number of months provided.
|
14
8
|
#
|
15
|
-
# #
|
16
|
-
# 2.years.from_now
|
17
|
-
#
|
18
|
-
# # equivalent to Time.now.advance(months: 4, years: 5)
|
19
|
-
# (4.months + 5.years).from_now
|
9
|
+
# 2.months # => 2 months
|
20
10
|
def months
|
21
11
|
ActiveSupport::Duration.months(self)
|
22
12
|
end
|
23
13
|
alias :month :months
|
24
14
|
|
15
|
+
# Returns a Duration instance matching the number of years provided.
|
16
|
+
#
|
17
|
+
# 2.years # => 2 years
|
25
18
|
def years
|
26
19
|
ActiveSupport::Duration.years(self)
|
27
20
|
end
|
@@ -1,11 +1,6 @@
|
|
1
|
-
|
2
|
-
REGEXPS = [
|
3
|
-
/^no such file to load -- (.+)$/i,
|
4
|
-
/^Missing \w+ (?:file\s*)?([^\s]+.rb)$/i,
|
5
|
-
/^Missing API definition file in (.+)$/i,
|
6
|
-
/^cannot load such file -- (.+)$/i,
|
7
|
-
]
|
1
|
+
# frozen_string_literal: true
|
8
2
|
|
3
|
+
class LoadError
|
9
4
|
# Returns true if the given path name (except perhaps for the ".rb"
|
10
5
|
# extension) is the missing file which caused the exception to be raised.
|
11
6
|
def is_missing?(location)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "active_support/core_ext/array/extract_options"
|
2
4
|
require "active_support/core_ext/regexp"
|
3
5
|
|
@@ -38,13 +40,10 @@ class Module
|
|
38
40
|
#
|
39
41
|
# Person.new.hair_colors # => NoMethodError
|
40
42
|
#
|
41
|
-
#
|
42
|
-
# Also, you can pass a block to set up the attribute with a default value.
|
43
|
+
# You can set a default value for the attribute.
|
43
44
|
#
|
44
45
|
# module HairColors
|
45
|
-
# mattr_reader :hair_colors
|
46
|
-
# [:brown, :black, :blonde, :red]
|
47
|
-
# end
|
46
|
+
# mattr_reader :hair_colors, default: [:brown, :black, :blonde, :red]
|
48
47
|
# end
|
49
48
|
#
|
50
49
|
# class Person
|
@@ -52,8 +51,7 @@ class Module
|
|
52
51
|
# end
|
53
52
|
#
|
54
53
|
# Person.new.hair_colors # => [:brown, :black, :blonde, :red]
|
55
|
-
def mattr_reader(*syms)
|
56
|
-
options = syms.extract_options!
|
54
|
+
def mattr_reader(*syms, instance_reader: true, instance_accessor: true, default: nil)
|
57
55
|
syms.each do |sym|
|
58
56
|
raise NameError.new("invalid attribute name: #{sym}") unless /\A[_A-Za-z]\w*\z/.match?(sym)
|
59
57
|
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
|
@@ -64,14 +62,16 @@ class Module
|
|
64
62
|
end
|
65
63
|
EOS
|
66
64
|
|
67
|
-
|
65
|
+
if instance_reader && instance_accessor
|
68
66
|
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
|
69
67
|
def #{sym}
|
70
68
|
@@#{sym}
|
71
69
|
end
|
72
70
|
EOS
|
73
71
|
end
|
74
|
-
|
72
|
+
|
73
|
+
sym_default_value = (block_given? && default.nil?) ? yield : default
|
74
|
+
class_variable_set("@@#{sym}", sym_default_value) unless sym_default_value.nil?
|
75
75
|
end
|
76
76
|
end
|
77
77
|
alias :cattr_reader :mattr_reader
|
@@ -107,12 +107,10 @@ class Module
|
|
107
107
|
#
|
108
108
|
# Person.new.hair_colors = [:blonde, :red] # => NoMethodError
|
109
109
|
#
|
110
|
-
#
|
110
|
+
# You can set a default value for the attribute.
|
111
111
|
#
|
112
112
|
# module HairColors
|
113
|
-
# mattr_writer :hair_colors
|
114
|
-
# [:brown, :black, :blonde, :red]
|
115
|
-
# end
|
113
|
+
# mattr_writer :hair_colors, default: [:brown, :black, :blonde, :red]
|
116
114
|
# end
|
117
115
|
#
|
118
116
|
# class Person
|
@@ -120,8 +118,7 @@ class Module
|
|
120
118
|
# end
|
121
119
|
#
|
122
120
|
# Person.class_variable_get("@@hair_colors") # => [:brown, :black, :blonde, :red]
|
123
|
-
def mattr_writer(*syms)
|
124
|
-
options = syms.extract_options!
|
121
|
+
def mattr_writer(*syms, instance_writer: true, instance_accessor: true, default: nil)
|
125
122
|
syms.each do |sym|
|
126
123
|
raise NameError.new("invalid attribute name: #{sym}") unless /\A[_A-Za-z]\w*\z/.match?(sym)
|
127
124
|
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
|
@@ -132,14 +129,16 @@ class Module
|
|
132
129
|
end
|
133
130
|
EOS
|
134
131
|
|
135
|
-
|
132
|
+
if instance_writer && instance_accessor
|
136
133
|
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
|
137
134
|
def #{sym}=(obj)
|
138
135
|
@@#{sym} = obj
|
139
136
|
end
|
140
137
|
EOS
|
141
138
|
end
|
142
|
-
|
139
|
+
|
140
|
+
sym_default_value = (block_given? && default.nil?) ? yield : default
|
141
|
+
send("#{sym}=", sym_default_value) unless sym_default_value.nil?
|
143
142
|
end
|
144
143
|
end
|
145
144
|
alias :cattr_writer :mattr_writer
|
@@ -197,12 +196,10 @@ class Module
|
|
197
196
|
# Person.new.hair_colors = [:brown] # => NoMethodError
|
198
197
|
# Person.new.hair_colors # => NoMethodError
|
199
198
|
#
|
200
|
-
#
|
199
|
+
# You can set a default value for the attribute.
|
201
200
|
#
|
202
201
|
# module HairColors
|
203
|
-
# mattr_accessor :hair_colors
|
204
|
-
# [:brown, :black, :blonde, :red]
|
205
|
-
# end
|
202
|
+
# mattr_accessor :hair_colors, default: [:brown, :black, :blonde, :red]
|
206
203
|
# end
|
207
204
|
#
|
208
205
|
# class Person
|
@@ -210,9 +207,9 @@ class Module
|
|
210
207
|
# end
|
211
208
|
#
|
212
209
|
# Person.class_variable_get("@@hair_colors") # => [:brown, :black, :blonde, :red]
|
213
|
-
def mattr_accessor(*syms, &blk)
|
214
|
-
mattr_reader(*syms, &blk)
|
215
|
-
mattr_writer(*syms)
|
210
|
+
def mattr_accessor(*syms, instance_reader: true, instance_writer: true, instance_accessor: true, default: nil, &blk)
|
211
|
+
mattr_reader(*syms, instance_reader: instance_reader, instance_accessor: instance_accessor, default: default, &blk)
|
212
|
+
mattr_writer(*syms, instance_writer: instance_writer, instance_accessor: instance_accessor, default: default)
|
216
213
|
end
|
217
214
|
alias :cattr_accessor :mattr_accessor
|
218
215
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "active_support/concern"
|
2
4
|
|
3
5
|
class Module
|
@@ -20,7 +22,7 @@ class Module
|
|
20
22
|
#
|
21
23
|
# == Using comments:
|
22
24
|
#
|
23
|
-
# class Todo
|
25
|
+
# class Todo < ApplicationRecord
|
24
26
|
# # Other todo implementation
|
25
27
|
# # ...
|
26
28
|
#
|
@@ -28,7 +30,6 @@ class Module
|
|
28
30
|
# has_many :events
|
29
31
|
#
|
30
32
|
# before_create :track_creation
|
31
|
-
# after_destroy :track_deletion
|
32
33
|
#
|
33
34
|
# private
|
34
35
|
# def track_creation
|
@@ -40,7 +41,7 @@ class Module
|
|
40
41
|
#
|
41
42
|
# Noisy syntax.
|
42
43
|
#
|
43
|
-
# class Todo
|
44
|
+
# class Todo < ApplicationRecord
|
44
45
|
# # Other todo implementation
|
45
46
|
# # ...
|
46
47
|
#
|
@@ -50,7 +51,6 @@ class Module
|
|
50
51
|
# included do
|
51
52
|
# has_many :events
|
52
53
|
# before_create :track_creation
|
53
|
-
# after_destroy :track_deletion
|
54
54
|
# end
|
55
55
|
#
|
56
56
|
# private
|
@@ -68,7 +68,7 @@ class Module
|
|
68
68
|
# increased overhead can be a reasonable tradeoff even if it reduces our
|
69
69
|
# at-a-glance perception of how things work.
|
70
70
|
#
|
71
|
-
# class Todo
|
71
|
+
# class Todo < ApplicationRecord
|
72
72
|
# # Other todo implementation
|
73
73
|
# # ...
|
74
74
|
#
|
@@ -80,7 +80,7 @@ class Module
|
|
80
80
|
# By quieting the mix-in noise, we arrive at a natural, low-ceremony way to
|
81
81
|
# separate bite-sized concerns.
|
82
82
|
#
|
83
|
-
# class Todo
|
83
|
+
# class Todo < ApplicationRecord
|
84
84
|
# # Other todo implementation
|
85
85
|
# # ...
|
86
86
|
#
|
@@ -88,7 +88,6 @@ class Module
|
|
88
88
|
# included do
|
89
89
|
# has_many :events
|
90
90
|
# before_create :track_creation
|
91
|
-
# after_destroy :track_deletion
|
92
91
|
# end
|
93
92
|
#
|
94
93
|
# private
|
@@ -99,7 +98,7 @@ class Module
|
|
99
98
|
# end
|
100
99
|
#
|
101
100
|
# Todo.ancestors
|
102
|
-
# # => [Todo, Todo::EventTracking, Object]
|
101
|
+
# # => [Todo, Todo::EventTracking, ApplicationRecord, Object]
|
103
102
|
#
|
104
103
|
# This small step has some wonderful ripple effects. We can
|
105
104
|
# * grok the behavior of our class in one glance,
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "set"
|
2
4
|
require "active_support/core_ext/regexp"
|
3
5
|
|
@@ -113,11 +115,8 @@ class Module
|
|
113
115
|
# invoice.customer_address # => 'Vimmersvej 13'
|
114
116
|
#
|
115
117
|
# If the target is +nil+ and does not respond to the delegated method a
|
116
|
-
# +Module::DelegationError+ is raised
|
117
|
-
#
|
118
|
-
# purpose of the <tt>:allow_nil</tt> option: If the target is not +nil+, or it
|
119
|
-
# is and responds to the method, everything works as usual. But if it is +nil+
|
120
|
-
# and does not respond to the delegated method, +nil+ is returned.
|
118
|
+
# +Module::DelegationError+ is raised. If you wish to instead return +nil+,
|
119
|
+
# use the <tt>:allow_nil</tt> option.
|
121
120
|
#
|
122
121
|
# class User < ActiveRecord::Base
|
123
122
|
# has_one :profile
|
@@ -174,7 +173,7 @@ class Module
|
|
174
173
|
to = to.to_s
|
175
174
|
to = "self.#{to}" if DELEGATION_RESERVED_METHOD_NAMES.include?(to)
|
176
175
|
|
177
|
-
methods.
|
176
|
+
methods.map do |method|
|
178
177
|
# Attribute writer methods only accept one argument. Makes sure []=
|
179
178
|
# methods still accept two arguments.
|
180
179
|
definition = /[^\]]=$/.match?(method) ? "arg" : "*args, &block"
|
@@ -219,48 +218,43 @@ class Module
|
|
219
218
|
# When building decorators, a common pattern may emerge:
|
220
219
|
#
|
221
220
|
# class Partition
|
222
|
-
# def initialize(
|
223
|
-
# @
|
221
|
+
# def initialize(event)
|
222
|
+
# @event = event
|
224
223
|
# end
|
225
224
|
#
|
226
|
-
# def
|
227
|
-
#
|
228
|
-
# @events.collect { |e| Array(e.detail.people) }.flatten.uniq
|
229
|
-
# else
|
230
|
-
# @events.collect(&:creator).uniq
|
231
|
-
# end
|
225
|
+
# def person
|
226
|
+
# @event.detail.person || @event.creator
|
232
227
|
# end
|
233
228
|
#
|
234
229
|
# private
|
235
230
|
# def respond_to_missing?(name, include_private = false)
|
236
|
-
# @
|
231
|
+
# @event.respond_to?(name, include_private)
|
237
232
|
# end
|
238
233
|
#
|
239
234
|
# def method_missing(method, *args, &block)
|
240
|
-
# @
|
235
|
+
# @event.send(method, *args, &block)
|
241
236
|
# end
|
242
237
|
# end
|
243
238
|
#
|
244
|
-
# With
|
239
|
+
# With <tt>Module#delegate_missing_to</tt>, the above is condensed to:
|
245
240
|
#
|
246
241
|
# class Partition
|
247
|
-
# delegate_missing_to :@
|
242
|
+
# delegate_missing_to :@event
|
248
243
|
#
|
249
|
-
# def initialize(
|
250
|
-
# @
|
244
|
+
# def initialize(event)
|
245
|
+
# @event = event
|
251
246
|
# end
|
252
247
|
#
|
253
|
-
# def
|
254
|
-
#
|
255
|
-
# @events.collect { |e| Array(e.detail.people) }.flatten.uniq
|
256
|
-
# else
|
257
|
-
# @events.collect(&:creator).uniq
|
258
|
-
# end
|
248
|
+
# def person
|
249
|
+
# @event.detail.person || @event.creator
|
259
250
|
# end
|
260
251
|
# end
|
261
252
|
#
|
262
|
-
# The target can be anything callable within the object
|
263
|
-
# variables, methods, constants
|
253
|
+
# The target can be anything callable within the object, e.g. instance
|
254
|
+
# variables, methods, constants, etc.
|
255
|
+
#
|
256
|
+
# The delegated method must be public on the target, otherwise it will
|
257
|
+
# raise +NoMethodError+.
|
264
258
|
def delegate_missing_to(target)
|
265
259
|
target = target.to_s
|
266
260
|
target = "self.#{target}" if DELEGATION_RESERVED_METHOD_NAMES.include?(target)
|
@@ -277,7 +271,15 @@ class Module
|
|
277
271
|
if #{target}.respond_to?(method)
|
278
272
|
#{target}.public_send(method, *args, &block)
|
279
273
|
else
|
280
|
-
|
274
|
+
begin
|
275
|
+
super
|
276
|
+
rescue NoMethodError
|
277
|
+
if #{target}.nil?
|
278
|
+
raise DelegationError, "\#{method} delegated to #{target}, but #{target} is nil"
|
279
|
+
else
|
280
|
+
raise
|
281
|
+
end
|
282
|
+
end
|
281
283
|
end
|
282
284
|
end
|
283
285
|
RUBY
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "active_support/core_ext/module/anonymous"
|
2
4
|
require "active_support/core_ext/string/inflections"
|
3
5
|
|
@@ -5,4 +7,5 @@ class Module
|
|
5
7
|
def reachable? #:nodoc:
|
6
8
|
!anonymous? && name.safe_constantize.equal?(self)
|
7
9
|
end
|
10
|
+
deprecate :reachable?
|
8
11
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Module
|
4
|
+
if RUBY_VERSION >= "2.3"
|
5
|
+
# Marks the named method as intended to be redefined, if it exists.
|
6
|
+
# Suppresses the Ruby method redefinition warning. Prefer
|
7
|
+
# #redefine_method where possible.
|
8
|
+
def silence_redefinition_of_method(method)
|
9
|
+
if method_defined?(method) || private_method_defined?(method)
|
10
|
+
# This suppresses the "method redefined" warning; the self-alias
|
11
|
+
# looks odd, but means we don't need to generate a unique name
|
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
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Replaces the existing method definition, if there is one, with the passed
|
25
|
+
# block as its body.
|
26
|
+
def redefine_method(method, &block)
|
27
|
+
visibility = method_visibility(method)
|
28
|
+
silence_redefinition_of_method(method)
|
29
|
+
define_method(method, &block)
|
30
|
+
send(visibility, method)
|
31
|
+
end
|
32
|
+
|
33
|
+
# Replaces the existing singleton method definition, if there is one, with
|
34
|
+
# the passed block as its body.
|
35
|
+
def redefine_singleton_method(method, &block)
|
36
|
+
singleton_class.redefine_method(method, &block)
|
37
|
+
end
|
38
|
+
|
39
|
+
def method_visibility(method) # :nodoc:
|
40
|
+
case
|
41
|
+
when private_method_defined?(method)
|
42
|
+
:private
|
43
|
+
when protected_method_defined?(method)
|
44
|
+
:protected
|
45
|
+
else
|
46
|
+
:public
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -1,3 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/core_ext/module/redefine_method"
|
4
|
+
|
1
5
|
class Module
|
2
6
|
# Removes the named method, if it exists.
|
3
7
|
def remove_possible_method(method)
|
@@ -8,28 +12,6 @@ class Module
|
|
8
12
|
|
9
13
|
# Removes the named singleton method, if it exists.
|
10
14
|
def remove_possible_singleton_method(method)
|
11
|
-
singleton_class.
|
12
|
-
remove_possible_method(method)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
# Replaces the existing method definition, if there is one, with the passed
|
17
|
-
# block as its body.
|
18
|
-
def redefine_method(method, &block)
|
19
|
-
visibility = method_visibility(method)
|
20
|
-
remove_possible_method(method)
|
21
|
-
define_method(method, &block)
|
22
|
-
send(visibility, method)
|
23
|
-
end
|
24
|
-
|
25
|
-
def method_visibility(method) # :nodoc:
|
26
|
-
case
|
27
|
-
when private_method_defined?(method)
|
28
|
-
:private
|
29
|
-
when protected_method_defined?(method)
|
30
|
-
:protected
|
31
|
-
else
|
32
|
-
:public
|
33
|
-
end
|
15
|
+
singleton_class.remove_possible_method(method)
|
34
16
|
end
|
35
17
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "active_support/core_ext/module/aliasing"
|
2
4
|
require "active_support/core_ext/module/introspection"
|
3
5
|
require "active_support/core_ext/module/anonymous"
|
@@ -8,4 +10,5 @@ require "active_support/core_ext/module/attr_internal"
|
|
8
10
|
require "active_support/core_ext/module/concerning"
|
9
11
|
require "active_support/core_ext/module/delegation"
|
10
12
|
require "active_support/core_ext/module/deprecation"
|
13
|
+
require "active_support/core_ext/module/redefine_method"
|
11
14
|
require "active_support/core_ext/module/remove_method"
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class NameError
|
2
4
|
# Extract the name of the missing constant from the exception message.
|
3
5
|
#
|
@@ -8,6 +10,11 @@ class NameError
|
|
8
10
|
# end
|
9
11
|
# # => "HelloWorld"
|
10
12
|
def missing_name
|
13
|
+
# Since ruby v2.3.0 `did_you_mean` gem is loaded by default.
|
14
|
+
# It extends NameError#message with spell corrections which are SLOW.
|
15
|
+
# We should use original_message message instead.
|
16
|
+
message = respond_to?(:original_message) ? original_message : self.message
|
17
|
+
|
11
18
|
if /undefined local variable or method/ !~ message
|
12
19
|
$1 if /((::)?([A-Z]\w*)(::[A-Z]\w*)*)$/ =~ message
|
13
20
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "active_support/core_ext/big_decimal/conversions"
|
2
4
|
require "active_support/number_helper"
|
3
5
|
require "active_support/core_ext/module/deprecation"
|
@@ -106,19 +108,19 @@ module ActiveSupport::NumericWithFormat
|
|
106
108
|
when Integer, String
|
107
109
|
super(format)
|
108
110
|
when :phone
|
109
|
-
|
111
|
+
ActiveSupport::NumberHelper.number_to_phone(self, options || {})
|
110
112
|
when :currency
|
111
|
-
|
113
|
+
ActiveSupport::NumberHelper.number_to_currency(self, options || {})
|
112
114
|
when :percentage
|
113
|
-
|
115
|
+
ActiveSupport::NumberHelper.number_to_percentage(self, options || {})
|
114
116
|
when :delimited
|
115
|
-
|
117
|
+
ActiveSupport::NumberHelper.number_to_delimited(self, options || {})
|
116
118
|
when :rounded
|
117
|
-
|
119
|
+
ActiveSupport::NumberHelper.number_to_rounded(self, options || {})
|
118
120
|
when :human
|
119
|
-
|
121
|
+
ActiveSupport::NumberHelper.number_to_human(self, options || {})
|
120
122
|
when :human_size
|
121
|
-
|
123
|
+
ActiveSupport::NumberHelper.number_to_human_size(self, options || {})
|
122
124
|
when Symbol
|
123
125
|
super()
|
124
126
|
else
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "active_support/duration"
|
2
4
|
require "active_support/core_ext/time/calculations"
|
3
5
|
require "active_support/core_ext/time/acts_like"
|
@@ -5,19 +7,9 @@ require "active_support/core_ext/date/calculations"
|
|
5
7
|
require "active_support/core_ext/date/acts_like"
|
6
8
|
|
7
9
|
class Numeric
|
8
|
-
#
|
9
|
-
#
|
10
|
-
# These methods use Time#advance for precise date calculations when using from_now, ago, etc.
|
11
|
-
# as well as adding or subtracting their results from a Time object. For example:
|
12
|
-
#
|
13
|
-
# # equivalent to Time.current.advance(months: 1)
|
14
|
-
# 1.month.from_now
|
15
|
-
#
|
16
|
-
# # equivalent to Time.current.advance(years: 2)
|
17
|
-
# 2.years.from_now
|
10
|
+
# Returns a Duration instance matching the number of seconds provided.
|
18
11
|
#
|
19
|
-
# #
|
20
|
-
# (4.months + 5.years).from_now
|
12
|
+
# 2.seconds # => 2 seconds
|
21
13
|
def seconds
|
22
14
|
ActiveSupport::Duration.seconds(self)
|
23
15
|
end
|
@@ -64,10 +56,10 @@ class Numeric
|
|
64
56
|
alias :fortnight :fortnights
|
65
57
|
|
66
58
|
# Returns the number of milliseconds equivalent to the seconds provided.
|
67
|
-
# Used with the standard time durations
|
68
|
-
# so we can feed them to JavaScript functions like getTime().
|
59
|
+
# Used with the standard time durations.
|
69
60
|
#
|
70
|
-
# 2.in_milliseconds # =>
|
61
|
+
# 2.in_milliseconds # => 2000
|
62
|
+
# 1.hour.in_milliseconds # => 3600000
|
71
63
|
def in_milliseconds
|
72
64
|
self * 1000
|
73
65
|
end
|