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 +7 -0
- data/.gitignore +5 -0
- data/CHANGELOG.md +2 -0
- data/Gemfile +2 -0
- data/Guardfile +12 -0
- data/README.md +80 -0
- data/Rakefile +11 -0
- data/deprecations.gemspec +28 -0
- data/lib/deprecations/configuration.rb +35 -0
- data/lib/deprecations/extension.rb +102 -0
- data/lib/deprecations/version.rb +3 -0
- data/lib/deprecations.rb +38 -0
- data/spec/deprecations/configuration_spec.rb +20 -0
- data/spec/deprecations/version_spec.rb +7 -0
- data/spec/deprecations_spec.rb +344 -0
- data/spec/spec_helper.rb +10 -0
- metadata +143 -0
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/CHANGELOG.md
ADDED
data/Gemfile
ADDED
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
|
data/lib/deprecations.rb
ADDED
@@ -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,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
|
data/spec/spec_helper.rb
ADDED
@@ -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: []
|