kevinrutherford-reek 1.1.3.1 → 1.1.3.2

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -3,6 +3,7 @@
3
3
  === Minor Changes
4
4
  * LongMethod now counts statements deeper into each method (#25)
5
5
  * LongMethod no longer counts control structures, only their contained stmts
6
+ * LargeClass is disabled when checking in-memory classes
6
7
 
7
8
  == 1.1.3 2009-05-19
8
9
 
@@ -54,10 +54,12 @@ module Reek
54
54
  end
55
55
 
56
56
  def process_class(exp)
57
- push(ClassContext.create(@element, exp)) do
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)
@@ -20,6 +20,11 @@ module Reek
20
20
  return unifier.process(sexp[0])
21
21
  end
22
22
 
23
+ def initialize(code, desc) # :nodoc:
24
+ super
25
+ @cf.disable('LargeClass')
26
+ end
27
+
23
28
  def can_parse_objects?
24
29
  return true if Object.const_defined?(:ParseTree)
25
30
  begin
@@ -77,5 +77,9 @@ module Reek
77
77
  return [] if path == parent
78
78
  all_reekfiles(parent) + Dir["#{path}/*.reek"]
79
79
  end
80
+
81
+ def disable(smell)
82
+ @config[smell].adopt!({'enabled' => false})
83
+ end
80
84
  end
81
85
  end
data/lib/reek.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  $:.unshift File.dirname(__FILE__)
2
2
 
3
3
  module Reek # :doc:
4
- VERSION = '1.1.3.1'
4
+ VERSION = '1.1.3.2'
5
5
  end
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.1"
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-04}
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 large class' do
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.should reek_only_of(:LargeClass, /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, 'counting instance variables' do
70
- it 'warns about class with 10 ivars' do
71
- class ManyIvars
72
- def method
73
- @vara = @varb = @varc = @vard = @vare
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
- it 'ignores class with only a couple of ivars' do
81
- LargeClass.should_not reek_of(:LargeClass)
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
- it 'ignores fq class with only a couple of ivars' do
85
- Reek::Smells::LargeClass.should_not reek_of(:LargeClass)
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
- src = 'def one() val = 4; end'
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
- src = 'def one() val = 4; val = 4; val = 4; end'
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
- src = 'def one() val[0] = 4; end'
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
- src = 'def one() val += 4; end'
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
- src = 'def one() val[0] += 4; end'
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
- src = 'def one() val = fred = 4; end'
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
- src = 'def one() val = 4; true; end'
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
- src = 'def one() if val == 4; callee(); end; end'
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
- src = 'def one() if val == 4; callee(); callee(); callee(); end; end'
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
- src = 'def one() if val == 4; ; end; end'
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
- src = 'def one() while val < 4; callee(); end; end'
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
- src = 'def one() while val < 4; callee(); callee(); callee(); end; end'
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
- src = 'def one() until val < 4; callee(); end; end'
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
- src = 'def one() until val < 4; callee(); callee(); callee(); end; end'
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
- src = 'def one() for i in 0..4; callee(); end; end'
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
- src = 'def one() for i in 0..4; callee(); callee(); callee(); end; end'
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
- src = 'def one() begin; callee(); rescue; callee(); end; end'
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
- src = 'def one() begin; callee(); callee(); callee(); rescue; callee(); callee(); callee(); end; end'
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
- src = 'def one() case fred; when "hi"; callee(); end; end'
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
- src = 'def one() case fred; when "hi"; callee(); callee(); when "lo"; callee(); end; end'
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
- src = 'def one() case fred; when "hi"; ; when "lo"; ; end; end'
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
- source = Source.from_s(src)
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.1
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-04 00:00:00 -07:00
12
+ date: 2009-06-13 00:00:00 -07:00
13
13
  default_executable: reek
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency