reek 1.2.3 → 1.2.4
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +9 -1
- data/features/options.feature +1 -9
- data/features/samples.feature +7 -2
- data/features/step_definitions/reek_steps.rb +3 -3
- data/lib/reek.rb +1 -1
- data/lib/reek/adapters/application.rb +22 -27
- data/lib/reek/adapters/command_line.rb +41 -42
- data/lib/reek/adapters/report.rb +30 -23
- data/lib/reek/adapters/spec.rb +1 -1
- data/lib/reek/code_context.rb +6 -2
- data/lib/reek/code_parser.rb +3 -7
- data/lib/reek/detector_stack.rb +2 -4
- data/lib/reek/help_command.rb +14 -0
- data/lib/reek/masking_collection.rb +33 -0
- data/lib/reek/method_context.rb +18 -6
- data/lib/reek/module_context.rb +0 -13
- data/lib/reek/reek_command.rb +28 -0
- data/lib/reek/singleton_method_context.rb +1 -1
- data/lib/reek/smell_warning.rb +5 -3
- data/lib/reek/smells/attribute.rb +17 -1
- data/lib/reek/smells/class_variable.rb +1 -1
- data/lib/reek/smells/control_couple.rb +13 -10
- data/lib/reek/smells/large_class.rb +1 -1
- data/lib/reek/smells/long_method.rb +0 -2
- data/lib/reek/smells/simulated_polymorphism.rb +2 -2
- data/lib/reek/sniffer.rb +1 -3
- data/lib/reek/tree_dresser.rb +35 -23
- data/lib/reek/version_command.rb +14 -0
- data/reek.gemspec +3 -3
- data/spec/reek/adapters/report_spec.rb +8 -8
- data/spec/reek/adapters/should_reek_of_spec.rb +1 -1
- data/spec/reek/adapters/should_reek_only_of_spec.rb +2 -2
- data/spec/reek/adapters/should_reek_spec.rb +3 -3
- data/spec/reek/code_context_spec.rb +11 -11
- data/spec/reek/code_parser_spec.rb +0 -88
- data/spec/reek/help_command_spec.rb +24 -0
- data/spec/reek/masking_collection_spec.rb +236 -0
- data/spec/reek/method_context_spec.rb +43 -1
- data/spec/reek/reek_command_spec.rb +45 -0
- data/spec/reek/smell_warning_spec.rb +12 -4
- data/spec/reek/smells/attribute_spec.rb +79 -7
- data/spec/reek/smells/control_couple_spec.rb +40 -11
- data/spec/reek/smells/long_parameter_list_spec.rb +1 -1
- data/spec/reek/smells/smell_detector_spec.rb +0 -17
- data/spec/reek/tree_dresser_spec.rb +20 -0
- data/spec/reek/version_command_spec.rb +29 -0
- metadata +11 -2
@@ -7,7 +7,7 @@ include Reek
|
|
7
7
|
|
8
8
|
describe MethodContext, 'matching' do
|
9
9
|
before :each do
|
10
|
-
@element = MethodContext.new(StopContext.new, s(0, :mod)
|
10
|
+
@element = MethodContext.new(StopContext.new, s(0, :mod))
|
11
11
|
end
|
12
12
|
|
13
13
|
it 'should recognise itself in a collection of names' do
|
@@ -64,3 +64,45 @@ describe MethodContext do
|
|
64
64
|
mc.envious_receivers.should be_empty
|
65
65
|
end
|
66
66
|
end
|
67
|
+
|
68
|
+
describe MethodParameters, 'default assignments' do
|
69
|
+
def assignments_from(src)
|
70
|
+
exp = src.to_reek_source.syntax_tree
|
71
|
+
ctx = MethodContext.new(StopContext.new, exp)
|
72
|
+
return ctx.parameters.default_assignments
|
73
|
+
end
|
74
|
+
|
75
|
+
context 'with no defaults' do
|
76
|
+
it 'returns an empty hash' do
|
77
|
+
src = 'def meth(arga, argb, &blk) end'
|
78
|
+
assignments_from(src).should be_empty
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context 'with 1 default' do
|
83
|
+
before :each do
|
84
|
+
src = "def meth(arga, argb=456, &blk) end"
|
85
|
+
@defaults = assignments_from(src)
|
86
|
+
end
|
87
|
+
it 'returns the param-value pair' do
|
88
|
+
@defaults[:argb].should == s(:lit, 456)
|
89
|
+
end
|
90
|
+
it 'returns the nothing else' do
|
91
|
+
@defaults.length.should == 1
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
context 'with 2 defaults' do
|
96
|
+
before :each do
|
97
|
+
src = "def meth(arga=123, argb=456, &blk) end"
|
98
|
+
@defaults = assignments_from(src)
|
99
|
+
end
|
100
|
+
it 'returns both param-value pairs' do
|
101
|
+
@defaults[:arga].should == s(:lit, 123)
|
102
|
+
@defaults[:argb].should == s(:lit, 456)
|
103
|
+
end
|
104
|
+
it 'returns nothing else' do
|
105
|
+
@defaults.length.should == 2
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper.rb'
|
2
|
+
|
3
|
+
require 'reek/reek_command'
|
4
|
+
|
5
|
+
include Reek
|
6
|
+
|
7
|
+
describe ReekCommand do
|
8
|
+
before :each do
|
9
|
+
@view = mock('view', :null_object => true)
|
10
|
+
end
|
11
|
+
|
12
|
+
context 'with smells' do
|
13
|
+
before :each do
|
14
|
+
src = 'def x(); end'
|
15
|
+
@cmd = ReekCommand.new(src, QuietReport, false)
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'displays the correct text on the view' do
|
19
|
+
@view.should_receive(:output).with(/Uncommunicative Name/)
|
20
|
+
@cmd.execute(@view)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'tells the view it succeeded' do
|
24
|
+
@view.should_receive(:report_smells)
|
25
|
+
@cmd.execute(@view)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'with no smells' do
|
30
|
+
before :each do
|
31
|
+
src = 'def clean(); end'
|
32
|
+
@cmd = ReekCommand.new(src, QuietReport, false)
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'displays nothing on the view' do
|
36
|
+
@view.should_receive(:output).with('')
|
37
|
+
@cmd.execute(@view)
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'tells the view it succeeded' do
|
41
|
+
@view.should_receive(:report_success)
|
42
|
+
@cmd.execute(@view)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -22,6 +22,10 @@ describe SmellWarning, 'equality' do
|
|
22
22
|
it 'should compare equal when using <=>' do
|
23
23
|
(@first <=> @second).should == 0
|
24
24
|
end
|
25
|
+
it 'matches using eql?' do
|
26
|
+
@first.should eql(@second)
|
27
|
+
@second.should eql(@first)
|
28
|
+
end
|
25
29
|
end
|
26
30
|
|
27
31
|
shared_examples_for 'first sorts ahead of second' do
|
@@ -34,12 +38,16 @@ describe SmellWarning, 'equality' do
|
|
34
38
|
it 'sort correctly' do
|
35
39
|
(@first <=> @second).should be < 0
|
36
40
|
end
|
41
|
+
it 'does not match using eql?' do
|
42
|
+
@first.should_not eql(@second)
|
43
|
+
@second.should_not eql(@first)
|
44
|
+
end
|
37
45
|
end
|
38
46
|
|
39
47
|
context 'smells differing only by detector' do
|
40
48
|
before :each do
|
41
|
-
@first = SmellWarning.new(Smells::Duplication.new, "self", "self",
|
42
|
-
@second = SmellWarning.new(Smells::FeatureEnvy.new, "self", "self",
|
49
|
+
@first = SmellWarning.new(Smells::Duplication.new, "self", "self", false)
|
50
|
+
@second = SmellWarning.new(Smells::FeatureEnvy.new, "self", "self", true)
|
43
51
|
end
|
44
52
|
|
45
53
|
it_should_behave_like 'first sorts ahead of second'
|
@@ -88,11 +96,11 @@ describe SmellWarning, 'equality' do
|
|
88
96
|
def initialize
|
89
97
|
@masked = @non_masked = 0
|
90
98
|
end
|
91
|
-
def
|
99
|
+
def found_smell(sw)
|
92
100
|
@non_masked += 1
|
93
101
|
end
|
94
102
|
|
95
|
-
def
|
103
|
+
def found_masked_smell(sw)
|
96
104
|
@masked += 1
|
97
105
|
end
|
98
106
|
end
|
@@ -3,24 +3,96 @@ require File.dirname(__FILE__) + '/../../spec_helper.rb'
|
|
3
3
|
require 'reek/smells/attribute'
|
4
4
|
require 'reek/class_context'
|
5
5
|
|
6
|
-
require 'spec/reek/smells/behaves_like_variable_detector'
|
7
|
-
|
8
6
|
include Reek
|
9
7
|
include Reek::Smells
|
10
8
|
|
11
9
|
describe Attribute do
|
12
10
|
before :each do
|
13
11
|
@detector = Attribute.new
|
14
|
-
@record_variable = :record_attribute
|
15
12
|
end
|
13
|
+
context 'with no attributes' do
|
14
|
+
it 'records nothing in the class' do
|
15
|
+
ctx = ClassContext.from_s('class Fred; end')
|
16
|
+
@detector.attributes_in(ctx).should be_empty
|
17
|
+
end
|
18
|
+
it 'records nothing in the module' do
|
19
|
+
ctx = ModuleContext.from_s('module Fred; end')
|
20
|
+
@detector.attributes_in(ctx).should be_empty
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'with one attribute' do
|
25
|
+
shared_examples_for 'one attribute found' do
|
26
|
+
it 'records the attribute' do
|
27
|
+
@detector.attributes_in(@ctx).should include(:property)
|
28
|
+
end
|
29
|
+
it 'records only that attribute' do
|
30
|
+
@detector.attributes_in(@ctx).length.should == 1
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'declared in a class' do
|
35
|
+
before :each do
|
36
|
+
@ctx = ClassContext.from_s('class Fred; attr :property; end')
|
37
|
+
end
|
38
|
+
|
39
|
+
it_should_behave_like 'one attribute found'
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'reader in a class' do
|
43
|
+
before :each do
|
44
|
+
@ctx = ClassContext.from_s('class Fred; attr_reader :property; end')
|
45
|
+
end
|
46
|
+
|
47
|
+
it_should_behave_like 'one attribute found'
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'writer in a class' do
|
51
|
+
before :each do
|
52
|
+
@ctx = ClassContext.from_s('class Fred; attr_writer :property; end')
|
53
|
+
end
|
54
|
+
|
55
|
+
it_should_behave_like 'one attribute found'
|
56
|
+
end
|
57
|
+
|
58
|
+
context 'accessor in a class' do
|
59
|
+
before :each do
|
60
|
+
@ctx = ClassContext.from_s('class Fred; attr_accessor :property; end')
|
61
|
+
end
|
62
|
+
|
63
|
+
it_should_behave_like 'one attribute found'
|
64
|
+
end
|
65
|
+
|
66
|
+
context 'declared in a module' do
|
67
|
+
before :each do
|
68
|
+
@ctx = ModuleContext.from_s('module Fred; attr :property; end')
|
69
|
+
end
|
70
|
+
|
71
|
+
it_should_behave_like 'one attribute found'
|
72
|
+
end
|
73
|
+
|
74
|
+
context 'reader in a module' do
|
75
|
+
before :each do
|
76
|
+
@ctx = ModuleContext.from_s('module Fred; attr_reader :property; end')
|
77
|
+
end
|
78
|
+
|
79
|
+
it_should_behave_like 'one attribute found'
|
80
|
+
end
|
81
|
+
|
82
|
+
context 'writer in a module' do
|
83
|
+
before :each do
|
84
|
+
@ctx = ModuleContext.from_s('module Fred; attr_writer :property; end')
|
85
|
+
end
|
86
|
+
|
87
|
+
it_should_behave_like 'one attribute found'
|
88
|
+
end
|
16
89
|
|
17
|
-
|
18
|
-
context "in a #{klass}" do
|
90
|
+
context 'accessor in a module' do
|
19
91
|
before :each do
|
20
|
-
@ctx =
|
92
|
+
@ctx = ModuleContext.from_s('module Fred; attr_accessor :property; end')
|
21
93
|
end
|
22
94
|
|
23
|
-
it_should_behave_like '
|
95
|
+
it_should_behave_like 'one attribute found'
|
24
96
|
end
|
25
97
|
end
|
26
98
|
end
|
@@ -5,19 +5,48 @@ require 'reek/smells/control_couple'
|
|
5
5
|
include Reek::Smells
|
6
6
|
|
7
7
|
describe ControlCouple do
|
8
|
-
|
9
|
-
'
|
8
|
+
context 'conditional on a parameter' do
|
9
|
+
it 'should report a ternary check on a parameter' do
|
10
|
+
'def simple(arga) arga ? @ivar : 3 end'.should reek_only_of(:ControlCouple, /arga/)
|
11
|
+
end
|
12
|
+
it 'should not report a ternary check on an ivar' do
|
13
|
+
'def simple(arga) @ivar ? arga : 3 end'.should_not reek
|
14
|
+
end
|
15
|
+
it 'should not report a ternary check on a lvar' do
|
16
|
+
'def simple(arga) lvar = 27; lvar ? arga : @ivar end'.should_not reek
|
17
|
+
end
|
18
|
+
it 'should spot a couple inside a block' do
|
19
|
+
'def blocks(arg) @text.map { |blk| arg ? blk : "#{blk}" } end'.should reek_of(:ControlCouple, /arg/)
|
20
|
+
end
|
10
21
|
end
|
11
22
|
|
12
|
-
|
13
|
-
'
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
23
|
+
context 'parameter defaulted with boolean' do
|
24
|
+
context 'in a method' do
|
25
|
+
it 'reports a parameter defaulted to true' do
|
26
|
+
'def cc(arga = true) end'.should reek_of(:ControlCouple, /arga/)
|
27
|
+
end
|
28
|
+
it 'reports a parameter defaulted to false' do
|
29
|
+
'def cc(arga = false) end'.should reek_of(:ControlCouple, /arga/)
|
30
|
+
end
|
31
|
+
it 'reports two parameters defaulted to booleans' do
|
32
|
+
src = 'def cc(nowt, arga = true, argb = false, &blk) end'
|
33
|
+
src.should reek_of(:ControlCouple, /arga/)
|
34
|
+
src.should reek_of(:ControlCouple, /argb/)
|
35
|
+
end
|
36
|
+
end
|
19
37
|
|
20
|
-
|
21
|
-
|
38
|
+
context 'in a singleton method' do
|
39
|
+
it 'reports a parameter defaulted to true' do
|
40
|
+
'def self.cc(arga = true) end'.should reek_of(:ControlCouple, /arga/)
|
41
|
+
end
|
42
|
+
it 'reports a parameter defaulted to false' do
|
43
|
+
'def fred.cc(arga = false) end'.should reek_of(:ControlCouple, /arga/)
|
44
|
+
end
|
45
|
+
it 'reports two parameters defaulted to booleans' do
|
46
|
+
src = 'def Module.cc(nowt, arga = true, argb = false, &blk) end'
|
47
|
+
src.should reek_of(:ControlCouple, /arga/)
|
48
|
+
src.should reek_of(:ControlCouple, /argb/)
|
49
|
+
end
|
50
|
+
end
|
22
51
|
end
|
23
52
|
end
|
@@ -50,7 +50,7 @@ describe LongParameterList do
|
|
50
50
|
'def simple(polly, queue, yep, zero=nil) f(3);false end'.should reek_only_of(:LongParameterList, /4 parameters/)
|
51
51
|
end
|
52
52
|
it 'should report with 3 defaulted' do
|
53
|
-
'def simple(aarg, polly=2, yep
|
53
|
+
'def simple(aarg, polly=2, yep=:truth, zero=nil) f(3);false end'.should reek_only_of(:LongParameterList, /4 parameters/)
|
54
54
|
end
|
55
55
|
end
|
56
56
|
end
|
@@ -19,23 +19,6 @@ describe SmellDetector, 'configuration' do
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
-
describe SmellDetector, 'when copied' do
|
23
|
-
before :each do
|
24
|
-
@detector = LongMethod.new
|
25
|
-
@copy = @detector.copy
|
26
|
-
end
|
27
|
-
|
28
|
-
it 'should have the same state' do
|
29
|
-
@copy.max_statements.should == @detector.max_statements
|
30
|
-
end
|
31
|
-
|
32
|
-
it 'should change independently of its parent' do
|
33
|
-
default_max = @detector.max_statements
|
34
|
-
@copy.configure_with(LongMethod::MAX_ALLOWED_STATEMENTS_KEY => 25)
|
35
|
-
@detector.max_statements.should == default_max
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
22
|
describe SmellDetector, 'configuration' do
|
40
23
|
# it 'stays enabled when not disabled' do
|
41
24
|
# @detector = LargeClass.new
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper.rb'
|
2
|
+
|
3
|
+
require 'reek/tree_dresser'
|
4
|
+
|
5
|
+
include Reek
|
6
|
+
|
7
|
+
describe TreeDresser do
|
8
|
+
before(:each) do
|
9
|
+
@dresser = TreeDresser.new
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'maps :if to IfNode' do
|
13
|
+
@dresser.extensions_for(:if).should == 'IfNode'
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'maps :call to CallNode' do
|
17
|
+
@dresser.extensions_for(:call).should == 'CallNode'
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper.rb'
|
2
|
+
|
3
|
+
require 'reek/version_command'
|
4
|
+
|
5
|
+
include Reek
|
6
|
+
|
7
|
+
describe VersionCommand do
|
8
|
+
before :each do
|
9
|
+
@text = 'Piece of interesting text'
|
10
|
+
@cmd = VersionCommand.new(@text)
|
11
|
+
@view = mock('view', :null_object => true)
|
12
|
+
@view.should_not_receive(:report_smells)
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'displays the text on the view' do
|
16
|
+
@view.should_receive(:output).with(/#{@text}/)
|
17
|
+
@cmd.execute(@view)
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'displays the Reek version on the view' do
|
21
|
+
@view.should_receive(:output).with(/#{Reek::VERSION}/)
|
22
|
+
@cmd.execute(@view)
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'tells the view it succeeded' do
|
26
|
+
@view.should_receive(:report_success)
|
27
|
+
@cmd.execute(@view)
|
28
|
+
end
|
29
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: reek
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevin Rutherford
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-11-
|
12
|
+
date: 2009-11-17 00:00:00 +00:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -84,11 +84,14 @@ files:
|
|
84
84
|
- lib/reek/code_parser.rb
|
85
85
|
- lib/reek/configuration.rb
|
86
86
|
- lib/reek/detector_stack.rb
|
87
|
+
- lib/reek/help_command.rb
|
87
88
|
- lib/reek/if_context.rb
|
89
|
+
- lib/reek/masking_collection.rb
|
88
90
|
- lib/reek/method_context.rb
|
89
91
|
- lib/reek/module_context.rb
|
90
92
|
- lib/reek/name.rb
|
91
93
|
- lib/reek/object_refs.rb
|
94
|
+
- lib/reek/reek_command.rb
|
92
95
|
- lib/reek/sexp_formatter.rb
|
93
96
|
- lib/reek/singleton_method_context.rb
|
94
97
|
- lib/reek/smell_warning.rb
|
@@ -110,6 +113,7 @@ files:
|
|
110
113
|
- lib/reek/sniffer.rb
|
111
114
|
- lib/reek/stop_context.rb
|
112
115
|
- lib/reek/tree_dresser.rb
|
116
|
+
- lib/reek/version_command.rb
|
113
117
|
- lib/reek/yield_call_context.rb
|
114
118
|
- reek.gemspec
|
115
119
|
- spec/reek/adapters/report_spec.rb
|
@@ -122,12 +126,15 @@ files:
|
|
122
126
|
- spec/reek/code_parser_spec.rb
|
123
127
|
- spec/reek/config_spec.rb
|
124
128
|
- spec/reek/configuration_spec.rb
|
129
|
+
- spec/reek/help_command_spec.rb
|
125
130
|
- spec/reek/if_context_spec.rb
|
131
|
+
- spec/reek/masking_collection_spec.rb
|
126
132
|
- spec/reek/method_context_spec.rb
|
127
133
|
- spec/reek/module_context_spec.rb
|
128
134
|
- spec/reek/name_spec.rb
|
129
135
|
- spec/reek/object_refs_spec.rb
|
130
136
|
- spec/reek/object_source_spec.rb
|
137
|
+
- spec/reek/reek_command_spec.rb
|
131
138
|
- spec/reek/singleton_method_context_spec.rb
|
132
139
|
- spec/reek/smell_warning_spec.rb
|
133
140
|
- spec/reek/smells/attribute_spec.rb
|
@@ -147,6 +154,8 @@ files:
|
|
147
154
|
- spec/reek/smells/utility_function_spec.rb
|
148
155
|
- spec/reek/sniffer_spec.rb
|
149
156
|
- spec/reek/stop_context_spec.rb
|
157
|
+
- spec/reek/tree_dresser_spec.rb
|
158
|
+
- spec/reek/version_command_spec.rb
|
150
159
|
- spec/samples/all_but_one_masked/clean_one.rb
|
151
160
|
- spec/samples/all_but_one_masked/dirty.rb
|
152
161
|
- spec/samples/all_but_one_masked/masked.reek
|