warning 0.10.1 → 1.0.0
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 +5 -5
- data/CHANGELOG +10 -0
- data/README.rdoc +28 -5
- data/lib/warning.rb +27 -2
- data/test/test_freeze_warning.rb +2 -1
- data/test/test_warning.rb +117 -1
- metadata +25 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 0fd71447749bdaad9176ecb3eb6302104bcaf5401516719beed80594d2fa234a
|
4
|
+
data.tar.gz: 18eee8db50ef702428bcfd5690c3f92d013b4b8013dd6cd28e554ff808cccbd6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8038062c8d96ec8eb800be734041654d3dd24a1a5ddda523c5c44f465f7cbdf3fdbaa3537e4d360ad9673effb4a54e27de544325235b0fe343ec13f6ee3ec948
|
7
|
+
data.tar.gz: 26324dfc9591fda0a4627d515c3b18738e55f3213c0ff76b15f7493616980c54cf3cf3b945985d460d230db69b57ccd687f2b4ac5f367feec1b1efeae72319f0
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
=== 1.0.0 (2020-01-21)
|
2
|
+
|
3
|
+
* Add support for :taint as regexp argument to Warning.ignore (jeremyevans)
|
4
|
+
|
5
|
+
* Add support for :safe as regexp argument to Warning.ignore (jeremyevans)
|
6
|
+
|
7
|
+
* Add Warning.dedup for deduplicating warnings (jeremyevans)
|
8
|
+
|
9
|
+
* Add support for :keyword_separation as regexp argument to Warning.ignore (jeremyevans)
|
10
|
+
|
1
11
|
=== 0.10.1 (2017-11-16)
|
2
12
|
|
3
13
|
* Correctly handle Warning.freeze (jeremyevans)
|
data/README.rdoc
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
|
3
3
|
ruby-warning adds custom processing for warnings, including the
|
4
4
|
ability to ignore specific warning messages, ignore warnings
|
5
|
-
in specific files/directories, and add
|
6
|
-
warnings in specific files/directories.
|
5
|
+
in specific files/directories, deduplicate warnings, and add
|
6
|
+
custom handling for all warnings in specific files/directories.
|
7
7
|
|
8
8
|
ruby-warning requires ruby 2.4+, as previous versions of ruby do
|
9
9
|
not support custom processing of warnings.
|
@@ -30,11 +30,14 @@ appropriate regexp. The supported symbols are:
|
|
30
30
|
* :ambiguous_slash
|
31
31
|
* :bignum
|
32
32
|
* :fixnum
|
33
|
+
* :keyword_separation
|
33
34
|
* :method_redefined
|
34
35
|
* :missing_gvar
|
35
36
|
* :missing_ivar
|
36
37
|
* :not_reached
|
38
|
+
* :safe
|
37
39
|
* :shadow
|
40
|
+
* :taint
|
38
41
|
* :unused_var
|
39
42
|
* :useless_operator
|
40
43
|
|
@@ -44,15 +47,27 @@ string instead of performing the default behavior. You can call
|
|
44
47
|
<tt>Warning.process</tt> multiple times and it will operate intelligently,
|
45
48
|
choosing the longest path prefix that the string starts with.
|
46
49
|
|
47
|
-
<tt>Warning.
|
48
|
-
|
50
|
+
<tt>Warning.dedup</tt> deduplicates warnings, so that if a warning is received
|
51
|
+
that is the same as a warning that has already been processed, the warning is
|
52
|
+
ignored. Note that this should be used with care, since if the application
|
53
|
+
generates an arbitrary number of unique warnings, that can lead to unbounded
|
54
|
+
memory growth.
|
55
|
+
|
56
|
+
<tt>Warning.clear</tt> resets the library to its initial state, clearing the
|
57
|
+
current ignored warnings and warning processors, and turning off deduplication.
|
49
58
|
|
50
59
|
By using path prefixes, it's fairly easy for a gem to set that specific warnings
|
51
60
|
should be ignored inside the gem's directory.
|
52
61
|
|
53
62
|
Note that path prefixes will not correctly handle warnings raised by
|
54
63
|
<tt>Kernel#warn</tt>, unless the warning message given to <tt>Kernel#warn</tt>
|
55
|
-
starts with the filename where the warning is used.
|
64
|
+
starts with the filename where the warning is used. The <tt>Kernel#warn</tt>
|
65
|
+
+:uplevel+ option will make sure the warning starts with the filename.
|
66
|
+
|
67
|
+
Note that many of the warnings this library can ignore are warnings caused
|
68
|
+
during compilation (i.e. when files are loaded via require). You should
|
69
|
+
require this library and setup the appropriate warning handling before
|
70
|
+
loading any code that could cause warnings.
|
56
71
|
|
57
72
|
= Examples
|
58
73
|
|
@@ -78,6 +93,14 @@ starts with the filename where the warning is used.
|
|
78
93
|
LOGGER.error(warning)
|
79
94
|
end
|
80
95
|
|
96
|
+
# Deduplicate warnings
|
97
|
+
Warning.dedup
|
98
|
+
|
99
|
+
# Ignore all warnings in Gem dependencies
|
100
|
+
Gem.path.each do |path|
|
101
|
+
Warning.ignore(//, path)
|
102
|
+
end
|
103
|
+
|
81
104
|
= License
|
82
105
|
|
83
106
|
MIT
|
data/lib/warning.rb
CHANGED
@@ -15,16 +15,28 @@ module Warning
|
|
15
15
|
shadow: /: warning: shadowing outer local variable - \w+\n\z/,
|
16
16
|
unused_var: /: warning: assigned but unused variable - \w+\n\z/,
|
17
17
|
useless_operator: /: warning: possibly useless use of [><!=]+ in void context\n\z/,
|
18
|
+
keyword_separation: /: warning: (?:Using the last argument (?:for `.+' )?as keyword parameters is deprecated; maybe \*\* should be added to the call|Passing the keyword argument (?:for `.+' )?as the last hash parameter is deprecated|Splitting the last argument (?:for `.+' )?into positional and keyword parameters is deprecated|The called method (?:`.+' )?is defined here)\n\z/,
|
19
|
+
safe: /: warning: (?:rb_safe_level_2_warning|rb_safe_level|rb_set_safe_level_force|rb_set_safe_level|rb_secure|rb_insecure_operation|rb_check_safe_obj|\$SAFE) will (?:be removed|become a normal global variable) in Ruby 3\.0\n\z/,
|
20
|
+
taint: /: warning: (?:rb_error_untrusted|rb_check_trusted|Pathname#taint|Pathname#untaint|rb_env_path_tainted|Object#tainted\?|Object#taint|Object#untaint|Object#untrusted\?|Object#untrust|Object#trust|rb_obj_infect|rb_tainted_str_new|rb_tainted_str_new_cstr) is deprecated and will be removed in Ruby 3\.2\.\n\z/,
|
18
21
|
}
|
19
22
|
|
20
|
-
# Clear all current ignored warnings and
|
23
|
+
# Clear all current ignored warnings, warning processors, and duplicate check cache.
|
24
|
+
# Also disables deduplicating warnings if that is currently enabled.
|
21
25
|
def clear
|
22
26
|
synchronize do
|
23
27
|
@ignore.clear
|
24
28
|
@process.clear
|
29
|
+
@dedup = false
|
25
30
|
end
|
26
31
|
end
|
27
32
|
|
33
|
+
# Deduplicate warnings, supress warning messages if the same warning message
|
34
|
+
# has already occurred. Note that this can lead to unbounded memory use
|
35
|
+
# if unique warnings are generated.
|
36
|
+
def dedup
|
37
|
+
@dedup = {}
|
38
|
+
end
|
39
|
+
|
28
40
|
def freeze
|
29
41
|
@ignore.freeze
|
30
42
|
@process.freeze
|
@@ -40,6 +52,7 @@ module Warning
|
|
40
52
|
# :ambiguous_slash :: Ignore warnings for things like <tt>method /regexp/</tt>
|
41
53
|
# :bignum :: Ignore warnings when referencing the ::Bignum constant.
|
42
54
|
# :fixnum :: Ignore warnings when referencing the ::Fixnum constant.
|
55
|
+
# :keyword_separation :: Ignore warnings related to keyword argument separation.
|
43
56
|
# :method_redefined :: Ignore warnings when defining a method in a class/module where a
|
44
57
|
# method of the same name was already defined in that class/module.
|
45
58
|
# :missing_gvar :: Ignore warnings for accesses to global variables
|
@@ -47,7 +60,9 @@ module Warning
|
|
47
60
|
# :missing_ivar :: Ignore warnings for accesses to instance variables
|
48
61
|
# that have not yet been initialized
|
49
62
|
# :not_reached :: Ignore statement not reached warnings.
|
63
|
+
# :safe :: Ignore warnings related to $SAFE and related C-API functions.
|
50
64
|
# :shadow :: Ignore warnings related to shadowing outer local variables.
|
65
|
+
# :taint :: Ignore warnings related to taint and related methods and C-API functions.
|
51
66
|
# :unused_var :: Ignore warnings for unused variables.
|
52
67
|
# :useless_operator :: Ignore warnings when using operators such as == and > when the
|
53
68
|
# result is not used.
|
@@ -105,7 +120,8 @@ module Warning
|
|
105
120
|
end
|
106
121
|
|
107
122
|
# Handle ignored warnings and warning processors. If the warning is
|
108
|
-
# not ignored
|
123
|
+
# not ignored, is not a duplicate warning (if checking for duplicates)
|
124
|
+
# and there is no warning processor setup for the warning
|
109
125
|
# string, then use the default behavior of writing to $stderr.
|
110
126
|
def warn(str)
|
111
127
|
synchronize{@ignore.dup}.each do |path, regexp|
|
@@ -114,6 +130,14 @@ module Warning
|
|
114
130
|
end
|
115
131
|
end
|
116
132
|
|
133
|
+
if @dedup
|
134
|
+
if synchronize{@dedup[str]}
|
135
|
+
return
|
136
|
+
end
|
137
|
+
|
138
|
+
synchronize{@dedup[str] = true}
|
139
|
+
end
|
140
|
+
|
117
141
|
synchronize{@process.dup}.each do |path, block|
|
118
142
|
if str.start_with?(path)
|
119
143
|
block.call(str)
|
@@ -133,6 +157,7 @@ module Warning
|
|
133
157
|
|
134
158
|
@ignore = []
|
135
159
|
@process = []
|
160
|
+
@dedup = false
|
136
161
|
@monitor = Monitor.new
|
137
162
|
|
138
163
|
extend Processor
|
data/test/test_freeze_warning.rb
CHANGED
data/test/test_warning.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
-
|
1
|
+
ENV['MT_NO_PLUGINS'] = '1' # Work around stupid autoloading of plugins
|
2
|
+
require 'minitest/global_expectations/autorun'
|
2
3
|
require 'warning'
|
4
|
+
require 'pathname'
|
3
5
|
|
4
6
|
class WarningTest < Minitest::Test
|
5
7
|
module EnvUtil
|
@@ -42,6 +44,28 @@ class WarningTest < Minitest::Test
|
|
42
44
|
Warning.clear
|
43
45
|
end
|
44
46
|
|
47
|
+
def ivar
|
48
|
+
Object.new.instance_variable_get(:@ivar)
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_warning_dedup
|
52
|
+
assert_warning(/instance variable @ivar not initialized/) do
|
53
|
+
ivar
|
54
|
+
end
|
55
|
+
assert_warning(/instance variable @ivar not initialized/) do
|
56
|
+
ivar
|
57
|
+
end
|
58
|
+
|
59
|
+
Warning.dedup
|
60
|
+
|
61
|
+
assert_warning(/instance variable @ivar not initialized/) do
|
62
|
+
ivar
|
63
|
+
end
|
64
|
+
assert_warning('') do
|
65
|
+
ivar
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
45
69
|
def test_warning_ignore
|
46
70
|
obj = Object.new
|
47
71
|
|
@@ -219,6 +243,98 @@ class WarningTest < Minitest::Test
|
|
219
243
|
assert_warning '' do
|
220
244
|
instance_eval('lambda{|a| lambda{|a|}}', __FILE__)
|
221
245
|
end
|
246
|
+
end if RUBY_VERSION < '2.6'
|
247
|
+
|
248
|
+
if RUBY_VERSION > '2.7' && RUBY_VERSION < '2.8'
|
249
|
+
def h2kw(**kw)
|
250
|
+
end
|
251
|
+
def kw2h(h, **kw)
|
252
|
+
end
|
253
|
+
def skw(h=1, a: 1)
|
254
|
+
end
|
255
|
+
|
256
|
+
def test_warning_ignore_keyword
|
257
|
+
assert_warning(/warning: Using the last argument as keyword parameters is deprecated; maybe \*\* should be added to the call.*The called method `h2kw' is defined here/m) do
|
258
|
+
h2kw({})
|
259
|
+
end
|
260
|
+
assert_warning(/warning: Passing the keyword argument as the last hash parameter is deprecated.*The called method `kw2h' is defined here/m) do
|
261
|
+
kw2h(a: 1)
|
262
|
+
end
|
263
|
+
assert_warning(/warning: Splitting the last argument into positional and keyword parameters is deprecated.*The called method `skw' is defined here/m) do
|
264
|
+
skw("b" => 1, a: 2)
|
265
|
+
end
|
266
|
+
assert_warning(/warning: Splitting the last argument into positional and keyword parameters is deprecated.*The called method `skw' is defined here/m) do
|
267
|
+
skw({"b" => 1, a: 2})
|
268
|
+
end
|
269
|
+
|
270
|
+
Warning.ignore(:keyword_separation, __FILE__)
|
271
|
+
|
272
|
+
assert_warning '' do
|
273
|
+
h2kw({})
|
274
|
+
kw2h(a: 1)
|
275
|
+
skw("b" => 1, a: 2)
|
276
|
+
skw({"b" => 1, a: 2})
|
277
|
+
end
|
278
|
+
end
|
279
|
+
|
280
|
+
def test_warning_ignore_safe
|
281
|
+
assert_warning(/\$SAFE will become a normal global variable in Ruby 3\.0/) do
|
282
|
+
$SAFE = 0
|
283
|
+
end
|
284
|
+
|
285
|
+
Warning.ignore(:safe, __FILE__)
|
286
|
+
|
287
|
+
assert_warning("") do
|
288
|
+
$SAFE = 0
|
289
|
+
end
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
293
|
+
if RUBY_VERSION > '2.7' && RUBY_VERSION < '3.2'
|
294
|
+
|
295
|
+
def test_warning_ignore_taint
|
296
|
+
o = Object.new
|
297
|
+
|
298
|
+
assert_warning(/Object#taint is deprecated and will be removed in Ruby 3\.2/) do
|
299
|
+
o.taint
|
300
|
+
end
|
301
|
+
assert_warning(/Object#untaint is deprecated and will be removed in Ruby 3\.2/) do
|
302
|
+
o.untaint
|
303
|
+
end
|
304
|
+
assert_warning(/Object#tainted\? is deprecated and will be removed in Ruby 3\.2/) do
|
305
|
+
o.tainted?
|
306
|
+
end
|
307
|
+
assert_warning(/Object#trust is deprecated and will be removed in Ruby 3\.2/) do
|
308
|
+
o.trust
|
309
|
+
end
|
310
|
+
assert_warning(/Object#untrust is deprecated and will be removed in Ruby 3\.2/) do
|
311
|
+
o.untrust
|
312
|
+
end
|
313
|
+
assert_warning(/Object#untrusted\? is deprecated and will be removed in Ruby 3\.2/) do
|
314
|
+
o.untrusted?
|
315
|
+
end
|
316
|
+
|
317
|
+
path = Pathname.new(__FILE__)
|
318
|
+
assert_warning(/Pathname#taint is deprecated and will be removed in Ruby 3\.2/) do
|
319
|
+
path.taint
|
320
|
+
end
|
321
|
+
assert_warning(/Pathname#untaint is deprecated and will be removed in Ruby 3\.2/) do
|
322
|
+
path.untaint
|
323
|
+
end
|
324
|
+
|
325
|
+
Warning.ignore(:taint, __FILE__)
|
326
|
+
|
327
|
+
assert_warning("") do
|
328
|
+
o.taint
|
329
|
+
o.untaint
|
330
|
+
o.tainted?
|
331
|
+
o.trust
|
332
|
+
o.untrust
|
333
|
+
o.untrusted?
|
334
|
+
p.taint
|
335
|
+
p.untaint
|
336
|
+
end
|
337
|
+
end
|
222
338
|
end
|
223
339
|
|
224
340
|
def test_warning_ignore_symbol_array
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: warning
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Evans
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
11
|
+
date: 2020-01-21 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: minitest-global_expectations
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
description: |
|
14
28
|
ruby-warning adds custom processing for warnings, including the
|
15
29
|
ability to ignore specific warning messages, ignore warnings
|
@@ -33,7 +47,11 @@ files:
|
|
33
47
|
homepage: https://github.com/jeremyevans/ruby-warning
|
34
48
|
licenses:
|
35
49
|
- MIT
|
36
|
-
metadata:
|
50
|
+
metadata:
|
51
|
+
bug_tracker_uri: https://github.com/jeremyevans/ruby-warning/issues
|
52
|
+
changelog_uri: https://github.com/jeremyevans/ruby-warning/blob/master/CHANGELOG
|
53
|
+
documentation_uri: https://github.com/jeremyevans/ruby-warning/blob/master/README.rdoc
|
54
|
+
source_code_uri: https://github.com/jeremyevans/ruby-warning
|
37
55
|
post_install_message:
|
38
56
|
rdoc_options:
|
39
57
|
- "--quiet"
|
@@ -47,17 +65,16 @@ require_paths:
|
|
47
65
|
- lib
|
48
66
|
required_ruby_version: !ruby/object:Gem::Requirement
|
49
67
|
requirements:
|
50
|
-
- - "
|
68
|
+
- - ">="
|
51
69
|
- !ruby/object:Gem::Version
|
52
|
-
version: 2.
|
70
|
+
version: 2.4.0
|
53
71
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
54
72
|
requirements:
|
55
73
|
- - ">="
|
56
74
|
- !ruby/object:Gem::Version
|
57
75
|
version: '0'
|
58
76
|
requirements: []
|
59
|
-
|
60
|
-
rubygems_version: 2.6.13
|
77
|
+
rubygems_version: 3.1.2
|
61
78
|
signing_key:
|
62
79
|
specification_version: 4
|
63
80
|
summary: Add custom processing for warnings
|