rails_best_practices 1.14.0 → 1.14.1
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.
- checksums.yaml +4 -4
- data/.travis.yml +0 -1
- data/README.md +4 -3
- data/lib/rails_best_practices/core/check.rb +1 -1
- data/lib/rails_best_practices/core/methods.rb +5 -4
- data/lib/rails_best_practices/prepares/controller_prepare.rb +5 -5
- data/lib/rails_best_practices/prepares/helper_prepare.rb +3 -3
- data/lib/rails_best_practices/prepares/model_prepare.rb +12 -12
- data/lib/rails_best_practices/reviews/always_add_db_index_review.rb +1 -1
- data/lib/rails_best_practices/reviews/move_code_into_controller_review.rb +1 -1
- data/lib/rails_best_practices/reviews/needless_deep_nesting_review.rb +1 -1
- data/lib/rails_best_practices/reviews/not_rescue_exception_review.rb +1 -1
- data/lib/rails_best_practices/reviews/overuse_route_customizations_review.rb +2 -2
- data/lib/rails_best_practices/reviews/remove_unused_methods_in_controllers_review.rb +1 -1
- data/lib/rails_best_practices/reviews/remove_unused_methods_in_helpers_review.rb +1 -1
- data/lib/rails_best_practices/reviews/remove_unused_methods_in_models_review.rb +1 -1
- data/lib/rails_best_practices/reviews/use_before_filter_review.rb +7 -7
- data/lib/rails_best_practices/reviews/use_query_attribute_review.rb +1 -1
- data/lib/rails_best_practices/reviews/use_say_with_time_in_migrations_review.rb +1 -1
- data/lib/rails_best_practices/version.rb +1 -1
- data/rails_best_practices.gemspec +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9d6e0107b4ea24053498f1c9996cf1109cd7f7ca
|
4
|
+
data.tar.gz: 136b20157ca9b1f557d69955fc320e018be97749
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c565ecd5732afe084d926f71fdd4780e4a6201d79f6fa9406a5acf115faced692731935b042b87ee7915e76adab2cce1fe481c00e718002e913854199cd21f89
|
7
|
+
data.tar.gz: 0d9f67c5435ee528e2f0f17ad1d866bb3f4ee88c340ece9732002ea8247a5f21ec3a4417eda96c994f45e43f353020cf59959f809012a875d2055c37cf6fe9fe
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
# rails_best_practices
|
2
2
|
|
3
|
+
[](http://badge.fury.io/rb/rails_best_practices)
|
3
4
|
[](http://travis-ci.org/railsbp/rails_best_practices)
|
4
|
-
[](http://coderwall.com/flyerhzm)
|
5
|
+
[](https://coveralls.io/r/railsbp/rails_best_practices)
|
6
|
+
[](https://codeclimate.com/repos/51eb7073f3ea00179b00db0b/feed)
|
7
7
|
|
8
|
+
[](http://coderwall.com/flyerhzm)
|
8
9
|
[](http://www.pledgie.com/campaigns/12057)
|
9
10
|
|
10
11
|
rails_best_practices is a code metric tool to check the quality of rails codes.
|
@@ -46,7 +46,7 @@ module RailsBestPractices
|
|
46
46
|
# @param [String] message, is the string message for violation of the rails best practice
|
47
47
|
# @param [String] filename, is the filename of source code
|
48
48
|
# @param [Integer] line_number, is the line number of the source code which is reviewing
|
49
|
-
def add_error(message, filename = @node.file, line_number = @node.
|
49
|
+
def add_error(message, filename = @node.file, line_number = @node.line_number)
|
50
50
|
errors << RailsBestPractices::Core::Error.new(
|
51
51
|
filename: filename,
|
52
52
|
line_number: line_number,
|
@@ -12,7 +12,7 @@ module RailsBestPractices
|
|
12
12
|
#
|
13
13
|
# @param [String] class name
|
14
14
|
# @param [String] method name
|
15
|
-
# @param [Hash] method meta, file and line, {"file" => "app/models/post.rb", "
|
15
|
+
# @param [Hash] method meta, file and line, {"file" => "app/models/post.rb", "line_number" => 5}
|
16
16
|
# @param [String] access control, public, protected or private
|
17
17
|
def add_method(class_name, method_name, meta={}, access_control="public")
|
18
18
|
return if class_name == ""
|
@@ -141,15 +141,15 @@ module RailsBestPractices
|
|
141
141
|
end
|
142
142
|
end
|
143
143
|
|
144
|
-
# Method info includes class name, method name, access control, file,
|
144
|
+
# Method info includes class name, method name, access control, file, line_number, used.
|
145
145
|
class Method
|
146
|
-
attr_reader :access_control, :class_name, :method_name, :used, :file, :
|
146
|
+
attr_reader :access_control, :class_name, :method_name, :used, :file, :line_number
|
147
147
|
|
148
148
|
def initialize(class_name, method_name, access_control, meta)
|
149
149
|
@class_name = class_name
|
150
150
|
@method_name = method_name
|
151
151
|
@file = meta["file"]
|
152
|
-
@
|
152
|
+
@line_number = meta["line_number"]
|
153
153
|
@access_control = access_control
|
154
154
|
@used = false
|
155
155
|
end
|
@@ -163,6 +163,7 @@ module RailsBestPractices
|
|
163
163
|
def publicize
|
164
164
|
@access_control = "public"
|
165
165
|
end
|
166
|
+
|
166
167
|
end
|
167
168
|
end
|
168
169
|
end
|
@@ -32,7 +32,7 @@ module RailsBestPractices
|
|
32
32
|
add_callback :end_class do |node|
|
33
33
|
if @inherited_resources && "ApplicationController" != current_class_name
|
34
34
|
@actions.each do |action|
|
35
|
-
@methods.add_method(current_class_name, action, {"file" => node.file, "
|
35
|
+
@methods.add_method(current_class_name, action, {"file" => node.file, "line_number" => node.line_number})
|
36
36
|
end
|
37
37
|
end
|
38
38
|
end
|
@@ -73,16 +73,16 @@ module RailsBestPractices
|
|
73
73
|
# the remembered methods (@methods) are like
|
74
74
|
# {
|
75
75
|
# "PostsController" => {
|
76
|
-
# "save" => {"file" => "app/controllers/posts_controller.rb", "
|
77
|
-
# "find" => {"file" => "app/controllers/posts_controller.rb", "
|
76
|
+
# "save" => {"file" => "app/controllers/posts_controller.rb", "line_number" => 10, "unused" => false},
|
77
|
+
# "find" => {"file" => "app/controllers/posts_controller.rb", "line_number" => 10, "unused" => false}
|
78
78
|
# },
|
79
79
|
# "CommentsController" => {
|
80
|
-
# "create" => {"file" => "app/controllers/comments_controller.rb", "
|
80
|
+
# "create" => {"file" => "app/controllers/comments_controller.rb", "line_number" => 10, "unused" => false},
|
81
81
|
# }
|
82
82
|
# }
|
83
83
|
add_callback :start_def do |node|
|
84
84
|
method_name = node.method_name.to_s
|
85
|
-
@methods.add_method(current_class_name, method_name, {"file" => node.file, "
|
85
|
+
@methods.add_method(current_class_name, method_name, {"file" => node.file, "line_number" => node.line_number}, current_access_control)
|
86
86
|
end
|
87
87
|
|
88
88
|
# ask Reviews::RemoveUnusedMoethodsInHelperReview to check the controllers who include helpers.
|
@@ -24,14 +24,14 @@ module RailsBestPractices
|
|
24
24
|
# the remembered methods (@methods) are like
|
25
25
|
# {
|
26
26
|
# "PostsHelper" => {
|
27
|
-
# "create_time" => {"file" => "app/helpers/posts_helper.rb", "
|
28
|
-
# "update_time" => {"file" => "app/helpers/posts_helper.rb", "
|
27
|
+
# "create_time" => {"file" => "app/helpers/posts_helper.rb", "line_number" => 10, "unused" => false},
|
28
|
+
# "update_time" => {"file" => "app/helpers/posts_helper.rb", "line_number" => 10, "unused" => false}
|
29
29
|
# }
|
30
30
|
# }
|
31
31
|
add_callback :start_def do |node|
|
32
32
|
if node.file =~ HELPER_FILES
|
33
33
|
method_name = node.method_name.to_s
|
34
|
-
@methods.add_method(current_module_name, method_name, {"file" => node.file, "
|
34
|
+
@methods.add_method(current_module_name, method_name, {"file" => node.file, "line_number" => node.line_number}, current_access_control)
|
35
35
|
end
|
36
36
|
end
|
37
37
|
end
|
@@ -30,11 +30,11 @@ module RailsBestPractices
|
|
30
30
|
# the remembered methods (@methods) are like
|
31
31
|
# {
|
32
32
|
# "Post" => {
|
33
|
-
# "save" => {"file" => "app/models/post.rb", "
|
34
|
-
# "find" => {"file" => "app/models/post.rb", "
|
33
|
+
# "save" => {"file" => "app/models/post.rb", "line_number" => 10, "unused" => false, "unused" => false},
|
34
|
+
# "find" => {"file" => "app/models/post.rb", "line_number" => 10, "unused" => false, "unused" => false}
|
35
35
|
# },
|
36
36
|
# "Comment" => {
|
37
|
-
# "create" => {"file" => "app/models/comment.rb", "
|
37
|
+
# "create" => {"file" => "app/models/comment.rb", "line_number" => 10, "unused" => false, "unused" => false},
|
38
38
|
# }
|
39
39
|
# }
|
40
40
|
add_callback :start_def do |node|
|
@@ -42,7 +42,7 @@ module RailsBestPractices
|
|
42
42
|
"ActionMailer::Base" != current_extend_class_name &&
|
43
43
|
(classable_modules.empty? || klasses.any?)
|
44
44
|
method_name = node.method_name.to_s
|
45
|
-
@methods.add_method(current_class_name, method_name, {"file" => node.file, "
|
45
|
+
@methods.add_method(current_class_name, method_name, {"file" => node.file, "line_number" => node.line_number}, current_access_control)
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
@@ -51,17 +51,17 @@ module RailsBestPractices
|
|
51
51
|
# the remembered methods (@methods) are like
|
52
52
|
# {
|
53
53
|
# "Post" => {
|
54
|
-
# "save" => {"file" => "app/models/post.rb", "
|
55
|
-
# "find" => {"file" => "app/models/post.rb", "
|
54
|
+
# "save" => {"file" => "app/models/post.rb", "line_number" => 10, "unused" => false, "unused" => false},
|
55
|
+
# "find" => {"file" => "app/models/post.rb", "line_number" => 10, "unused" => false, "unused" => false}
|
56
56
|
# },
|
57
57
|
# "Comment" => {
|
58
|
-
# "create" => {"file" => "app/models/comment.rb", "
|
58
|
+
# "create" => {"file" => "app/models/comment.rb", "line_number" => 10, "unused" => false, "unused" => false},
|
59
59
|
# }
|
60
60
|
# }
|
61
61
|
add_callback :start_defs do |node|
|
62
62
|
if @klass && "ActionMailer::Base" != current_extend_class_name
|
63
63
|
method_name = node.method_name.to_s
|
64
|
-
@methods.add_method(current_class_name, method_name, {"file" => node.file, "
|
64
|
+
@methods.add_method(current_class_name, method_name, {"file" => node.file, "line_number" => node.line_number}, current_access_control)
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
@@ -80,11 +80,11 @@ module RailsBestPractices
|
|
80
80
|
case node.message.to_s
|
81
81
|
when *%w(named_scope scope alias_method)
|
82
82
|
method_name = node.arguments.all.first.to_s
|
83
|
-
@methods.add_method(current_class_name, method_name, {"file" => node.file, "
|
83
|
+
@methods.add_method(current_class_name, method_name, {"file" => node.file, "line_number" => node.line_number}, current_access_control)
|
84
84
|
when "alias_method_chain"
|
85
85
|
method, feature = *node.arguments.all.map(&:to_s)
|
86
|
-
@methods.add_method(current_class_name, "#{method}_with_#{feature}", {"file" => node.file, "
|
87
|
-
@methods.add_method(current_class_name, "#{method}", {"file" => node.file, "
|
86
|
+
@methods.add_method(current_class_name, "#{method}_with_#{feature}", {"file" => node.file, "line_number" => node.line_number}, current_access_control)
|
87
|
+
@methods.add_method(current_class_name, "#{method}", {"file" => node.file, "line_number" => node.line_number}, current_access_control)
|
88
88
|
when "field"
|
89
89
|
arguments = node.arguments.all
|
90
90
|
attribute_name = arguments.first.to_s
|
@@ -102,7 +102,7 @@ module RailsBestPractices
|
|
102
102
|
# check alias node to remembr the alias methods.
|
103
103
|
add_callback :start_alias do |node|
|
104
104
|
method_name = node.new_method.to_s
|
105
|
-
@methods.add_method(current_class_name, method_name, {"file" => node.file, "
|
105
|
+
@methods.add_method(current_class_name, method_name, {"file" => node.file, "line_number" => node.line_number}, current_access_control)
|
106
106
|
end
|
107
107
|
|
108
108
|
# after prepare process, fix incorrect associations' class_name.
|
@@ -74,7 +74,7 @@ module RailsBestPractices
|
|
74
74
|
table_node = @table_nodes[table]
|
75
75
|
foreign_key.each do |column|
|
76
76
|
if not_indexed?(table, column)
|
77
|
-
add_error "always add db index (#{table} => [#{Array(column).join(', ')}])", table_node.file, table_node.
|
77
|
+
add_error "always add db index (#{table} => [#{Array(column).join(', ')}])", table_node.file, table_node.line_number
|
78
78
|
end
|
79
79
|
end
|
80
80
|
end
|
@@ -31,7 +31,7 @@ module RailsBestPractices
|
|
31
31
|
# and the message of the right value node is one of the find, all, first and last,
|
32
32
|
# then it is a finder and should be moved to controller.
|
33
33
|
add_callback :start_assign do |node|
|
34
|
-
add_error "move code into controller", node.file, node.right_value.
|
34
|
+
add_error "move code into controller", node.file, node.right_value.line_number if finder?(node.right_value)
|
35
35
|
end
|
36
36
|
|
37
37
|
private
|
@@ -70,7 +70,7 @@ module RailsBestPractices
|
|
70
70
|
end
|
71
71
|
@counter -= 1
|
72
72
|
elsif [:command_call, :command].include?(node.sexp_type) && ["resources", "resource"].include?(node.message.to_s)
|
73
|
-
add_error "needless deep nesting (nested_count > #{@nested_count})", @file, node.
|
73
|
+
add_error "needless deep nesting (nested_count > #{@nested_count})", @file, node.line_number if @counter >= @nested_count && !@shallow_nodes.include?(node)
|
74
74
|
end
|
75
75
|
end
|
76
76
|
end
|
@@ -18,7 +18,7 @@ module RailsBestPractices
|
|
18
18
|
# check rescue node to see if its type is Exception
|
19
19
|
add_callback :start_rescue do |rescue_node|
|
20
20
|
if rescue_node.exception_classes.any? { |rescue_class| "Exception" == rescue_class.to_s }
|
21
|
-
add_error "not rescue Exception", rescue_node.file, rescue_node.exception_classes.first.
|
21
|
+
add_error "not rescue Exception", rescue_node.file, rescue_node.exception_classes.first.line_number
|
22
22
|
end
|
23
23
|
end
|
24
24
|
end
|
@@ -46,7 +46,7 @@ module RailsBestPractices
|
|
46
46
|
# then they are overuse route customizations.
|
47
47
|
add_callback :start_command_call do |node|
|
48
48
|
if member_and_collection_count_for_rails2(node) > @customize_count
|
49
|
-
add_error "overuse route customizations (customize_count > #{@customize_count})", node.file, node.receiver.
|
49
|
+
add_error "overuse route customizations (customize_count > #{@customize_count})", node.file, node.receiver.line_number
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
@@ -59,7 +59,7 @@ module RailsBestPractices
|
|
59
59
|
# then they are overuse route customizations.
|
60
60
|
add_callback :start_method_add_block do |node|
|
61
61
|
if member_and_collection_count_for_rails3(node) > @customize_count
|
62
|
-
add_error "overuse route customizations (customize_count > #{@customize_count})", node.file, node.
|
62
|
+
add_error "overuse route customizations (customize_count > #{@customize_count})", node.file, node.line_number
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
@@ -94,7 +94,7 @@ module RailsBestPractices
|
|
94
94
|
end
|
95
95
|
@controller_methods.get_all_unused_methods.each do |method|
|
96
96
|
if !excepted?(method)
|
97
|
-
add_error "remove unused methods (#{method.class_name}##{method.method_name})", method.file, method.
|
97
|
+
add_error "remove unused methods (#{method.class_name}##{method.method_name})", method.file, method.line_number
|
98
98
|
end
|
99
99
|
end
|
100
100
|
end
|
@@ -26,7 +26,7 @@ module RailsBestPractices
|
|
26
26
|
add_callback :after_check do
|
27
27
|
@helper_methods.get_all_unused_methods.each do |method|
|
28
28
|
if !excepted?(method)
|
29
|
-
add_error "remove unused methods (#{method.class_name}##{method.method_name})", method.file, method.
|
29
|
+
add_error "remove unused methods (#{method.class_name}##{method.method_name})", method.file, method.line_number
|
30
30
|
end
|
31
31
|
end
|
32
32
|
end
|
@@ -80,7 +80,7 @@ module RailsBestPractices
|
|
80
80
|
add_callback :after_check do
|
81
81
|
@model_methods.get_all_unused_methods.each do |method|
|
82
82
|
if !excepted?(method) && method.method_name !~ /=$/
|
83
|
-
add_error "remove unused methods (#{method.class_name}##{method.method_name})", method.file, method.
|
83
|
+
add_error "remove unused methods (#{method.class_name}##{method.method_name})", method.file, method.line_number
|
84
84
|
end
|
85
85
|
end
|
86
86
|
end
|
@@ -2,14 +2,14 @@
|
|
2
2
|
module RailsBestPractices
|
3
3
|
module Reviews
|
4
4
|
# Review a controller file to make sure to use before_filter to remove duplicated first code
|
5
|
-
#
|
5
|
+
# line_number in different action.
|
6
6
|
#
|
7
7
|
# See the best practice detailed here http://rails-bestpractices.com/posts/22-use-before_filter.
|
8
8
|
#
|
9
9
|
# Implementation:
|
10
10
|
#
|
11
11
|
# Review process:
|
12
|
-
# check all first code
|
12
|
+
# check all first code line_number in method definitions (actions),
|
13
13
|
# if they are duplicated, then they should be moved to before_filter.
|
14
14
|
class UseBeforeFilterReview < Review
|
15
15
|
interesting_nodes :class
|
@@ -21,11 +21,11 @@ module RailsBestPractices
|
|
21
21
|
@customize_count = options['customize_count'] || 2
|
22
22
|
end
|
23
23
|
|
24
|
-
# check class define node to see if there are method define nodes whose first code
|
24
|
+
# check class define node to see if there are method define nodes whose first code line_number are duplicated.
|
25
25
|
#
|
26
26
|
# it will check every def nodes in the class node until protected or private identification,
|
27
|
-
# if there are defn nodes who have the same first code
|
28
|
-
# then these duplicated first code
|
27
|
+
# if there are defn nodes who have the same first code line_number,
|
28
|
+
# then these duplicated first code line_numbers should be moved to before_filter.
|
29
29
|
add_callback :start_class do |node|
|
30
30
|
@first_sentences = {}
|
31
31
|
|
@@ -39,7 +39,7 @@ module RailsBestPractices
|
|
39
39
|
if def_nodes.size > @customize_count
|
40
40
|
add_error "use before_filter for #{def_nodes.map { |node| node.method_name.to_s }.join(',')}",
|
41
41
|
node.file,
|
42
|
-
def_nodes.map(&:
|
42
|
+
def_nodes.map(&:line_number).join(',')
|
43
43
|
end
|
44
44
|
end
|
45
45
|
end
|
@@ -49,7 +49,7 @@ module RailsBestPractices
|
|
49
49
|
def remember_first_sentence(node)
|
50
50
|
first_sentence = node.body.statements.first
|
51
51
|
return unless first_sentence
|
52
|
-
first_sentence = first_sentence.
|
52
|
+
first_sentence = first_sentence.remove_line_number_and_column
|
53
53
|
unless first_sentence == s(:nil)
|
54
54
|
@first_sentences[first_sentence] ||= []
|
55
55
|
@first_sentences[first_sentence] << node
|
@@ -43,7 +43,7 @@ module RailsBestPractices
|
|
43
43
|
receiver_node = query_attribute_node.receiver
|
44
44
|
add_error "use query attribute (#{receiver_node.receiver}.#{receiver_node.message}?)",
|
45
45
|
node.file,
|
46
|
-
query_attribute_node.
|
46
|
+
query_attribute_node.line_number
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
@@ -39,7 +39,7 @@ module RailsBestPractices
|
|
39
39
|
child_node
|
40
40
|
end
|
41
41
|
if :call == receiver_node.sexp_type
|
42
|
-
add_error("use say with time in migrations", node.file, child_node.
|
42
|
+
add_error("use say with time in migrations", node.file, child_node.line_number)
|
43
43
|
end
|
44
44
|
end
|
45
45
|
end
|
@@ -16,7 +16,7 @@ Gem::Specification.new do |s|
|
|
16
16
|
|
17
17
|
s.add_dependency("activesupport")
|
18
18
|
s.add_dependency("awesome_print")
|
19
|
-
s.add_dependency("code_analyzer")
|
19
|
+
s.add_dependency("code_analyzer", ">= 0.4.0")
|
20
20
|
s.add_dependency("colored")
|
21
21
|
s.add_dependency("erubis")
|
22
22
|
s.add_dependency("i18n")
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_best_practices
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.14.
|
4
|
+
version: 1.14.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Richard Huang
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-08-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - '>='
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 0.4.0
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 0.4.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: colored
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -398,7 +398,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
398
398
|
version: 1.3.6
|
399
399
|
requirements: []
|
400
400
|
rubyforge_project:
|
401
|
-
rubygems_version: 2.0.
|
401
|
+
rubygems_version: 2.0.6
|
402
402
|
signing_key:
|
403
403
|
specification_version: 4
|
404
404
|
summary: a code metric tool for rails codes.
|