rails_best_practices 1.10.1 → 1.11.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/.gitignore +1 -0
- data/README.md +11 -6
- data/assets/result.html.erb +76 -46
- data/install_supported_rubies.sh +3 -0
- data/lib/rails_best_practices.rb +2 -1
- data/lib/rails_best_practices/analyzer.rb +10 -8
- data/lib/rails_best_practices/core.rb +0 -4
- data/lib/rails_best_practices/core/check.rb +41 -117
- data/lib/rails_best_practices/core/error.rb +3 -9
- data/lib/rails_best_practices/core/runner.rb +20 -80
- data/lib/rails_best_practices/lexicals/long_line_check.rb +2 -1
- data/lib/rails_best_practices/lexicals/remove_tab_check.rb +1 -3
- data/lib/rails_best_practices/lexicals/remove_trailing_whitespace_check.rb +1 -3
- data/lib/rails_best_practices/prepares/config_prepare.rb +1 -1
- data/lib/rails_best_practices/prepares/controller_prepare.rb +7 -8
- data/lib/rails_best_practices/prepares/helper_prepare.rb +2 -2
- data/lib/rails_best_practices/prepares/mailer_prepare.rb +1 -1
- data/lib/rails_best_practices/prepares/model_prepare.rb +6 -7
- data/lib/rails_best_practices/prepares/route_prepare.rb +12 -13
- data/lib/rails_best_practices/prepares/schema_prepare.rb +2 -2
- data/lib/rails_best_practices/reviews/add_model_virtual_attribute_review.rb +19 -15
- data/lib/rails_best_practices/reviews/always_add_db_index_review.rb +10 -17
- data/lib/rails_best_practices/reviews/dry_bundler_in_capistrano_review.rb +2 -5
- data/lib/rails_best_practices/reviews/hash_syntax_review.rb +3 -30
- data/lib/rails_best_practices/reviews/isolate_seed_data_review.rb +7 -10
- data/lib/rails_best_practices/reviews/keep_finders_on_their_own_model_review.rb +5 -9
- data/lib/rails_best_practices/reviews/law_of_demeter_review.rb +10 -13
- data/lib/rails_best_practices/reviews/move_code_into_controller_review.rb +6 -9
- data/lib/rails_best_practices/reviews/move_code_into_helper_review.rb +2 -5
- data/lib/rails_best_practices/reviews/move_code_into_model_review.rb +7 -13
- data/lib/rails_best_practices/reviews/move_finder_to_named_scope_review.rb +3 -6
- data/lib/rails_best_practices/reviews/move_model_logic_into_model_review.rb +6 -9
- data/lib/rails_best_practices/reviews/needless_deep_nesting_review.rb +3 -6
- data/lib/rails_best_practices/reviews/not_use_default_route_review.rb +4 -7
- data/lib/rails_best_practices/reviews/not_use_time_ago_in_words_review.rb +2 -5
- data/lib/rails_best_practices/reviews/overuse_route_customizations_review.rb +7 -10
- data/lib/rails_best_practices/reviews/protect_mass_assignment_review.rb +2 -5
- data/lib/rails_best_practices/reviews/remove_empty_helpers_review.rb +2 -5
- data/lib/rails_best_practices/reviews/remove_unused_methods_in_controllers_review.rb +8 -6
- data/lib/rails_best_practices/reviews/remove_unused_methods_in_helpers_review.rb +1 -2
- data/lib/rails_best_practices/reviews/remove_unused_methods_in_models_review.rb +4 -5
- data/lib/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review.rb +9 -12
- data/lib/rails_best_practices/reviews/replace_instance_variable_with_local_variable_review.rb +2 -13
- data/lib/rails_best_practices/reviews/restrict_auto_generated_routes_review.rb +18 -26
- data/lib/rails_best_practices/reviews/review.rb +6 -7
- data/lib/rails_best_practices/reviews/simplify_render_in_controllers_review.rb +2 -5
- data/lib/rails_best_practices/reviews/simplify_render_in_views_review.rb +2 -5
- data/lib/rails_best_practices/reviews/use_before_filter_review.rb +2 -5
- data/lib/rails_best_practices/reviews/use_model_association_review.rb +11 -14
- data/lib/rails_best_practices/reviews/use_multipart_alternative_as_content_type_of_email_review.rb +11 -8
- data/lib/rails_best_practices/reviews/use_observer_review.rb +8 -11
- data/lib/rails_best_practices/reviews/use_parentheses_in_method_def_review.rb +1 -1
- data/lib/rails_best_practices/reviews/use_query_attribute_review.rb +12 -18
- data/lib/rails_best_practices/reviews/use_say_with_time_in_migrations_review.rb +7 -10
- data/lib/rails_best_practices/reviews/use_scope_access_review.rb +4 -10
- data/lib/rails_best_practices/version.rb +1 -1
- data/rails_best_practices.gemspec +1 -1
- data/rails_best_practices.yml +5 -5
- data/spec/rails_best_practices/core/check_spec.rb +0 -67
- data/spec/rails_best_practices/prepares/controller_prepare_spec.rb +0 -1
- data/spec/rails_best_practices/prepares/model_prepare_spec.rb +0 -4
- data/spec/rails_best_practices/reviews/hash_syntax_review_spec.rb +3 -30
- data/spec/rails_best_practices/reviews/remove_unused_methods_in_controllers_review_spec.rb +22 -0
- data/spec/rails_best_practices/reviews/remove_unused_methods_in_models_review_spec.rb +19 -0
- data/spec/rails_best_practices/reviews/use_multipart_alternative_as_content_type_of_email_review_spec.rb +2 -2
- data/spec/spec_helper.rb +0 -4
- metadata +28 -41
- data/Gemfile.lock +0 -71
- data/lib/rails_best_practices/core/checking_visitor.rb +0 -80
- data/lib/rails_best_practices/core/nil.rb +0 -37
- data/lib/rails_best_practices/core_ext/enumerable.rb +0 -9
- data/lib/rails_best_practices/core_ext/sexp.rb +0 -840
- data/spec/rails_best_practices/core/checking_visitor_spec.rb +0 -79
- data/spec/rails_best_practices/core/nil_spec.rb +0 -37
- data/spec/rails_best_practices/core_ext/enumerable_spec.rb +0 -7
- data/spec/rails_best_practices/core_ext/sexp_spec.rb +0 -613
@@ -4,14 +4,12 @@ module RailsBestPractices
|
|
4
4
|
# Error is the violation to rails best practice.
|
5
5
|
#
|
6
6
|
# it indicates the filenname, line number and error message for the violation.
|
7
|
-
class Error
|
8
|
-
attr_reader :
|
7
|
+
class Error < CodeAnalyzer::Warning
|
8
|
+
attr_reader :type, :url
|
9
9
|
attr_accessor :git_commit, :git_username, :hg_commit, :hg_username, :highlight
|
10
10
|
|
11
11
|
def initialize(options={})
|
12
|
-
|
13
|
-
@line_number = options[:line_number].to_s
|
14
|
-
@message = options[:message]
|
12
|
+
super
|
15
13
|
@type = options[:type]
|
16
14
|
@url = options[:url]
|
17
15
|
@git_commit = options[:git_commit]
|
@@ -28,10 +26,6 @@ module RailsBestPractices
|
|
28
26
|
def first_line_number
|
29
27
|
line_number.split(',').first
|
30
28
|
end
|
31
|
-
|
32
|
-
def to_s
|
33
|
-
"#{@filename}:#{@line_number} - #{@message}"
|
34
|
-
end
|
35
29
|
end
|
36
30
|
end
|
37
31
|
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require 'yaml'
|
3
|
-
require 'ripper'
|
4
3
|
require 'active_support/inflector'
|
5
4
|
require 'active_support/core_ext/object/blank'
|
6
5
|
begin
|
@@ -19,7 +18,6 @@ module RailsBestPractices
|
|
19
18
|
# 2. review process, it does real check, if the source code violates some best practices, the violations will be notified.
|
20
19
|
class Runner
|
21
20
|
attr_reader :checks
|
22
|
-
attr_accessor :debug, :whiny, :color
|
23
21
|
|
24
22
|
# set the base path.
|
25
23
|
#
|
@@ -50,66 +48,46 @@ module RailsBestPractices
|
|
50
48
|
@reviews = reviews.empty? ? load_reviews : reviews
|
51
49
|
load_plugin_reviews if reviews.empty?
|
52
50
|
|
53
|
-
@
|
54
|
-
@
|
55
|
-
@
|
51
|
+
@lexical_checker ||= CodeAnalyzer::CheckingVisitor::Plain.new(checkers: @lexicals)
|
52
|
+
@prepare_checker ||= CodeAnalyzer::CheckingVisitor::Default.new(checkers: @prepares)
|
53
|
+
@review_checker ||= CodeAnalyzer::CheckingVisitor::Default.new(checkers: @reviews)
|
56
54
|
end
|
57
55
|
|
58
56
|
# lexical analysis the file.
|
59
57
|
#
|
60
|
-
# @param [String] filename
|
61
|
-
# @param [String] content
|
58
|
+
# @param [String] filename of the file
|
59
|
+
# @param [String] content of the file
|
62
60
|
def lexical(filename, content)
|
63
|
-
|
64
|
-
@checker.lexical(filename, content)
|
61
|
+
@lexical_checker.check(filename, content)
|
65
62
|
end
|
66
63
|
|
67
|
-
|
68
|
-
|
69
|
-
# @param [String] filename
|
70
|
-
def lexical_file(filename)
|
71
|
-
lexical(filename, read_file(filename))
|
64
|
+
def after_lexical
|
65
|
+
@lexical_checker.after_check
|
72
66
|
end
|
73
67
|
|
74
|
-
# parepare
|
68
|
+
# parepare the file.
|
75
69
|
#
|
76
|
-
# @param [String] filename
|
77
|
-
# @param [String] content
|
70
|
+
# @param [String] filename of the file
|
71
|
+
# @param [String] content of the file
|
78
72
|
def prepare(filename, content)
|
79
|
-
|
80
|
-
node = parse_ruby(filename, content)
|
81
|
-
if node
|
82
|
-
node.file = filename
|
83
|
-
node.prepare(@checker)
|
84
|
-
end
|
73
|
+
@prepare_checker.check(filename, content)
|
85
74
|
end
|
86
75
|
|
87
|
-
|
88
|
-
|
89
|
-
# @param [String] filename
|
90
|
-
def prepare_file(filename)
|
91
|
-
prepare(filename, read_file(filename))
|
76
|
+
def after_prepare
|
77
|
+
@prepare_checker.after_check
|
92
78
|
end
|
93
79
|
|
94
|
-
# review
|
80
|
+
# review the file.
|
95
81
|
#
|
96
|
-
# @param [String] filename
|
97
|
-
# @param [String] content
|
82
|
+
# @param [String] filename of the file
|
83
|
+
# @param [String] content of the file
|
98
84
|
def review(filename, content)
|
99
|
-
puts filename if @debug
|
100
85
|
content = parse_html_template(filename, content)
|
101
|
-
|
102
|
-
if node
|
103
|
-
node.file = filename
|
104
|
-
node.review(@checker)
|
105
|
-
end
|
86
|
+
@review_checker.check(filename, content)
|
106
87
|
end
|
107
88
|
|
108
|
-
|
109
|
-
|
110
|
-
# @param [String] filename
|
111
|
-
def review_file(filename)
|
112
|
-
review(filename, read_file(filename))
|
89
|
+
def after_review
|
90
|
+
@review_checker.after_check
|
113
91
|
end
|
114
92
|
|
115
93
|
# get all errors from lexicals and reviews.
|
@@ -119,45 +97,7 @@ module RailsBestPractices
|
|
119
97
|
@errors ||= (@reviews + @lexicals).collect {|check| check.errors}.flatten
|
120
98
|
end
|
121
99
|
|
122
|
-
def after_lexical; end
|
123
|
-
|
124
|
-
# provide a handler after all files reviewed.
|
125
|
-
def after_prepare
|
126
|
-
filename = "rails_best_practices.after_prepare"
|
127
|
-
content = "class RailsBestPractices::AfterPrepare; end"
|
128
|
-
node = parse_ruby(filename, content)
|
129
|
-
node.file = filename
|
130
|
-
node.prepare(@checker)
|
131
|
-
end
|
132
|
-
|
133
|
-
# provide a handler after all files reviewed.
|
134
|
-
def after_review
|
135
|
-
filename = "rails_best_practices.after_review"
|
136
|
-
content = "class RailsBestPractices::AfterReview; end"
|
137
|
-
node = parse_ruby(filename, content)
|
138
|
-
node.file = filename
|
139
|
-
node.review(@checker)
|
140
|
-
end
|
141
|
-
|
142
100
|
private
|
143
|
-
# parse ruby code.
|
144
|
-
#
|
145
|
-
# @param [String] filename is the filename of ruby file.
|
146
|
-
# @param [String] content is the source code of ruby file.
|
147
|
-
def parse_ruby(filename, content)
|
148
|
-
begin
|
149
|
-
Sexp.from_array(Ripper::SexpBuilder.new(content).parse)
|
150
|
-
rescue Exception => e
|
151
|
-
if @debug
|
152
|
-
warning = "#{filename} looks like it's not a valid Ruby file. Skipping..."
|
153
|
-
warning = warning.red if self.color
|
154
|
-
puts warning
|
155
|
-
end
|
156
|
-
raise e if @whiny
|
157
|
-
nil
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
101
|
# parse html tempalte code, erb, haml and slim.
|
162
102
|
#
|
163
103
|
# @param [String] filename is the filename of the erb, haml or slim code.
|
@@ -7,9 +7,7 @@ module RailsBestPractices
|
|
7
7
|
#
|
8
8
|
# See the best practice details here http://rails-bestpractices.com/posts/81-remove-tab
|
9
9
|
class RemoveTabCheck < Core::Check
|
10
|
-
|
11
|
-
"http://rails-bestpractices.com/posts/81-remove-tab"
|
12
|
-
end
|
10
|
+
url "http://rails-bestpractices.com/posts/81-remove-tab"
|
13
11
|
|
14
12
|
# check if the content of file contains a tab.
|
15
13
|
#
|
@@ -7,9 +7,7 @@ module RailsBestPractices
|
|
7
7
|
#
|
8
8
|
# See the best practice details here http://rails-bestpractices.com/posts/60-remove-trailing-whitespace
|
9
9
|
class RemoveTrailingWhitespaceCheck < Core::Check
|
10
|
-
|
11
|
-
"http://rails-bestpractices.com/posts/60-remove-trailing-whitespace"
|
12
|
-
end
|
10
|
+
url "http://rails-bestpractices.com/posts/60-remove-trailing-whitespace"
|
13
11
|
|
14
12
|
# check if the content of file contain a trailing whitespace.
|
15
13
|
#
|
@@ -11,7 +11,7 @@ module RailsBestPractices
|
|
11
11
|
@configs = Prepares.configs
|
12
12
|
end
|
13
13
|
|
14
|
-
|
14
|
+
add_callback :start_assign do |node|
|
15
15
|
if node.left_value.grep_node(sexp_type: [:vcall, :var_ref], to_s: "config").present?
|
16
16
|
@configs[node.left_value.to_s] = node.right_value.to_s
|
17
17
|
end
|
@@ -8,7 +8,6 @@ module RailsBestPractices
|
|
8
8
|
include Core::Check::Classable
|
9
9
|
include Core::Check::InheritedResourcesable
|
10
10
|
include Core::Check::Accessable
|
11
|
-
include Core::Check::Afterable
|
12
11
|
|
13
12
|
interesting_nodes :class, :var_ref, :vcall, :command, :def
|
14
13
|
interesting_files CONTROLLER_FILES
|
@@ -24,7 +23,7 @@ module RailsBestPractices
|
|
24
23
|
|
25
24
|
# check class node to remember the class name.
|
26
25
|
# also check if the controller is inherit from InheritedResources::Base.
|
27
|
-
|
26
|
+
add_callback :start_class do |node|
|
28
27
|
@controllers << @klass
|
29
28
|
if @inherited_resources
|
30
29
|
@actions = DEFAULT_ACTIONS
|
@@ -32,7 +31,7 @@ module RailsBestPractices
|
|
32
31
|
end
|
33
32
|
|
34
33
|
# remember the action names at the end of class node if the controller is a InheritedResources.
|
35
|
-
|
34
|
+
add_callback :end_class do |node|
|
36
35
|
if @inherited_resources && "ApplicationController" != current_class_name
|
37
36
|
@actions.each do |action|
|
38
37
|
@methods.add_method(current_class_name, action, {"file" => node.file, "line" => node.line})
|
@@ -41,21 +40,21 @@ module RailsBestPractices
|
|
41
40
|
end
|
42
41
|
|
43
42
|
# check if there is a DSL call inherit_resources.
|
44
|
-
|
43
|
+
add_callback :start_var_ref do |node|
|
45
44
|
if @inherited_resources
|
46
45
|
@actions = DEFAULT_ACTIONS
|
47
46
|
end
|
48
47
|
end
|
49
48
|
|
50
49
|
# check if there is a DSL call inherit_resources.
|
51
|
-
|
50
|
+
add_callback :start_vcall do |node|
|
52
51
|
if @inherited_resources
|
53
52
|
@actions = DEFAULT_ACTIONS
|
54
53
|
end
|
55
54
|
end
|
56
55
|
|
57
56
|
# restrict actions for inherited_resources
|
58
|
-
|
57
|
+
add_callback :start_command do |node|
|
59
58
|
if "include" == node.message.to_s
|
60
59
|
@helpers.add_module_decendant(node.arguments.all.first.to_s, current_class_name)
|
61
60
|
elsif @inherited_resources && "actions" == node.message.to_s
|
@@ -83,13 +82,13 @@ module RailsBestPractices
|
|
83
82
|
# "create" => {"file" => "app/controllers/comments_controller.rb", "line" => 10, "unused" => false},
|
84
83
|
# }
|
85
84
|
# }
|
86
|
-
|
85
|
+
add_callback :start_def do |node|
|
87
86
|
method_name = node.method_name.to_s
|
88
87
|
@methods.add_method(current_class_name, method_name, {"file" => node.file, "line" => node.line}, current_access_control)
|
89
88
|
end
|
90
89
|
|
91
90
|
# ask Reviews::RemoveUnusedMoethodsInHelperReview to check the controllers who include helpers.
|
92
|
-
|
91
|
+
add_callback :after_check do
|
93
92
|
decendants = @helpers.map(&:decendants).flatten
|
94
93
|
if decendants.present?
|
95
94
|
Reviews::RemoveUnusedMethodsInHelpersReview.interesting_files *decendants.map { |decendant| %r|#{decendant.underscore}| }
|
@@ -17,7 +17,7 @@ module RailsBestPractices
|
|
17
17
|
end
|
18
18
|
|
19
19
|
# check module node to remember the module name.
|
20
|
-
|
20
|
+
add_callback :start_module do |node|
|
21
21
|
@helpers << Core::Mod.new(current_module_name, [])
|
22
22
|
end
|
23
23
|
|
@@ -30,7 +30,7 @@ module RailsBestPractices
|
|
30
30
|
# "update_time" => {"file" => "app/helpers/posts_helper.rb", "line" => 10, "unused" => false}
|
31
31
|
# }
|
32
32
|
# }
|
33
|
-
|
33
|
+
add_callback :start_def do |node|
|
34
34
|
if node.file =~ HELPER_FILES
|
35
35
|
method_name = node.method_name.to_s
|
36
36
|
@methods.add_method(current_module_name, method_name, {"file" => node.file, "line" => node.line}, current_access_control)
|
@@ -18,7 +18,7 @@ module RailsBestPractices
|
|
18
18
|
#
|
19
19
|
# if it is a subclass of ActionMailer::Base,
|
20
20
|
# then remember its class name.
|
21
|
-
|
21
|
+
add_callback :start_class do |node|
|
22
22
|
if "ActionMailer::Base" == current_extend_class_name
|
23
23
|
@mailers << @klass
|
24
24
|
end
|
@@ -7,7 +7,6 @@ module RailsBestPractices
|
|
7
7
|
class ModelPrepare < Core::Check
|
8
8
|
include Core::Check::Classable
|
9
9
|
include Core::Check::Accessable
|
10
|
-
include Core::Check::Afterable
|
11
10
|
|
12
11
|
interesting_nodes :class, :def, :defs, :command, :alias
|
13
12
|
interesting_files MODEL_FILES
|
@@ -22,7 +21,7 @@ module RailsBestPractices
|
|
22
21
|
end
|
23
22
|
|
24
23
|
# remember the class name.
|
25
|
-
|
24
|
+
add_callback :start_class do |node|
|
26
25
|
if "ActionMailer::Base" != current_extend_class_name
|
27
26
|
@models << @klass
|
28
27
|
end
|
@@ -40,7 +39,7 @@ module RailsBestPractices
|
|
40
39
|
# "create" => {"file" => "app/models/comment.rb", "line" => 10, "unused" => false, "unused" => false},
|
41
40
|
# }
|
42
41
|
# }
|
43
|
-
|
42
|
+
add_callback :start_def do |node|
|
44
43
|
if @klass && "ActionMailer::Base" != current_extend_class_name
|
45
44
|
method_name = node.method_name.to_s
|
46
45
|
@methods.add_method(current_class_name, method_name, {"file" => node.file, "line" => node.line}, current_access_control)
|
@@ -59,7 +58,7 @@ module RailsBestPractices
|
|
59
58
|
# "create" => {"file" => "app/models/comment.rb", "line" => 10, "unused" => false, "unused" => false},
|
60
59
|
# }
|
61
60
|
# }
|
62
|
-
|
61
|
+
add_callback :start_defs do |node|
|
63
62
|
if @klass && "ActionMailer::Base" != current_extend_class_name
|
64
63
|
method_name = node.method_name.to_s
|
65
64
|
@methods.add_method(current_class_name, method_name, {"file" => node.file, "line" => node.line}, current_access_control)
|
@@ -77,7 +76,7 @@ module RailsBestPractices
|
|
77
76
|
# "milestones => {"has_many" => "Milestone"}
|
78
77
|
# }
|
79
78
|
# }
|
80
|
-
|
79
|
+
add_callback :start_command do |node|
|
81
80
|
case node.message.to_s
|
82
81
|
when *%w(named_scope scope alias_method)
|
83
82
|
method_name = node.arguments.all.first.to_s
|
@@ -101,13 +100,13 @@ module RailsBestPractices
|
|
101
100
|
end
|
102
101
|
|
103
102
|
# check alias node to remembr the alias methods.
|
104
|
-
|
103
|
+
add_callback :start_alias do |node|
|
105
104
|
method_name = node.new_method.to_s
|
106
105
|
@methods.add_method(current_class_name, method_name, {"file" => node.file, "line" => node.line}, current_access_control)
|
107
106
|
end
|
108
107
|
|
109
108
|
# after prepare process, fix incorrect associations' class_name.
|
110
|
-
|
109
|
+
add_callback :after_check do
|
111
110
|
@model_associations.each do |model, model_associations|
|
112
111
|
model_associations.each do |association_name, association_meta|
|
113
112
|
unless @models.include?(association_meta["class_name"])
|
@@ -18,7 +18,7 @@ module RailsBestPractices
|
|
18
18
|
end
|
19
19
|
|
20
20
|
# remember route for rails3.
|
21
|
-
|
21
|
+
add_callback :start_command do |node|
|
22
22
|
case node.message.to_s
|
23
23
|
when "resources"
|
24
24
|
add_resources_routes(node)
|
@@ -42,13 +42,14 @@ module RailsBestPractices
|
|
42
42
|
if :bare_assoc_hash == first_argument.sexp_type
|
43
43
|
route_node = first_argument.hash_values.first
|
44
44
|
# do not parse redirect block
|
45
|
-
|
46
|
-
|
45
|
+
if :method_add_arg != route_node.sexp_type
|
46
|
+
controller_name, action_name = route_node.to_s.split('#')
|
47
|
+
@routes.add_route(current_namespaces, controller_name.underscore, action_name)
|
48
|
+
end
|
47
49
|
elsif :array == first_argument.sexp_type
|
48
50
|
first_argument.array_values.map(&:to_s).each do |action_node|
|
49
51
|
@routes.add_route(current_namespaces, controller_name, action_node.to_s)
|
50
52
|
end
|
51
|
-
return
|
52
53
|
elsif :bare_assoc_hash == second_argument.try(:sexp_type)
|
53
54
|
if second_argument.hash_value("to").present?
|
54
55
|
controller_name, action_name = second_argument.hash_value("to").to_s.split('#')
|
@@ -56,10 +57,11 @@ module RailsBestPractices
|
|
56
57
|
controller_name = current_controller_name
|
57
58
|
action_name = second_argument.hash_value("action")
|
58
59
|
end
|
60
|
+
@routes.add_route(current_namespaces, controller_name.try(:underscore), action_name)
|
59
61
|
else
|
60
62
|
controller_name, action_name = first_argument.to_s.split('/')
|
63
|
+
@routes.add_route(current_namespaces, controller_name.underscore, action_name)
|
61
64
|
end
|
62
|
-
@routes.add_route(current_namespaces, controller_name.try(:underscore), action_name)
|
63
65
|
end
|
64
66
|
when "match", "root"
|
65
67
|
options = node.arguments.all.last
|
@@ -90,7 +92,7 @@ module RailsBestPractices
|
|
90
92
|
end
|
91
93
|
|
92
94
|
# remember route for rails2.
|
93
|
-
|
95
|
+
add_callback :start_command_call do |node|
|
94
96
|
case node.message.to_s
|
95
97
|
when "resources"
|
96
98
|
add_resources_routes(node)
|
@@ -109,7 +111,7 @@ module RailsBestPractices
|
|
109
111
|
end
|
110
112
|
|
111
113
|
# remember the namespace.
|
112
|
-
|
114
|
+
add_callback :start_method_add_block do |node|
|
113
115
|
case node.message.to_s
|
114
116
|
when "namespace"
|
115
117
|
@namespaces << node.arguments.all.first.to_s
|
@@ -134,7 +136,7 @@ module RailsBestPractices
|
|
134
136
|
end
|
135
137
|
|
136
138
|
# end of namespace call.
|
137
|
-
|
139
|
+
add_callback :end_method_add_block do |node|
|
138
140
|
case node.message.to_s
|
139
141
|
when "namespace"
|
140
142
|
@namespaces.pop
|
@@ -148,18 +150,15 @@ module RailsBestPractices
|
|
148
150
|
end
|
149
151
|
|
150
152
|
# remember current controller name, used for nested resources.
|
151
|
-
|
153
|
+
add_callback :start_do_block, :start_brace_block do |node|
|
152
154
|
@controller_names << @controller_name.try(:last)
|
153
155
|
end
|
154
156
|
|
155
157
|
# remove current controller name, and use upper lever resource name.
|
156
|
-
|
158
|
+
add_callback :end_do_block, :end_brace_block do |node|
|
157
159
|
@controller_names.pop
|
158
160
|
end
|
159
161
|
|
160
|
-
alias_method :start_brace_block, :start_do_block
|
161
|
-
alias_method :end_brace_block, :end_do_block
|
162
|
-
|
163
162
|
[:resources, :resource].each do |route_name|
|
164
163
|
class_eval <<-EOF
|
165
164
|
def add_#{route_name}_routes(node)
|