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.
Files changed (79) hide show
  1. data/History.txt +9 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +123 -0
  4. data/bin/excellent +49 -12
  5. data/lib/simplabs/excellent.rb +2 -2
  6. data/lib/simplabs/excellent/checks.rb +1 -1
  7. data/lib/simplabs/excellent/checks/abc_metric_method_check.rb +1 -1
  8. data/lib/simplabs/excellent/checks/assignment_in_conditional_check.rb +1 -1
  9. data/lib/simplabs/excellent/checks/base.rb +12 -9
  10. data/lib/simplabs/excellent/checks/case_missing_else_check.rb +1 -1
  11. data/lib/simplabs/excellent/checks/class_line_count_check.rb +3 -3
  12. data/lib/simplabs/excellent/checks/class_name_check.rb +5 -5
  13. data/lib/simplabs/excellent/checks/{singleton_variable_check.rb → class_variable_check.rb} +3 -3
  14. data/lib/simplabs/excellent/checks/control_coupling_check.rb +1 -1
  15. data/lib/simplabs/excellent/checks/cyclomatic_complexity_block_check.rb +4 -4
  16. data/lib/simplabs/excellent/checks/cyclomatic_complexity_check.rb +3 -3
  17. data/lib/simplabs/excellent/checks/cyclomatic_complexity_method_check.rb +2 -2
  18. data/lib/simplabs/excellent/checks/empty_rescue_body_check.rb +1 -1
  19. data/lib/simplabs/excellent/checks/flog_block_check.rb +2 -2
  20. data/lib/simplabs/excellent/checks/flog_check.rb +3 -3
  21. data/lib/simplabs/excellent/checks/flog_class_check.rb +2 -2
  22. data/lib/simplabs/excellent/checks/flog_method_check.rb +2 -2
  23. data/lib/simplabs/excellent/checks/for_loop_check.rb +1 -1
  24. data/lib/simplabs/excellent/checks/global_variable_check.rb +5 -2
  25. data/lib/simplabs/excellent/checks/line_count_check.rb +3 -3
  26. data/lib/simplabs/excellent/checks/method_line_count_check.rb +2 -2
  27. data/lib/simplabs/excellent/checks/method_name_check.rb +5 -4
  28. data/lib/simplabs/excellent/checks/module_line_count_check.rb +2 -2
  29. data/lib/simplabs/excellent/checks/module_name_check.rb +3 -3
  30. data/lib/simplabs/excellent/checks/name_check.rb +4 -4
  31. data/lib/simplabs/excellent/checks/nested_iterators_check.rb +2 -2
  32. data/lib/simplabs/excellent/checks/parameter_number_check.rb +1 -1
  33. data/lib/simplabs/excellent/checks/rails/attr_accessible_check.rb +1 -1
  34. data/lib/simplabs/excellent/checks/rails/attr_protected_check.rb +1 -1
  35. data/lib/simplabs/excellent/checks/rails/custom_initialize_method_check.rb +1 -1
  36. data/lib/simplabs/excellent/checks/rails/instance_var_in_partial_check.rb +1 -1
  37. data/lib/simplabs/excellent/checks/rails/params_hash_in_view_check.rb +1 -1
  38. data/lib/simplabs/excellent/checks/rails/session_hash_in_view_check.rb +1 -1
  39. data/lib/simplabs/excellent/checks/rails/validations_check.rb +1 -1
  40. data/lib/simplabs/excellent/formatters/text.rb +7 -1
  41. data/lib/simplabs/excellent/parsing/gvar_context.rb +0 -8
  42. data/lib/simplabs/excellent/parsing/loc_parser.rb +94 -0
  43. data/lib/simplabs/excellent/parsing/resbody_context.rb +0 -6
  44. data/lib/simplabs/excellent/runner.rb +49 -32
  45. data/lib/simplabs/excellent/warning.rb +1 -4
  46. metadata +23 -49
  47. data/README.rdoc +0 -72
  48. data/VERSION.yml +0 -4
  49. data/lib/simplabs/excellent/extensions/string.rb +0 -28
  50. data/spec/checks/abc_metric_method_check_spec.rb +0 -122
  51. data/spec/checks/assignment_in_conditional_check_spec.rb +0 -90
  52. data/spec/checks/case_missing_else_check_spec.rb +0 -46
  53. data/spec/checks/class_line_count_check_spec.rb +0 -62
  54. data/spec/checks/class_name_check_spec.rb +0 -48
  55. data/spec/checks/control_coupling_check_spec.rb +0 -103
  56. data/spec/checks/cyclomatic_complexity_block_check_spec.rb +0 -47
  57. data/spec/checks/cyclomatic_complexity_method_check_spec.rb +0 -210
  58. data/spec/checks/empty_rescue_body_check_spec.rb +0 -170
  59. data/spec/checks/flog_block_check_spec.rb +0 -28
  60. data/spec/checks/flog_class_check_spec.rb +0 -28
  61. data/spec/checks/flog_method_check_spec.rb +0 -46
  62. data/spec/checks/for_loop_check_spec.rb +0 -52
  63. data/spec/checks/global_variable_check_spec.rb +0 -66
  64. data/spec/checks/method_line_count_check_spec.rb +0 -49
  65. data/spec/checks/method_name_check_spec.rb +0 -112
  66. data/spec/checks/module_line_count_check_spec.rb +0 -48
  67. data/spec/checks/module_name_check_spec.rb +0 -61
  68. data/spec/checks/nested_iterators_check_spec.rb +0 -44
  69. data/spec/checks/parameter_number_check_spec.rb +0 -97
  70. data/spec/checks/rails/attr_accessible_check_spec.rb +0 -79
  71. data/spec/checks/rails/attr_protected_check_spec.rb +0 -77
  72. data/spec/checks/rails/custom_initialize_method_check_spec.rb +0 -58
  73. data/spec/checks/rails/instance_var_in_partial_check_spec.rb +0 -40
  74. data/spec/checks/rails/params_hash_in_view_check_spec.rb +0 -40
  75. data/spec/checks/rails/session_hash_in_view_check_spec.rb +0 -40
  76. data/spec/checks/rails/validations_check_spec.rb +0 -81
  77. data/spec/checks/singleton_variable_check_spec.rb +0 -66
  78. data/spec/extensions/string_spec.rb +0 -13
  79. data/spec/spec_helper.rb +0 -13
@@ -1,112 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
-
3
- describe Simplabs::Excellent::Checks::MethodNameCheck do
4
-
5
- before do
6
- @excellent = Simplabs::Excellent::Runner.new(Simplabs::Excellent::Checks::MethodNameCheck.new)
7
- end
8
-
9
- describe '#evaluate' do
10
-
11
- it 'should accept method names with underscores' do
12
- code = <<-END
13
- def good_method_name
14
- end
15
- END
16
- @excellent.check_code(code)
17
-
18
- @excellent.warnings.should be_empty
19
- end
20
-
21
- it 'should accept method names with numbers' do
22
- code = <<-END
23
- def good_method_name_1
24
- end
25
- END
26
- @excellent.check_code(code)
27
-
28
- @excellent.warnings.should be_empty
29
- end
30
-
31
- it 'should accept method names ending with a question mark' do
32
- code = <<-END
33
- def good_method_name?
34
- end
35
- END
36
- @excellent.check_code(code)
37
-
38
- @excellent.warnings.should be_empty
39
- end
40
-
41
- it 'should accept method names ending with an exclamation mark' do
42
- code = <<-END
43
- def good_method_name!
44
- end
45
- END
46
- @excellent.check_code(code)
47
-
48
- @excellent.warnings.should be_empty
49
- end
50
-
51
- it 'should accept method names ending an equals sign' do
52
- code = <<-END
53
- def good_method_name=
54
- end
55
- END
56
- @excellent.check_code(code)
57
-
58
- @excellent.warnings.should be_empty
59
- end
60
-
61
- ['<<', '>>', '==', '<', '<=', '>', '>=', '[]', '[]=', '+', '-', '*', '~', '/', '%', '&', '^', '|'].each do |operator|
62
-
63
- it "should accept #{operator} as a method name" do
64
- code = <<-END
65
- def #{operator}
66
- end
67
- END
68
- @excellent.check_code(code)
69
-
70
- @excellent.warnings.should be_empty
71
- end
72
-
73
- end
74
-
75
- end
76
-
77
- it 'should reject camel cased method names' do
78
- code = <<-END
79
- def badMethodName
80
- end
81
- END
82
- @excellent.check_code(code)
83
- warnings = @excellent.warnings
84
-
85
- warnings.should_not be_empty
86
- warnings[0].info.should == { :method => 'badMethodName' }
87
- warnings[0].line_number.should == 1
88
- warnings[0].message.should == 'Bad method name badMethodName.'
89
- end
90
-
91
- it "should correctly return the method's full name" do
92
- code = <<-END
93
- class Class
94
- def badMethodName
95
- end
96
- def self.badMethodName2
97
- end
98
- end
99
- END
100
- @excellent.check_code(code)
101
- warnings = @excellent.warnings
102
-
103
- warnings.should_not be_empty
104
- warnings[0].info.should == { :method => 'Class#badMethodName' }
105
- warnings[0].line_number.should == 2
106
- warnings[0].message.should == 'Bad method name Class#badMethodName.'
107
- warnings[1].info.should == { :method => 'Class.badMethodName2' }
108
- warnings[1].line_number.should == 4
109
- warnings[1].message.should == 'Bad method name Class.badMethodName2.'
110
- end
111
-
112
- end
@@ -1,48 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
-
3
- describe Simplabs::Excellent::Checks::ModuleLineCountCheck do
4
-
5
- before do
6
- @excellent = Simplabs::Excellent::Runner.new(Simplabs::Excellent::Checks::ModuleLineCountCheck.new({ :threshold => 2 }))
7
- end
8
-
9
- describe '#evaluate' do
10
-
11
- it 'should accept modules with less lines than the threshold' do
12
- code = <<-END
13
- module OneLineModule; end
14
- END
15
- @excellent.check_code(code)
16
-
17
- @excellent.warnings.should be_empty
18
- end
19
-
20
- it 'should accept modules with the same number of lines as the threshold' do
21
- code = <<-END
22
- module TwoLinesModule
23
- end
24
- END
25
- @excellent.check_code(code)
26
-
27
- @excellent.warnings.should be_empty
28
- end
29
-
30
- it 'should reject modules with more lines than the threshold' do
31
- code = <<-END
32
- module FourLinesModule
33
- @foo = 1
34
- @bar = 2
35
- end
36
- END
37
- @excellent.check_code(code)
38
- warnings = @excellent.warnings
39
-
40
- warnings.should_not be_empty
41
- warnings[0].info.should == { :module => 'FourLinesModule', :count => 4 }
42
- warnings[0].line_number.should == 1
43
- warnings[0].message.should == 'FourLinesModule has 4 lines.'
44
- end
45
-
46
- end
47
-
48
- end
@@ -1,61 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
-
3
- describe Simplabs::Excellent::Checks::ModuleNameCheck do
4
-
5
- before do
6
- @excellent = Simplabs::Excellent::Runner.new(Simplabs::Excellent::Checks::ModuleNameCheck.new)
7
- end
8
-
9
- describe '#evaluate' do
10
-
11
- it 'should accept camel case module names starting in capitals' do
12
- code = <<-END
13
- module GoodModuleName
14
- end
15
- END
16
- @excellent.check_code(code)
17
-
18
- @excellent.warnings.should be_empty
19
- end
20
-
21
- it 'should accept namespaced modules' do
22
- code = <<-END
23
- module Outer::Inner::GoodModuleName
24
- end
25
- END
26
- @excellent.check_code(code)
27
-
28
- @excellent.warnings.should be_empty
29
- end
30
-
31
- it 'should reject module names with underscores' do
32
- code = <<-END
33
- module Bad_ModuleName
34
- end
35
- END
36
- @excellent.check_code(code)
37
- warnings = @excellent.warnings
38
-
39
- warnings.should_not be_empty
40
- warnings[0].info.should == { :module => 'Bad_ModuleName' }
41
- warnings[0].line_number.should == 1
42
- warnings[0].message.should == 'Bad module name Bad_ModuleName.'
43
- end
44
-
45
- it 'should correctly report bad names of namespaced modules' do
46
- code = <<-END
47
- module Outer::Inner::Bad_ModuleName
48
- end
49
- END
50
- @excellent.check_code(code)
51
- warnings = @excellent.warnings
52
-
53
- warnings.should_not be_empty
54
- warnings[0].info.should == { :module => 'Outer::Inner::Bad_ModuleName' }
55
- warnings[0].line_number.should == 1
56
- warnings[0].message.should == 'Bad module name Outer::Inner::Bad_ModuleName.'
57
- end
58
-
59
- end
60
-
61
- end
@@ -1,44 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
-
3
- describe Simplabs::Excellent::Checks::NestedIteratorsCheck do
4
-
5
- before do
6
- @excellent = Simplabs::Excellent::Runner.new(Simplabs::Excellent::Checks::NestedIteratorsCheck.new)
7
- end
8
-
9
- describe '#evaluate' do
10
-
11
- it 'should reject a block inside a block' do
12
- code = <<-END
13
- method1 do
14
- method2 do
15
- end
16
- end
17
- END
18
- @excellent.check_code(code)
19
- warnings = @excellent.warnings
20
-
21
- warnings.should_not be_empty
22
- warnings[0].info.should == { :block => 'block', :parent => 'block' }
23
- warnings[0].line_number.should == 2
24
- warnings[0].message.should == 'block inside of block.'
25
- end
26
-
27
- it 'should accept 2 blocks inside a method that are not nested' do
28
- code = <<-END
29
- def method
30
- method1 do
31
- end
32
- method2 do
33
- end
34
- end
35
- END
36
- @excellent.check_code(code)
37
- warnings = @excellent.warnings
38
-
39
- warnings.should be_empty
40
- end
41
-
42
- end
43
-
44
- end
@@ -1,97 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
-
3
- describe Simplabs::Excellent::Checks::ParameterNumberCheck do
4
-
5
- before(:each) do
6
- @excellent = Simplabs::Excellent::Runner.new(Simplabs::Excellent::Checks::ParameterNumberCheck.new({ :threshold => 1 }))
7
- end
8
-
9
- describe '#evaluate' do
10
-
11
- it 'should accept methods with less parameters than the threshold' do
12
- code = <<-END
13
- def zero_parameter_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 parameters as the threshold' do
22
- code = <<-END
23
- def one_parameter_method(first_parameter)
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 parameters than the threshold' do
32
- code = <<-END
33
- def two_parameter_method(first_parameter, second_parameter)
34
- end
35
- END
36
-
37
- verify_warning_found(code, 'two_parameter_method')
38
- end
39
-
40
- it 'should work with default values on parameters' do
41
- code = <<-END
42
- def two_parameter_method(first_parameter = 1, second_parameter = 2)
43
- end
44
- END
45
-
46
- verify_warning_found(code, 'two_parameter_method')
47
- end
48
-
49
- it 'should work with methods defined on objects' do
50
- code = <<-END
51
- def object.two_parameter_method(first_parameter = 1, second_parameter = 2)
52
- end
53
- END
54
-
55
- verify_warning_found(code, 'object.two_parameter_method')
56
- end
57
-
58
- it 'should work with methods defined directly on classes' do
59
- code = <<-END
60
- def Class.two_parameter_method(first_parameter = 1, second_parameter = 2)
61
- end
62
- END
63
-
64
- verify_warning_found(code, 'Class.two_parameter_method')
65
- end
66
-
67
- it 'should reject yield calls with more parameters than the threshold' do
68
- code = <<-END
69
- two_parameter_method do |first_parameter, second_parameter|
70
- end
71
- END
72
-
73
- verify_warning_found(code, 'block')
74
- end
75
-
76
- it 'should reject yield calls on a receiver with more parameters than the threshold' do
77
- code = <<-END
78
- receiver.two_parameter_method do |first_parameter, second_parameter|
79
- end
80
- END
81
-
82
- verify_warning_found(code, 'block')
83
- end
84
-
85
- end
86
-
87
- def verify_warning_found(code, name)
88
- @excellent.check_code(code)
89
- warnings = @excellent.warnings
90
-
91
- warnings.should_not be_empty
92
- warnings[0].info.should == { :method => name, :parameters => 2 }
93
- warnings[0].line_number.should == 1
94
- warnings[0].message.should == "#{name} has 2 parameters."
95
- end
96
-
97
- end
@@ -1,79 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
-
3
- describe Simplabs::Excellent::Checks::Rails::AttrAccessibleCheck do
4
-
5
- before do
6
- @excellent = Simplabs::Excellent::Runner.new(Simplabs::Excellent::Checks::Rails::AttrAccessibleCheck.new)
7
- end
8
-
9
- describe '#evaluate' do
10
-
11
- it 'should ignore classes that are not active record models' do
12
- code = <<-END
13
- class Test
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 an active record model that does not specify attr_accessible' do
23
- code = <<-END
24
- class User < ActiveRecord::Base
25
- end
26
- END
27
- @excellent.check_code(code)
28
- warnings = @excellent.warnings
29
-
30
- warnings.should_not be_empty
31
- warnings[0].info.should == { :class => 'User' }
32
- warnings[0].line_number.should == 1
33
- warnings[0].message.should == 'User does not specify attr_accessible.'
34
- end
35
-
36
- it 'should reject an active record model that does specify attr_protected' do
37
- code = <<-END
38
- class User < ActiveRecord::Base
39
- attr_protected :first_name
40
- end
41
- END
42
- @excellent.check_code(code)
43
- warnings = @excellent.warnings
44
-
45
- warnings.should_not be_empty
46
- warnings[0].info.should == { :class => 'User' }
47
- warnings[0].line_number.should == 1
48
- warnings[0].message.should == 'User does not specify attr_accessible.'
49
- end
50
-
51
- it 'should accept an active record model that does specify attr_accessible' do
52
- code = <<-END
53
- class User < ActiveRecord::Base
54
- attr_accessible :first_name
55
- end
56
- END
57
- @excellent.check_code(code)
58
- warnings = @excellent.warnings
59
-
60
- warnings.should be_empty
61
- end
62
-
63
- it 'should also work with namespaced models' do
64
- code = <<-END
65
- class Backend::User < ActiveRecord::Base
66
- end
67
- END
68
- @excellent.check_code(code)
69
- warnings = @excellent.warnings
70
-
71
- warnings.should_not be_empty
72
- warnings[0].info.should == { :class => 'Backend::User' }
73
- warnings[0].line_number.should == 1
74
- warnings[0].message.should == 'Backend::User does not specify attr_accessible.'
75
- end
76
-
77
- end
78
-
79
- end