structured_warnings 0.2.0 → 0.3.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 +4 -4
- data/README.md +200 -0
- data/lib/{structured_warnings/dynamic.rb → dynamic.rb} +0 -0
- data/lib/structured_warnings.rb +19 -9
- data/lib/structured_warnings/base.rb +132 -0
- data/lib/structured_warnings/kernel.rb +5 -65
- data/lib/structured_warnings/minitest.rb +5 -0
- data/lib/structured_warnings/test.rb +3 -5
- data/lib/structured_warnings/test/assertions.rb +93 -98
- data/lib/structured_warnings/test/warner.rb +32 -35
- data/lib/structured_warnings/test_unit.rb +5 -0
- data/lib/structured_warnings/version.rb +3 -0
- data/lib/structured_warnings/warner.rb +13 -11
- data/lib/structured_warnings/warning.rb +61 -119
- data/lib/warning.rb +9 -0
- metadata +53 -92
- data/Gemfile +0 -3
- data/Gemfile.lock +0 -21
- data/History.txt +0 -36
- data/License.txt +0 -20
- data/README.rdoc +0 -137
- data/Rakefile +0 -55
- data/doc/DeprecatedMethodWarning.html +0 -105
- data/doc/DeprecatedSignatureWarning.html +0 -106
- data/doc/DeprecationWarning.html +0 -106
- data/doc/Dynamic.html +0 -125
- data/doc/Object.html +0 -117
- data/doc/README_rdoc.html +0 -283
- data/doc/StandardWarning.html +0 -104
- data/doc/StructuredWarnings.html +0 -125
- data/doc/StructuredWarnings/ClassMethods.html +0 -192
- data/doc/StructuredWarnings/Kernel.html +0 -222
- data/doc/StructuredWarnings/Test.html +0 -97
- data/doc/StructuredWarnings/Test/Assertions.html +0 -272
- data/doc/StructuredWarnings/Test/Warner.html +0 -208
- data/doc/StructuredWarnings/Warner.html +0 -162
- data/doc/Test.html +0 -95
- data/doc/Test/Unit.html +0 -95
- data/doc/Warning.html +0 -398
- data/doc/Warning/ClassMethods.html +0 -278
- data/doc/created.rid +0 -10
- data/doc/css/fonts.css +0 -167
- data/doc/css/rdoc.css +0 -590
- data/doc/fonts/Lato-Light.ttf +0 -0
- data/doc/fonts/Lato-LightItalic.ttf +0 -0
- data/doc/fonts/Lato-Regular.ttf +0 -0
- data/doc/fonts/Lato-RegularItalic.ttf +0 -0
- data/doc/fonts/SourceCodePro-Bold.ttf +0 -0
- data/doc/fonts/SourceCodePro-Regular.ttf +0 -0
- data/doc/images/add.png +0 -0
- data/doc/images/arrow_up.png +0 -0
- data/doc/images/brick.png +0 -0
- data/doc/images/brick_link.png +0 -0
- data/doc/images/bug.png +0 -0
- data/doc/images/bullet_black.png +0 -0
- data/doc/images/bullet_toggle_minus.png +0 -0
- data/doc/images/bullet_toggle_plus.png +0 -0
- data/doc/images/date.png +0 -0
- data/doc/images/delete.png +0 -0
- data/doc/images/find.png +0 -0
- data/doc/images/loadingAnimation.gif +0 -0
- data/doc/images/macFFBgHack.png +0 -0
- data/doc/images/package.png +0 -0
- data/doc/images/page_green.png +0 -0
- data/doc/images/page_white_text.png +0 -0
- data/doc/images/page_white_width.png +0 -0
- data/doc/images/plugin.png +0 -0
- data/doc/images/ruby.png +0 -0
- data/doc/images/tag_blue.png +0 -0
- data/doc/images/tag_green.png +0 -0
- data/doc/images/transparent.png +0 -0
- data/doc/images/wrench.png +0 -0
- data/doc/images/wrench_orange.png +0 -0
- data/doc/images/zoom.png +0 -0
- data/doc/index.html +0 -121
- data/doc/js/darkfish.js +0 -161
- data/doc/js/jquery.js +0 -4
- data/doc/js/navigation.js +0 -142
- data/doc/js/navigation.js.gz +0 -0
- data/doc/js/search.js +0 -109
- data/doc/js/search_index.js +0 -1
- data/doc/js/search_index.js.gz +0 -0
- data/doc/js/searcher.js +0 -228
- data/doc/js/searcher.js.gz +0 -0
- data/doc/table_of_contents.html +0 -200
- data/structured_warnings.gemspec +0 -24
- data/test/structured_warnings_test.rb +0 -187
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 82e448e3265ea35dd71196fb6f3adbc6b629cbb5
|
4
|
+
data.tar.gz: 5ed838c91e79e3d459f10d2cb9c7b596f03b5d98
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c784e0acb8c6aa8840ba44a36f5fdd090d7a46d178b4701fc97f1c6203d0f0de41f8d90a8579a53a7064a4df9146a314a936b6c6d290c892d3022840bce58282
|
7
|
+
data.tar.gz: f816ed5e9f249359c9c8108ba65c978140f9c2cef49f7d70202b26537ba4ced18ad1699c76ee9954ea8771bde64da59e98a08f34deee41766b06f76328a836df
|
data/README.md
ADDED
@@ -0,0 +1,200 @@
|
|
1
|
+
# StructuredWarnings
|
2
|
+
|
3
|
+
> **Disclaimer:** This is an experimental reimplementation of structured
|
4
|
+
> warnings, based on Ruby 2.4's new warning module. This is not yet ready for
|
5
|
+
> prime time.
|
6
|
+
|
7
|
+
This is an implementation of Daniel Berger's [proposal of structured warnings
|
8
|
+
for Ruby](https://web.archive.org/web/20140328021259/http://www.oreillynet.com/ruby/blog/2008/02/structured_warnings_now.html).
|
9
|
+
They provide dynamic suppression and activation, as well as, an inheritance
|
10
|
+
hierarchy to model their relations. This library preserves the old `warn`
|
11
|
+
signature, but additionally allows a `raise`-like use.
|
12
|
+
|
13
|
+
For more information on the usage and benefits of this library have a look at
|
14
|
+
the inspiring article at O'Reilly.
|
15
|
+
|
16
|
+
[www.oreillynet.com/ruby/blog/2008/02/structured\_warnings\_now.html](https://web.archive.org/web/20140328021259/http://www.oreillynet.com/ruby/blog/2008/02/structured_warnings_now.html)
|
17
|
+
(link to web archive - O'Reilly took it down)
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
## Installation
|
22
|
+
|
23
|
+
Add this line to your application's Gemfile:
|
24
|
+
|
25
|
+
```ruby
|
26
|
+
gem 'structured_warnings'
|
27
|
+
```
|
28
|
+
|
29
|
+
And then execute:
|
30
|
+
|
31
|
+
$ bundle
|
32
|
+
|
33
|
+
Or install it yourself as:
|
34
|
+
|
35
|
+
$ gem install structured_warnings
|
36
|
+
|
37
|
+
|
38
|
+
## Compatibility
|
39
|
+
|
40
|
+
`structured_warnings` aims to work with all Ruby interpreters. Please file a bug
|
41
|
+
for any incompatibilities.
|
42
|
+
|
43
|
+
|
44
|
+
Versions of `structured_warnings` before `v0.3.0` are incompatible with Ruby
|
45
|
+
2.4+. Please upgrade accordingly, if you need Ruby 2.4 compatibility. Please
|
46
|
+
note on the otherhand, that many class names changed in an incompatible way
|
47
|
+
with `structured_warnings` `v0.3.0`. This was done to avoid future name clashes.
|
48
|
+
|
49
|
+
Here's a table which should ease upgrading.
|
50
|
+
|
51
|
+
| v0.2.0 and before | v0.3.0 and after |
|
52
|
+
|------------------------------|--------------------------------------------------|
|
53
|
+
| `Warning` | `StructuredWarnings::Base` |
|
54
|
+
| `StandardWarning` | `StructuredWarnings::StandardWarning` |
|
55
|
+
| `DeprecationWarning` | `StructuredWarnings::DeprecationWarning` |
|
56
|
+
| `DeprecatedMethodWarning` | `StructuredWarnings::DeprecatedMethodWarning` |
|
57
|
+
| `DeprecatedSignatureWarning` | `StructuredWarnings::DeprecatedSignatureWarning` |
|
58
|
+
|
59
|
+
|
60
|
+
### Test framework support
|
61
|
+
|
62
|
+
`structured_warnings` supports both
|
63
|
+
[test-unit](https://github.com/test-unit/test-unit/) and
|
64
|
+
[minitest/test](https://github.com/seattlerb/minitest/) by adding the
|
65
|
+
`assert_warn` and `assert_no_warn` assertions.
|
66
|
+
|
67
|
+
Pull requests which add support for `RSpec` or `minitest/spec` are very welcome.
|
68
|
+
|
69
|
+
|
70
|
+
### Known Issues
|
71
|
+
|
72
|
+
In Ruby versions before 2.4, the library may not extend Ruby's built-in
|
73
|
+
warnings handled by the C-level function `rb_warn`. Therefore warnings like
|
74
|
+
"method redefined", "void context", and "parenthesis" may not be manipulated by
|
75
|
+
`structured_warnings`.
|
76
|
+
|
77
|
+
|
78
|
+
## Usage
|
79
|
+
|
80
|
+
To get you started - here is a short example
|
81
|
+
|
82
|
+
In order to use `structured_warnings` in library code, use the following code.
|
83
|
+
|
84
|
+
```ruby
|
85
|
+
# in lib/...
|
86
|
+
require 'structured_warnings'
|
87
|
+
|
88
|
+
class Foo
|
89
|
+
def old_method
|
90
|
+
warn StructuredWarnings::DeprecatedMethodWarning, 'This method is deprecated. Use new_method instead'
|
91
|
+
# Do stuff
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
# in test/...
|
96
|
+
require 'test/unit'
|
97
|
+
require 'structured_warnings'
|
98
|
+
|
99
|
+
class FooTests < Test::Unit::TestCase
|
100
|
+
def setup
|
101
|
+
@foo = Foo.new
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_old_method_emits_deprecation_warning
|
105
|
+
assert_warn(StructuredWarnings::DeprecatedMethodWarning){ @foo.old_method }
|
106
|
+
end
|
107
|
+
end
|
108
|
+
```
|
109
|
+
|
110
|
+
`StructuredWarnings::DeprecatedMethodWarning` is only one of multiple predefined
|
111
|
+
warning types. You may add your own types by subclassing
|
112
|
+
`StructuredWarnings::Base` if you like.
|
113
|
+
|
114
|
+
Client code of your library will look as follows:
|
115
|
+
|
116
|
+
```ruby
|
117
|
+
require "foo"
|
118
|
+
|
119
|
+
foo = Foo.new
|
120
|
+
foo.old_method # => will print
|
121
|
+
# ... `old_method' : This method is deprecated. Use new_method instead (StructuredWarnings::DeprecatedMethodWarning)
|
122
|
+
```
|
123
|
+
|
124
|
+
But the main difference to the standard warning concept shipped with ruby, is
|
125
|
+
that the client is able to selectively disable certain warnings s/he is aware of
|
126
|
+
and not willing to fix.
|
127
|
+
|
128
|
+
```ruby
|
129
|
+
StructuredWarnings::DeprecatedMethodWarning.disable # Globally disable warnings about deprecated methods!
|
130
|
+
|
131
|
+
foo.old_method # => will print nothing
|
132
|
+
|
133
|
+
StructuredWarnings::DeprecatedMethodWarning.enable # Reenable warnings again.
|
134
|
+
```
|
135
|
+
|
136
|
+
And there is an even more powerful option for your clients, the can selectively
|
137
|
+
disable warnings in a dynamic block scope.
|
138
|
+
|
139
|
+
```ruby
|
140
|
+
# Don't bug me about deprecated method warnings within this block, I know
|
141
|
+
# what I'm doing.
|
142
|
+
#
|
143
|
+
StructuredWarnings::DeprecatedMethodWarning.disable do
|
144
|
+
foo.old_method
|
145
|
+
end
|
146
|
+
```
|
147
|
+
|
148
|
+
These settings are scoped to the local thread (and all threads spawned in the
|
149
|
+
block scope) and automatically reset after the block.
|
150
|
+
|
151
|
+
|
152
|
+
## Detailed Documentation
|
153
|
+
|
154
|
+
Have closer look at the RDoc of `StructuredWarnings::Warning`,
|
155
|
+
`StructuredWarnings::Base` and `StructuredWarnings::Base::ClassMethods`.
|
156
|
+
|
157
|
+
Part of this library is a set of different warnings:
|
158
|
+
|
159
|
+
* `StructuredWarnings::Base`
|
160
|
+
* `StructuredWarnings::BuiltInWarning`
|
161
|
+
* `StructuredWarnings::StandardWarning`
|
162
|
+
* `StructuredWarnings::DeprecationWarning`
|
163
|
+
* `StructuredWarnings::DeprecatedMethodWarning`
|
164
|
+
* `StructuredWarnings::DeprecatedSignatureWarning`
|
165
|
+
|
166
|
+
You are encouraged to use your own subclasses of `StructuredWarnings::Base` to
|
167
|
+
give as much feedback to your users as possible.
|
168
|
+
|
169
|
+
|
170
|
+
## Resources
|
171
|
+
|
172
|
+
* [Inspiring article](https://web.archive.org/web/20140328021259/http://www.oreillynet.com/ruby/blog/2008/02/structured_warnings_now.html)
|
173
|
+
* [Implementation Highlights](http://www.nach-vorne.de/2008/2/22/structured_warnings-highlights)
|
174
|
+
* [Project's website](https://github.com/schmidt/structured_warnings/)
|
175
|
+
* [API doc](http://rdoc.info/projects/schmidt/structured_warnings)
|
176
|
+
* [Build status](https://travis-ci.org/schmidt/structured_warnings)
|
177
|
+
|
178
|
+
|
179
|
+
## Development
|
180
|
+
|
181
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run
|
182
|
+
`rake test` to run the tests. You can also run `bin/console` for an interactive
|
183
|
+
prompt that will allow you to experiment.
|
184
|
+
|
185
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To
|
186
|
+
release a new version, update the version number in `version.rb`, and then run
|
187
|
+
`bundle exec rake release`, which will create a git tag for the version, push
|
188
|
+
git commits and tags, and push the `.gem` file to
|
189
|
+
[rubygems.org](https://rubygems.org).
|
190
|
+
|
191
|
+
## Contributing
|
192
|
+
|
193
|
+
Bug reports and pull requests are welcome on GitHub at
|
194
|
+
[github.com/schmidt/structured\_warnings](https://github.com/schmidt/structured_warnings).
|
195
|
+
|
196
|
+
|
197
|
+
## License
|
198
|
+
|
199
|
+
The gem is available as open source under the terms of the [MIT
|
200
|
+
License](http://opensource.org/licenses/MIT).
|
File without changes
|
data/lib/structured_warnings.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
|
-
require
|
2
|
-
|
3
|
-
|
4
|
-
require
|
1
|
+
require 'structured_warnings/version'
|
2
|
+
|
3
|
+
# Compatibility layer
|
4
|
+
require 'warning' unless defined? ::Warning
|
5
|
+
|
6
|
+
require 'dynamic'
|
5
7
|
|
6
8
|
module StructuredWarnings
|
7
|
-
# If you <code>require
|
8
|
-
# have to <code>require
|
9
|
+
# If you <code>require 'test/unit'</code> after +structured_warnings+ you
|
10
|
+
# have to <code>require 'structured_warnings/test'</code> manually,
|
9
11
|
# otherwise the test extensions will be added automatically.
|
10
12
|
module ClassMethods
|
11
13
|
# Executes a block using the given warner. This may be used to suppress
|
@@ -58,12 +60,20 @@ module StructuredWarnings
|
|
58
60
|
end
|
59
61
|
#:startdoc:
|
60
62
|
end
|
63
|
+
|
61
64
|
extend ClassMethods
|
62
65
|
end
|
63
66
|
|
64
|
-
|
65
|
-
|
67
|
+
require 'structured_warnings/kernel'
|
68
|
+
require 'structured_warnings/warning'
|
69
|
+
require 'structured_warnings/warner'
|
70
|
+
require 'structured_warnings/base'
|
71
|
+
|
72
|
+
|
73
|
+
unless Dynamic.variables.key? :disabled_warnings
|
66
74
|
StructuredWarnings::disabled_warnings = []
|
67
75
|
StructuredWarnings::warner = StructuredWarnings::Warner.new
|
68
76
|
end
|
69
|
-
|
77
|
+
|
78
|
+
require 'structured_warnings/minitest' if defined? Minitest::Test
|
79
|
+
require 'structured_warnings/test_unit' if defined? Test::Unit::TestCase
|
@@ -0,0 +1,132 @@
|
|
1
|
+
# Descendents of class StructuredWarnings::Base are used to raise structured
|
2
|
+
# warnings. They enable programmers to explicitly supress certain kinds of
|
3
|
+
# warnings and provide additional information in contrast to the plain warn
|
4
|
+
# method. They implement an Exception-like interface and carry information about
|
5
|
+
# the warning -- its type (the warning's class name), an optional descriptive
|
6
|
+
# string, and optional traceback information. Programs may subclass
|
7
|
+
# StructuredWarnings::Base to add additional information.
|
8
|
+
#
|
9
|
+
# Large portions of this class's documentation are taken from the Exception
|
10
|
+
# RDoc.
|
11
|
+
class StructuredWarnings::Base
|
12
|
+
# Construct a new StructuredWarning::Base object, optionally passing in a
|
13
|
+
# message.
|
14
|
+
def initialize(message = nil)
|
15
|
+
@message = message
|
16
|
+
@backtrace = caller(1)
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
# call-seq:
|
21
|
+
# warning.backtrace => array
|
22
|
+
#
|
23
|
+
# Returns any backtrace associated with the warning. The backtrace
|
24
|
+
# is an array of strings, each containing either ``filename:lineNo: in
|
25
|
+
# `method''' or ``filename:lineNo.''
|
26
|
+
def backtrace
|
27
|
+
@backtrace
|
28
|
+
end
|
29
|
+
|
30
|
+
# Sets the backtrace information associated with warning. The argument must
|
31
|
+
# be an array of String objects in the format described in
|
32
|
+
# Exception#backtrace.
|
33
|
+
def set_backtrace(backtrace)
|
34
|
+
@backtrace = backtrace
|
35
|
+
end
|
36
|
+
|
37
|
+
# Returns warning's message (or the name of the warning if no message is set).
|
38
|
+
def to_s
|
39
|
+
@message || self.class.name
|
40
|
+
end
|
41
|
+
alias_method :to_str, :to_s
|
42
|
+
alias_method :message, :to_s
|
43
|
+
|
44
|
+
# Return this warning's class name and message
|
45
|
+
def inspect
|
46
|
+
"#<#{self.class}: #{self}>"
|
47
|
+
end
|
48
|
+
|
49
|
+
# This module extends StructuredWarnings::Base and each subclass. It may be
|
50
|
+
# used to activate or deactivate a set of warnings.
|
51
|
+
module ClassMethods
|
52
|
+
# returns a Boolean, stating whether a warning of this type would be
|
53
|
+
# emmitted or not.
|
54
|
+
def active?
|
55
|
+
StructuredWarnings::disabled_warnings.all? {|w| !(w >= self)}
|
56
|
+
end
|
57
|
+
|
58
|
+
# call-seq:
|
59
|
+
# disable()
|
60
|
+
# disable() {...}
|
61
|
+
#
|
62
|
+
# If called without a block, warnings of this type will be disabled in the
|
63
|
+
# current thread and all new child threads.
|
64
|
+
#
|
65
|
+
# warn("this will be printed") # creates a StructuredWarnings::StandardWarning
|
66
|
+
# # which is enabled by default
|
67
|
+
#
|
68
|
+
# StructuredWarnings::Base.disable
|
69
|
+
#
|
70
|
+
# warn("this will not be printed") # creates a StructuredWarnings::StandardWarning
|
71
|
+
# # which is currently disabled
|
72
|
+
#
|
73
|
+
# If called with a block, warnings of this type will be disabled in the
|
74
|
+
# dynamic scope of the given block.
|
75
|
+
#
|
76
|
+
# StructuredWarnings::Base.disable do
|
77
|
+
# warn("this will not be printed") # creates a StructuredWarnings::StandardWarning
|
78
|
+
# # which is currently disabled
|
79
|
+
# end
|
80
|
+
#
|
81
|
+
# warn("this will be printed") # creates a StructuredWarnings::StandardWarning
|
82
|
+
# # which is currently enabled
|
83
|
+
def disable
|
84
|
+
if block_given?
|
85
|
+
StructuredWarnings::with_disabled_warnings(StructuredWarnings.disabled_warnings | [self]) do
|
86
|
+
yield
|
87
|
+
end
|
88
|
+
else
|
89
|
+
StructuredWarnings::disabled_warnings |= [self]
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
# call-seq:
|
94
|
+
# enable()
|
95
|
+
# enable() {...}
|
96
|
+
#
|
97
|
+
# This method has the same semantics as disable, only with the opposite
|
98
|
+
# outcome. In general the last assignment wins, so that disabled warnings
|
99
|
+
# may be enabled again and so on.
|
100
|
+
def enable
|
101
|
+
if block_given?
|
102
|
+
StructuredWarnings::with_disabled_warnings(StructuredWarnings.disabled_warnings - [self]) do
|
103
|
+
yield
|
104
|
+
end
|
105
|
+
else
|
106
|
+
StructuredWarnings::disabled_warnings -= [self]
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
extend ClassMethods
|
112
|
+
end
|
113
|
+
|
114
|
+
# This warning is used when calling #Kernel.warn without arguments.
|
115
|
+
class StructuredWarnings::StandardWarning < StructuredWarnings::Base; end
|
116
|
+
|
117
|
+
# This is a general warning used to mark certain actions as deprecated. We
|
118
|
+
# recommend to add a useful warning message, which alternative to use instead.
|
119
|
+
class StructuredWarnings::DeprecationWarning < StructuredWarnings::Base; end
|
120
|
+
|
121
|
+
# This warning marks single methods as deprecated. We
|
122
|
+
# recommend to add a useful warning message, which alternative to use instead.
|
123
|
+
class StructuredWarnings::DeprecatedMethodWarning < StructuredWarnings::DeprecationWarning; end
|
124
|
+
|
125
|
+
# This warning marks the given parameters for a certain methods as
|
126
|
+
# deprecated. We recommend to add a useful warning message, which
|
127
|
+
# alternative to use instead.
|
128
|
+
class StructuredWarnings::DeprecatedSignatureWarning < StructuredWarnings::DeprecationWarning; end
|
129
|
+
|
130
|
+
# This warning is used for Ruby's built in warnings about accessing unused
|
131
|
+
# instance vars, redefining constants, etc.
|
132
|
+
class StructuredWarnings::BuiltInWarning < StructuredWarnings::Base; end
|
@@ -1,67 +1,7 @@
|
|
1
|
-
module StructuredWarnings
|
2
|
-
|
3
|
-
|
4
|
-
module Kernel
|
5
|
-
|
6
|
-
# :call-seq:
|
7
|
-
# warn(message = nil)
|
8
|
-
# warn(warning_class, message)
|
9
|
-
# warn(warning_instance)
|
10
|
-
#
|
11
|
-
# This method provides a +raise+-like interface. It extends the default
|
12
|
-
# warn in ::Kernel to allow the use of structured warnings.
|
13
|
-
#
|
14
|
-
# Internally it uses the StructuredWarnings::warner to format a message
|
15
|
-
# based on the given warning class, the message and a stack frame.
|
16
|
-
# The return value is passed to super, which is likely the implementation
|
17
|
-
# in ::Kernel. That way, it is less likely, that structured_warnings
|
18
|
-
# interferes with other extensions.
|
19
|
-
#
|
20
|
-
# It the warner return nil or an empty string the underlying warn will not
|
21
|
-
# be called. That way, warnings may be transferred to other devices without
|
22
|
-
# the need to redefine ::Kernel#warn.
|
23
|
-
#
|
24
|
-
# Just like the original version, this method does not take command line
|
25
|
-
# switches or verbosity levels into account. In order to deactivate all
|
26
|
-
# warnings use <code>Warning.disable</code>.
|
27
|
-
#
|
28
|
-
# warn "This is an old-style warning" # This will emit a StandardWarning
|
29
|
-
#
|
30
|
-
# class Foo
|
31
|
-
# def bar
|
32
|
-
# warn DeprecationWarning, "Never use bar again, use beer"
|
33
|
-
# end
|
34
|
-
# def beer
|
35
|
-
# "Ahhh"
|
36
|
-
# end
|
37
|
-
# end
|
38
|
-
#
|
39
|
-
# warn Warning.new("The least specific warning you can get")
|
40
|
-
#
|
41
|
-
def warn(*args)
|
42
|
-
first = args.shift
|
43
|
-
if first.is_a? Class and first <= Warning
|
44
|
-
warning = first
|
45
|
-
message = args.shift
|
46
|
-
|
47
|
-
elsif first.is_a? Warning
|
48
|
-
warning = first.class
|
49
|
-
message = first.message
|
50
|
-
|
51
|
-
else
|
52
|
-
warning = StandardWarning
|
53
|
-
message = first.to_s
|
54
|
-
end
|
55
|
-
|
56
|
-
# If args is not empty, user passed an incompatible set of arguments.
|
57
|
-
# Maybe somebody else is overriding warn as well and knows, what to do.
|
58
|
-
# Better do nothing in this case. See #5
|
59
|
-
return super unless args.empty?
|
60
|
-
|
61
|
-
if warning.active?
|
62
|
-
output = StructuredWarnings.warner.format(warning, message, caller(1))
|
63
|
-
super(output) unless output.nil? or output.to_s.empty?
|
64
|
-
end
|
65
|
-
end
|
1
|
+
module StructuredWarnings::Kernel
|
2
|
+
def warn(*args)
|
3
|
+
Warning.warn(*args)
|
66
4
|
end
|
67
5
|
end
|
6
|
+
|
7
|
+
Object.class_eval { include StructuredWarnings::Kernel }
|