kevinrutherford-reek 1.1.3.1 → 1.1.3.2
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/History.txt +1 -0
- data/lib/reek/code_parser.rb +3 -1
- data/lib/reek/object_source.rb +5 -0
- data/lib/reek/smells/smells.rb +4 -0
- data/lib/reek.rb +1 -1
- data/reek.gemspec +2 -2
- data/spec/reek/smells/large_class_spec.rb +95 -19
- data/spec/reek/smells/long_method_spec.rb +27 -65
- metadata +2 -2
data/History.txt
CHANGED
data/lib/reek/code_parser.rb
CHANGED
@@ -54,10 +54,12 @@ module Reek
|
|
54
54
|
end
|
55
55
|
|
56
56
|
def process_class(exp)
|
57
|
-
|
57
|
+
scope = ClassContext.create(@element, exp)
|
58
|
+
push(scope) do
|
58
59
|
process_default(exp) unless @element.is_struct?
|
59
60
|
check_smells(:class)
|
60
61
|
end
|
62
|
+
scope
|
61
63
|
end
|
62
64
|
|
63
65
|
def process_defn(exp)
|
data/lib/reek/object_source.rb
CHANGED
data/lib/reek/smells/smells.rb
CHANGED
data/lib/reek.rb
CHANGED
data/reek.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{reek}
|
5
|
-
s.version = "1.1.3.
|
5
|
+
s.version = "1.1.3.2"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Kevin Rutherford"]
|
9
|
-
s.date = %q{2009-06-
|
9
|
+
s.date = %q{2009-06-13}
|
10
10
|
s.default_executable = %q{reek}
|
11
11
|
s.description = %q{Code smell detector for Ruby}
|
12
12
|
s.email = ["kevin@rutherford-software.com"]
|
@@ -6,9 +6,9 @@ require 'reek/smells/large_class'
|
|
6
6
|
include Reek
|
7
7
|
include Reek::Smells
|
8
8
|
|
9
|
-
describe LargeClass do
|
9
|
+
describe LargeClass, 'checking Class objects' do
|
10
10
|
|
11
|
-
it 'should report
|
11
|
+
it 'should not report class with 26 methods' do
|
12
12
|
class BigOne
|
13
13
|
26.times do |i|
|
14
14
|
define_method "method#{i}".to_sym do
|
@@ -16,11 +16,8 @@ describe LargeClass do
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
19
|
-
BigOne.
|
19
|
+
BigOne.should_not reek
|
20
20
|
end
|
21
|
-
end
|
22
|
-
|
23
|
-
describe LargeClass do
|
24
21
|
|
25
22
|
it 'should not report short class' do
|
26
23
|
class ShortClass
|
@@ -33,6 +30,26 @@ describe LargeClass do
|
|
33
30
|
end
|
34
31
|
ShortClass.should_not reek
|
35
32
|
end
|
33
|
+
|
34
|
+
describe LargeClass, 'counting instance variables' do
|
35
|
+
it 'should not report class with 10 ivars' do
|
36
|
+
class ManyIvars
|
37
|
+
def method
|
38
|
+
@vara = @varb = @varc = @vard = @vare
|
39
|
+
@varf = @varg = @varh = @vari = @varj
|
40
|
+
end
|
41
|
+
end
|
42
|
+
ManyIvars.should_not reek
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'ignores class with only a couple of ivars' do
|
46
|
+
LargeClass.should_not reek_of(:LargeClass)
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'ignores fq class with only a couple of ivars' do
|
50
|
+
Reek::Smells::LargeClass.should_not reek_of(:LargeClass)
|
51
|
+
end
|
52
|
+
end
|
36
53
|
end
|
37
54
|
|
38
55
|
describe LargeClass, 'when exceptions are listed' do
|
@@ -66,22 +83,81 @@ describe LargeClass, 'when exceptions are listed' do
|
|
66
83
|
end
|
67
84
|
end
|
68
85
|
|
69
|
-
describe LargeClass, '
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
@varf = @varg = @varh = @vari = @varj
|
75
|
-
end
|
76
|
-
end
|
77
|
-
ManyIvars.should reek_of(:LargeClass, /10/)
|
86
|
+
describe LargeClass, 'checking source code' do
|
87
|
+
|
88
|
+
def process_class(src)
|
89
|
+
source = Source.from_s(src)
|
90
|
+
CodeParser.new(nil, {}).process_class(source.generate_syntax_tree)
|
78
91
|
end
|
79
92
|
|
80
|
-
|
81
|
-
|
93
|
+
describe 'counting instance variables' do
|
94
|
+
it 'should not report empty class' do
|
95
|
+
process_class('class Empty;end').variable_names.length.should == 0
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'should count ivars in one method' do
|
99
|
+
process_class('class Empty;def ivars() @aa=@ab=@ac=@ad; end;end').variable_names.length.should == 4
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'should count ivars in 2 methods' do
|
103
|
+
process_class('class Empty;def iv1() @aa=@ab; end;def iv2() @aa=@ac; end;end').variable_names.length.should == 3
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'should not report 9 ivars' do
|
107
|
+
'class Empty;def ivars() @aa=@ab=@ac=@ad=@ae=@af=@ag=@ah=@ai; end;end'.should_not reek
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'should report 10 ivars' do
|
111
|
+
'class Empty;def ivars() @aa=@ab=@ac=@ad=@ae=@af=@ag=@ah=@ai=@aj; end;end'.should reek_of(:LargeClass)
|
112
|
+
end
|
113
|
+
|
114
|
+
it 'should not report 10 ivars in 2 extensions' do
|
115
|
+
src = <<EOS
|
116
|
+
class Full;def ivars1() @aa=@ab=@ac=@ad=@ae; end;end
|
117
|
+
class Full;def ivars2() @af=@ag=@ah=@ai=@aj; end;end
|
118
|
+
EOS
|
119
|
+
src.should_not reek
|
120
|
+
end
|
82
121
|
end
|
83
122
|
|
84
|
-
|
85
|
-
|
123
|
+
describe 'counting methods' do
|
124
|
+
it 'should not report empty class' do
|
125
|
+
process_class('class Empty;end').num_methods.should == 0
|
126
|
+
end
|
127
|
+
|
128
|
+
it 'should count 1 method' do
|
129
|
+
process_class('class Empty;def ivars() @aa=@ab; end;end').num_methods.should == 1
|
130
|
+
end
|
131
|
+
|
132
|
+
it 'should count 2 methods' do
|
133
|
+
process_class('class Empty;def meth1() @aa=@ab;end;def meth2() @aa=@ab;end;end').num_methods.should == 2
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'should not report 25 methods' do
|
137
|
+
src = <<EOS
|
138
|
+
class Full
|
139
|
+
def me01()3 end;def me02()3 end;def me03()3 end;def me04()3 end;def me05()3 end
|
140
|
+
def me11()3 end;def me12()3 end;def me13()3 end;def me14()3 end;def me15()3 end
|
141
|
+
def me21()3 end;def me22()3 end;def me23()3 end;def me24()3 end;def me25()3 end
|
142
|
+
def me31()3 end;def me32()3 end;def me33()3 end;def me34()3 end;def me35()3 end
|
143
|
+
def me41()3 end;def me42()3 end;def me43()3 end;def me44()3 end;def me45()3 end
|
144
|
+
end
|
145
|
+
EOS
|
146
|
+
src.should_not reek
|
147
|
+
end
|
148
|
+
|
149
|
+
it 'should report 26 methods' do
|
150
|
+
src = <<EOS
|
151
|
+
class Full
|
152
|
+
def me01()3 end;def me02()3 end;def me03()3 end;def me04()3 end;def me05()3 end
|
153
|
+
def me11()3 end;def me12()3 end;def me13()3 end;def me14()3 end;def me15()3 end
|
154
|
+
def me21()3 end;def me22()3 end;def me23()3 end;def me24()3 end;def me25()3 end
|
155
|
+
def me31()3 end;def me32()3 end;def me33()3 end;def me34()3 end;def me35()3 end
|
156
|
+
def me41()3 end;def me42()3 end;def me43()3 end;def me44()3 end;def me45()3 end
|
157
|
+
def me51()3 end
|
158
|
+
end
|
159
|
+
EOS
|
160
|
+
src.should reek_of(:LargeClass)
|
161
|
+
end
|
86
162
|
end
|
87
163
|
end
|
@@ -7,6 +7,11 @@ require 'reek/smells/long_method'
|
|
7
7
|
include Reek
|
8
8
|
include Reek::Smells
|
9
9
|
|
10
|
+
def process_method(src)
|
11
|
+
source = Source.from_s(src)
|
12
|
+
CodeParser.new(nil, {}).process_defn(source.generate_syntax_tree)
|
13
|
+
end
|
14
|
+
|
10
15
|
describe LongMethod do
|
11
16
|
it 'should not report short methods' do
|
12
17
|
'def short(arga) alf = f(1);@bet = 2;@cut = 3;@dit = 4; @emp = 5;end'.should_not reek
|
@@ -62,151 +67,109 @@ end
|
|
62
67
|
|
63
68
|
describe LongMethod do
|
64
69
|
it 'counts 1 assignment' do
|
65
|
-
|
66
|
-
source = Source.from_s(src)
|
67
|
-
method = CodeParser.new(nil, {}).process_defn(source.generate_syntax_tree)
|
70
|
+
method = process_method('def one() val = 4; end')
|
68
71
|
method.num_statements.should == 1
|
69
72
|
end
|
70
73
|
|
71
74
|
it 'counts 3 assignments' do
|
72
|
-
|
73
|
-
source = Source.from_s(src)
|
74
|
-
method = CodeParser.new(nil, {}).process_defn(source.generate_syntax_tree)
|
75
|
+
method = process_method('def one() val = 4; val = 4; val = 4; end')
|
75
76
|
method.num_statements.should == 3
|
76
77
|
end
|
77
78
|
|
78
79
|
it 'counts 1 attr assignment' do
|
79
|
-
|
80
|
-
source = Source.from_s(src)
|
81
|
-
method = CodeParser.new(nil, {}).process_defn(source.generate_syntax_tree)
|
80
|
+
method = process_method('def one() val[0] = 4; end')
|
82
81
|
method.num_statements.should == 1
|
83
82
|
end
|
84
83
|
|
85
84
|
it 'counts 1 increment assignment' do
|
86
|
-
|
87
|
-
source = Source.from_s(src)
|
88
|
-
method = CodeParser.new(nil, {}).process_defn(source.generate_syntax_tree)
|
85
|
+
method = process_method('def one() val += 4; end')
|
89
86
|
method.num_statements.should == 1
|
90
87
|
end
|
91
88
|
|
92
89
|
it 'counts 1 increment attr assignment' do
|
93
|
-
|
94
|
-
source = Source.from_s(src)
|
95
|
-
method = CodeParser.new(nil, {}).process_defn(source.generate_syntax_tree)
|
90
|
+
method = process_method('def one() val[0] += 4; end')
|
96
91
|
method.num_statements.should == 1
|
97
92
|
end
|
98
93
|
|
99
94
|
it 'counts 1 nested assignment' do
|
100
|
-
|
101
|
-
source = Source.from_s(src)
|
102
|
-
method = CodeParser.new(nil, {}).process_defn(source.generate_syntax_tree)
|
95
|
+
method = process_method('def one() val = fred = 4; end')
|
103
96
|
method.num_statements.should == 1
|
104
97
|
end
|
105
98
|
|
106
99
|
it 'counts returns' do
|
107
|
-
|
108
|
-
source = Source.from_s(src)
|
109
|
-
method = CodeParser.new(nil, {}).process_defn(source.generate_syntax_tree)
|
100
|
+
method = process_method('def one() val = 4; true; end')
|
110
101
|
method.num_statements.should == 2
|
111
102
|
end
|
112
103
|
end
|
113
104
|
|
114
105
|
describe LongMethod, 'does not count control statements' do
|
115
106
|
it 'counts 1 statement in a conditional expression' do
|
116
|
-
|
117
|
-
source = Source.from_s(src)
|
118
|
-
method = CodeParser.new(nil, {}).process_defn(source.generate_syntax_tree)
|
107
|
+
method = process_method('def one() if val == 4; callee(); end; end')
|
119
108
|
method.num_statements.should == 1
|
120
109
|
end
|
121
110
|
|
122
111
|
it 'counts 3 statements in a conditional expression' do
|
123
|
-
|
124
|
-
source = Source.from_s(src)
|
125
|
-
method = CodeParser.new(nil, {}).process_defn(source.generate_syntax_tree)
|
112
|
+
method = process_method('def one() if val == 4; callee(); callee(); callee(); end; end')
|
126
113
|
method.num_statements.should == 3
|
127
114
|
end
|
128
115
|
|
129
116
|
it 'does not count empty conditional expression' do
|
130
|
-
|
131
|
-
source = Source.from_s(src)
|
132
|
-
method = CodeParser.new(nil, {}).process_defn(source.generate_syntax_tree)
|
117
|
+
method = process_method('def one() if val == 4; ; end; end')
|
133
118
|
method.num_statements.should == 0
|
134
119
|
end
|
135
120
|
|
136
121
|
it 'counts 1 statement in a while loop' do
|
137
|
-
|
138
|
-
source = Source.from_s(src)
|
139
|
-
method = CodeParser.new(nil, {}).process_defn(source.generate_syntax_tree)
|
122
|
+
method = process_method('def one() while val < 4; callee(); end; end')
|
140
123
|
method.num_statements.should == 1
|
141
124
|
end
|
142
125
|
|
143
126
|
it 'counts 3 statements in a while loop' do
|
144
|
-
|
145
|
-
source = Source.from_s(src)
|
146
|
-
method = CodeParser.new(nil, {}).process_defn(source.generate_syntax_tree)
|
127
|
+
method = process_method('def one() while val < 4; callee(); callee(); callee(); end; end')
|
147
128
|
method.num_statements.should == 3
|
148
129
|
end
|
149
130
|
|
150
131
|
it 'counts 1 statement in a until loop' do
|
151
|
-
|
152
|
-
source = Source.from_s(src)
|
153
|
-
method = CodeParser.new(nil, {}).process_defn(source.generate_syntax_tree)
|
132
|
+
method = process_method('def one() until val < 4; callee(); end; end')
|
154
133
|
method.num_statements.should == 1
|
155
134
|
end
|
156
135
|
|
157
136
|
it 'counts 3 statements in a until loop' do
|
158
|
-
|
159
|
-
source = Source.from_s(src)
|
160
|
-
method = CodeParser.new(nil, {}).process_defn(source.generate_syntax_tree)
|
137
|
+
method = process_method('def one() until val < 4; callee(); callee(); callee(); end; end')
|
161
138
|
method.num_statements.should == 3
|
162
139
|
end
|
163
140
|
|
164
141
|
it 'counts 1 statement in a for loop' do
|
165
|
-
|
166
|
-
source = Source.from_s(src)
|
167
|
-
method = CodeParser.new(nil, {}).process_defn(source.generate_syntax_tree)
|
142
|
+
method = process_method('def one() for i in 0..4; callee(); end; end')
|
168
143
|
method.num_statements.should == 1
|
169
144
|
end
|
170
145
|
|
171
146
|
it 'counts 3 statements in a for loop' do
|
172
|
-
|
173
|
-
source = Source.from_s(src)
|
174
|
-
method = CodeParser.new(nil, {}).process_defn(source.generate_syntax_tree)
|
147
|
+
method = process_method('def one() for i in 0..4; callee(); callee(); callee(); end; end')
|
175
148
|
method.num_statements.should == 3
|
176
149
|
end
|
177
150
|
|
178
151
|
it 'counts 1 statement in a rescue' do
|
179
|
-
|
180
|
-
source = Source.from_s(src)
|
181
|
-
method = CodeParser.new(nil, {}).process_defn(source.generate_syntax_tree)
|
152
|
+
method = process_method('def one() begin; callee(); rescue; callee(); end; end')
|
182
153
|
method.num_statements.should == 2
|
183
154
|
end
|
184
155
|
|
185
156
|
it 'counts 3 statements in a rescue' do
|
186
|
-
|
187
|
-
source = Source.from_s(src)
|
188
|
-
method = CodeParser.new(nil, {}).process_defn(source.generate_syntax_tree)
|
157
|
+
method = process_method('def one() begin; callee(); callee(); callee(); rescue; callee(); callee(); callee(); end; end')
|
189
158
|
method.num_statements.should == 6
|
190
159
|
end
|
191
160
|
|
192
161
|
it 'counts 1 statement in a when' do
|
193
|
-
|
194
|
-
source = Source.from_s(src)
|
195
|
-
method = CodeParser.new(nil, {}).process_defn(source.generate_syntax_tree)
|
162
|
+
method = process_method('def one() case fred; when "hi"; callee(); end; end')
|
196
163
|
method.num_statements.should == 1
|
197
164
|
end
|
198
165
|
|
199
166
|
it 'counts 3 statements in a when' do
|
200
|
-
|
201
|
-
source = Source.from_s(src)
|
202
|
-
method = CodeParser.new(nil, {}).process_defn(source.generate_syntax_tree)
|
167
|
+
method = process_method('def one() case fred; when "hi"; callee(); callee(); when "lo"; callee(); end; end')
|
203
168
|
method.num_statements.should == 3
|
204
169
|
end
|
205
170
|
|
206
171
|
it 'does not count empty case' do
|
207
|
-
|
208
|
-
source = Source.from_s(src)
|
209
|
-
method = CodeParser.new(nil, {}).process_defn(source.generate_syntax_tree)
|
172
|
+
method = process_method('def one() case fred; when "hi"; ; when "lo"; ; end; end')
|
210
173
|
method.num_statements.should == 0
|
211
174
|
end
|
212
175
|
|
@@ -226,8 +189,7 @@ def parse(arg, argv, &error)
|
|
226
189
|
val
|
227
190
|
end
|
228
191
|
EOS
|
229
|
-
|
230
|
-
method = CodeParser.new(nil, {}).process_defn(source.generate_syntax_tree)
|
192
|
+
method = process_method(src)
|
231
193
|
method.num_statements.should == 6
|
232
194
|
end
|
233
195
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kevinrutherford-reek
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.3.
|
4
|
+
version: 1.1.3.2
|
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-06-
|
12
|
+
date: 2009-06-13 00:00:00 -07:00
|
13
13
|
default_executable: reek
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|