as_deprecation_tracker 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE +1 -1
- data/README.md +19 -6
- data/lib/as_deprecation_tracker/configuration.rb +1 -1
- data/lib/as_deprecation_tracker/railtie.rb +10 -1
- data/lib/as_deprecation_tracker/receiver.rb +15 -1
- data/lib/as_deprecation_tracker/version.rb +1 -1
- data/lib/as_deprecation_tracker/whitelist.rb +3 -2
- data/lib/as_deprecation_tracker/whitelist_entry.rb +24 -5
- data/test/configuration_test.rb +1 -1
- data/test/receiver_test.rb +25 -0
- data/test/whitelist_entry_test.rb +44 -24
- data/test/whitelist_test.rb +10 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3c3db75579f6e32b233ab757406affac74f42210
|
4
|
+
data.tar.gz: 22c98db26c0c16b71993f038804b9b6e23ad7ea4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7d3a4345c389c3a37436cab4aaac86c981264f237e8e14d0366b9b3a85b53e24f6d567ecb3029daac26f6f438b4adf634ae1d8073a1d9edd3d175f6b727a8812
|
7
|
+
data.tar.gz: a4609be92a9373db4acba7a048f0ee320a51f027d5295a6c2c3c3cad4d608ab8ad3872cdd5eca617313337554b932d5b810fa0f76e3bbc75230a092d481582de
|
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -50,7 +50,10 @@ specific instances of deprecated calls which can be committed. Subsequent `rake
|
|
50
50
|
test` runs will then automatically raise errors for new occurrences.
|
51
51
|
|
52
52
|
Re-run tests with `AS_DEPRECATION_RECORD=yes` to append new instances to the
|
53
|
-
existing
|
53
|
+
existing whitelist file, if you wish to permit rather than fix them.
|
54
|
+
|
55
|
+
Use `AS_DEPRECATION_WHITELIST=~/rails_engine` to set a different root directory
|
56
|
+
or whitelist file to update, e.g. for a Rails engine.
|
54
57
|
|
55
58
|
### Whitelist configuration
|
56
59
|
|
@@ -71,9 +74,12 @@ array of hashes:
|
|
71
74
|
callstack: "app/models/foo.rb:23:in `example_method'"
|
72
75
|
```
|
73
76
|
|
74
|
-
Accepted keys are
|
75
|
-
|
76
|
-
|
77
|
+
Accepted keys are:
|
78
|
+
|
79
|
+
* `message`, matching the exact deprecation message
|
80
|
+
* `callstack`, a string or an array forming the backtrace of the deprecation.
|
81
|
+
If an array is given for the callstack, all entries must match the caller.
|
82
|
+
* `engine`, a Rails `engine_name` string, matching any call within the engine
|
77
83
|
|
78
84
|
The callstack will match on as much data as is provided - if only a file is
|
79
85
|
given, any matching deprecation within the file will be whitelisted. The line
|
@@ -82,6 +88,13 @@ number may vary by up to ten lines from the recorded number by default (see
|
|
82
88
|
`line_tolerance` to tune). Usually the filename and method name are sufficient
|
83
89
|
to match the caller without needing line numbers.
|
84
90
|
|
91
|
+
Additional whitelist files may be placed below the root of each Rails engine
|
92
|
+
and will be loaded at startup in addition to the main Rails root config file.
|
93
|
+
|
94
|
+
Entries can be added programmatically by calling
|
95
|
+
`ASDeprecationTracker.whitelist.add(message: ...)` with any of the supported
|
96
|
+
keys above supplied as keyword arguments.
|
97
|
+
|
85
98
|
### Configuration
|
86
99
|
|
87
100
|
Use an initializer to change ASDT's behaviour at startup:
|
@@ -101,8 +114,8 @@ Supported options:
|
|
101
114
|
to ASDeprecationTracker::Receiver at startup, may be disabled to use multiple
|
102
115
|
behaviors (defaults to true)
|
103
116
|
* `whitelist_file` to customise the location of the whitelist YAML file
|
104
|
-
(defaults to `config/as_deprecation_whitelist.yaml`
|
117
|
+
(defaults to `config/as_deprecation_whitelist.yaml`)
|
105
118
|
|
106
119
|
## License
|
107
120
|
|
108
|
-
Copyright (c) 2016 Dominic Cleal. Distributed under the MIT license.
|
121
|
+
Copyright (c) 2016-2017 Dominic Cleal. Distributed under the MIT license.
|
@@ -9,7 +9,7 @@ module ASDeprecationTracker
|
|
9
9
|
@envs = %w(test)
|
10
10
|
@line_tolerance = 10
|
11
11
|
@register_behavior = true
|
12
|
-
@whitelist_file = File.join(
|
12
|
+
@whitelist_file = File.join('config', 'as_deprecation_whitelist.yaml')
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|
@@ -9,7 +9,16 @@ module ASDeprecationTracker
|
|
9
9
|
ActiveSupport::Deprecation.behavior = :notify if ASDeprecationTracker.config.register_behavior?
|
10
10
|
|
11
11
|
whitelist = ASDeprecationTracker.config.whitelist_file
|
12
|
-
|
12
|
+
([Rails.root] + engine_roots).each do |root|
|
13
|
+
engine_whitelist = File.join(root, whitelist)
|
14
|
+
ASDeprecationTracker.whitelist.load_file(engine_whitelist) if File.exist?(engine_whitelist)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def engine_roots
|
21
|
+
::Rails::Engine.descendants.map { |engine| engine.root rescue nil }.compact.uniq # rubocop:disable Style/RescueModifier
|
13
22
|
end
|
14
23
|
end
|
15
24
|
end
|
@@ -20,11 +20,25 @@ module ASDeprecationTracker
|
|
20
20
|
private
|
21
21
|
|
22
22
|
def write_deprecation(message, callstack)
|
23
|
-
writer = ASDeprecationTracker::Writer.new(
|
23
|
+
writer = ASDeprecationTracker::Writer.new(whitelist_file)
|
24
24
|
writer.add(message, callstack)
|
25
25
|
writer.write_file
|
26
26
|
end
|
27
27
|
|
28
|
+
def whitelist_file
|
29
|
+
root = if ENV['AS_DEPRECATION_WHITELIST'].present?
|
30
|
+
File.expand_path(ENV['AS_DEPRECATION_WHITELIST'])
|
31
|
+
else
|
32
|
+
Rails.root
|
33
|
+
end
|
34
|
+
|
35
|
+
if File.directory?(root)
|
36
|
+
File.join(root, ASDeprecationTracker.config.whitelist_file)
|
37
|
+
else
|
38
|
+
root
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
28
42
|
def raise_deprecation(message, callstack)
|
29
43
|
e = ActiveSupport::DeprecationException.new(message)
|
30
44
|
e.set_backtrace(callstack)
|
@@ -11,9 +11,10 @@ module ASDeprecationTracker
|
|
11
11
|
@list = []
|
12
12
|
end
|
13
13
|
|
14
|
-
def add_to_list(entries)
|
15
|
-
entries.each { |entry| @list << WhitelistEntry.new(entry) }
|
14
|
+
def add_to_list(*entries)
|
15
|
+
entries.flatten.each { |entry| @list << WhitelistEntry.new(entry.symbolize_keys) }
|
16
16
|
end
|
17
|
+
alias_method :add, :add_to_list
|
17
18
|
|
18
19
|
def clear
|
19
20
|
@list.clear
|
@@ -3,21 +3,24 @@ module ASDeprecationTracker
|
|
3
3
|
# Configuration of a whitelisted (known) deprecation warning matched by data
|
4
4
|
# such as a message and/or callstack
|
5
5
|
class WhitelistEntry
|
6
|
+
KNOWN_KEYS = %w(callstack engine message).freeze
|
6
7
|
MESSAGE_CLEANUP_RE = Regexp.new('\ADEPRECATION WARNING: (.+) \(called from.*')
|
7
8
|
CALLSTACK_FILE_RE = Regexp.new('\A(.*?)(?::(\d+))?(?::in `(.+)\')?\z')
|
8
9
|
|
9
|
-
def initialize(
|
10
|
-
|
11
|
-
|
12
|
-
@message =
|
13
|
-
@callstack = callstack_to_files_lines(Array.wrap(entry[:callstack]))
|
10
|
+
def initialize(callstack: [], engine: nil, message: nil)
|
11
|
+
@callstack = callstack_to_files_lines(Array.wrap(callstack))
|
12
|
+
@engine_root = engine.present? ? engine_root(engine) : nil
|
13
|
+
@message = message
|
14
14
|
end
|
15
15
|
|
16
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
16
17
|
def matches?(deprecation)
|
17
18
|
return false if @message.present? && !message_matches?(deprecation[:message])
|
18
19
|
return false if @callstack.present? && !callstack_matches?(deprecation[:callstack])
|
20
|
+
return false if @engine_root.present? && !engine_root_matches?(deprecation[:callstack])
|
19
21
|
true
|
20
22
|
end
|
23
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
21
24
|
|
22
25
|
private
|
23
26
|
|
@@ -35,6 +38,7 @@ module ASDeprecationTracker
|
|
35
38
|
end
|
36
39
|
|
37
40
|
def callstack_matches?(callstack)
|
41
|
+
callstack = Rails::BacktraceCleaner.new.clean(callstack, :silent)
|
38
42
|
callstack = callstack_to_files_lines(callstack)
|
39
43
|
|
40
44
|
@callstack.all? do |whitelist_entry|
|
@@ -59,5 +63,20 @@ module ASDeprecationTracker
|
|
59
63
|
return true if method1.nil? || method2.nil?
|
60
64
|
method1 == method2
|
61
65
|
end
|
66
|
+
|
67
|
+
def engine_root_matches?(callstack)
|
68
|
+
callstack.any? { |callstack_entry| callstack_entry.start_with?(@engine_root) }
|
69
|
+
end
|
70
|
+
|
71
|
+
def engine_root(engine_name)
|
72
|
+
::Rails::Engine.descendants.each do |engine|
|
73
|
+
begin
|
74
|
+
return engine.root.to_s if engine_name == engine.engine_name
|
75
|
+
rescue NoMethodError, RuntimeError # rubocop:disable Lint/HandleExceptions
|
76
|
+
# Ignore failures with singleton engine subclasses etc.
|
77
|
+
end
|
78
|
+
end
|
79
|
+
raise("Unknown configured engine name #{engine_name}")
|
80
|
+
end
|
62
81
|
end
|
63
82
|
end
|
data/test/configuration_test.rb
CHANGED
@@ -36,7 +36,7 @@ class ConfigurationTest < ASDeprecationTracker::TestCase
|
|
36
36
|
|
37
37
|
def test_whitelist_file
|
38
38
|
assert_kind_of String, @config.whitelist_file
|
39
|
-
assert File.exist?(@config.whitelist_file)
|
39
|
+
assert File.exist?(File.join(Rails.root, @config.whitelist_file))
|
40
40
|
end
|
41
41
|
|
42
42
|
def test_whitelist_file=
|
data/test/receiver_test.rb
CHANGED
@@ -40,6 +40,31 @@ class ReceiverTest < ASDeprecationTracker::TestCase
|
|
40
40
|
ActiveSupport::Notifications.instrument('deprecation.rails', message: 'test')
|
41
41
|
end
|
42
42
|
|
43
|
+
def test_whitelist_file_root
|
44
|
+
assert_equal File.join(Rails.root, 'config', 'as_deprecation_whitelist.yaml'), ASDeprecationTracker::Receiver.new.send(:whitelist_file)
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_whitelist_file_env_directory
|
48
|
+
ENV['AS_DEPRECATION_WHITELIST'] = '/'
|
49
|
+
assert_equal File.join('/', 'config', 'as_deprecation_whitelist.yaml'), ASDeprecationTracker::Receiver.new.send(:whitelist_file)
|
50
|
+
ensure
|
51
|
+
ENV.delete('AS_DEPRECATION_WHITELIST')
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_whitelist_file_env_file
|
55
|
+
ENV['AS_DEPRECATION_WHITELIST'] = '/as_deprecation_whitelist.yaml'
|
56
|
+
assert_equal '/as_deprecation_whitelist.yaml', ASDeprecationTracker::Receiver.new.send(:whitelist_file)
|
57
|
+
ensure
|
58
|
+
ENV.delete('AS_DEPRECATION_WHITELIST')
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_whitelist_file_env_expand
|
62
|
+
ENV['AS_DEPRECATION_WHITELIST'] = File.join(Rails.root, '..', 'as_deprecation_whitelist.yaml')
|
63
|
+
assert_equal File.expand_path('../as_deprecation_whitelist.yaml', Rails.root), ASDeprecationTracker::Receiver.new.send(:whitelist_file)
|
64
|
+
ensure
|
65
|
+
ENV.delete('AS_DEPRECATION_WHITELIST')
|
66
|
+
end
|
67
|
+
|
43
68
|
private
|
44
69
|
|
45
70
|
def event(payload)
|
@@ -2,11 +2,7 @@
|
|
2
2
|
require 'test_helper'
|
3
3
|
|
4
4
|
class WhitelistEntryTest < ASDeprecationTracker::TestCase
|
5
|
-
def
|
6
|
-
ASDeprecationTracker::WhitelistEntry.new('message' => 'test')
|
7
|
-
end
|
8
|
-
|
9
|
-
def test_initialize_with_symbols
|
5
|
+
def test_initialize
|
10
6
|
ASDeprecationTracker::WhitelistEntry.new(message: 'test')
|
11
7
|
end
|
12
8
|
|
@@ -27,54 +23,54 @@ class WhitelistEntryTest < ASDeprecationTracker::TestCase
|
|
27
23
|
end
|
28
24
|
|
29
25
|
def test_matches_partial_callstack_top
|
30
|
-
assert entry(callstack: ['
|
26
|
+
assert entry(callstack: ['app/models/foo.rb:23']).matches?(deprecation)
|
31
27
|
end
|
32
28
|
|
33
29
|
def test_matches_partial_callstack_bottom
|
34
|
-
assert entry(callstack: ['
|
30
|
+
assert entry(callstack: ['app/controllers/foos_controller.rb:42']).matches?(deprecation)
|
35
31
|
end
|
36
32
|
|
37
33
|
def test_matches_partial_callstack_multiple
|
38
34
|
assert entry(callstack: [
|
39
|
-
'
|
40
|
-
'
|
35
|
+
'app/models/foo.rb:23',
|
36
|
+
'app/controllers/foos_controller.rb:42'
|
41
37
|
]).matches?(deprecation)
|
42
38
|
end
|
43
39
|
|
44
40
|
def test_matches_partial_callstack_within_tolerance
|
45
|
-
assert entry(callstack: ['
|
41
|
+
assert entry(callstack: ['app/models/foo.rb:25']).matches?(deprecation)
|
46
42
|
end
|
47
43
|
|
48
44
|
def test_matches_partial_callstack_outside_tolerance
|
49
|
-
refute entry(callstack: ['
|
45
|
+
refute entry(callstack: ['app/models/foo.rb:34']).matches?(deprecation)
|
50
46
|
end
|
51
47
|
|
52
48
|
def test_matches_partial_callstack_same_method
|
53
|
-
assert entry(callstack: ['
|
49
|
+
assert entry(callstack: ['app/models/foo.rb:in `example_method\'']).matches?(deprecation)
|
54
50
|
end
|
55
51
|
|
56
52
|
def test_matches_partial_callstack_different_method
|
57
|
-
refute entry(callstack: ['
|
53
|
+
refute entry(callstack: ['app/models/foo.rb:23:in `another_method\'']).matches?(deprecation)
|
58
54
|
end
|
59
55
|
|
60
56
|
def test_matches_partial_callstack_different_method_no_line
|
61
|
-
refute entry(callstack: ['
|
57
|
+
refute entry(callstack: ['app/models/foo.rb:in `another_method\'']).matches?(deprecation)
|
62
58
|
end
|
63
59
|
|
64
60
|
def test_matches_partial_callstack_within_tolerance_same_method
|
65
|
-
assert entry(callstack: ['
|
61
|
+
assert entry(callstack: ['app/models/foo.rb:25:in `example_method\'']).matches?(deprecation)
|
66
62
|
end
|
67
63
|
|
68
64
|
def test_matches_partial_callstack_outside_tolerance_same_method
|
69
|
-
refute entry(callstack: ['
|
65
|
+
refute entry(callstack: ['app/models/foo.rb:34:in `example_method\'']).matches?(deprecation)
|
70
66
|
end
|
71
67
|
|
72
68
|
def test_matches_partial_callstack_string
|
73
|
-
assert entry(callstack: '
|
69
|
+
assert entry(callstack: 'app/models/foo.rb:23').matches?(deprecation)
|
74
70
|
end
|
75
71
|
|
76
72
|
def test_matches_partial_callstack_file
|
77
|
-
assert entry(callstack: ['
|
73
|
+
assert entry(callstack: ['app/models/foo.rb']).matches?(deprecation)
|
78
74
|
end
|
79
75
|
|
80
76
|
def test_matches_different_message_same_callstack
|
@@ -89,20 +85,44 @@ class WhitelistEntryTest < ASDeprecationTracker::TestCase
|
|
89
85
|
refute entry.matches?(deprecation(message: 'a different method is deprecated', callstack: caller))
|
90
86
|
end
|
91
87
|
|
88
|
+
def test_matches_only_engine
|
89
|
+
assert entry(engine: 'example').matches?(deprecation(called_in_engine: 'example'))
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_matches_different_engine
|
93
|
+
refute entry(engine: 'another').matches?(deprecation(called_in_engine: 'example'))
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_matches_outside_engine
|
97
|
+
refute entry(engine: 'another').matches?(deprecation(called_in_engine: 'example'))
|
98
|
+
end
|
99
|
+
|
92
100
|
private
|
93
101
|
|
94
|
-
def
|
102
|
+
def default_deprecation
|
95
103
|
{
|
96
104
|
message: 'uniq is deprecated and will be removed',
|
97
105
|
callstack: [
|
98
|
-
|
99
|
-
|
100
|
-
|
106
|
+
"#{Rails.root}/app/models/foo.rb:23:in `example_method'",
|
107
|
+
"#{Rails.root}/app/controllers/foos_controller.rb:42:in `update'",
|
108
|
+
"#{Rails.root}/test/controllers/foos_controller_test.rb:18:in `block in <class:FoosControllerTest>'"
|
101
109
|
]
|
102
|
-
}
|
110
|
+
}
|
111
|
+
end
|
112
|
+
|
113
|
+
def deprecation(overrides = {})
|
114
|
+
deprecation = default_deprecation
|
115
|
+
if (engine = overrides.delete(:called_in_engine))
|
116
|
+
deprecation[:callstack] << "/home/user/engines/#{engine}/app/middleware/foo.rb:12:in `call'"
|
117
|
+
end
|
118
|
+
deprecation.merge(overrides).compact
|
103
119
|
end
|
104
120
|
|
105
121
|
def entry(overrides = {})
|
106
|
-
|
122
|
+
entry_hash = default_deprecation.merge(overrides).compact
|
123
|
+
entry_hash[:callstack].map! { |line| line.sub(Rails.root.to_s + '/', '') } if entry_hash[:callstack].is_a?(Array)
|
124
|
+
|
125
|
+
ASDeprecationTracker::WhitelistEntry.any_instance.expects(:engine_root).with(overrides[:engine]).returns("/home/user/engines/#{overrides[:engine]}") if overrides.key?(:engine)
|
126
|
+
ASDeprecationTracker::WhitelistEntry.new(entry_hash)
|
107
127
|
end
|
108
128
|
end
|
data/test/whitelist_test.rb
CHANGED
@@ -7,11 +7,21 @@ class WhitelistTest < ASDeprecationTracker::TestCase
|
|
7
7
|
super
|
8
8
|
end
|
9
9
|
|
10
|
+
def test_add
|
11
|
+
@whitelist.add(entry)
|
12
|
+
assert_equal 1, @whitelist.list.count
|
13
|
+
end
|
14
|
+
|
10
15
|
def test_add_to_list
|
11
16
|
@whitelist.add_to_list([entry])
|
12
17
|
assert_equal 1, @whitelist.list.count
|
13
18
|
end
|
14
19
|
|
20
|
+
def test_add_to_list_string_keys
|
21
|
+
@whitelist.add_to_list([entry.stringify_keys])
|
22
|
+
assert_equal 1, @whitelist.list.count
|
23
|
+
end
|
24
|
+
|
15
25
|
def test_clear
|
16
26
|
@whitelist.add_to_list([entry])
|
17
27
|
@whitelist.clear
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: as_deprecation_tracker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dominic Cleal
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-02-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|