deprecations 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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b74900a310d72869dfae2f9b091e9a48da08b5fa
4
+ data.tar.gz: fc6eda630d25dbcde15725ace76a8a3d0a539c83
5
+ SHA512:
6
+ metadata.gz: f52526544a564d6be8c33d69f2140131e914adc480a0644578f8655c09b8201e4cdcf1dd43d30cb74aa5f311cce9fb52f1db349bec6874886e305fab1d60ff74
7
+ data.tar.gz: 0a7e22ebf74c2c8264f58e12abaa551b8c68d6b6921d03efc643e74dbf77029e27f9dbb28809ce6038bda2c40e6bb1bf1e3a96352b665bc306140307f056378c
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ tmp/
2
+ local/
3
+ pkg/
4
+ coverage/
5
+ Gemfile.lock
data/CHANGELOG.md ADDED
@@ -0,0 +1,2 @@
1
+ ### deprecations 1.0.0
2
+ - initial release
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,12 @@
1
+ guard(
2
+ :rspec,
3
+ cmd: 'bundle exec rspec -c',
4
+ spec_paths: ['spec'],
5
+ failed_mode: :focus,
6
+ all_on_start: true,
7
+ all_after_pass: true,
8
+ ) do
9
+ watch(%r[^spec/.+_spec.rb$])
10
+ watch(%r[^lib/.+.rb$]){ 'spec' }
11
+ watch(%r[^spec/spec_helper]){ 'spec' }
12
+ end
data/README.md ADDED
@@ -0,0 +1,80 @@
1
+ # Deprecations
2
+
3
+ This gem provides transparent declaration of deprecated methods and classes.
4
+
5
+ ## Installation
6
+
7
+ The simplest way to install Deprecations gem is to use [Bundler](http://gembundler.com/).
8
+
9
+ Add Deprecations to your `Gemfile`:
10
+
11
+ ```ruby
12
+ gem 'deprecations'
13
+ ```
14
+
15
+ and install it by running Bundler:
16
+
17
+ ```bash
18
+ $ bundle
19
+ ```
20
+
21
+ To install the gem globally use:
22
+
23
+ ```bash
24
+ $ gem install deprecations
25
+ ```
26
+
27
+ ## Usage
28
+
29
+ After adding the gem to your project
30
+
31
+ ```ruby
32
+ require 'deprecations'
33
+ ```
34
+
35
+ you can specify which methods and classes are deprecated. To mark a method as deprecated is quite easy:
36
+
37
+ ```ruby
38
+ class MySample
39
+
40
+ def clear
41
+ # something here
42
+ end
43
+
44
+ def clean
45
+ clear
46
+ end
47
+ deprecate :clean, :clear, 'next version'
48
+
49
+ end
50
+ ```
51
+
52
+ Whenever the method `MySample#clean` is called this warning appears:
53
+
54
+ > [DEPRECATION] `MySample#clean` is deprecated and will be outdated next version. Please use `MySample#clear` instead.
55
+
56
+ You can change this behavior by configure the Deprecations gem:
57
+
58
+ ```ruby
59
+ Deprecations.configure do |config|
60
+ config.behavior = :raise
61
+ end
62
+ ```
63
+
64
+ Valid behaviors are:
65
+
66
+ - `:raise` will raise an `DeprecationException` when a deprecated method is called
67
+ - `:silence` will do nothing
68
+ - `:warn` will print a warning (default behavior)
69
+
70
+ Marking a complete class as deprecated will present the deprecation warning (or exception) whenever this class is instantiated:
71
+
72
+ ```ruby
73
+ class MySample
74
+ deprecated!
75
+
76
+ # some more code here...
77
+ end
78
+ ```
79
+
80
+ Please have a look at the [specs](https://github.com/mblumtritt/deprecations/blob/master/spec/deprecations_spec.rb) for detailed information and more samples.
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ ENV.key?('NO_RUBYGEMS') or require('rubygems')
2
+ require 'bundler/gem_tasks'
3
+
4
+ require 'rspec/core/rake_task'
5
+ RSpec::Core::RakeTask.new(:test) do |t|
6
+ t.pattern = ['spec/*_spec.rb', 'spec/**/*/*_spec.rb']
7
+ t.rspec_opts = '-w'
8
+ t.verbose = Rake.application.options.trace
9
+ end
10
+
11
+ task default: :test
@@ -0,0 +1,28 @@
1
+ require File.expand_path('../lib/deprecations/version', __FILE__)
2
+
3
+ GemSpec= Gem::Specification.new do |spec|
4
+ spec.required_rubygems_version = Gem::Requirement.new('>= 1.3.6')
5
+ spec.platform = Gem::Platform::RUBY
6
+ spec.required_ruby_version = '>= 2.0.0'
7
+ spec.name = spec.rubyforge_project = 'deprecations'
8
+ spec.version = Deprecations::VERSION
9
+ spec.authors = ['Mike Blumtritt']
10
+ spec.email = %w[mike.blumtritt@injixo.com]
11
+ spec.summary = 'Deprecation support for your project.'
12
+ spec.description = 'This gem provides transparent declaration of deprecated methods and classes.'
13
+ spec.homepage = 'https://github.com/mblumtritt/deprecations'
14
+ spec.date = Time.now.strftime('%Y-%m-%d')
15
+ spec.require_paths = %w[lib]
16
+ spec.files = %x[git ls-files].split($/)
17
+ spec.test_files = spec.files.grep(%r[^test/])
18
+ spec.extra_rdoc_files = %w[README.md]
19
+ spec.has_rdoc = false # TODO!
20
+ spec.add_development_dependency 'rake'
21
+ spec.add_development_dependency 'rspec', '>= 3.0.0'
22
+ spec.add_development_dependency 'guard'
23
+ spec.add_development_dependency 'guard-rspec'
24
+ if /darwin|mac os/i =~ RUBY_PLATFORM
25
+ spec.add_development_dependency 'rb-fsevent'
26
+ spec.add_development_dependency 'terminal-notifier-guard'
27
+ end
28
+ end
@@ -0,0 +1,35 @@
1
+
2
+ module Deprecations
3
+ class << self
4
+
5
+ def configure
6
+ yield(@@cfg = Cfg.new)
7
+ end
8
+
9
+ def configuration
10
+ @@cfg
11
+ end
12
+
13
+ BEHAVIORS = [:warn, :raise, :silence].freeze
14
+
15
+ private
16
+
17
+ class Cfg < BasicObject
18
+ attr_reader :behavior
19
+
20
+ def initialize
21
+ @behavior = :warn
22
+ end
23
+
24
+ def behavior=(how)
25
+ BEHAVIORS.include?(how) and return @behavior = how
26
+ ::Kernel.raise(
27
+ ::ArgumentError, "invalid parameter `#{how}` - have to be #{BEHAVIORS.map(&:inspect).join(' | ')}"
28
+ )
29
+ end
30
+
31
+ end
32
+
33
+ @@cfg = Cfg.new
34
+ end
35
+ end
@@ -0,0 +1,102 @@
1
+
2
+ module Deprecations
3
+ class << self
4
+ private
5
+ def infect(mod)
6
+ mod.extend(ClassMethods)
7
+ mod.send(:include, InstanceMethods)
8
+ end
9
+
10
+ module Helper
11
+ private
12
+
13
+ def __method_scope(method_name)
14
+ private_method_defined?(method_name) and return :private
15
+ protected_method_defined?(method_name) and return :protected
16
+ public_method_defined?(method_name) and return :public
17
+ nil
18
+ end
19
+
20
+ def __define_deprecated(opts)
21
+ alias_name = "deprecated_#{opts[:name]}"
22
+ private_method_defined?(alias_name) and raise(
23
+ ScriptError, "method is already deprecated - #{opts[:decorated]}"
24
+ )
25
+ alias_method(alias_name, opts[:name])
26
+ private(alias_name)
27
+ define_method(opts[:name]) do |*a, &b|
28
+ Deprecations.call(opts[:decorated], opts[:alternative], opts[:outdated])
29
+ send(alias_name, *a, &b)
30
+ end
31
+ send(opts[:scope], opts[:name])
32
+ opts[:name]
33
+ end
34
+ end
35
+
36
+ module ClassMethods
37
+ include Helper
38
+ private
39
+
40
+ def deprecated(method_name, alternative_method_name = nil, outdated = nil)
41
+ method_scope = __method_scope(method_name) or __not_found!(method_name)
42
+ __define_deprecated(
43
+ name: method_name,
44
+ scope: method_scope,
45
+ decorated: "#{self.inspect[8..-2]}.#{method_name}",
46
+ alternative: __decorated(alternative_method_name),
47
+ outdated: outdated
48
+ )
49
+ ensure
50
+ $@ and $@.delete_if{ |s| s.index(__FILE__) }
51
+ end
52
+
53
+ def __decorated(name)
54
+ name or return nil
55
+ __method_scope(name) and return "#{self.inspect[8..-2]}.#{name}"
56
+ Symbol === name and __not_found!(name)
57
+ name
58
+ end
59
+
60
+ def __not_found!(name)
61
+ raise(NameError, "undefined method `#{name}` for class `#{self.inspect[8..-2]}`")
62
+ end
63
+ end
64
+
65
+ module InstanceMethods
66
+ include Helper
67
+ private
68
+
69
+ def deprecated!(alternative = nil, outdated = nil)
70
+ singleton_class.send(
71
+ :__define_deprecated,
72
+ name: :new,
73
+ scope: :public,
74
+ decorated: name,
75
+ alternative: alternative ? "#{alternative}" : nil,
76
+ outdated: outdated
77
+ )
78
+ end
79
+
80
+ def deprecated(method_name, alternative_method_name = nil, outdated = nil)
81
+ method_scope = __method_scope(method_name) and return __define_deprecated(
82
+ name: method_name,
83
+ scope: method_scope,
84
+ decorated: "#{name}##{method_name}",
85
+ alternative: __decorated(alternative_method_name),
86
+ outdated: outdated
87
+ )
88
+ singleton_class.send(:deprecated, method_name, alternative_method_name, outdated)
89
+ ensure
90
+ $@ and $@.delete_if{ |s| s.index(__FILE__) }
91
+ end
92
+
93
+ def __decorated(name)
94
+ name or return nil
95
+ __method_scope(name) ? "#{self.name}##{name}" : singleton_class.send(:__decorated, name)
96
+ end
97
+ end
98
+ end
99
+
100
+ infect(Module)
101
+ TOPLEVEL_BINDING.eval('DeprecationError = Class.new(ScriptError)')
102
+ end
@@ -0,0 +1,3 @@
1
+ module Deprecations
2
+ VERSION = '1.0.0'
3
+ end
@@ -0,0 +1,38 @@
1
+
2
+ module Deprecations
3
+ autoload(:VERSION, "#{__FILE__[/.*(?=\..+$)/]}/version")
4
+ require_relative 'deprecations/configuration'
5
+ require_relative 'deprecations/extension'
6
+
7
+ class << self
8
+
9
+ def call(subject, alternative, outdated)
10
+ case configuration.behavior
11
+ when :warn
12
+ warn(subject, alternative, outdated)
13
+ when :raise
14
+ throw!(subject, alternative)
15
+ end
16
+ self
17
+ end
18
+
19
+ private
20
+
21
+ def throw!(subject, alternative)
22
+ msg = "`#{subject}` is deprecated"
23
+ alternative and msg << " - use #{alternative} instead"
24
+ ex = DeprecationError.new(msg)
25
+ ex.set_backtrace(caller(3))
26
+ raise(ex)
27
+ end
28
+
29
+ def warn(subject, alternative, outdated)
30
+ location = ::Kernel.caller_locations(3,1).last and location = "#{location.path}:#{location.lineno}: "
31
+ msg = "#{location}[DEPRECATION] `#{subject}` is deprecated"
32
+ msg << (outdated ? " and will be outdated #{outdated}." : '.')
33
+ alternative and msg << " Please use `#{alternative}` instead."
34
+ ::Kernel.warn(msg)
35
+ end
36
+
37
+ end
38
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe 'Deprecations::Configuration' do
4
+ it 'is possible to configure the module' do
5
+ Deprecations.configure do |config|
6
+ config.behavior = :silence
7
+ end
8
+ expect(Deprecations.configuration.behavior).to be :silence
9
+ end
10
+
11
+ context 'when invalid arguments are given' do
12
+ it 'raises an error' do
13
+ expect do
14
+ Deprecations.configure do |config|
15
+ config.behavior = :invalid_value
16
+ end
17
+ end.to raise_error(ArgumentError, /invalid_value/)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Deprecations::VERSION do
4
+ it 'has format <major>.<minor>.<build>' do
5
+ expect(subject).to match(/^\d{1,2}\.\d{1,2}\.\d{1,3}/)
6
+ end
7
+ end
@@ -0,0 +1,344 @@
1
+ require 'spec_helper'
2
+
3
+ module DeprecationsSamples # samples how to use
4
+
5
+ # mixin with some methods for demonstration
6
+ module MethodSamples
7
+ def foo(*parameters)
8
+ block_given? ? yield(parameters) : {foo: parameters}
9
+ end
10
+
11
+ def alt
12
+ :nop
13
+ end
14
+ end
15
+
16
+ # mixin with initializer method for demonstration
17
+ module InitializerSample
18
+ attr_reader :parameters
19
+ def initialize(*parameters)
20
+ @parameters = block_given? ? yield(parameters) : {foo: parameters}
21
+ end
22
+ end
23
+
24
+ # here we go:
25
+
26
+ # method Sample1#foo is deprecated
27
+ class Sample1
28
+ include MethodSamples
29
+ deprecated :foo
30
+ end
31
+
32
+ # method Sample2#foo is deprecated, Sample2#alt should be used
33
+ class Sample2
34
+ include MethodSamples
35
+ deprecated :foo, :alt
36
+ end
37
+
38
+ # method Sample3#foo is deprecated and will be outdated in next version, Sample3#alt should be used
39
+ class Sample3
40
+ include MethodSamples
41
+ deprecated :foo, :alt, 'next version'
42
+ end
43
+
44
+ # class method Sample4::foo is deprecated
45
+ class Sample4
46
+ extend MethodSamples
47
+ deprecated :foo
48
+ end
49
+
50
+ # class method Sample5::foo is deprecated, Sample5::alt should be used
51
+ class Sample5
52
+ extend MethodSamples
53
+ deprecated :foo, :alt
54
+ end
55
+
56
+ # class method Sample6::foo is deprecated and will be outdated in next version, Sample6::alt should be used
57
+ class Sample6
58
+ extend MethodSamples
59
+ deprecated :foo, :alt, 'next version'
60
+ end
61
+
62
+ # class Sample7 is deprecated
63
+ class Sample7
64
+ include InitializerSample
65
+ deprecated!
66
+ end
67
+
68
+ # class Sample8 is deprecated, class Sample1 should be used
69
+ class Sample8
70
+ include InitializerSample
71
+ deprecated! Sample1
72
+ end
73
+
74
+ # class Sample9 is deprecated and will be outdated in version 2.0.0, class Sample1 should be used
75
+ class Sample9
76
+ include InitializerSample
77
+ deprecated! Sample1, 'in 2.0.0'
78
+ end
79
+
80
+ end
81
+
82
+ RSpec.shared_examples_for 'a transparent deprecated method' do
83
+ it 'forwards all parameter and returns the original method`s result' do
84
+ allow(Kernel).to receive(:warn)
85
+ expect(sample.foo(:arg1, :arg2, 42)).to eq(foo: [:arg1, :arg2, 42])
86
+ end
87
+
88
+ it 'forwards a given Proc to the original method' do
89
+ allow(Kernel).to receive(:warn)
90
+ expect(sample.foo(:arg1, 'test', 42){ |p| {via_block: p} }).to eq(via_block: [:arg1, 'test', 42])
91
+ end
92
+ end
93
+
94
+ RSpec.shared_examples_for 'a deprecated method (warnings enabled)' do
95
+ it_should_behave_like 'a transparent deprecated method'
96
+
97
+ it 'warns about the deprecation' do
98
+ expect(Kernel).to receive(:warn).once.with(/\bDeprecationsSamples::Sample\d[\.#]foo\b.*\bdeprecated\b/)
99
+ sample.foo
100
+ end
101
+
102
+ it 'points to the calling line' do
103
+ expect(Kernel).to receive(:warn).with(/#{__FILE__}:#{__LINE__ + 1}/)
104
+ sample.foo
105
+ end
106
+
107
+ end
108
+
109
+ RSpec.shared_examples_for 'a deprecated method (should throw)' do
110
+ it 'raises an DeprecationError' do
111
+ expect{ sample.foo }.to raise_error(DeprecationError, /\bDeprecationsSamples::Sample\d[\.#]foo\b.*\bdeprecated\b/)
112
+ end
113
+
114
+ it 'has a helpful backtrace' do
115
+ backtrace = nil
116
+ begin
117
+ sample.foo
118
+ rescue DeprecationError => err
119
+ backtrace = err.backtrace
120
+ end
121
+ expect(backtrace.first).to match(/#{__FILE__}:#{__LINE__ - 4}/)
122
+ end
123
+ end
124
+
125
+ RSpec.shared_examples_for 'a transparent deprecated class' do
126
+ it 'calls the original initializer with all parameters' do
127
+ allow(Kernel).to receive(:warn)
128
+ instance = sample.new(:arg1, :arg2, 42)
129
+ expect(instance.parameters).to eq(foo: [:arg1, :arg2, 42])
130
+ end
131
+
132
+ it 'forwards a given Proc to the original initializer' do
133
+ allow(Kernel).to receive(:warn)
134
+ instance = sample.new(:arg1, 'test', 42){ |p| {via_block: p} }
135
+ expect(instance.parameters).to eq(via_block: [:arg1, 'test', 42])
136
+ end
137
+ end
138
+
139
+ RSpec.shared_examples_for 'a deprecated class (warnings enabled)' do
140
+ it_should_behave_like 'a transparent deprecated class'
141
+
142
+ it 'warns about the deprecation' do
143
+ expect(Kernel).to receive(:warn).once.with(/\b#{sample}\b.*\bdeprecated\b/)
144
+ sample.new
145
+ end
146
+
147
+ it 'points to the calling line' do
148
+ expect(Kernel).to receive(:warn).with(/#{__FILE__}:#{__LINE__ + 1}/)
149
+ sample.new
150
+ end
151
+ end
152
+
153
+ RSpec.shared_examples_for 'a deprecated class (should throw)' do
154
+ it 'raises an DeprecationError' do
155
+ expect{ sample.new }.to raise_error(DeprecationError, /\bDeprecationsSamples::Sample\d\b.*\bdeprecated\b/)
156
+ end
157
+
158
+ it 'has a helpful backtrace' do
159
+ backtrace = nil
160
+ begin
161
+ sample.new
162
+ rescue DeprecationError => err
163
+ backtrace = err.backtrace
164
+ end
165
+ expect(backtrace.first).to match(/#{__FILE__}:#{__LINE__ - 4}/)
166
+ end
167
+ end
168
+
169
+ RSpec.describe Deprecations do
170
+ context 'when configured as silent' do
171
+ before :all do
172
+ Deprecations.configuration.behavior = :silence
173
+ end
174
+
175
+ context 'when an instance method is marked as deprecated' do
176
+ let(:sample){ DeprecationsSamples::Sample1.new }
177
+ it_should_behave_like 'a transparent deprecated method'
178
+ end
179
+
180
+ context 'when a class method is marked as deprecated' do
181
+ let(:sample){ DeprecationsSamples::Sample4 }
182
+ it_should_behave_like 'a transparent deprecated method'
183
+ end
184
+
185
+ context 'when a class is marked as deprecated' do
186
+ let(:sample){ DeprecationsSamples::Sample7 }
187
+ it_should_behave_like 'a transparent deprecated class'
188
+ end
189
+ end
190
+
191
+ context 'when configured to warn' do
192
+ before :all do
193
+ Deprecations.configuration.behavior = :warn
194
+ end
195
+
196
+ context 'when an instance method is marked as deprecated' do
197
+ let(:sample){ DeprecationsSamples::Sample1.new }
198
+
199
+ it_should_behave_like 'a deprecated method (warnings enabled)'
200
+
201
+ context 'when an optional alternative method is given' do
202
+ let(:sample){ DeprecationsSamples::Sample2.new }
203
+
204
+ it_should_behave_like 'a deprecated method (warnings enabled)'
205
+
206
+ it 'suggests the alternative method' do
207
+ expect(Kernel).to receive(:warn).with(/DeprecationsSamples::Sample2#alt.*instead/)
208
+ sample.foo
209
+ end
210
+ end
211
+
212
+ context 'when an optional comment is given' do
213
+ let(:sample){ DeprecationsSamples::Sample3.new }
214
+
215
+ it_should_behave_like 'a deprecated method (warnings enabled)'
216
+
217
+ it 'informs about when it will become outdated' do
218
+ expect(Kernel).to receive(:warn).with(/outdated next version/)
219
+ sample.foo
220
+ end
221
+ end
222
+ end
223
+
224
+ context 'when a class method is marked as deprecated' do
225
+ let(:sample){ DeprecationsSamples::Sample4 }
226
+
227
+ it_should_behave_like 'a deprecated method (warnings enabled)'
228
+
229
+ context 'when an optional alternative method is given' do
230
+ let(:sample){ DeprecationsSamples::Sample5 }
231
+
232
+ it_should_behave_like 'a deprecated method (warnings enabled)'
233
+
234
+ it 'suggests the alternative method' do
235
+ expect(Kernel).to receive(:warn).with(/\bDeprecationsSamples::Sample5\.alt\b.*\binstead\b/)
236
+ sample.foo
237
+ end
238
+ end
239
+
240
+ context 'when an optional comment is given' do
241
+ let(:sample){ DeprecationsSamples::Sample6 }
242
+
243
+ it_should_behave_like 'a deprecated method (warnings enabled)'
244
+
245
+ it 'informs about when it will become outdated' do
246
+ expect(Kernel).to receive(:warn).with(/outdated next version/)
247
+ sample.foo
248
+ end
249
+ end
250
+
251
+ end
252
+
253
+ context 'when a class is marked as deprecated' do
254
+ let(:sample){ DeprecationsSamples::Sample7 }
255
+
256
+ it_should_behave_like 'a deprecated class (warnings enabled)'
257
+
258
+ context 'when an optional alternative class is given' do
259
+ let(:sample){ DeprecationsSamples::Sample8 }
260
+
261
+ it_should_behave_like 'a deprecated class (warnings enabled)'
262
+
263
+ it 'suggests the alternative class' do
264
+ expect(Kernel).to receive(:warn).with(/\bDeprecationsSamples::Sample1\b.*\binstead\b/)
265
+ sample.new
266
+ end
267
+ end
268
+
269
+ context 'when an optional comment is given' do
270
+ let(:sample){ DeprecationsSamples::Sample9 }
271
+
272
+ it_should_behave_like 'a deprecated class (warnings enabled)'
273
+
274
+ it 'informs about when it will become outdated' do
275
+ expect(Kernel).to receive(:warn).with(/outdated in 2.0.0/)
276
+ sample.new
277
+ end
278
+ end
279
+ end
280
+
281
+ context 'error cases' do
282
+
283
+ context 'when the method to mark as deprecated does not exist' do
284
+ it 'raises a NameError' do
285
+ expect do
286
+ Class.new do
287
+ deprecated :does_not_exist
288
+ end
289
+ end.to raise_error(NameError, /undefined method.*does_not_exist/)
290
+ end
291
+ end
292
+
293
+ context 'when the alternative method does not exist' do
294
+ it 'raises a NameError' do
295
+ expect do
296
+ Class.new do
297
+ def foo; end
298
+ deprecated :foo, :not_existing_alternative
299
+ end
300
+ end.to raise_error(NameError, /undefined method.*not_existing_alternative/)
301
+ end
302
+ end
303
+
304
+ end
305
+ end
306
+
307
+ context 'when configured to raise' do
308
+ before :all do
309
+ Deprecations.configuration.behavior = :raise
310
+ end
311
+
312
+ context 'when an instance method is marked as deprecated' do
313
+ let(:sample){ DeprecationsSamples::Sample1.new }
314
+
315
+ it_should_behave_like 'a deprecated method (should throw)'
316
+
317
+ context 'when an optional alternative method is given' do
318
+ let(:sample){ DeprecationsSamples::Sample2.new }
319
+
320
+ it_should_behave_like 'a deprecated method (should throw)'
321
+
322
+ it 'suggests the alternative method' do
323
+ expect{ sample.foo }.to raise_error(DeprecationError, /DeprecationsSamples::Sample2#alt.*instead/)
324
+ end
325
+ end
326
+ end
327
+
328
+ context 'when a class method is marked as deprecated' do
329
+ let(:sample){ DeprecationsSamples::Sample7 }
330
+
331
+ it_should_behave_like 'a deprecated class (should throw)'
332
+
333
+ context 'when an optional alternative class is given' do
334
+ let(:sample){ DeprecationsSamples::Sample8 }
335
+
336
+ it_should_behave_like 'a deprecated class (should throw)'
337
+
338
+ it 'suggests the alternative class' do
339
+ expect{ sample.new }.to raise_error(DeprecationError, /\bDeprecationsSamples::Sample8\b.*\binstead\b/)
340
+ end
341
+ end
342
+ end
343
+ end
344
+ end
@@ -0,0 +1,10 @@
1
+ # configure RSpec
2
+ RSpec.configure do |config|
3
+ config.raise_errors_for_deprecations!
4
+ config.disable_monkey_patching!
5
+ config.expose_dsl_globally = false
6
+ config.expect_with(:rspec){ |c| c.syntax = :expect }
7
+ config.mock_with(:rspec){ |c| c.syntax = :expect }
8
+ end
9
+
10
+ require 'deprecations'
metadata ADDED
@@ -0,0 +1,143 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: deprecations
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Mike Blumtritt
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-06-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
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'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 3.0.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 3.0.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: guard
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: guard-rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rb-fsevent
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: terminal-notifier-guard
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: This gem provides transparent declaration of deprecated methods and classes.
98
+ email:
99
+ - mike.blumtritt@injixo.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files:
103
+ - README.md
104
+ files:
105
+ - ".gitignore"
106
+ - CHANGELOG.md
107
+ - Gemfile
108
+ - Guardfile
109
+ - README.md
110
+ - Rakefile
111
+ - deprecations.gemspec
112
+ - lib/deprecations.rb
113
+ - lib/deprecations/configuration.rb
114
+ - lib/deprecations/extension.rb
115
+ - lib/deprecations/version.rb
116
+ - spec/deprecations/configuration_spec.rb
117
+ - spec/deprecations/version_spec.rb
118
+ - spec/deprecations_spec.rb
119
+ - spec/spec_helper.rb
120
+ homepage: https://github.com/mblumtritt/deprecations
121
+ licenses: []
122
+ metadata: {}
123
+ post_install_message:
124
+ rdoc_options: []
125
+ require_paths:
126
+ - lib
127
+ required_ruby_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: 2.0.0
132
+ required_rubygems_version: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: 1.3.6
137
+ requirements: []
138
+ rubyforge_project: deprecations
139
+ rubygems_version: 2.2.2
140
+ signing_key:
141
+ specification_version: 4
142
+ summary: Deprecation support for your project.
143
+ test_files: []