structured_warnings 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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 }
|