deprecated 3.0.0 → 3.0.1
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.
- data/Rakefile +27 -41
- data/lib/deprecated.rb +110 -110
- data/test/test_deprecated.rb +78 -76
- metadata +41 -40
data/Rakefile
CHANGED
@@ -2,18 +2,14 @@
|
|
2
2
|
# Please see the COPYING file in the source distribution for copyright information.
|
3
3
|
#
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
gem 'test-unit'
|
8
|
-
rescue LoadError
|
9
|
-
end
|
10
|
-
|
11
|
-
$:.unshift 'lib'
|
5
|
+
require 'rubygems'
|
6
|
+
require 'rubygems/package_task'
|
12
7
|
require 'rake/testtask'
|
13
|
-
require 'rake/packagetask'
|
14
|
-
require 'rake/gempackagetask'
|
15
8
|
require 'rdoc/task'
|
9
|
+
|
10
|
+
$:.unshift 'lib'
|
16
11
|
require 'deprecated'
|
12
|
+
$:.shift
|
17
13
|
|
18
14
|
task :default => [ :dist ]
|
19
15
|
|
@@ -22,9 +18,9 @@ task :default => [ :dist ]
|
|
22
18
|
#
|
23
19
|
|
24
20
|
Rake::TestTask.new do |t|
|
25
|
-
|
26
|
-
|
27
|
-
|
21
|
+
t.libs << 'lib'
|
22
|
+
t.test_files = FileList['test/test*.rb']
|
23
|
+
t.verbose = true
|
28
24
|
end
|
29
25
|
|
30
26
|
#
|
@@ -35,21 +31,16 @@ task :dist => [:test, :repackage, :gem, :rdoc]
|
|
35
31
|
task :distclean => [:clobber_package, :clobber_rdoc]
|
36
32
|
task :clean => [:distclean]
|
37
33
|
|
38
|
-
task :to_blog => [:clobber_rdoc, :rdoc] do
|
39
|
-
sh "rm -r $git/blog/content/docs/deprecated && mv rdoc $git/blog/content/docs/deprecated"
|
40
|
-
end
|
41
|
-
|
42
|
-
|
43
34
|
#
|
44
35
|
# Documentation
|
45
36
|
#
|
46
37
|
|
47
38
|
RDoc::Task.new do |rd|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
39
|
+
rd.rdoc_dir = "rdoc"
|
40
|
+
rd.main = "README"
|
41
|
+
rd.rdoc_files.include("README")
|
42
|
+
rd.rdoc_files.include("./lib/**/*.rb")
|
43
|
+
rd.options = %w(-a)
|
53
44
|
end
|
54
45
|
|
55
46
|
#
|
@@ -57,25 +48,20 @@ end
|
|
57
48
|
#
|
58
49
|
|
59
50
|
spec = Gem::Specification.new do |s|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
Rake::GemPackageTask.new(spec) do |s|
|
51
|
+
s.name = "deprecated"
|
52
|
+
s.version = Deprecated::VERSION
|
53
|
+
s.author = "Erik Hollensbe"
|
54
|
+
s.email = "erik@hollensbe.org"
|
55
|
+
s.summary = "An easy way to handle deprecating and conditionally running deprecated code"
|
56
|
+
s.has_rdoc = true
|
57
|
+
s.files = Dir['Rakefile'] + Dir['lib/deprecated.rb'] + Dir['test/test_deprecated.rb']
|
58
|
+
s.test_file = "test/test_deprecated.rb"
|
59
|
+
s.rubyforge_project = 'deprecated'
|
60
|
+
s.license = "MIT"
|
61
|
+
s.add_development_dependency "test-unit", ">= 0"
|
72
62
|
end
|
73
63
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
p.package_files.include("./setup.rb")
|
78
|
-
p.package_files.include("./Rakefile")
|
79
|
-
p.package_files.include("./lib/**/*.rb")
|
80
|
-
p.package_files.include("./test/**/*")
|
64
|
+
Gem::PackageTask.new(spec) do |p|
|
65
|
+
p.need_tar_gz = true
|
66
|
+
p.need_zip = true
|
81
67
|
end
|
data/lib/deprecated.rb
CHANGED
@@ -70,134 +70,134 @@ class DeprecatedError < StandardError; end
|
|
70
70
|
# Deprecated::Module#deprecated_set_action for more information.
|
71
71
|
#
|
72
72
|
module Deprecated
|
73
|
-
|
73
|
+
VERSION = "3.0.1"
|
74
74
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
end
|
75
|
+
def __deprecated_run_action__(sym, replacement)
|
76
|
+
if self.class.instance_eval { @__deprecated_run_action__ }
|
77
|
+
self.class.instance_eval { @__deprecated_run_action__ }.call(self.class, sym, replacement)
|
78
|
+
else
|
79
|
+
Deprecated.run_action(self.class, sym, replacement)
|
81
80
|
end
|
81
|
+
end
|
82
82
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
if replacement
|
87
|
-
message += " Please use #{replacement}."
|
88
|
-
end
|
83
|
+
def self.build_message(klass, sym, replacement)
|
84
|
+
message = "#{klass}##{sym} is deprecated."
|
89
85
|
|
90
|
-
|
86
|
+
if replacement
|
87
|
+
message += " Please use #{replacement}."
|
91
88
|
end
|
92
89
|
|
93
|
-
|
94
|
-
|
95
|
-
# provide the block, any canned argument is ignored.
|
96
|
-
#
|
97
|
-
# The canned arguments are:
|
98
|
-
#
|
99
|
-
# :warn:: display a warning
|
100
|
-
# :raise:: raise a DeprecatedError (a kind of StandardError) with the warning.
|
101
|
-
# :fail:: fail. die. kaput. it's over.
|
102
|
-
#
|
103
|
-
# Procs take three arguments:
|
104
|
-
#
|
105
|
-
# - The class of the method
|
106
|
-
# - The method name itself, a symbol
|
107
|
-
# - A replacement string which may be nil
|
108
|
-
#
|
109
|
-
def self.set_action(type=nil, &block)
|
110
|
-
@action = if block
|
111
|
-
block
|
112
|
-
else
|
113
|
-
case type
|
114
|
-
when :warn
|
115
|
-
proc { |*args| warn build_message(*args) }
|
116
|
-
when :fail
|
117
|
-
proc { |*args| fail build_message(*args) }
|
118
|
-
when :raise
|
119
|
-
proc { |*args| raise DeprecatedError, build_message(*args) }
|
120
|
-
else
|
121
|
-
raise ArgumentError, "you must provide a symbol or a block to set_action()."
|
122
|
-
end
|
123
|
-
end
|
124
|
-
end
|
90
|
+
return message
|
91
|
+
end
|
125
92
|
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
93
|
+
#
|
94
|
+
# set_action takes 3 "canned" arguments or an arbitrary block. If you
|
95
|
+
# provide the block, any canned argument is ignored.
|
96
|
+
#
|
97
|
+
# The canned arguments are:
|
98
|
+
#
|
99
|
+
# :warn:: display a warning
|
100
|
+
# :raise:: raise a DeprecatedError (a kind of StandardError) with the warning.
|
101
|
+
# :fail:: fail. die. kaput. it's over.
|
102
|
+
#
|
103
|
+
# Procs take three arguments:
|
104
|
+
#
|
105
|
+
# - The class of the method
|
106
|
+
# - The method name itself, a symbol
|
107
|
+
# - A replacement string which may be nil
|
108
|
+
#
|
109
|
+
def self.set_action(type=nil, &block)
|
110
|
+
@action = if block
|
111
|
+
block
|
112
|
+
else
|
113
|
+
case type
|
114
|
+
when :warn
|
115
|
+
proc { |*args| warn build_message(*args) }
|
116
|
+
when :fail
|
117
|
+
proc { |*args| fail build_message(*args) }
|
118
|
+
when :raise
|
119
|
+
proc { |*args| raise DeprecatedError, build_message(*args) }
|
120
|
+
else
|
121
|
+
raise ArgumentError, "you must provide a symbol or a block to set_action()."
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
134
125
|
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
126
|
+
#
|
127
|
+
# Is called when an action needs to be run. Proably not in your best
|
128
|
+
# interest to run this directly.
|
129
|
+
#
|
130
|
+
def self.run_action(klass, sym, replacement)
|
131
|
+
raise "run_action has no associated hook" unless @action
|
132
|
+
@action.call(klass, sym, replacement)
|
133
|
+
end
|
134
|
+
|
135
|
+
#
|
136
|
+
# Returns the current action; this may be block or Proc.
|
137
|
+
#
|
138
|
+
def self.action
|
139
|
+
@action
|
140
|
+
end
|
141
141
|
end
|
142
142
|
|
143
143
|
module Deprecated
|
144
|
-
|
144
|
+
module Module
|
145
145
|
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
146
|
+
#
|
147
|
+
# deprecated takes up to three arguments:
|
148
|
+
#
|
149
|
+
# - A symbol which is the name of the method you wish to deprecate
|
150
|
+
# (required)
|
151
|
+
# - A string or symbol which is the replacement method. If you provide
|
152
|
+
# this, your users will be instructed to use that method instead.
|
153
|
+
# - A symbol of :public, :private, or :protected which determines the
|
154
|
+
# new scope of the method. If you do not provide one, it will be
|
155
|
+
# searched for in the various collections, and scope will be chosen
|
156
|
+
# that way.
|
157
|
+
#
|
158
|
+
def deprecated(sym, replacement=nil, scope=nil)
|
159
|
+
unless sym.kind_of?(Symbol)
|
160
|
+
raise ArgumentError, "deprecated() requires symbols for its first argument."
|
161
|
+
end
|
162
162
|
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
163
|
+
meth = instance_method(sym)
|
164
|
+
unless scope
|
165
|
+
pub = public_instance_methods
|
166
|
+
pro = protected_instance_methods
|
167
|
+
pri = private_instance_methods
|
168
|
+
if pub.include?(sym) or pub.include?(sym.to_s)
|
169
|
+
scope = :public
|
170
|
+
elsif pro.include?(sym) or pro.include?(sym.to_s)
|
171
|
+
scope = :protected
|
172
|
+
elsif pri.include?(sym) or pri.include?(sym.to_s)
|
173
|
+
scope = :private
|
174
|
+
end
|
175
|
+
end
|
176
176
|
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
177
|
+
define_method(sym) do |*args|
|
178
|
+
dep_meth = method(sym).unbind
|
179
|
+
__deprecated_run_action__(sym, replacement)
|
180
|
+
retval = meth.bind(self).call(*args)
|
181
|
+
dep_meth.bind(self)
|
182
|
+
return retval
|
183
|
+
end
|
184
184
|
|
185
|
-
|
186
|
-
|
187
|
-
|
185
|
+
method(scope).call(sym) if scope
|
186
|
+
return scope
|
187
|
+
end
|
188
188
|
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
end
|
189
|
+
#
|
190
|
+
# Deprecated.set_action for class scope. See Deprecated.set_action.
|
191
|
+
#
|
192
|
+
def deprecated_set_action(&block)
|
193
|
+
raise "You must provide a block" unless block
|
194
|
+
@__deprecated_run_action__ = block
|
196
195
|
end
|
196
|
+
end
|
197
197
|
|
198
|
-
|
199
|
-
|
200
|
-
|
198
|
+
def self.included(base)
|
199
|
+
base.extend(Module)
|
200
|
+
end
|
201
201
|
end
|
202
202
|
|
203
203
|
Deprecated.set_action(:warn)
|
data/test/test_deprecated.rb
CHANGED
@@ -3,111 +3,113 @@
|
|
3
3
|
require 'rubygems'
|
4
4
|
gem 'test-unit'
|
5
5
|
require 'test/unit'
|
6
|
-
|
6
|
+
$:.unshift 'lib'
|
7
|
+
require 'deprecated.rb'
|
8
|
+
$:.shift
|
7
9
|
|
8
10
|
# this class is used to test the deprecate functionality
|
9
11
|
class DummyClass
|
10
|
-
|
12
|
+
include Deprecated
|
11
13
|
|
12
|
-
|
13
|
-
|
14
|
-
|
14
|
+
def monkey
|
15
|
+
return true
|
16
|
+
end
|
15
17
|
|
16
|
-
|
17
|
-
|
18
|
-
|
18
|
+
def monkey_bars
|
19
|
+
return true
|
20
|
+
end
|
19
21
|
|
20
|
-
|
21
|
-
|
22
|
+
deprecated :monkey
|
23
|
+
deprecated :monkey_bars, "FooClass#fart"
|
22
24
|
|
23
|
-
|
25
|
+
protected
|
24
26
|
|
25
|
-
|
26
|
-
|
27
|
-
|
27
|
+
def my_protected
|
28
|
+
return true
|
29
|
+
end
|
28
30
|
|
29
|
-
|
31
|
+
deprecated :my_protected
|
30
32
|
|
31
|
-
|
33
|
+
private
|
32
34
|
|
33
|
-
|
34
|
-
|
35
|
-
|
35
|
+
def my_private
|
36
|
+
return true
|
37
|
+
end
|
36
38
|
|
37
|
-
|
39
|
+
deprecated :my_private
|
38
40
|
end
|
39
41
|
|
40
42
|
class DummyClass2
|
41
|
-
|
43
|
+
include Deprecated
|
42
44
|
|
43
|
-
|
44
|
-
|
45
|
-
|
45
|
+
deprecated_set_action do |klass, sym, replacement|
|
46
|
+
raise DeprecatedError, "foo!"
|
47
|
+
end
|
46
48
|
|
47
|
-
|
48
|
-
|
49
|
-
|
49
|
+
def monkey
|
50
|
+
return true
|
51
|
+
end
|
50
52
|
|
51
|
-
|
53
|
+
deprecated :monkey
|
52
54
|
end
|
53
55
|
|
54
56
|
# we want exceptions for testing here.
|
55
57
|
Deprecated.set_action(:raise)
|
56
58
|
|
57
59
|
class DeprecateTest < Test::Unit::TestCase
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
Deprecated.set_action { |klass, sym| raise DeprecatedError.new("#{klass}##{sym} is deprecated.") }
|
62
|
-
assert_raises(DeprecatedError.new("DummyClass#monkey is deprecated.")) do
|
63
|
-
DummyClass.new.monkey
|
64
|
-
end
|
60
|
+
def test_set_action
|
61
|
+
assert_raises(DeprecatedError) { DummyClass.new.monkey }
|
65
62
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
DummyClass.new.monkey
|
70
|
-
end
|
71
|
-
|
72
|
-
# set to warn and make sure our return values are getting through.
|
73
|
-
Deprecated.set_action(:warn)
|
74
|
-
assert(DummyClass.new.monkey)
|
75
|
-
|
76
|
-
Kernel.module_eval {
|
77
|
-
def self.fail
|
78
|
-
raise "failed"
|
79
|
-
end
|
80
|
-
}
|
81
|
-
|
82
|
-
Deprecated.set_action(:fail)
|
83
|
-
|
84
|
-
assert_raises("failed") { DummyClass.new.monkey }
|
63
|
+
Deprecated.set_action { |klass, sym| raise DeprecatedError.new("#{klass}##{sym} is deprecated.") }
|
64
|
+
assert_raises(DeprecatedError.new("DummyClass#monkey is deprecated.")) do
|
65
|
+
DummyClass.new.monkey
|
85
66
|
end
|
86
67
|
|
87
|
-
|
88
|
-
assert(
|
89
|
-
DummyClass.public_instance_methods.include?(:monkey) ||
|
90
|
-
DummyClass.public_instance_methods.include?("monkey")
|
91
|
-
)
|
92
|
-
assert(
|
93
|
-
DummyClass.protected_instance_methods.include?(:my_protected) ||
|
94
|
-
DummyClass.protected_instance_methods.include?("my_protected")
|
95
|
-
)
|
96
|
-
assert(
|
97
|
-
DummyClass.private_instance_methods.include?(:my_private) ||
|
98
|
-
DummyClass.private_instance_methods.include?("my_private")
|
99
|
-
)
|
100
|
-
end
|
68
|
+
Deprecated.set_action(:raise)
|
101
69
|
|
102
|
-
|
103
|
-
|
70
|
+
assert_raises(DeprecatedError.new("DummyClass#monkey is deprecated.")) do
|
71
|
+
DummyClass.new.monkey
|
104
72
|
end
|
105
73
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
74
|
+
# set to warn and make sure our return values are getting through.
|
75
|
+
Deprecated.set_action(:warn)
|
76
|
+
assert(DummyClass.new.monkey)
|
77
|
+
|
78
|
+
Kernel.module_eval {
|
79
|
+
def self.fail
|
80
|
+
raise "failed"
|
81
|
+
end
|
82
|
+
}
|
83
|
+
|
84
|
+
Deprecated.set_action(:fail)
|
85
|
+
|
86
|
+
assert_raises("failed") { DummyClass.new.monkey }
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_scope
|
90
|
+
assert(
|
91
|
+
DummyClass.public_instance_methods.include?(:monkey) ||
|
92
|
+
DummyClass.public_instance_methods.include?("monkey")
|
93
|
+
)
|
94
|
+
assert(
|
95
|
+
DummyClass.protected_instance_methods.include?(:my_protected) ||
|
96
|
+
DummyClass.protected_instance_methods.include?("my_protected")
|
97
|
+
)
|
98
|
+
assert(
|
99
|
+
DummyClass.private_instance_methods.include?(:my_private) ||
|
100
|
+
DummyClass.private_instance_methods.include?("my_private")
|
101
|
+
)
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_scoped_actions
|
105
|
+
assert_raises(DeprecatedError.new("foo!")) { DummyClass2.new.monkey }
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_replacement
|
109
|
+
Deprecated.set_action(:raise)
|
110
|
+
|
111
|
+
assert_raises(DeprecatedError.new("DummyClass#monkey_bars is deprecated. Please use FooClass#fart.")) do
|
112
|
+
DummyClass.new.monkey_bars
|
112
113
|
end
|
114
|
+
end
|
113
115
|
end
|
metadata
CHANGED
@@ -1,64 +1,65 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: deprecated
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
6
|
-
- 3
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
version: 3.0.0
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 3.0.1
|
5
|
+
prerelease:
|
10
6
|
platform: ruby
|
11
|
-
authors:
|
7
|
+
authors:
|
12
8
|
- Erik Hollensbe
|
13
9
|
autorequire:
|
14
10
|
bindir: bin
|
15
11
|
cert_chain: []
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
12
|
+
date: 2012-09-29 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: test-unit
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
21
30
|
description:
|
22
31
|
email: erik@hollensbe.org
|
23
32
|
executables: []
|
24
|
-
|
25
33
|
extensions: []
|
26
|
-
|
27
34
|
extra_rdoc_files: []
|
28
|
-
|
29
|
-
files:
|
35
|
+
files:
|
30
36
|
- Rakefile
|
31
37
|
- lib/deprecated.rb
|
32
38
|
- test/test_deprecated.rb
|
33
|
-
has_rdoc: true
|
34
39
|
homepage:
|
35
|
-
licenses:
|
36
|
-
|
40
|
+
licenses:
|
41
|
+
- MIT
|
37
42
|
post_install_message:
|
38
43
|
rdoc_options: []
|
39
|
-
|
40
|
-
require_paths:
|
44
|
+
require_paths:
|
41
45
|
- lib
|
42
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
requirements:
|
51
|
-
- -
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
|
54
|
-
- 0
|
55
|
-
version: "0"
|
46
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
47
|
+
none: false
|
48
|
+
requirements:
|
49
|
+
- - ! '>='
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '0'
|
52
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ! '>='
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '0'
|
56
58
|
requirements: []
|
57
|
-
|
58
59
|
rubyforge_project: deprecated
|
59
|
-
rubygems_version: 1.
|
60
|
+
rubygems_version: 1.8.24
|
60
61
|
signing_key:
|
61
62
|
specification_version: 3
|
62
63
|
summary: An easy way to handle deprecating and conditionally running deprecated code
|
63
|
-
test_files:
|
64
|
+
test_files:
|
64
65
|
- test/test_deprecated.rb
|