rails_best_practices 1.10.1 → 1.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. data/.gitignore +1 -0
  2. data/README.md +11 -6
  3. data/assets/result.html.erb +76 -46
  4. data/install_supported_rubies.sh +3 -0
  5. data/lib/rails_best_practices.rb +2 -1
  6. data/lib/rails_best_practices/analyzer.rb +10 -8
  7. data/lib/rails_best_practices/core.rb +0 -4
  8. data/lib/rails_best_practices/core/check.rb +41 -117
  9. data/lib/rails_best_practices/core/error.rb +3 -9
  10. data/lib/rails_best_practices/core/runner.rb +20 -80
  11. data/lib/rails_best_practices/lexicals/long_line_check.rb +2 -1
  12. data/lib/rails_best_practices/lexicals/remove_tab_check.rb +1 -3
  13. data/lib/rails_best_practices/lexicals/remove_trailing_whitespace_check.rb +1 -3
  14. data/lib/rails_best_practices/prepares/config_prepare.rb +1 -1
  15. data/lib/rails_best_practices/prepares/controller_prepare.rb +7 -8
  16. data/lib/rails_best_practices/prepares/helper_prepare.rb +2 -2
  17. data/lib/rails_best_practices/prepares/mailer_prepare.rb +1 -1
  18. data/lib/rails_best_practices/prepares/model_prepare.rb +6 -7
  19. data/lib/rails_best_practices/prepares/route_prepare.rb +12 -13
  20. data/lib/rails_best_practices/prepares/schema_prepare.rb +2 -2
  21. data/lib/rails_best_practices/reviews/add_model_virtual_attribute_review.rb +19 -15
  22. data/lib/rails_best_practices/reviews/always_add_db_index_review.rb +10 -17
  23. data/lib/rails_best_practices/reviews/dry_bundler_in_capistrano_review.rb +2 -5
  24. data/lib/rails_best_practices/reviews/hash_syntax_review.rb +3 -30
  25. data/lib/rails_best_practices/reviews/isolate_seed_data_review.rb +7 -10
  26. data/lib/rails_best_practices/reviews/keep_finders_on_their_own_model_review.rb +5 -9
  27. data/lib/rails_best_practices/reviews/law_of_demeter_review.rb +10 -13
  28. data/lib/rails_best_practices/reviews/move_code_into_controller_review.rb +6 -9
  29. data/lib/rails_best_practices/reviews/move_code_into_helper_review.rb +2 -5
  30. data/lib/rails_best_practices/reviews/move_code_into_model_review.rb +7 -13
  31. data/lib/rails_best_practices/reviews/move_finder_to_named_scope_review.rb +3 -6
  32. data/lib/rails_best_practices/reviews/move_model_logic_into_model_review.rb +6 -9
  33. data/lib/rails_best_practices/reviews/needless_deep_nesting_review.rb +3 -6
  34. data/lib/rails_best_practices/reviews/not_use_default_route_review.rb +4 -7
  35. data/lib/rails_best_practices/reviews/not_use_time_ago_in_words_review.rb +2 -5
  36. data/lib/rails_best_practices/reviews/overuse_route_customizations_review.rb +7 -10
  37. data/lib/rails_best_practices/reviews/protect_mass_assignment_review.rb +2 -5
  38. data/lib/rails_best_practices/reviews/remove_empty_helpers_review.rb +2 -5
  39. data/lib/rails_best_practices/reviews/remove_unused_methods_in_controllers_review.rb +8 -6
  40. data/lib/rails_best_practices/reviews/remove_unused_methods_in_helpers_review.rb +1 -2
  41. data/lib/rails_best_practices/reviews/remove_unused_methods_in_models_review.rb +4 -5
  42. data/lib/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review.rb +9 -12
  43. data/lib/rails_best_practices/reviews/replace_instance_variable_with_local_variable_review.rb +2 -13
  44. data/lib/rails_best_practices/reviews/restrict_auto_generated_routes_review.rb +18 -26
  45. data/lib/rails_best_practices/reviews/review.rb +6 -7
  46. data/lib/rails_best_practices/reviews/simplify_render_in_controllers_review.rb +2 -5
  47. data/lib/rails_best_practices/reviews/simplify_render_in_views_review.rb +2 -5
  48. data/lib/rails_best_practices/reviews/use_before_filter_review.rb +2 -5
  49. data/lib/rails_best_practices/reviews/use_model_association_review.rb +11 -14
  50. data/lib/rails_best_practices/reviews/use_multipart_alternative_as_content_type_of_email_review.rb +11 -8
  51. data/lib/rails_best_practices/reviews/use_observer_review.rb +8 -11
  52. data/lib/rails_best_practices/reviews/use_parentheses_in_method_def_review.rb +1 -1
  53. data/lib/rails_best_practices/reviews/use_query_attribute_review.rb +12 -18
  54. data/lib/rails_best_practices/reviews/use_say_with_time_in_migrations_review.rb +7 -10
  55. data/lib/rails_best_practices/reviews/use_scope_access_review.rb +4 -10
  56. data/lib/rails_best_practices/version.rb +1 -1
  57. data/rails_best_practices.gemspec +1 -1
  58. data/rails_best_practices.yml +5 -5
  59. data/spec/rails_best_practices/core/check_spec.rb +0 -67
  60. data/spec/rails_best_practices/prepares/controller_prepare_spec.rb +0 -1
  61. data/spec/rails_best_practices/prepares/model_prepare_spec.rb +0 -4
  62. data/spec/rails_best_practices/reviews/hash_syntax_review_spec.rb +3 -30
  63. data/spec/rails_best_practices/reviews/remove_unused_methods_in_controllers_review_spec.rb +22 -0
  64. data/spec/rails_best_practices/reviews/remove_unused_methods_in_models_review_spec.rb +19 -0
  65. data/spec/rails_best_practices/reviews/use_multipart_alternative_as_content_type_of_email_review_spec.rb +2 -2
  66. data/spec/spec_helper.rb +0 -4
  67. metadata +28 -41
  68. data/Gemfile.lock +0 -71
  69. data/lib/rails_best_practices/core/checking_visitor.rb +0 -80
  70. data/lib/rails_best_practices/core/nil.rb +0 -37
  71. data/lib/rails_best_practices/core_ext/enumerable.rb +0 -9
  72. data/lib/rails_best_practices/core_ext/sexp.rb +0 -840
  73. data/spec/rails_best_practices/core/checking_visitor_spec.rb +0 -79
  74. data/spec/rails_best_practices/core/nil_spec.rb +0 -37
  75. data/spec/rails_best_practices/core_ext/enumerable_spec.rb +0 -7
  76. 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 :filename, :line_number, :message, :type, :url
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
- @filename = options[:filename]
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
- @checker ||= CheckingVisitor.new(prepares: @prepares, reviews: @reviews, lexicals: @lexicals)
54
- @debug = false
55
- @whiny = false
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 name of the file
61
- # @param [String] content content of the file
58
+ # @param [String] filename of the file
59
+ # @param [String] content of the file
62
60
  def lexical(filename, content)
63
- puts filename if @debug
64
- @checker.lexical(filename, content)
61
+ @lexical_checker.check(filename, content)
65
62
  end
66
63
 
67
- # lexical analysis the file.
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 a file's content with filename.
68
+ # parepare the file.
75
69
  #
76
- # @param [String] filename name of the file
77
- # @param [String] content content of the file
70
+ # @param [String] filename of the file
71
+ # @param [String] content of the file
78
72
  def prepare(filename, content)
79
- puts filename if @debug
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
- # parapare the file.
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 a file's content with filename.
80
+ # review the file.
95
81
  #
96
- # @param [String] filename name of the file
97
- # @param [String] content content of the file
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
- node = parse_ruby(filename, content)
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
- # review the file.
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.
@@ -1,5 +1,6 @@
1
1
  # encoding: utf-8
2
- require 'rails_best_practices/reviews/review'
2
+ require 'rails_best_practices/core/check'
3
+
3
4
  module RailsBestPractices
4
5
  module Lexicals
5
6
  # Keep lines fewer than 80 characters.
@@ -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
- def url
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
- def url
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
- def start_assign(node)
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
- def start_class(node)
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
- def end_class(node)
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
- def start_var_ref(node)
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
- def start_vcall(node)
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
- def start_command(node)
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
- def start_def(node)
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
- def after_prepare
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
- def start_module(node)
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
- def start_def(node)
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
- def start_class(node)
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
- def start_class(node)
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
- def start_def(node)
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
- def start_defs(node)
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
- def start_command(node)
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
- def start_alias(node)
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
- def after_prepare
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
- def start_command(node)
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
- return if :method_add_arg == route_node.sexp_type
46
- controller_name, action_name = route_node.to_s.split('#')
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
- def start_command_call(node)
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
- def start_method_add_block(node)
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
- def end_method_add_block(node)
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
- def start_do_block(node)
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
- def end_do_block(node)
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)