warning 1.1.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 719af8cdb41da57d07edb0fa0eac81d2bb017d5d816cadf98e600cc75e63f4aa
4
- data.tar.gz: 169550daf070386f36072d01c9c36303c631b6f598cf358e0f16e786f1d4ac68
3
+ metadata.gz: 0ea693f6c3250c25b7ba2859e7c8ea5d945e8c0560aa3c564fda63da2d52e567
4
+ data.tar.gz: 3417d55cd4807d454d37afc6360864d9d87b29874b8e87d8082b413d209a4b4e
5
5
  SHA512:
6
- metadata.gz: 5ddf24399c73e0b2b747189d02972c3616482ac90c3c9e89b16b8594a1e2c6cf005b3b81bab905de6f30d3fd1882d806c8746fd317f59e6915408f80f054ee8f
7
- data.tar.gz: a5f1d714b59737dd6e67ab000687783acff87c3fe5cfd85bac2828c91556a7de5637d082e82d0a34198b53580a324c69639da93e07c0436e4f648e0031c7ff00
6
+ metadata.gz: 379377da9ef4d3ac871eb4bdbf08dcc245ccb94d7f987ef04f3f60944f4e1d0784aeee60bb560cbd4d744b92e675803fcd6955c354553649bd72e8d0e3dda1a2
7
+ data.tar.gz: 691e2c43099ddad0631752b66d7c401025a59a1b81de0fc1eca92627e5efd9b6d561b571b434526a325cab2f30bc9f4c7d2f625d62ec303905b19115ecf85148
data/CHANGELOG CHANGED
@@ -1,3 +1,23 @@
1
+ === 1.3.0 (2022-07-14)
2
+
3
+ * Allow Warning.clear to take a block, and restore current state after block (splattael) (#18, #20)
4
+
5
+ * Raise ArgumentError if Warning.process is passed non-String as first argument (splattael) (#17, #19)
6
+
7
+ === 1.2.1 (2021-10-04)
8
+
9
+ * Recognize additional void context warnings (kachick) (#13)
10
+
11
+ === 1.2.0 (2021-02-16)
12
+
13
+ * Add support for :void_context as regexp argument to Warning.ignore (jeremyevans)
14
+
15
+ * Support :category keyword to Warning.warn on Ruby 3.0 (jeremyevans)
16
+
17
+ * Fix :taint warning handling on Ruby 3.0 (jeremyevans)
18
+
19
+ * Fix :ambiguous_slash warning handling on Ruby 3.0 (jeremyevans)
20
+
1
21
  === 1.1.0 (2020-06-12)
2
22
 
3
23
  * Allow Warning.process to be called with a hash of actions instead of a block (jeremyevans)
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2016-2020 Jeremy Evans
1
+ Copyright (c) 2016-2022 Jeremy Evans
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  of this software and associated documentation files (the "Software"), to
data/README.rdoc CHANGED
@@ -42,6 +42,7 @@ appropriate regexp. The supported symbols are:
42
42
  * :taint
43
43
  * :unused_var
44
44
  * :useless_operator
45
+ * :void_context
45
46
 
46
47
  <tt>Warning.process</tt> takes an optional path prefix and a block, and if the
47
48
  warning string starts with the path prefix, it calls the block with the warning
data/lib/warning.rb CHANGED
@@ -4,7 +4,7 @@ module Warning
4
4
  module Processor
5
5
  # Map of symbols to regexps for warning messages to ignore.
6
6
  IGNORE_MAP = {
7
- ambiguous_slash: /: warning: ambiguous first argument; put parentheses or a space even after `\/' operator\n\z/,
7
+ ambiguous_slash: /: warning: ambiguous first argument; put parentheses or a space even after `\/' operator\n\z|: warning: ambiguity between regexp and two divisions: wrap regexp in parentheses or add a space after `\/' operator\n\z/,
8
8
  arg_prefix: /: warning: `[&\*]' interpreted as argument prefix\n\z/,
9
9
  bignum: /: warning: constant ::Bignum is deprecated\n\z/,
10
10
  fixnum: /: warning: constant ::Fixnum is deprecated\n\z/,
@@ -17,29 +17,63 @@ module Warning
17
17
  useless_operator: /: warning: possibly useless use of [><!=]+ in void context\n\z/,
18
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
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/,
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/,
21
21
  mismatched_indentations: /: warning: mismatched indentations at '.+' with '.+' at \d+\n\z/,
22
+ void_context: /possibly useless use of (?:a )?\S+ in void context/,
22
23
  }
23
24
 
24
25
  # Map of action symbols to procs that return the symbol
25
26
  ACTION_PROC_MAP = {
27
+ raise: proc{|_| :raise},
26
28
  default: proc{|_| :default},
27
29
  backtrace: proc{|_| :backtrace},
28
- raise: proc{|_| :raise},
29
30
  }
30
31
  private_constant :ACTION_PROC_MAP
31
32
 
32
33
  # Clear all current ignored warnings, warning processors, and duplicate check cache.
33
34
  # Also disables deduplicating warnings if that is currently enabled.
35
+ #
36
+ # If a block is passed, the previous values are restored after the block exits.
37
+ #
38
+ # Examples:
39
+ #
40
+ # # Clear warning state
41
+ # Warning.clear
42
+ #
43
+ # Warning.clear do
44
+ # # Clear warning state inside the block
45
+ # ...
46
+ # end
47
+ # # Previous warning state restored when block exists
34
48
  def clear
35
- synchronize do
36
- @ignore.clear
37
- @process.clear
38
- @dedup = false
49
+ if block_given?
50
+ ignore = process = dedup = nil
51
+ synchronize do
52
+ ignore = @ignore.dup
53
+ process = @process.dup
54
+ dedup = @dedup.dup
55
+ end
56
+
57
+ begin
58
+ clear
59
+ yield
60
+ ensure
61
+ synchronize do
62
+ @ignore = ignore
63
+ @process = process
64
+ @dedup = dedup
65
+ end
66
+ end
67
+ else
68
+ synchronize do
69
+ @ignore.clear
70
+ @process.clear
71
+ @dedup = false
72
+ end
39
73
  end
40
74
  end
41
75
 
42
- # Deduplicate warnings, supress warning messages if the same warning message
76
+ # Deduplicate warnings, suppress warning messages if the same warning message
43
77
  # has already occurred. Note that this can lead to unbounded memory use
44
78
  # if unique warnings are generated.
45
79
  def dedup
@@ -75,6 +109,8 @@ module Warning
75
109
  # :unused_var :: Ignore warnings for unused variables.
76
110
  # :useless_operator :: Ignore warnings when using operators such as == and > when the
77
111
  # result is not used.
112
+ # :void_context :: Ignore warnings for :: to reference constants when the result is not
113
+ # used (often used to trigger autoload).
78
114
  #
79
115
  # Examples:
80
116
  #
@@ -126,7 +162,7 @@ module Warning
126
162
  # Instead of passing a block, you can pass a hash of actions to take for specific
127
163
  # warnings, using regexp as keys and a callable objects as values:
128
164
  #
129
- # Warning.ignore(__FILE__,
165
+ # Warning.process(__FILE__,
130
166
  # /instance variable @\w+ not initialized/ => proc do |warning|
131
167
  # LOGGER.warning(warning)
132
168
  # end,
@@ -141,6 +177,10 @@ module Warning
141
177
  #
142
178
  # Warning.process(__FILE__, :missing_ivar=>:backtrace, :keyword_separation=>:raise)
143
179
  def process(path='', actions=nil, &block)
180
+ unless path.is_a?(String)
181
+ raise ArgumentError, "path must be a String (given an instance of #{path.class})"
182
+ end
183
+
144
184
  if block
145
185
  if actions
146
186
  raise ArgumentError, "cannot pass both actions and block to Warning.process"
@@ -166,57 +206,65 @@ module Warning
166
206
  nil
167
207
  end
168
208
 
169
- # Handle ignored warnings and warning processors. If the warning is
170
- # not ignored, is not a duplicate warning (if checking for duplicates)
171
- # and there is no warning processor setup for the warning
172
- # string, then use the default behavior of writing to $stderr.
173
- def warn(str)
174
- synchronize{@ignore.dup}.each do |path, regexp|
175
- if str.start_with?(path) && str =~ regexp
176
- return
177
- end
178
- end
179
209
 
180
- if @dedup
181
- if synchronize{@dedup[str]}
182
- return
210
+ if RUBY_VERSION >= '3.0'
211
+ method_args = ', category: nil'
212
+ super_ = "category ? super : super(str)"
213
+ # :nocov:
214
+ else
215
+ super_ = "super"
216
+ # :nocov:
217
+ end
218
+
219
+ class_eval(<<-END, __FILE__, __LINE__+1)
220
+ def warn(str#{method_args})
221
+ synchronize{@ignore.dup}.each do |path, regexp|
222
+ if str.start_with?(path) && regexp.match?(str)
223
+ return
224
+ end
183
225
  end
184
226
 
185
- synchronize{@dedup[str] = true}
186
- end
227
+ if @dedup
228
+ if synchronize{@dedup[str]}
229
+ return
230
+ end
231
+
232
+ synchronize{@dedup[str] = true}
233
+ end
187
234
 
188
- action = catch(:action) do
189
- synchronize{@process.dup}.each do |path, block|
190
- if str.start_with?(path)
191
- if block.is_a?(Hash)
192
- block.each do |regexp, blk|
193
- if str =~ regexp
194
- throw :action, blk.call(str)
235
+ action = catch(:action) do
236
+ synchronize{@process.dup}.each do |path, block|
237
+ if str.start_with?(path)
238
+ if block.is_a?(Hash)
239
+ block.each do |regexp, blk|
240
+ if regexp.match?(str)
241
+ throw :action, blk.call(str)
242
+ end
195
243
  end
244
+ else
245
+ throw :action, block.call(str)
196
246
  end
197
- else
198
- throw :action, block.call(str)
199
247
  end
200
248
  end
249
+
250
+ :default
201
251
  end
202
252
 
203
- :default
204
- end
253
+ case action
254
+ when :default
255
+ #{super_}
256
+ when :backtrace
257
+ #{super_}
258
+ $stderr.puts caller
259
+ when :raise
260
+ raise str
261
+ else
262
+ # nothing
263
+ end
205
264
 
206
- case action
207
- when :default
208
- super
209
- when :backtrace
210
- super
211
- $stderr.puts caller
212
- when :raise
213
- raise str
214
- else
215
- # nothing
265
+ nil
216
266
  end
217
-
218
- nil
219
- end
267
+ END
220
268
 
221
269
  private
222
270
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: warning
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.3.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: 2020-06-12 00:00:00.000000000 Z
11
+ date: 2022-07-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest-global_expectations
@@ -41,11 +41,7 @@ files:
41
41
  - CHANGELOG
42
42
  - MIT-LICENSE
43
43
  - README.rdoc
44
- - Rakefile
45
44
  - lib/warning.rb
46
- - test/fixtures/mismatched_indentations.rb
47
- - test/test_freeze_warning.rb
48
- - test/test_warning.rb
49
45
  homepage: https://github.com/jeremyevans/ruby-warning
50
46
  licenses:
51
47
  - MIT
@@ -76,7 +72,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
76
72
  - !ruby/object:Gem::Version
77
73
  version: '0'
78
74
  requirements: []
79
- rubygems_version: 3.1.2
75
+ rubygems_version: 3.3.7
80
76
  signing_key:
81
77
  specification_version: 4
82
78
  summary: Add custom processing for warnings
data/Rakefile DELETED
@@ -1,47 +0,0 @@
1
- require "rake"
2
- require "rake/clean"
3
- require 'rake/testtask'
4
- require "rdoc/task"
5
-
6
- CLEAN.include ["warning-*.gem", "rdoc"]
7
-
8
- desc "Build warning gem"
9
- task :package=>[:clean] do |p|
10
- sh %{#{FileUtils::RUBY} -S gem build warning.gemspec}
11
- end
12
-
13
- ### Specs
14
-
15
- desc "Run test"
16
- Rake::TestTask.new do |t|
17
- t.libs.push "lib"
18
- t.test_files = FileList['test/test_warning.rb']
19
- t.verbose = true
20
- end
21
-
22
- desc "Run test"
23
- Rake::TestTask.new(:test_freeze) do |t|
24
- t.libs.push "lib"
25
- t.test_files = FileList['test/test_freeze_warning.rb']
26
- t.verbose = true
27
- end
28
-
29
- desc "Run all tests"
30
- task :default=>[:test, :test_freeze]
31
-
32
- ### RDoc
33
-
34
- RDOC_OPTS = ['--main', 'README.rdoc', "--quiet", "--line-numbers", "--inline-source", '--title', 'ruby-warning: Add custom processing for warnings']
35
-
36
- begin
37
- gem 'hanna-nouveau'
38
- RDOC_OPTS.concat(['-f', 'hanna'])
39
- rescue Gem::LoadError
40
- end
41
-
42
-
43
- RDoc::Task.new do |rdoc|
44
- rdoc.rdoc_dir = "rdoc"
45
- rdoc.options += RDOC_OPTS
46
- rdoc.rdoc_files.add %w"README.rdoc CHANGELOG MIT-LICENSE lib/**/*.rb"
47
- end
@@ -1,4 +0,0 @@
1
- # Example that will trigger the "mismatched indentations" warning from Ruby
2
- if 2 > 1
3
- true
4
- end
@@ -1,70 +0,0 @@
1
- ENV['MT_NO_PLUGINS'] = '1' # Work around stupid autoloading of plugins
2
- require 'minitest/global_expectations/autorun'
3
- require 'warning'
4
-
5
- class WarningFreezeTest < Minitest::Test
6
- module EnvUtil
7
- def verbose_warning
8
- class << (stderr = "")
9
- alias write <<
10
- end
11
- stderr, $stderr, verbose, $VERBOSE = $stderr, stderr, $VERBOSE, true
12
- yield stderr
13
- return $stderr
14
- ensure
15
- stderr, $stderr, $VERBOSE = $stderr, stderr, verbose
16
- end
17
- module_function :verbose_warning
18
-
19
- def with_default_internal(enc)
20
- verbose, $VERBOSE = $VERBOSE, nil
21
- origenc, Encoding.default_internal = Encoding.default_internal, enc
22
- $VERBOSE = verbose
23
- yield
24
- ensure
25
- verbose, $VERBOSE = $VERBOSE, nil
26
- Encoding.default_internal = origenc
27
- $VERBOSE = verbose
28
- end
29
- module_function :with_default_internal
30
- end
31
-
32
- def assert_warning(pat, msg = nil)
33
- stderr = EnvUtil.verbose_warning {
34
- EnvUtil.with_default_internal(pat.encoding) {
35
- yield
36
- }
37
- }
38
- msg = message(msg) {diff pat, stderr}
39
- assert(pat === stderr, msg)
40
- end
41
-
42
- def test_warning_ignore
43
- obj = Object.new
44
- w = nil
45
-
46
- Warning.ignore(/instance variable @ivar not initialized/)
47
- Warning.process do |warning|
48
- w = [4, warning]
49
- end
50
- Warning.freeze
51
-
52
- assert_raises RuntimeError do
53
- Warning.ignore(/instance variable @ivar not initialized/)
54
- end
55
- assert_raises RuntimeError do
56
- Warning.process{|warning| w = [4, warning]}
57
- end
58
-
59
- assert_warning '' do
60
- assert_nil(obj.instance_variable_get(:@ivar))
61
- end
62
- assert_nil w
63
-
64
- assert_warning '' do
65
- assert_nil(obj.instance_variable_get(:@ivar6))
66
- end
67
- assert_equal(4, w.first)
68
- assert_match(/instance variable @ivar6 not initialized/, w.last)
69
- end
70
- end
data/test/test_warning.rb DELETED
@@ -1,515 +0,0 @@
1
- ENV['MT_NO_PLUGINS'] = '1' # Work around stupid autoloading of plugins
2
- require 'minitest/global_expectations/autorun'
3
- require 'warning'
4
- require 'pathname'
5
-
6
- class WarningTest < Minitest::Test
7
- module EnvUtil
8
- def verbose_warning
9
- stderr = ""
10
- class << (stderr = "")
11
- alias write <<
12
- def puts(*a)
13
- self << a.join("\n")
14
- end
15
- end
16
- stderr, $stderr, verbose, $VERBOSE = $stderr, stderr, $VERBOSE, true
17
- yield stderr
18
- return $stderr
19
- ensure
20
- stderr, $stderr, $VERBOSE = $stderr, stderr, verbose
21
- end
22
- module_function :verbose_warning
23
-
24
- def with_default_internal(enc)
25
- verbose, $VERBOSE = $VERBOSE, nil
26
- origenc, Encoding.default_internal = Encoding.default_internal, enc
27
- $VERBOSE = verbose
28
- yield
29
- ensure
30
- verbose, $VERBOSE = $VERBOSE, nil
31
- Encoding.default_internal = origenc
32
- $VERBOSE = verbose
33
- end
34
- module_function :with_default_internal
35
- end
36
-
37
- def assert_warning(pat, msg = nil)
38
- stderr = EnvUtil.verbose_warning {
39
- EnvUtil.with_default_internal(pat.encoding) {
40
- yield
41
- }
42
- }
43
- msg = message(msg) {diff pat, stderr}
44
- assert(pat === stderr, msg)
45
- end
46
-
47
- def teardown
48
- Warning.clear
49
- end
50
-
51
- def ivar
52
- Object.new.instance_variable_get(:@ivar)
53
- end
54
-
55
- def test_warning_dedup
56
- assert_warning(/instance variable @ivar not initialized/) do
57
- ivar
58
- end
59
- assert_warning(/instance variable @ivar not initialized/) do
60
- ivar
61
- end
62
-
63
- Warning.dedup
64
-
65
- assert_warning(/instance variable @ivar not initialized/) do
66
- ivar
67
- end
68
- assert_warning('') do
69
- ivar
70
- end
71
- end
72
-
73
- def test_warning_ignore
74
- obj = Object.new
75
-
76
- assert_warning(/instance variable @ivar not initialized/) do
77
- assert_nil(obj.instance_variable_get(:@ivar))
78
- end
79
-
80
- assert_warning(/instance variable @ivar not initialized/) do
81
- assert_nil(obj.instance_variable_get(:@ivar))
82
- end
83
-
84
- Warning.ignore(/instance variable @ivar not initialized/)
85
-
86
- assert_warning '' do
87
- assert_nil(obj.instance_variable_get(:@ivar))
88
- end
89
-
90
- assert_warning(/instance variable @ivar2 not initialized/) do
91
- assert_nil(obj.instance_variable_get(:@ivar2))
92
- end
93
-
94
- Warning.ignore(/instance variable @ivar2 not initialized/, __FILE__)
95
-
96
- assert_warning '' do
97
- assert_nil(obj.instance_variable_get(:@ivar2))
98
- end
99
-
100
- assert_warning(/instance variable @ivar3 not initialized/) do
101
- assert_nil(obj.instance_variable_get(:@ivar3))
102
- end
103
-
104
- Warning.ignore(/instance variable @ivar3 not initialized/, __FILE__+'a')
105
-
106
- assert_warning(/instance variable @ivar3 not initialized/) do
107
- assert_nil(obj.instance_variable_get(:@ivar3))
108
- end
109
- end
110
-
111
- def test_warning_ignore_missing_ivar
112
- Warning.clear
113
-
114
- assert_warning(/instance variable @ivar not initialized/) do
115
- assert_nil(instance_variable_get(:@ivar))
116
- end
117
-
118
- Warning.ignore(:missing_ivar, __FILE__)
119
-
120
- assert_warning '' do
121
- assert_nil(instance_variable_get(:@ivar))
122
- end
123
- end
124
-
125
- def test_warning_ignore_missing_gvar
126
- assert_warning(/global variable `\$gvar' not initialized/) do
127
- $gvar
128
- end
129
-
130
- Warning.ignore(:missing_gvar, __FILE__)
131
-
132
- assert_warning '' do
133
- $gvar
134
- end
135
- end
136
-
137
- def test_warning_ignore_method_redefined
138
- def self.a; end
139
-
140
- assert_warning(/method redefined; discarding old a.+previous definition of a was here/m) do
141
- def self.a; end
142
- end
143
-
144
- Warning.ignore(:method_redefined, __FILE__)
145
-
146
- assert_warning '' do
147
- def self.a; end
148
- end
149
- end
150
-
151
- def test_warning_ignore_not_reached
152
- assert_warning(/: warning: statement not reached/) do
153
- instance_eval('def self.b; return; 1 end', __FILE__)
154
- end
155
-
156
- Warning.ignore(:not_reached, __FILE__)
157
-
158
- assert_warning '' do
159
- instance_eval('def self.c; return; 1 end', __FILE__)
160
- end
161
- end
162
-
163
- def test_warning_ignore_fixnum
164
- assert_warning(/warning: constant ::Fixnum is deprecated/) do
165
- ::Fixnum
166
- end
167
-
168
- Warning.ignore(:fixnum, __FILE__)
169
-
170
- assert_warning '' do
171
- ::Fixnum
172
- end
173
- end
174
-
175
- def test_warning_ignore_bignum
176
- assert_warning(/warning: constant ::Bignum is deprecated/) do
177
- ::Bignum
178
- end
179
-
180
- Warning.ignore(:bignum, __FILE__)
181
-
182
- assert_warning '' do
183
- ::Bignum
184
- end
185
- end
186
-
187
- def test_warning_ignore_ambiguous_slash
188
- def self.d(re); end
189
- assert_warning(/warning: ambiguous first argument; put parentheses or a space even after `\/' operator/) do
190
- instance_eval('d /a/', __FILE__)
191
- end
192
-
193
- Warning.ignore(:ambiguous_slash, __FILE__)
194
-
195
- assert_warning '' do
196
- instance_eval('d /a/', __FILE__)
197
- end
198
- end
199
-
200
- def test_warning_ignore_unused_var
201
- assert_warning(/warning: assigned but unused variable - \w+/) do
202
- instance_eval('def self.e; b = 1; 2 end', __FILE__)
203
- end
204
-
205
- Warning.ignore(:unused_var, __FILE__)
206
-
207
- assert_warning '' do
208
- instance_eval('def self.f; b = 1; 2 end', __FILE__)
209
- end
210
- end
211
-
212
- def test_warning_ignore_useless_operator
213
- assert_warning(/warning: possibly useless use of == in void context/) do
214
- instance_eval('1 == 2; true', __FILE__)
215
- end
216
-
217
- Warning.ignore(:useless_operator, __FILE__)
218
-
219
- assert_warning '' do
220
- instance_eval('1 == 2; true', __FILE__)
221
- end
222
- end
223
-
224
- def test_warning_ignore_arg_prefix
225
- assert_warning(/: warning: `\*' interpreted as argument prefix/) do
226
- instance_eval('Array *[nil]', __FILE__)
227
- end
228
-
229
- assert_warning(/: warning: `&' interpreted as argument prefix/) do
230
- instance_eval('tap &proc{}', __FILE__)
231
- end
232
- Warning.ignore(:arg_prefix, __FILE__)
233
-
234
- assert_warning '' do
235
- instance_eval('Array *[nil]', __FILE__)
236
- instance_eval('tap &proc{}', __FILE__)
237
- end
238
- end
239
-
240
- def test_warning_ignore_shadow
241
- assert_warning(/warning: shadowing outer local variable - a/) do
242
- instance_eval('lambda{|a| lambda{|a|}}', __FILE__)
243
- end
244
-
245
- Warning.ignore(:shadow, __FILE__)
246
-
247
- assert_warning '' do
248
- instance_eval('lambda{|a| lambda{|a|}}', __FILE__)
249
- end
250
- end if RUBY_VERSION < '2.6'
251
-
252
- if RUBY_VERSION > '2.7' && RUBY_VERSION < '2.8'
253
- def h2kw(**kw)
254
- end
255
- def kw2h(h, **kw)
256
- end
257
- def skw(h=1, a: 1)
258
- end
259
-
260
- def test_warning_ignore_keyword
261
- 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
262
- h2kw({})
263
- end
264
- assert_warning(/warning: Passing the keyword argument as the last hash parameter is deprecated.*The called method `kw2h' is defined here/m) do
265
- kw2h(a: 1)
266
- end
267
- assert_warning(/warning: Splitting the last argument into positional and keyword parameters is deprecated.*The called method `skw' is defined here/m) do
268
- skw("b" => 1, a: 2)
269
- end
270
- assert_warning(/warning: Splitting the last argument into positional and keyword parameters is deprecated.*The called method `skw' is defined here/m) do
271
- skw({"b" => 1, a: 2})
272
- end
273
-
274
- Warning.ignore(:keyword_separation, __FILE__)
275
-
276
- assert_warning '' do
277
- h2kw({})
278
- kw2h(a: 1)
279
- skw("b" => 1, a: 2)
280
- skw({"b" => 1, a: 2})
281
- end
282
- end
283
-
284
- def test_warning_ignore_safe
285
- assert_warning(/\$SAFE will become a normal global variable in Ruby 3\.0/) do
286
- $SAFE = 0
287
- end
288
-
289
- Warning.ignore(:safe, __FILE__)
290
-
291
- assert_warning("") do
292
- $SAFE = 0
293
- end
294
- end
295
- end
296
-
297
- if RUBY_VERSION > '2.7' && RUBY_VERSION < '3.2'
298
-
299
- def test_warning_ignore_taint
300
- o = Object.new
301
-
302
- assert_warning(/Object#taint is deprecated and will be removed in Ruby 3\.2/) do
303
- o.taint
304
- end
305
- assert_warning(/Object#untaint is deprecated and will be removed in Ruby 3\.2/) do
306
- o.untaint
307
- end
308
- assert_warning(/Object#tainted\? is deprecated and will be removed in Ruby 3\.2/) do
309
- o.tainted?
310
- end
311
- assert_warning(/Object#trust is deprecated and will be removed in Ruby 3\.2/) do
312
- o.trust
313
- end
314
- assert_warning(/Object#untrust is deprecated and will be removed in Ruby 3\.2/) do
315
- o.untrust
316
- end
317
- assert_warning(/Object#untrusted\? is deprecated and will be removed in Ruby 3\.2/) do
318
- o.untrusted?
319
- end
320
-
321
- path = Pathname.new(__FILE__)
322
- assert_warning(/Pathname#taint is deprecated and will be removed in Ruby 3\.2/) do
323
- path.taint
324
- end
325
- assert_warning(/Pathname#untaint is deprecated and will be removed in Ruby 3\.2/) do
326
- path.untaint
327
- end
328
-
329
- Warning.ignore(:taint, __FILE__)
330
-
331
- assert_warning("") do
332
- o.taint
333
- o.untaint
334
- o.tainted?
335
- o.trust
336
- o.untrust
337
- o.untrusted?
338
- p.taint
339
- p.untaint
340
- end
341
- end
342
- end
343
-
344
- def test_warning_ignore_symbol_array
345
- def self.c; end
346
-
347
- assert_warning(/statement not reached.+method redefined; discarding old c.+previous definition of c was here/m) do
348
- instance_eval('def self.c; return; 1 end', __FILE__)
349
- end
350
-
351
- Warning.ignore([:method_redefined, :not_reached], __FILE__)
352
-
353
- assert_warning '' do
354
- instance_eval('def self.c; return; 1 end', __FILE__)
355
- end
356
- end
357
-
358
- def test_warning_ignore_mismatched_indentation
359
- assert_warning(/warning: mismatched indentations/) do
360
- load 'test/fixtures/mismatched_indentations.rb'
361
- end
362
-
363
- Warning.ignore(:mismatched_indentations, 'test/fixtures/mismatched_indentations.rb')
364
-
365
- assert_warning '' do
366
- load 'test/fixtures/mismatched_indentations.rb'
367
- end
368
- end
369
-
370
- def test_warning_process
371
- obj = Object.new
372
- warn = nil
373
-
374
- Warning.process(__FILE__+'a') do |warning|
375
- warn = [0, warning]
376
- end
377
-
378
- assert_warning(/instance variable @ivar not initialized/) do
379
- assert_nil(obj.instance_variable_get(:@ivar))
380
- end
381
- assert_nil(warn)
382
-
383
- Warning.process(__FILE__) do |warning|
384
- warn = [1, warning]
385
- end
386
-
387
- assert_warning '' do
388
- assert_nil(obj.instance_variable_get(:@ivar2))
389
- end
390
- assert_equal(1, warn.first)
391
- assert_match(/instance variable @ivar2 not initialized/, warn.last)
392
- warn = nil
393
-
394
- Warning.process(File.dirname(__FILE__)) do |warning|
395
- warn = [2, warning]
396
- end
397
-
398
- assert_warning '' do
399
- assert_nil(obj.instance_variable_get(:@ivar3))
400
- end
401
- assert_equal(1, warn.first)
402
- assert_match(/instance variable @ivar3 not initialized/, warn.last)
403
- warn = nil
404
-
405
- Warning.process(__FILE__+':') do |warning|
406
- warn = [3, warning]
407
- end
408
-
409
- assert_warning '' do
410
- assert_nil(obj.instance_variable_get(:@ivar4))
411
- end
412
- assert_equal(3, warn.first)
413
- assert_match(/instance variable @ivar4 not initialized/, warn.last)
414
- warn = nil
415
-
416
- Warning.clear
417
-
418
- assert_warning(/instance variable @ivar5 not initialized/) do
419
- assert_nil(obj.instance_variable_get(:@ivar5))
420
- end
421
- assert_nil(warn)
422
-
423
- Warning.process do |warning|
424
- warn = [4, warning]
425
- end
426
-
427
- assert_warning '' do
428
- assert_nil(obj.instance_variable_get(:@ivar6))
429
- end
430
- assert_equal(4, warn.first)
431
- assert_match(/instance variable @ivar6 not initialized/, warn.last)
432
- end
433
-
434
- def test_warning_process_block_return_default
435
- w = nil
436
- Warning.process(__FILE__) do |warning|
437
- w = warning
438
- :default
439
- end
440
-
441
- assert_warning(/instance variable @ivar not initialized/) do
442
- ivar
443
- end
444
- assert_match(/instance variable @ivar not initialized/, w)
445
- end
446
-
447
- def test_warning_process_block_return_backtrace
448
- w = nil
449
- Warning.process(__FILE__) do |warning|
450
- w = warning
451
- :backtrace
452
- end
453
-
454
- assert_warning(/instance variable @ivar not initialized.*#{__FILE__}/m) do
455
- ivar
456
- end
457
- assert_match(/instance variable @ivar not initialized/, w)
458
- end
459
-
460
- def test_warning_process_block_return_raise
461
- w = nil
462
- Warning.process(__FILE__) do |warning|
463
- w = warning
464
- :raise
465
- end
466
-
467
- assert_raises(RuntimeError, /instance variable @ivar not initialized/) do
468
- EnvUtil.verbose_warning{ivar}
469
- end
470
- assert_match(/instance variable @ivar not initialized/, w)
471
- end
472
-
473
- def test_warning_process_action
474
- w = nil
475
- Warning.process(__FILE__, :missing_ivar=>:default, :missing_gvar=>:backtrace, :ambiguous_slash=>:raise)
476
- Warning.process(__FILE__, :not_reached=>proc do |warning|
477
- w = warning
478
- :raise
479
- end)
480
-
481
- assert_warning(/instance variable @ivar not initialized/) do
482
- ivar
483
- end
484
-
485
- assert_warning(/global variable `\$gvar' not initialized.*#{__FILE__}/m) do
486
- $gvar
487
- end
488
-
489
- Warning.process(__FILE__) do |warning|
490
- w = warning
491
- :raise
492
- end
493
-
494
- assert_raises(RuntimeError, /warning: ambiguous first argument; put parentheses or a space even after `\/' operator/) do
495
- EnvUtil.verbose_warning{instance_eval('d /a/', __FILE__)}
496
- end
497
-
498
- assert_raises(RuntimeError, /warning: statement not reached/) do
499
- EnvUtil.verbose_warning{instance_eval('def self.b; return; 1 end', __FILE__)}
500
- end
501
- assert_match(/warning: statement not reached/, w)
502
- end
503
-
504
- def test_warning_process_action_and_block
505
- assert_raises(ArgumentError) do
506
- Warning.process(__FILE__)
507
- end
508
- end
509
-
510
- def test_warning_process_no_action_and_no_block
511
- assert_raises(ArgumentError) do
512
- Warning.process(__FILE__, :missing_ivar=>:default){}
513
- end
514
- end
515
- end