activesupport 7.0.8.7 → 7.1.0.beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +722 -314
- data/MIT-LICENSE +1 -1
- data/README.rdoc +4 -4
- data/lib/active_support/actionable_error.rb +3 -1
- data/lib/active_support/array_inquirer.rb +2 -0
- data/lib/active_support/backtrace_cleaner.rb +25 -5
- data/lib/active_support/benchmarkable.rb +1 -0
- data/lib/active_support/builder.rb +1 -1
- data/lib/active_support/cache/coder.rb +153 -0
- data/lib/active_support/cache/entry.rb +128 -0
- data/lib/active_support/cache/file_store.rb +36 -9
- data/lib/active_support/cache/mem_cache_store.rb +84 -68
- data/lib/active_support/cache/memory_store.rb +76 -24
- data/lib/active_support/cache/null_store.rb +6 -0
- data/lib/active_support/cache/redis_cache_store.rb +126 -131
- data/lib/active_support/cache/serializer_with_fallback.rb +175 -0
- data/lib/active_support/cache/strategy/local_cache.rb +20 -8
- data/lib/active_support/cache.rb +304 -246
- data/lib/active_support/callbacks.rb +38 -18
- data/lib/active_support/concern.rb +4 -2
- data/lib/active_support/concurrency/load_interlock_aware_monitor.rb +42 -3
- data/lib/active_support/concurrency/null_lock.rb +13 -0
- data/lib/active_support/configurable.rb +10 -0
- data/lib/active_support/core_ext/array/conversions.rb +2 -1
- data/lib/active_support/core_ext/array.rb +0 -1
- data/lib/active_support/core_ext/class/subclasses.rb +13 -10
- data/lib/active_support/core_ext/date/conversions.rb +1 -0
- data/lib/active_support/core_ext/date.rb +0 -1
- data/lib/active_support/core_ext/date_and_time/calculations.rb +10 -0
- data/lib/active_support/core_ext/date_time/conversions.rb +6 -2
- data/lib/active_support/core_ext/date_time.rb +0 -1
- data/lib/active_support/core_ext/digest/uuid.rb +1 -10
- data/lib/active_support/core_ext/enumerable.rb +3 -75
- data/lib/active_support/core_ext/erb/util.rb +196 -0
- data/lib/active_support/core_ext/hash/conversions.rb +1 -1
- data/lib/active_support/core_ext/module/attribute_accessors.rb +6 -0
- data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +34 -16
- data/lib/active_support/core_ext/module/delegation.rb +40 -11
- data/lib/active_support/core_ext/module/deprecation.rb +15 -12
- data/lib/active_support/core_ext/module/introspection.rb +0 -1
- data/lib/active_support/core_ext/numeric/bytes.rb +9 -0
- data/lib/active_support/core_ext/numeric/conversions.rb +2 -0
- data/lib/active_support/core_ext/numeric.rb +0 -1
- data/lib/active_support/core_ext/object/deep_dup.rb +16 -0
- data/lib/active_support/core_ext/object/duplicable.rb +15 -24
- data/lib/active_support/core_ext/object/inclusion.rb +13 -5
- data/lib/active_support/core_ext/object/instance_variables.rb +22 -12
- data/lib/active_support/core_ext/object/json.rb +10 -2
- data/lib/active_support/core_ext/object/with.rb +44 -0
- data/lib/active_support/core_ext/object/with_options.rb +3 -3
- data/lib/active_support/core_ext/object.rb +1 -0
- data/lib/active_support/core_ext/pathname/blank.rb +16 -0
- data/lib/active_support/core_ext/pathname/existence.rb +2 -0
- data/lib/active_support/core_ext/pathname.rb +1 -0
- data/lib/active_support/core_ext/range/conversions.rb +28 -7
- data/lib/active_support/core_ext/range/{overlaps.rb → overlap.rb} +5 -3
- data/lib/active_support/core_ext/range.rb +1 -2
- data/lib/active_support/core_ext/securerandom.rb +24 -12
- data/lib/active_support/core_ext/string/filters.rb +20 -14
- data/lib/active_support/core_ext/string/inflections.rb +16 -5
- data/lib/active_support/core_ext/string/output_safety.rb +38 -174
- data/lib/active_support/core_ext/thread/backtrace/location.rb +12 -0
- data/lib/active_support/core_ext/time/calculations.rb +18 -2
- data/lib/active_support/core_ext/time/conversions.rb +2 -2
- data/lib/active_support/core_ext/time/zones.rb +4 -4
- data/lib/active_support/core_ext/time.rb +0 -1
- data/lib/active_support/current_attributes.rb +15 -6
- data/lib/active_support/dependencies/autoload.rb +17 -12
- data/lib/active_support/deprecation/behaviors.rb +53 -32
- data/lib/active_support/deprecation/constant_accessor.rb +5 -4
- data/lib/active_support/deprecation/deprecators.rb +104 -0
- data/lib/active_support/deprecation/disallowed.rb +3 -5
- data/lib/active_support/deprecation/instance_delegator.rb +31 -4
- data/lib/active_support/deprecation/method_wrappers.rb +6 -23
- data/lib/active_support/deprecation/proxy_wrappers.rb +37 -22
- data/lib/active_support/deprecation/reporting.rb +35 -21
- data/lib/active_support/deprecation.rb +32 -5
- data/lib/active_support/deprecator.rb +7 -0
- data/lib/active_support/descendants_tracker.rb +104 -132
- data/lib/active_support/duration/iso8601_serializer.rb +0 -2
- data/lib/active_support/duration.rb +2 -1
- data/lib/active_support/encrypted_configuration.rb +30 -9
- data/lib/active_support/encrypted_file.rb +8 -3
- data/lib/active_support/environment_inquirer.rb +22 -2
- data/lib/active_support/error_reporter/test_helper.rb +15 -0
- data/lib/active_support/error_reporter.rb +121 -35
- data/lib/active_support/execution_wrapper.rb +4 -4
- data/lib/active_support/file_update_checker.rb +4 -2
- data/lib/active_support/fork_tracker.rb +10 -2
- data/lib/active_support/gem_version.rb +4 -4
- data/lib/active_support/gzip.rb +2 -0
- data/lib/active_support/hash_with_indifferent_access.rb +35 -17
- data/lib/active_support/i18n.rb +1 -1
- data/lib/active_support/i18n_railtie.rb +20 -13
- data/lib/active_support/inflector/inflections.rb +2 -0
- data/lib/active_support/inflector/methods.rb +22 -10
- data/lib/active_support/inflector/transliterate.rb +3 -1
- data/lib/active_support/isolated_execution_state.rb +26 -22
- data/lib/active_support/json/decoding.rb +2 -1
- data/lib/active_support/json/encoding.rb +25 -43
- data/lib/active_support/key_generator.rb +9 -1
- data/lib/active_support/lazy_load_hooks.rb +6 -4
- data/lib/active_support/locale/en.yml +2 -0
- data/lib/active_support/log_subscriber.rb +78 -33
- data/lib/active_support/logger.rb +1 -1
- data/lib/active_support/logger_thread_safe_level.rb +9 -21
- data/lib/active_support/message_encryptor.rb +197 -53
- data/lib/active_support/message_encryptors.rb +140 -0
- data/lib/active_support/message_pack/cache_serializer.rb +23 -0
- data/lib/active_support/message_pack/extensions.rb +292 -0
- data/lib/active_support/message_pack/serializer.rb +63 -0
- data/lib/active_support/message_pack.rb +50 -0
- data/lib/active_support/message_verifier.rb +212 -93
- data/lib/active_support/message_verifiers.rb +134 -0
- data/lib/active_support/messages/codec.rb +65 -0
- data/lib/active_support/messages/metadata.rb +111 -45
- data/lib/active_support/messages/rotation_coordinator.rb +93 -0
- data/lib/active_support/messages/rotator.rb +34 -32
- data/lib/active_support/messages/serializer_with_fallback.rb +158 -0
- data/lib/active_support/multibyte/chars.rb +2 -0
- data/lib/active_support/multibyte/unicode.rb +9 -37
- data/lib/active_support/notifications/fanout.rb +239 -81
- data/lib/active_support/notifications/instrumenter.rb +71 -14
- data/lib/active_support/notifications.rb +1 -1
- data/lib/active_support/number_helper/number_converter.rb +2 -2
- data/lib/active_support/number_helper/number_to_human_size_converter.rb +1 -1
- data/lib/active_support/number_helper/number_to_phone_converter.rb +1 -0
- data/lib/active_support/ordered_hash.rb +3 -3
- data/lib/active_support/ordered_options.rb +14 -0
- data/lib/active_support/parameter_filter.rb +84 -69
- data/lib/active_support/proxy_object.rb +2 -0
- data/lib/active_support/railtie.rb +33 -21
- data/lib/active_support/reloader.rb +12 -4
- data/lib/active_support/rescuable.rb +2 -0
- data/lib/active_support/secure_compare_rotator.rb +16 -9
- data/lib/active_support/string_inquirer.rb +3 -1
- data/lib/active_support/subscriber.rb +9 -27
- data/lib/active_support/syntax_error_proxy.rb +49 -0
- data/lib/active_support/tagged_logging.rb +60 -24
- data/lib/active_support/test_case.rb +153 -6
- data/lib/active_support/testing/assertions.rb +25 -9
- data/lib/active_support/testing/autorun.rb +0 -2
- data/lib/active_support/testing/constant_stubbing.rb +32 -0
- data/lib/active_support/testing/deprecation.rb +25 -25
- data/lib/active_support/testing/error_reporter_assertions.rb +108 -0
- data/lib/active_support/testing/isolation.rb +1 -1
- data/lib/active_support/testing/method_call_assertions.rb +21 -8
- data/lib/active_support/testing/parallelize_executor.rb +8 -3
- data/lib/active_support/testing/stream.rb +1 -1
- data/lib/active_support/testing/strict_warnings.rb +38 -0
- data/lib/active_support/testing/time_helpers.rb +32 -14
- data/lib/active_support/time_with_zone.rb +4 -14
- data/lib/active_support/values/time_zone.rb +9 -7
- data/lib/active_support/version.rb +1 -1
- data/lib/active_support/xml_mini/jdom.rb +3 -10
- data/lib/active_support/xml_mini/nokogiri.rb +1 -1
- data/lib/active_support/xml_mini/nokogirisax.rb +1 -1
- data/lib/active_support/xml_mini/rexml.rb +1 -1
- data/lib/active_support/xml_mini.rb +2 -2
- data/lib/active_support.rb +13 -3
- metadata +106 -21
- data/lib/active_support/core_ext/array/deprecated_conversions.rb +0 -25
- data/lib/active_support/core_ext/date/deprecated_conversions.rb +0 -40
- data/lib/active_support/core_ext/date_time/deprecated_conversions.rb +0 -36
- data/lib/active_support/core_ext/numeric/deprecated_conversions.rb +0 -60
- data/lib/active_support/core_ext/range/deprecated_conversions.rb +0 -36
- data/lib/active_support/core_ext/range/include_time_with_zone.rb +0 -5
- data/lib/active_support/core_ext/time/deprecated_conversions.rb +0 -73
- data/lib/active_support/core_ext/uri.rb +0 -5
- data/lib/active_support/per_thread_registry.rb +0 -65
@@ -0,0 +1,104 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveSupport
|
4
|
+
class Deprecation
|
5
|
+
# A managed collection of deprecators. Configuration methods, such as
|
6
|
+
# #behavior=, affect all deprecators in the collection. Additionally, the
|
7
|
+
# #silence method silences all deprecators in the collection for the
|
8
|
+
# duration of a given block.
|
9
|
+
class Deprecators
|
10
|
+
def initialize
|
11
|
+
@options = {}
|
12
|
+
@deprecators = {}
|
13
|
+
end
|
14
|
+
|
15
|
+
# Returns a deprecator added to this collection via #[]=.
|
16
|
+
def [](name)
|
17
|
+
@deprecators[name]
|
18
|
+
end
|
19
|
+
|
20
|
+
# Adds a given +deprecator+ to this collection. The deprecator will be
|
21
|
+
# immediately configured with any options previously set on this
|
22
|
+
# collection.
|
23
|
+
#
|
24
|
+
# deprecators = ActiveSupport::Deprecation::Deprecators.new
|
25
|
+
# deprecators.debug = true
|
26
|
+
#
|
27
|
+
# foo_deprecator = ActiveSupport::Deprecation.new("2.0", "Foo")
|
28
|
+
# foo_deprecator.debug # => false
|
29
|
+
#
|
30
|
+
# deprecators[:foo] = foo_deprecator
|
31
|
+
# deprecators[:foo].debug # => true
|
32
|
+
# foo_deprecator.debug # => true
|
33
|
+
#
|
34
|
+
def []=(name, deprecator)
|
35
|
+
apply_options(deprecator)
|
36
|
+
@deprecators[name] = deprecator
|
37
|
+
end
|
38
|
+
|
39
|
+
# Iterates over all deprecators in this collection. If no block is given,
|
40
|
+
# returns an +Enumerator+.
|
41
|
+
def each(&block)
|
42
|
+
return to_enum(__method__) unless block
|
43
|
+
@deprecators.each_value(&block)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Sets the silenced flag for all deprecators in this collection.
|
47
|
+
def silenced=(silenced)
|
48
|
+
set_option(:silenced, silenced)
|
49
|
+
end
|
50
|
+
|
51
|
+
# Sets the debug flag for all deprecators in this collection.
|
52
|
+
def debug=(debug)
|
53
|
+
set_option(:debug, debug)
|
54
|
+
end
|
55
|
+
|
56
|
+
# Sets the deprecation warning behavior for all deprecators in this
|
57
|
+
# collection.
|
58
|
+
#
|
59
|
+
# See ActiveSupport::Deprecation#behavior=.
|
60
|
+
def behavior=(behavior)
|
61
|
+
set_option(:behavior, behavior)
|
62
|
+
end
|
63
|
+
|
64
|
+
# Sets the disallowed deprecation warning behavior for all deprecators in
|
65
|
+
# this collection.
|
66
|
+
#
|
67
|
+
# See ActiveSupport::Deprecation#disallowed_behavior=.
|
68
|
+
def disallowed_behavior=(disallowed_behavior)
|
69
|
+
set_option(:disallowed_behavior, disallowed_behavior)
|
70
|
+
end
|
71
|
+
|
72
|
+
# Sets the disallowed deprecation warnings for all deprecators in this
|
73
|
+
# collection.
|
74
|
+
#
|
75
|
+
# See ActiveSupport::Deprecation#disallowed_warnings=.
|
76
|
+
def disallowed_warnings=(disallowed_warnings)
|
77
|
+
set_option(:disallowed_warnings, disallowed_warnings)
|
78
|
+
end
|
79
|
+
|
80
|
+
# Silences all deprecators in this collection for the duration of the
|
81
|
+
# given block.
|
82
|
+
#
|
83
|
+
# See ActiveSupport::Deprecation#silence.
|
84
|
+
def silence(&block)
|
85
|
+
each { |deprecator| deprecator.begin_silence }
|
86
|
+
block.call
|
87
|
+
ensure
|
88
|
+
each { |deprecator| deprecator.end_silence }
|
89
|
+
end
|
90
|
+
|
91
|
+
private
|
92
|
+
def set_option(name, value)
|
93
|
+
@options[name] = value
|
94
|
+
each { |deprecator| deprecator.public_send("#{name}=", value) }
|
95
|
+
end
|
96
|
+
|
97
|
+
def apply_options(deprecator)
|
98
|
+
@options.each do |name, value|
|
99
|
+
deprecator.public_send("#{name}=", value)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -24,10 +24,9 @@ module ActiveSupport
|
|
24
24
|
|
25
25
|
private
|
26
26
|
def deprecation_disallowed?(message)
|
27
|
-
disallowed = ActiveSupport::Deprecation.disallowed_warnings
|
28
27
|
return false if explicitly_allowed?(message)
|
29
|
-
return true if
|
30
|
-
|
28
|
+
return true if disallowed_warnings == :all
|
29
|
+
message && disallowed_warnings.any? do |rule|
|
31
30
|
case rule
|
32
31
|
when String, Symbol
|
33
32
|
message.include?(rule.to_s)
|
@@ -41,8 +40,7 @@ module ActiveSupport
|
|
41
40
|
allowances = @explicitly_allowed_warnings.value
|
42
41
|
return false unless allowances
|
43
42
|
return true if allowances == :all
|
44
|
-
|
45
|
-
allowances.any? do |rule|
|
43
|
+
message && Array(allowances).any? do |rule|
|
46
44
|
case rule
|
47
45
|
when String, Symbol
|
48
46
|
message.include?(rule.to_s)
|
@@ -1,24 +1,51 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "active_support/core_ext/module/delegation"
|
4
|
-
|
5
3
|
module ActiveSupport
|
6
4
|
class Deprecation
|
7
5
|
module InstanceDelegator # :nodoc:
|
8
6
|
def self.included(base)
|
9
7
|
base.extend(ClassMethods)
|
10
8
|
base.singleton_class.prepend(OverrideDelegators)
|
11
|
-
base.public_class_method :new
|
12
9
|
end
|
13
10
|
|
14
11
|
module ClassMethods # :nodoc:
|
12
|
+
MUTEX = Mutex.new
|
13
|
+
private_constant :MUTEX
|
14
|
+
|
15
15
|
def include(included_module)
|
16
16
|
included_module.instance_methods.each { |m| method_added(m) }
|
17
17
|
super
|
18
18
|
end
|
19
19
|
|
20
20
|
def method_added(method_name)
|
21
|
-
|
21
|
+
use_instead =
|
22
|
+
case method_name
|
23
|
+
when :silence, :behavior=, :disallowed_behavior=, :disallowed_warnings=, :silenced=, :debug=
|
24
|
+
target = "(defined?(Rails.application.deprecators) ? Rails.application.deprecators : ActiveSupport::Deprecation._instance)"
|
25
|
+
"Rails.application.deprecators.#{method_name}"
|
26
|
+
when :warn, :deprecate_methods, :gem_name, :gem_name=, :deprecation_horizon, :deprecation_horizon=
|
27
|
+
"your own Deprecation object"
|
28
|
+
else
|
29
|
+
"Rails.application.deprecators[framework].#{method_name} where framework is for example :active_record"
|
30
|
+
end
|
31
|
+
args = /[^\]]=\z/.match?(method_name) ? "arg" : "..."
|
32
|
+
target ||= "ActiveSupport::Deprecation._instance"
|
33
|
+
singleton_class.module_eval <<~RUBY, __FILE__, __LINE__ + 1
|
34
|
+
def #{method_name}(#{args})
|
35
|
+
#{target}.#{method_name}(#{args})
|
36
|
+
ensure
|
37
|
+
ActiveSupport.deprecator.warn("Calling #{method_name} on ActiveSupport::Deprecation is deprecated and will be removed from Rails (use #{use_instead} instead)")
|
38
|
+
end
|
39
|
+
RUBY
|
40
|
+
end
|
41
|
+
|
42
|
+
def instance
|
43
|
+
ActiveSupport.deprecator.warn("ActiveSupport::Deprecation.instance is deprecated (use your own Deprecation object)")
|
44
|
+
_instance
|
45
|
+
end
|
46
|
+
|
47
|
+
def _instance
|
48
|
+
@_instance ||= MUTEX.synchronize { @_instance ||= new }
|
22
49
|
end
|
23
50
|
end
|
24
51
|
|
@@ -16,38 +16,21 @@ module ActiveSupport
|
|
16
16
|
# def eee; end
|
17
17
|
# end
|
18
18
|
#
|
19
|
-
#
|
20
|
-
#
|
19
|
+
# deprecator = ActiveSupport::Deprecation.new('next-release', 'MyGem')
|
20
|
+
#
|
21
|
+
# deprecator.deprecate_methods(Fred, :aaa, bbb: :zzz, ccc: 'use Bar#ccc instead')
|
21
22
|
# # => Fred
|
22
23
|
#
|
23
24
|
# Fred.new.aaa
|
24
|
-
# # DEPRECATION WARNING: aaa is deprecated and will be removed from
|
25
|
+
# # DEPRECATION WARNING: aaa is deprecated and will be removed from MyGem next-release. (called from irb_binding at (irb):10)
|
25
26
|
# # => nil
|
26
27
|
#
|
27
28
|
# Fred.new.bbb
|
28
|
-
# # DEPRECATION WARNING: bbb is deprecated and will be removed from
|
29
|
+
# # DEPRECATION WARNING: bbb is deprecated and will be removed from MyGem next-release (use zzz instead). (called from irb_binding at (irb):11)
|
29
30
|
# # => nil
|
30
31
|
#
|
31
32
|
# Fred.new.ccc
|
32
|
-
# # DEPRECATION WARNING: ccc is deprecated and will be removed from
|
33
|
-
# # => nil
|
34
|
-
#
|
35
|
-
# Passing in a custom deprecator:
|
36
|
-
# custom_deprecator = ActiveSupport::Deprecation.new('next-release', 'MyGem')
|
37
|
-
# ActiveSupport::Deprecation.deprecate_methods(Fred, ddd: :zzz, deprecator: custom_deprecator)
|
38
|
-
# # => [:ddd]
|
39
|
-
#
|
40
|
-
# Fred.new.ddd
|
41
|
-
# DEPRECATION WARNING: ddd is deprecated and will be removed from MyGem next-release (use zzz instead). (called from irb_binding at (irb):15)
|
42
|
-
# # => nil
|
43
|
-
#
|
44
|
-
# Using a custom deprecator directly:
|
45
|
-
# custom_deprecator = ActiveSupport::Deprecation.new('next-release', 'MyGem')
|
46
|
-
# custom_deprecator.deprecate_methods(Fred, eee: :zzz)
|
47
|
-
# # => [:eee]
|
48
|
-
#
|
49
|
-
# Fred.new.eee
|
50
|
-
# DEPRECATION WARNING: eee is deprecated and will be removed from MyGem next-release (use zzz instead). (called from irb_binding at (irb):18)
|
33
|
+
# # DEPRECATION WARNING: ccc is deprecated and will be removed from MyGem next-release (use Bar#ccc instead). (called from irb_binding at (irb):12)
|
51
34
|
# # => nil
|
52
35
|
def deprecate_methods(target_module, *method_names)
|
53
36
|
options = method_names.extract_options!
|
@@ -25,11 +25,10 @@ module ActiveSupport
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
# DeprecatedObjectProxy transforms an object into a deprecated one. It
|
29
|
-
#
|
30
|
-
# deprecator defaults to +ActiveSupport::Deprecator+ if none is specified.
|
28
|
+
# DeprecatedObjectProxy transforms an object into a deprecated one. It takes an object, a deprecation message, and
|
29
|
+
# a deprecator.
|
31
30
|
#
|
32
|
-
# deprecated_object = ActiveSupport::Deprecation::DeprecatedObjectProxy.new(Object.new, "This object is now deprecated")
|
31
|
+
# deprecated_object = ActiveSupport::Deprecation::DeprecatedObjectProxy.new(Object.new, "This object is now deprecated", ActiveSupport::Deprecation.new)
|
33
32
|
# # => #<Object:0x007fb9b34c34b0>
|
34
33
|
#
|
35
34
|
# deprecated_object.to_s
|
@@ -37,10 +36,11 @@ module ActiveSupport
|
|
37
36
|
# (Backtrace)
|
38
37
|
# # => "#<Object:0x007fb9b34c34b0>"
|
39
38
|
class DeprecatedObjectProxy < DeprecationProxy
|
40
|
-
def initialize(object, message, deprecator =
|
39
|
+
def initialize(object, message, deprecator = nil)
|
41
40
|
@object = object
|
42
41
|
@message = message
|
43
|
-
|
42
|
+
ActiveSupport.deprecator.warn("DeprecatedObjectProxy without a deprecator is deprecated") unless deprecator
|
43
|
+
@deprecator = deprecator || ActiveSupport::Deprecation._instance
|
44
44
|
end
|
45
45
|
|
46
46
|
private
|
@@ -53,15 +53,15 @@ module ActiveSupport
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
|
-
# DeprecatedInstanceVariableProxy transforms an instance variable into a
|
57
|
-
#
|
58
|
-
#
|
59
|
-
#
|
60
|
-
#
|
56
|
+
# DeprecatedInstanceVariableProxy transforms an instance variable into a deprecated one. It takes an instance of a
|
57
|
+
# class, a method on that class, an instance variable, and a deprecator as the last argument.
|
58
|
+
#
|
59
|
+
# Trying to use the deprecated instance variable will result in a deprecation warning, pointing to the method as a
|
60
|
+
# replacement.
|
61
61
|
#
|
62
62
|
# class Example
|
63
63
|
# def initialize
|
64
|
-
# @request = ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy.new(self, :request, :@request)
|
64
|
+
# @request = ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy.new(self, :request, :@request, ActiveSupport::Deprecation.new)
|
65
65
|
# @_request = :special_request
|
66
66
|
# end
|
67
67
|
#
|
@@ -86,11 +86,12 @@ module ActiveSupport
|
|
86
86
|
# example.request.to_s
|
87
87
|
# # => "special_request"
|
88
88
|
class DeprecatedInstanceVariableProxy < DeprecationProxy
|
89
|
-
def initialize(instance, method, var = "@#{method}", deprecator =
|
89
|
+
def initialize(instance, method, var = "@#{method}", deprecator = nil)
|
90
90
|
@instance = instance
|
91
91
|
@method = method
|
92
92
|
@var = var
|
93
|
-
|
93
|
+
ActiveSupport.deprecator.warn("DeprecatedInstanceVariableProxy without a deprecator is deprecated") unless deprecator
|
94
|
+
@deprecator = deprecator || ActiveSupport::Deprecation._instance
|
94
95
|
end
|
95
96
|
|
96
97
|
private
|
@@ -103,18 +104,16 @@ module ActiveSupport
|
|
103
104
|
end
|
104
105
|
end
|
105
106
|
|
106
|
-
# DeprecatedConstantProxy transforms a constant into a deprecated one. It
|
107
|
-
#
|
108
|
-
#
|
109
|
-
# to +ActiveSupport::Deprecator+ if none is specified. The deprecated constant
|
110
|
-
# now returns the value of the new one.
|
107
|
+
# DeprecatedConstantProxy transforms a constant into a deprecated one. It takes the full names of an old
|
108
|
+
# (deprecated) constant and of a new constant (both in string form) and a deprecator. The deprecated constant now
|
109
|
+
# returns the value of the new one.
|
111
110
|
#
|
112
111
|
# PLANETS = %w(mercury venus earth mars jupiter saturn uranus neptune pluto)
|
113
112
|
#
|
114
113
|
# # (In a later update, the original implementation of `PLANETS` has been removed.)
|
115
114
|
#
|
116
115
|
# PLANETS_POST_2006 = %w(mercury venus earth mars jupiter saturn uranus neptune)
|
117
|
-
# PLANETS = ActiveSupport::Deprecation::DeprecatedConstantProxy.new(
|
116
|
+
# PLANETS = ActiveSupport::Deprecation::DeprecatedConstantProxy.new("PLANETS", "PLANETS_POST_2006", ActiveSupport::Deprecation.new)
|
118
117
|
#
|
119
118
|
# PLANETS.map { |planet| planet.capitalize }
|
120
119
|
# # => DEPRECATION WARNING: PLANETS is deprecated! Use PLANETS_POST_2006 instead.
|
@@ -128,12 +127,13 @@ module ActiveSupport
|
|
128
127
|
super
|
129
128
|
end
|
130
129
|
|
131
|
-
def initialize(old_const, new_const, deprecator =
|
130
|
+
def initialize(old_const, new_const, deprecator = nil, message: "#{old_const} is deprecated! Use #{new_const} instead.")
|
132
131
|
Kernel.require "active_support/inflector/methods"
|
133
132
|
|
134
133
|
@old_const = old_const
|
135
134
|
@new_const = new_const
|
136
|
-
|
135
|
+
ActiveSupport.deprecator.warn("DeprecatedConstantProxy without a deprecator is deprecated") unless deprecator
|
136
|
+
@deprecator = deprecator || ActiveSupport::Deprecation._instance
|
137
137
|
@message = message
|
138
138
|
end
|
139
139
|
|
@@ -158,6 +158,21 @@ module ActiveSupport
|
|
158
158
|
target.class
|
159
159
|
end
|
160
160
|
|
161
|
+
def append_features(base)
|
162
|
+
@deprecator.warn(@message, caller_locations)
|
163
|
+
base.include(target)
|
164
|
+
end
|
165
|
+
|
166
|
+
def prepend_features(base)
|
167
|
+
@deprecator.warn(@message, caller_locations)
|
168
|
+
base.prepend(target)
|
169
|
+
end
|
170
|
+
|
171
|
+
def extended(base)
|
172
|
+
@deprecator.warn(@message, caller_locations)
|
173
|
+
base.extend(target)
|
174
|
+
end
|
175
|
+
|
161
176
|
private
|
162
177
|
def target
|
163
178
|
ActiveSupport::Inflector.constantize(@new_const.to_s)
|
@@ -11,34 +11,50 @@ module ActiveSupport
|
|
11
11
|
attr_accessor :gem_name
|
12
12
|
|
13
13
|
# Outputs a deprecation warning to the output configured by
|
14
|
-
#
|
14
|
+
# ActiveSupport::Deprecation#behavior.
|
15
15
|
#
|
16
|
-
# ActiveSupport::Deprecation.warn('something broke!')
|
16
|
+
# ActiveSupport::Deprecation.new.warn('something broke!')
|
17
17
|
# # => "DEPRECATION WARNING: something broke! (called from your_code.rb:1)"
|
18
18
|
def warn(message = nil, callstack = nil)
|
19
19
|
return if silenced
|
20
20
|
|
21
21
|
callstack ||= caller_locations(2)
|
22
|
-
deprecation_message(callstack, message).tap do |
|
22
|
+
deprecation_message(callstack, message).tap do |full_message|
|
23
23
|
if deprecation_disallowed?(message)
|
24
|
-
disallowed_behavior.each { |b| b.call(
|
24
|
+
disallowed_behavior.each { |b| b.call(full_message, callstack, self) }
|
25
25
|
else
|
26
|
-
behavior.each { |b| b.call(
|
26
|
+
behavior.each { |b| b.call(full_message, callstack, self) }
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
31
|
# Silence deprecation warnings within the block.
|
32
32
|
#
|
33
|
-
# ActiveSupport::Deprecation.
|
33
|
+
# deprecator = ActiveSupport::Deprecation.new
|
34
|
+
# deprecator.warn('something broke!')
|
34
35
|
# # => "DEPRECATION WARNING: something broke! (called from your_code.rb:1)"
|
35
36
|
#
|
36
|
-
#
|
37
|
-
#
|
37
|
+
# deprecator.silence do
|
38
|
+
# deprecator.warn('something broke!')
|
38
39
|
# end
|
39
40
|
# # => nil
|
40
41
|
def silence(&block)
|
41
|
-
|
42
|
+
begin_silence
|
43
|
+
block.call
|
44
|
+
ensure
|
45
|
+
end_silence
|
46
|
+
end
|
47
|
+
|
48
|
+
def begin_silence # :nodoc:
|
49
|
+
@silence_counter.value += 1
|
50
|
+
end
|
51
|
+
|
52
|
+
def end_silence # :nodoc:
|
53
|
+
@silence_counter.value -= 1
|
54
|
+
end
|
55
|
+
|
56
|
+
def silenced
|
57
|
+
@silenced || @silence_counter.value.nonzero?
|
42
58
|
end
|
43
59
|
|
44
60
|
# Allow previously disallowed deprecation warnings within the block.
|
@@ -46,27 +62,28 @@ module ActiveSupport
|
|
46
62
|
# expressions. (Symbols are treated as strings). These are compared against
|
47
63
|
# the text of deprecation warning messages generated within the block.
|
48
64
|
# Matching warnings will be exempt from the rules set by
|
49
|
-
#
|
65
|
+
# ActiveSupport::Deprecation#disallowed_warnings.
|
50
66
|
#
|
51
67
|
# The optional <tt>if:</tt> argument accepts a truthy/falsy value or an object that
|
52
68
|
# responds to <tt>.call</tt>. If truthy, then matching warnings will be allowed.
|
53
69
|
# If falsey then the method yields to the block without allowing the warning.
|
54
70
|
#
|
55
|
-
# ActiveSupport::Deprecation.
|
56
|
-
#
|
71
|
+
# deprecator = ActiveSupport::Deprecation.new
|
72
|
+
# deprecator.disallowed_behavior = :raise
|
73
|
+
# deprecator.disallowed_warnings = [
|
57
74
|
# "something broke"
|
58
75
|
# ]
|
59
76
|
#
|
60
|
-
#
|
77
|
+
# deprecator.warn('something broke!')
|
61
78
|
# # => ActiveSupport::DeprecationException
|
62
79
|
#
|
63
|
-
#
|
64
|
-
#
|
80
|
+
# deprecator.allow ['something broke'] do
|
81
|
+
# deprecator.warn('something broke!')
|
65
82
|
# end
|
66
83
|
# # => nil
|
67
84
|
#
|
68
|
-
#
|
69
|
-
#
|
85
|
+
# deprecator.allow ['something broke'], if: Rails.env.production? do
|
86
|
+
# deprecator.warn('something broke!')
|
70
87
|
# end
|
71
88
|
# # => ActiveSupport::DeprecationException for dev/test, nil for production
|
72
89
|
def allow(allowed_warnings = :all, if: true, &block)
|
@@ -79,10 +96,6 @@ module ActiveSupport
|
|
79
96
|
end
|
80
97
|
end
|
81
98
|
|
82
|
-
def silenced
|
83
|
-
@silenced || @silenced_thread.value
|
84
|
-
end
|
85
|
-
|
86
99
|
def deprecation_warning(deprecated_method_name, message = nil, caller_backtrace = nil)
|
87
100
|
caller_backtrace ||= caller_locations(2)
|
88
101
|
deprecated_method_warning(deprecated_method_name, message).tap do |msg|
|
@@ -125,6 +138,7 @@ module ActiveSupport
|
|
125
138
|
end
|
126
139
|
|
127
140
|
def extract_callstack(callstack)
|
141
|
+
return [] if callstack.empty?
|
128
142
|
return _extract_callstack(callstack) if callstack.first.is_a? String
|
129
143
|
|
130
144
|
offending_line = callstack.find { |frame|
|
@@ -3,8 +3,35 @@
|
|
3
3
|
require "singleton"
|
4
4
|
|
5
5
|
module ActiveSupport
|
6
|
-
#
|
7
|
-
#
|
6
|
+
# = Active Support \Deprecation
|
7
|
+
#
|
8
|
+
# \Deprecation specifies the API used by \Rails to deprecate methods, instance variables, objects, and constants. It's
|
9
|
+
# also available for gems or applications.
|
10
|
+
#
|
11
|
+
# For a gem, use Deprecation.new to create a Deprecation object and store it in your module or class (in order for
|
12
|
+
# users to be able to configure it).
|
13
|
+
#
|
14
|
+
# module MyLibrary
|
15
|
+
# def self.deprecator
|
16
|
+
# @deprecator ||= ActiveSupport::Deprecation.new("2.0", "MyLibrary")
|
17
|
+
# end
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# For a Railtie or Engine, you may also want to add it to the application's deprecators, so that the application's
|
21
|
+
# configuration can be applied to it.
|
22
|
+
#
|
23
|
+
# module MyLibrary
|
24
|
+
# class Railtie < Rails::Railtie
|
25
|
+
# initializer "my_library.deprecator" do |app|
|
26
|
+
# app.deprecators[:my_library] = MyLibrary.deprecator
|
27
|
+
# end
|
28
|
+
# end
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
# With the above initializer, configuration settings like the following will affect +MyLibrary.deprecator+:
|
32
|
+
#
|
33
|
+
# # in config/environments/test.rb
|
34
|
+
# config.active_support.deprecation = :raise
|
8
35
|
class Deprecation
|
9
36
|
# active_support.rb sets an autoload for ActiveSupport::Deprecation.
|
10
37
|
#
|
@@ -21,10 +48,10 @@ module ActiveSupport
|
|
21
48
|
require "active_support/deprecation/constant_accessor"
|
22
49
|
require "active_support/deprecation/method_wrappers"
|
23
50
|
require "active_support/deprecation/proxy_wrappers"
|
51
|
+
require "active_support/deprecation/deprecators"
|
24
52
|
require "active_support/core_ext/module/deprecation"
|
25
53
|
require "concurrent/atomic/thread_local_var"
|
26
54
|
|
27
|
-
include Singleton
|
28
55
|
include InstanceDelegator
|
29
56
|
include Behavior
|
30
57
|
include Reporting
|
@@ -38,13 +65,13 @@ module ActiveSupport
|
|
38
65
|
# and the second is a library name.
|
39
66
|
#
|
40
67
|
# ActiveSupport::Deprecation.new('2.0', 'MyLibrary')
|
41
|
-
def initialize(deprecation_horizon = "7.
|
68
|
+
def initialize(deprecation_horizon = "7.2", gem_name = "Rails")
|
42
69
|
self.gem_name = gem_name
|
43
70
|
self.deprecation_horizon = deprecation_horizon
|
44
71
|
# By default, warnings are not silenced and debugging is off.
|
45
72
|
self.silenced = false
|
46
73
|
self.debug = false
|
47
|
-
@
|
74
|
+
@silence_counter = Concurrent::ThreadLocalVar.new(0)
|
48
75
|
@explicitly_allowed_warnings = Concurrent::ThreadLocalVar.new(nil)
|
49
76
|
end
|
50
77
|
end
|