excellent 1.7.2 → 2.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.
- data/History.txt +9 -0
- data/MIT-LICENSE +20 -0
- data/README.md +123 -0
- data/bin/excellent +49 -12
- data/lib/simplabs/excellent.rb +2 -2
- data/lib/simplabs/excellent/checks.rb +1 -1
- data/lib/simplabs/excellent/checks/abc_metric_method_check.rb +1 -1
- data/lib/simplabs/excellent/checks/assignment_in_conditional_check.rb +1 -1
- data/lib/simplabs/excellent/checks/base.rb +12 -9
- data/lib/simplabs/excellent/checks/case_missing_else_check.rb +1 -1
- data/lib/simplabs/excellent/checks/class_line_count_check.rb +3 -3
- data/lib/simplabs/excellent/checks/class_name_check.rb +5 -5
- data/lib/simplabs/excellent/checks/{singleton_variable_check.rb → class_variable_check.rb} +3 -3
- data/lib/simplabs/excellent/checks/control_coupling_check.rb +1 -1
- data/lib/simplabs/excellent/checks/cyclomatic_complexity_block_check.rb +4 -4
- data/lib/simplabs/excellent/checks/cyclomatic_complexity_check.rb +3 -3
- data/lib/simplabs/excellent/checks/cyclomatic_complexity_method_check.rb +2 -2
- data/lib/simplabs/excellent/checks/empty_rescue_body_check.rb +1 -1
- data/lib/simplabs/excellent/checks/flog_block_check.rb +2 -2
- data/lib/simplabs/excellent/checks/flog_check.rb +3 -3
- data/lib/simplabs/excellent/checks/flog_class_check.rb +2 -2
- data/lib/simplabs/excellent/checks/flog_method_check.rb +2 -2
- data/lib/simplabs/excellent/checks/for_loop_check.rb +1 -1
- data/lib/simplabs/excellent/checks/global_variable_check.rb +5 -2
- data/lib/simplabs/excellent/checks/line_count_check.rb +3 -3
- data/lib/simplabs/excellent/checks/method_line_count_check.rb +2 -2
- data/lib/simplabs/excellent/checks/method_name_check.rb +5 -4
- data/lib/simplabs/excellent/checks/module_line_count_check.rb +2 -2
- data/lib/simplabs/excellent/checks/module_name_check.rb +3 -3
- data/lib/simplabs/excellent/checks/name_check.rb +4 -4
- data/lib/simplabs/excellent/checks/nested_iterators_check.rb +2 -2
- data/lib/simplabs/excellent/checks/parameter_number_check.rb +1 -1
- data/lib/simplabs/excellent/checks/rails/attr_accessible_check.rb +1 -1
- data/lib/simplabs/excellent/checks/rails/attr_protected_check.rb +1 -1
- data/lib/simplabs/excellent/checks/rails/custom_initialize_method_check.rb +1 -1
- data/lib/simplabs/excellent/checks/rails/instance_var_in_partial_check.rb +1 -1
- data/lib/simplabs/excellent/checks/rails/params_hash_in_view_check.rb +1 -1
- data/lib/simplabs/excellent/checks/rails/session_hash_in_view_check.rb +1 -1
- data/lib/simplabs/excellent/checks/rails/validations_check.rb +1 -1
- data/lib/simplabs/excellent/formatters/text.rb +7 -1
- data/lib/simplabs/excellent/parsing/gvar_context.rb +0 -8
- data/lib/simplabs/excellent/parsing/loc_parser.rb +94 -0
- data/lib/simplabs/excellent/parsing/resbody_context.rb +0 -6
- data/lib/simplabs/excellent/runner.rb +49 -32
- data/lib/simplabs/excellent/warning.rb +1 -4
- metadata +23 -49
- data/README.rdoc +0 -72
- data/VERSION.yml +0 -4
- data/lib/simplabs/excellent/extensions/string.rb +0 -28
- data/spec/checks/abc_metric_method_check_spec.rb +0 -122
- data/spec/checks/assignment_in_conditional_check_spec.rb +0 -90
- data/spec/checks/case_missing_else_check_spec.rb +0 -46
- data/spec/checks/class_line_count_check_spec.rb +0 -62
- data/spec/checks/class_name_check_spec.rb +0 -48
- data/spec/checks/control_coupling_check_spec.rb +0 -103
- data/spec/checks/cyclomatic_complexity_block_check_spec.rb +0 -47
- data/spec/checks/cyclomatic_complexity_method_check_spec.rb +0 -210
- data/spec/checks/empty_rescue_body_check_spec.rb +0 -170
- data/spec/checks/flog_block_check_spec.rb +0 -28
- data/spec/checks/flog_class_check_spec.rb +0 -28
- data/spec/checks/flog_method_check_spec.rb +0 -46
- data/spec/checks/for_loop_check_spec.rb +0 -52
- data/spec/checks/global_variable_check_spec.rb +0 -66
- data/spec/checks/method_line_count_check_spec.rb +0 -49
- data/spec/checks/method_name_check_spec.rb +0 -112
- data/spec/checks/module_line_count_check_spec.rb +0 -48
- data/spec/checks/module_name_check_spec.rb +0 -61
- data/spec/checks/nested_iterators_check_spec.rb +0 -44
- data/spec/checks/parameter_number_check_spec.rb +0 -97
- data/spec/checks/rails/attr_accessible_check_spec.rb +0 -79
- data/spec/checks/rails/attr_protected_check_spec.rb +0 -77
- data/spec/checks/rails/custom_initialize_method_check_spec.rb +0 -58
- data/spec/checks/rails/instance_var_in_partial_check_spec.rb +0 -40
- data/spec/checks/rails/params_hash_in_view_check_spec.rb +0 -40
- data/spec/checks/rails/session_hash_in_view_check_spec.rb +0 -40
- data/spec/checks/rails/validations_check_spec.rb +0 -81
- data/spec/checks/singleton_variable_check_spec.rb +0 -66
- data/spec/extensions/string_spec.rb +0 -13
- data/spec/spec_helper.rb +0 -13
@@ -1,170 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
-
|
3
|
-
describe Simplabs::Excellent::Checks::EmptyRescueBodyCheck do
|
4
|
-
|
5
|
-
before do
|
6
|
-
@excellent = Simplabs::Excellent::Runner.new(Simplabs::Excellent::Checks::EmptyRescueBodyCheck.new)
|
7
|
-
end
|
8
|
-
|
9
|
-
describe '#evaluate' do
|
10
|
-
|
11
|
-
it 'should accept a rescue body with content and no parameter' do
|
12
|
-
code = <<-END
|
13
|
-
begin
|
14
|
-
call_method
|
15
|
-
rescue
|
16
|
-
puts "Recover from the call"
|
17
|
-
end
|
18
|
-
END
|
19
|
-
@excellent.check_code(code)
|
20
|
-
|
21
|
-
@excellent.warnings.should be_empty
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'should accept a rescue body with a return' do
|
25
|
-
code = <<-END
|
26
|
-
begin
|
27
|
-
call_method
|
28
|
-
rescue
|
29
|
-
return true
|
30
|
-
end
|
31
|
-
END
|
32
|
-
@excellent.check_code(code)
|
33
|
-
|
34
|
-
@excellent.warnings.should be_empty
|
35
|
-
end
|
36
|
-
|
37
|
-
it "should accept a virtual method call" do
|
38
|
-
code = <<-END
|
39
|
-
begin
|
40
|
-
call_method
|
41
|
-
rescue
|
42
|
-
show_error
|
43
|
-
end
|
44
|
-
END
|
45
|
-
@excellent.check_code(code)
|
46
|
-
|
47
|
-
@excellent.warnings.should be_empty
|
48
|
-
end
|
49
|
-
|
50
|
-
it 'should accept a rescue body with code and a parameter' do
|
51
|
-
code = <<-END
|
52
|
-
begin
|
53
|
-
call_method
|
54
|
-
rescue Exception => e
|
55
|
-
puts "Recover from the call"
|
56
|
-
end
|
57
|
-
END
|
58
|
-
@excellent.check_code(code)
|
59
|
-
|
60
|
-
@excellent.warnings.should be_empty
|
61
|
-
end
|
62
|
-
|
63
|
-
it 'should accept a rescue body with an assignment' do
|
64
|
-
code = <<-END
|
65
|
-
begin
|
66
|
-
call_method
|
67
|
-
rescue Exception => e
|
68
|
-
my_var = 1
|
69
|
-
end
|
70
|
-
END
|
71
|
-
@excellent.check_code(code)
|
72
|
-
|
73
|
-
@excellent.warnings.should be_empty
|
74
|
-
end
|
75
|
-
|
76
|
-
it 'should accept a rescue body with an attribute assignment' do
|
77
|
-
code = <<-END
|
78
|
-
begin
|
79
|
-
call_method
|
80
|
-
rescue Exception => e
|
81
|
-
self.var = 1
|
82
|
-
end
|
83
|
-
END
|
84
|
-
@excellent.check_code(code)
|
85
|
-
|
86
|
-
@excellent.warnings.should be_empty
|
87
|
-
end
|
88
|
-
|
89
|
-
it 'should accept an inline rescue statement' do
|
90
|
-
code = <<-END
|
91
|
-
value = call_method rescue 1
|
92
|
-
END
|
93
|
-
@excellent.check_code(code)
|
94
|
-
|
95
|
-
@excellent.warnings.should be_empty
|
96
|
-
end
|
97
|
-
|
98
|
-
it 'should accept an empty array as a statement' do
|
99
|
-
code = <<-END
|
100
|
-
value = call_method rescue []
|
101
|
-
END
|
102
|
-
|
103
|
-
@excellent.check_code(code)
|
104
|
-
|
105
|
-
@excellent.warnings.should be_empty
|
106
|
-
end
|
107
|
-
|
108
|
-
it 'should accept an empty hash as a statement' do
|
109
|
-
code = <<-END
|
110
|
-
value = call_method rescue {}
|
111
|
-
END
|
112
|
-
|
113
|
-
@excellent.check_code(code)
|
114
|
-
|
115
|
-
@excellent.warnings.should be_empty
|
116
|
-
end
|
117
|
-
|
118
|
-
it 'should accept a boolean as a statement' do
|
119
|
-
code = <<-END
|
120
|
-
value = call_method rescue false
|
121
|
-
END
|
122
|
-
@excellent.check_code(code)
|
123
|
-
|
124
|
-
@excellent.warnings.should be_empty
|
125
|
-
end
|
126
|
-
|
127
|
-
it 'should accept nil as a statement' do
|
128
|
-
code = <<-END
|
129
|
-
value = call_method rescue nil
|
130
|
-
END
|
131
|
-
@excellent.check_code(code)
|
132
|
-
|
133
|
-
@excellent.warnings.should be_empty
|
134
|
-
end
|
135
|
-
|
136
|
-
it 'should reject an empty rescue block with no parameter' do
|
137
|
-
code = <<-END
|
138
|
-
begin
|
139
|
-
call_method
|
140
|
-
rescue
|
141
|
-
end
|
142
|
-
END
|
143
|
-
|
144
|
-
verify_warning_found(code)
|
145
|
-
end
|
146
|
-
|
147
|
-
it 'should reject an empty rescue block with a parameter' do
|
148
|
-
code = <<-END
|
149
|
-
begin
|
150
|
-
call_method
|
151
|
-
rescue Exception => e
|
152
|
-
end
|
153
|
-
END
|
154
|
-
|
155
|
-
verify_warning_found(code)
|
156
|
-
end
|
157
|
-
|
158
|
-
end
|
159
|
-
|
160
|
-
def verify_warning_found(code)
|
161
|
-
@excellent.check_code(code)
|
162
|
-
warnings = @excellent.warnings
|
163
|
-
|
164
|
-
warnings.should_not be_empty
|
165
|
-
warnings[0].info.should == {}
|
166
|
-
warnings[0].line_number.should == 3
|
167
|
-
warnings[0].message.should == 'Rescue block is empty.'
|
168
|
-
end
|
169
|
-
|
170
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
-
|
3
|
-
describe Simplabs::Excellent::Checks::FlogBlockCheck do
|
4
|
-
|
5
|
-
before do
|
6
|
-
@excellent = Simplabs::Excellent::Runner.new(Simplabs::Excellent::Checks::FlogBlockCheck.new({ :threshold => 0 }))
|
7
|
-
end
|
8
|
-
|
9
|
-
describe '#evaluate' do
|
10
|
-
|
11
|
-
it 'should calculate the score correctly' do
|
12
|
-
code = <<-END
|
13
|
-
method_name do
|
14
|
-
puts 'test'
|
15
|
-
end
|
16
|
-
END
|
17
|
-
@excellent.check_code(code)
|
18
|
-
warnings = @excellent.warnings
|
19
|
-
|
20
|
-
warnings.should_not be_empty
|
21
|
-
warnings[0].info.should == { :block => 'block', :score => 3 }
|
22
|
-
warnings[0].line_number.should == 1
|
23
|
-
warnings[0].message.should == "block has flog score of 3."
|
24
|
-
end
|
25
|
-
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
-
|
3
|
-
describe Simplabs::Excellent::Checks::FlogClassCheck do
|
4
|
-
|
5
|
-
before do
|
6
|
-
@excellent = Simplabs::Excellent::Runner.new(Simplabs::Excellent::Checks::FlogClassCheck.new({ :threshold => 0 }))
|
7
|
-
end
|
8
|
-
|
9
|
-
describe '#evaluate' do
|
10
|
-
|
11
|
-
it 'should calculate the score correctly' do
|
12
|
-
code = <<-END
|
13
|
-
class User < ActiveRecord::Base
|
14
|
-
has_many :projects
|
15
|
-
end
|
16
|
-
END
|
17
|
-
@excellent.check_code(code)
|
18
|
-
warnings = @excellent.warnings
|
19
|
-
|
20
|
-
warnings.should_not be_empty
|
21
|
-
warnings[0].info.should == { :class => 'User', :score => 1 }
|
22
|
-
warnings[0].line_number.should == 1
|
23
|
-
warnings[0].message.should == "User has flog score of 1."
|
24
|
-
end
|
25
|
-
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
@@ -1,46 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
-
|
3
|
-
describe Simplabs::Excellent::Checks::FlogMethodCheck do
|
4
|
-
|
5
|
-
before do
|
6
|
-
@excellent = Simplabs::Excellent::Runner.new(Simplabs::Excellent::Checks::FlogMethodCheck.new({ :threshold => 0 }))
|
7
|
-
end
|
8
|
-
|
9
|
-
describe '#evaluate' do
|
10
|
-
|
11
|
-
it 'should calculate the score correctly' do
|
12
|
-
code = <<-END
|
13
|
-
def method_name
|
14
|
-
puts 'test'
|
15
|
-
end
|
16
|
-
END
|
17
|
-
|
18
|
-
verify_code_score(code, 1)
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'should calculate the score that uses special metaprogramming methods correctly' do
|
22
|
-
code = <<-END
|
23
|
-
def method_name
|
24
|
-
@instance.instance_eval do
|
25
|
-
def some_method
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
END
|
30
|
-
|
31
|
-
verify_code_score(code, 6)
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
35
|
-
|
36
|
-
def verify_code_score(code, score)
|
37
|
-
@excellent.check_code(code)
|
38
|
-
warnings = @excellent.warnings
|
39
|
-
|
40
|
-
warnings.should_not be_empty
|
41
|
-
warnings[0].info.should == { :method => 'method_name', :score => score }
|
42
|
-
warnings[0].line_number.should == 1
|
43
|
-
warnings[0].message.should == "method_name has flog score of #{score}."
|
44
|
-
end
|
45
|
-
|
46
|
-
end
|
@@ -1,52 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
-
|
3
|
-
describe Simplabs::Excellent::Checks::ForLoopCheck do
|
4
|
-
|
5
|
-
before do
|
6
|
-
@excellent = Simplabs::Excellent::Runner.new(Simplabs::Excellent::Checks::ForLoopCheck.new)
|
7
|
-
end
|
8
|
-
|
9
|
-
describe '#evaluate' do
|
10
|
-
|
11
|
-
it 'should accept iterators' do
|
12
|
-
code = <<-END
|
13
|
-
[:sym1, :sym2].each do |sym|
|
14
|
-
end
|
15
|
-
END
|
16
|
-
@excellent.check_code(code)
|
17
|
-
warnings = @excellent.warnings
|
18
|
-
|
19
|
-
warnings.should be_empty
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'should reject for loops on ranges' do
|
23
|
-
code = <<-END
|
24
|
-
for i in 1..2
|
25
|
-
end
|
26
|
-
END
|
27
|
-
|
28
|
-
verify_warning_found(code)
|
29
|
-
end
|
30
|
-
|
31
|
-
it 'should reject for loops on enumerations' do
|
32
|
-
code = <<-END
|
33
|
-
for symbol in [:sym1, :sym2]
|
34
|
-
end
|
35
|
-
END
|
36
|
-
|
37
|
-
verify_warning_found(code)
|
38
|
-
end
|
39
|
-
|
40
|
-
end
|
41
|
-
|
42
|
-
def verify_warning_found(code)
|
43
|
-
@excellent.check_code(code)
|
44
|
-
warnings = @excellent.warnings
|
45
|
-
|
46
|
-
warnings.should_not be_empty
|
47
|
-
warnings[0].info.should == {}
|
48
|
-
warnings[0].line_number.should == 1
|
49
|
-
warnings[0].message.should == 'For loop used.'
|
50
|
-
end
|
51
|
-
|
52
|
-
end
|
@@ -1,66 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
-
|
3
|
-
describe Simplabs::Excellent::Checks::GlobalVariableCheck do
|
4
|
-
|
5
|
-
before(:each) do
|
6
|
-
@excellent = Simplabs::Excellent::Runner.new(Simplabs::Excellent::Checks::GlobalVariableCheck.new)
|
7
|
-
end
|
8
|
-
|
9
|
-
describe '#evaluate' do
|
10
|
-
|
11
|
-
it 'should reject global variables' do
|
12
|
-
code = <<-END
|
13
|
-
$foo = 'bar'
|
14
|
-
END
|
15
|
-
@excellent.check_code(code)
|
16
|
-
warnings = @excellent.warnings
|
17
|
-
|
18
|
-
warnings.should_not be_empty
|
19
|
-
warnings[0].info.should == { :variable => 'foo' }
|
20
|
-
warnings[0].line_number.should == 1
|
21
|
-
warnings[0].message.should == 'Global variable foo used.'
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'should also work in modules' do
|
25
|
-
code = <<-END
|
26
|
-
module Outer
|
27
|
-
module Inner
|
28
|
-
class Class
|
29
|
-
$foo = 'bar'
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
END
|
34
|
-
@excellent.check_code(code)
|
35
|
-
warnings = @excellent.warnings
|
36
|
-
|
37
|
-
warnings.should_not be_empty
|
38
|
-
warnings[0].info.should == { :variable => 'foo' }
|
39
|
-
warnings[0].line_number.should == 4
|
40
|
-
warnings[0].message.should == 'Global variable foo used.'
|
41
|
-
end
|
42
|
-
|
43
|
-
it 'should also work for global variables that occur within methods' do
|
44
|
-
code = <<-END
|
45
|
-
module Outer
|
46
|
-
module Inner
|
47
|
-
class Class
|
48
|
-
def method
|
49
|
-
$foo == 'bar'
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
END
|
55
|
-
@excellent.check_code(code)
|
56
|
-
warnings = @excellent.warnings
|
57
|
-
|
58
|
-
warnings.should_not be_empty
|
59
|
-
warnings[0].info.should == { :variable => 'foo' }
|
60
|
-
warnings[0].line_number.should == 5
|
61
|
-
warnings[0].message.should == 'Global variable foo used.'
|
62
|
-
end
|
63
|
-
|
64
|
-
end
|
65
|
-
|
66
|
-
end
|
@@ -1,49 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
-
|
3
|
-
describe Simplabs::Excellent::Checks::MethodLineCountCheck do
|
4
|
-
|
5
|
-
before do
|
6
|
-
@excellent = Simplabs::Excellent::Runner.new(Simplabs::Excellent::Checks::MethodLineCountCheck.new({ :threshold => 2 }))
|
7
|
-
end
|
8
|
-
|
9
|
-
describe '#evaluate' do
|
10
|
-
|
11
|
-
it 'should accept methods with less lines than the threshold' do
|
12
|
-
code = <<-END
|
13
|
-
def one_line_method
|
14
|
-
end
|
15
|
-
END
|
16
|
-
@excellent.check_code(code)
|
17
|
-
|
18
|
-
@excellent.warnings.should be_empty
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'should accept methods with the same number of lines as the threshold' do
|
22
|
-
code = <<-END
|
23
|
-
def two_line_method
|
24
|
-
end
|
25
|
-
END
|
26
|
-
@excellent.check_code(code)
|
27
|
-
|
28
|
-
@excellent.warnings.should be_empty
|
29
|
-
end
|
30
|
-
|
31
|
-
it 'should reject methods with more lines than the threshold' do
|
32
|
-
code = <<-END
|
33
|
-
def four_line_method
|
34
|
-
puts 1
|
35
|
-
puts 2
|
36
|
-
end
|
37
|
-
END
|
38
|
-
@excellent.check_code(code)
|
39
|
-
warnings = @excellent.warnings
|
40
|
-
|
41
|
-
warnings.should_not be_empty
|
42
|
-
warnings[0].info.should == { :method => 'four_line_method', :count => 4 }
|
43
|
-
warnings[0].line_number.should == 1
|
44
|
-
warnings[0].message.should == 'four_line_method has 4 lines.'
|
45
|
-
end
|
46
|
-
|
47
|
-
end
|
48
|
-
|
49
|
-
end
|