rails_best_practices 1.9.0 → 1.9.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. data/.travis.yml +4 -1
  2. data/Gemfile +0 -3
  3. data/Gemfile.lock +10 -9
  4. data/README.md +2 -0
  5. data/lib/rails_best_practices/analyzer.rb +40 -21
  6. data/lib/rails_best_practices/core.rb +1 -0
  7. data/lib/rails_best_practices/core/check.rb +12 -0
  8. data/lib/rails_best_practices/core/configs.rb +7 -0
  9. data/lib/rails_best_practices/core/error.rb +2 -1
  10. data/lib/rails_best_practices/core/routes.rb +11 -5
  11. data/lib/rails_best_practices/core/runner.rb +6 -2
  12. data/lib/rails_best_practices/core_ext/sexp.rb +3 -1
  13. data/lib/rails_best_practices/prepares.rb +5 -0
  14. data/lib/rails_best_practices/prepares/config_prepare.rb +21 -0
  15. data/lib/rails_best_practices/prepares/route_prepare.rb +24 -7
  16. data/lib/rails_best_practices/reviews/protect_mass_assignment_review.rb +11 -3
  17. data/lib/rails_best_practices/reviews/remove_unused_methods_in_models_review.rb +7 -3
  18. data/lib/rails_best_practices/version.rb +1 -1
  19. data/rails_best_practices.gemspec +1 -0
  20. data/spec/rails_best_practices/analyzer_spec.rb +52 -32
  21. data/spec/rails_best_practices/core/check_spec.rb +64 -45
  22. data/spec/rails_best_practices/core/checking_visitor_spec.rb +65 -64
  23. data/spec/rails_best_practices/core/configs_spec.rb +7 -0
  24. data/spec/rails_best_practices/core/controllers_spec.rb +4 -2
  25. data/spec/rails_best_practices/core/error_spec.rb +28 -22
  26. data/spec/rails_best_practices/core/helpers_spec.rb +4 -2
  27. data/spec/rails_best_practices/core/klasses_spec.rb +8 -6
  28. data/spec/rails_best_practices/core/mailers_spec.rb +4 -2
  29. data/spec/rails_best_practices/core/methods_spec.rb +37 -35
  30. data/spec/rails_best_practices/core/model_associations_spec.rb +17 -15
  31. data/spec/rails_best_practices/core/model_attributes_spec.rb +17 -15
  32. data/spec/rails_best_practices/core/models_spec.rb +4 -2
  33. data/spec/rails_best_practices/core/modules_spec.rb +21 -19
  34. data/spec/rails_best_practices/core/nil_spec.rb +23 -21
  35. data/spec/rails_best_practices/core/routes_spec.rb +21 -14
  36. data/spec/rails_best_practices/core/runner_spec.rb +17 -15
  37. data/spec/rails_best_practices/core_ext/sexp_spec.rb +32 -7
  38. data/spec/rails_best_practices/lexicals/remove_tab_check_spec.rb +35 -31
  39. data/spec/rails_best_practices/lexicals/remove_trailing_whitespace_check_spec.rb +35 -31
  40. data/spec/rails_best_practices/prepares/config_prepare_spec.rb +24 -0
  41. data/spec/rails_best_practices/prepares/controller_prepare_spec.rb +122 -123
  42. data/spec/rails_best_practices/prepares/helper_prepare_spec.rb +36 -32
  43. data/spec/rails_best_practices/prepares/mailer_prepare_spec.rb +12 -8
  44. data/spec/rails_best_practices/prepares/model_prepare_spec.rb +326 -322
  45. data/spec/rails_best_practices/prepares/route_prepare_spec.rb +619 -573
  46. data/spec/rails_best_practices/prepares/schema_prepare_spec.rb +25 -21
  47. data/spec/rails_best_practices/reviews/add_model_virtual_attribute_review_spec.rb +85 -87
  48. data/spec/rails_best_practices/reviews/always_add_db_index_review_spec.rb +224 -222
  49. data/spec/rails_best_practices/reviews/dry_bundler_in_capistrano_review_spec.rb +30 -26
  50. data/spec/rails_best_practices/reviews/isolate_seed_data_review_spec.rb +79 -75
  51. data/spec/rails_best_practices/reviews/keep_finders_on_their_own_model_review_spec.rb +76 -72
  52. data/spec/rails_best_practices/reviews/law_of_demeter_review_spec.rb +138 -140
  53. data/spec/rails_best_practices/reviews/move_code_into_controller_review_spec.rb +38 -34
  54. data/spec/rails_best_practices/reviews/move_code_into_helper_review_spec.rb +22 -18
  55. data/spec/rails_best_practices/reviews/move_code_into_model_review_spec.rb +57 -53
  56. data/spec/rails_best_practices/reviews/move_finder_to_named_scope_review_spec.rb +62 -63
  57. data/spec/rails_best_practices/reviews/move_model_logic_into_model_review_spec.rb +51 -50
  58. data/spec/rails_best_practices/reviews/needless_deep_nesting_review_spec.rb +140 -136
  59. data/spec/rails_best_practices/reviews/not_use_default_route_review_spec.rb +48 -44
  60. data/spec/rails_best_practices/reviews/not_use_times_ago_in_words_review_spec.rb +42 -38
  61. data/spec/rails_best_practices/reviews/overuse_route_customizations_review_spec.rb +151 -149
  62. data/spec/rails_best_practices/reviews/protect_mass_assignment_review_spec.rb +86 -55
  63. data/spec/rails_best_practices/reviews/remove_empty_helpers_review_spec.rb +23 -19
  64. data/spec/rails_best_practices/reviews/remove_unused_methods_in_controllers_review_spec.rb +290 -286
  65. data/spec/rails_best_practices/reviews/remove_unused_methods_in_helpers_review_spec.rb +76 -72
  66. data/spec/rails_best_practices/reviews/remove_unused_methods_in_models_review_spec.rb +601 -597
  67. data/spec/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review_spec.rb +55 -54
  68. data/spec/rails_best_practices/reviews/replace_instance_variable_with_local_variable_review_spec.rb +34 -30
  69. data/spec/rails_best_practices/reviews/restrict_auto_generated_routes_review_spec.rb +288 -289
  70. data/spec/rails_best_practices/reviews/simplify_render_in_controllers_review_spec.rb +59 -55
  71. data/spec/rails_best_practices/reviews/simplify_render_in_views_review_spec.rb +73 -69
  72. data/spec/rails_best_practices/reviews/use_before_filter_review_spec.rb +89 -98
  73. data/spec/rails_best_practices/reviews/use_model_association_review_spec.rb +52 -52
  74. data/spec/rails_best_practices/reviews/use_multipart_alternative_as_content_type_of_email_review_spec.rb +192 -190
  75. data/spec/rails_best_practices/reviews/use_observer_review_spec.rb +114 -121
  76. data/spec/rails_best_practices/reviews/use_query_attribute_review_spec.rb +189 -190
  77. data/spec/rails_best_practices/reviews/use_say_with_time_in_migrations_review_spec.rb +97 -93
  78. data/spec/rails_best_practices/reviews/use_scope_access_review_spec.rb +146 -151
  79. data/spec/spec_helper.rb +11 -20
  80. metadata +42 -26
  81. data/.watchr.example +0 -65
@@ -1 +1,4 @@
1
- rvm: 1.9.3
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.2
4
+ - 1.9.3
data/Gemfile CHANGED
@@ -1,13 +1,10 @@
1
1
  source "http://rubygems.org"
2
2
  gemspec
3
3
 
4
- gem "ripper", :platform => :mri_18
5
-
6
4
  if RUBY_PLATFORM =~ /darwin/i
7
5
  gem 'rb-fsevent'
8
6
  gem 'growl'
9
7
  end
10
8
 
11
- gem 'spork', '0.9.0.rc9'
12
9
  gem 'guard'
13
10
  gem 'guard-rspec'
@@ -1,8 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rails_best_practices (1.9.0)
4
+ rails_best_practices (1.9.1)
5
5
  activesupport
6
+ awesome_print
6
7
  colored
7
8
  erubis
8
9
  i18n
@@ -12,7 +13,10 @@ PATH
12
13
  GEM
13
14
  remote: http://rubygems.org/
14
15
  specs:
15
- activesupport (3.0.10)
16
+ activesupport (3.2.3)
17
+ i18n (~> 0.6)
18
+ multi_json (~> 1.0)
19
+ awesome_print (1.0.2)
16
20
  colored (1.2)
17
21
  diff-lcs (1.1.3)
18
22
  erubis (2.7.0)
@@ -22,11 +26,11 @@ GEM
22
26
  guard-rspec (0.5.7)
23
27
  guard (>= 0.8.4)
24
28
  haml (3.1.3)
25
- i18n (0.5.0)
26
- progressbar (0.9.1)
29
+ i18n (0.6.0)
30
+ multi_json (1.2.0)
31
+ progressbar (0.11.0)
27
32
  rake (0.9.2.2)
28
33
  rb-fsevent (0.4.3.1)
29
- ripper (1.0.2)
30
34
  rspec (2.7.0)
31
35
  rspec-core (~> 2.7.0)
32
36
  rspec-expectations (~> 2.7.0)
@@ -35,11 +39,10 @@ GEM
35
39
  rspec-expectations (2.7.0)
36
40
  diff-lcs (~> 1.1.2)
37
41
  rspec-mocks (2.7.0)
38
- sexp_processor (3.0.5)
42
+ sexp_processor (3.2.0)
39
43
  slim (1.0.4)
40
44
  temple (~> 0.3.4)
41
45
  tilt (~> 1.3.2)
42
- spork (0.9.0.rc9)
43
46
  temple (0.3.4)
44
47
  thor (0.14.6)
45
48
  tilt (1.3.3)
@@ -56,7 +59,5 @@ DEPENDENCIES
56
59
  rails_best_practices!
57
60
  rake
58
61
  rb-fsevent
59
- ripper
60
62
  rspec
61
63
  slim
62
- spork (= 0.9.0.rc9)
data/README.md CHANGED
@@ -63,6 +63,8 @@ Resources
63
63
 
64
64
  Homepage: <http://rails-bestpractices.com>
65
65
 
66
+ Online Service: <http://railsbp.com>
67
+
66
68
  Github: <http://github.com/railsbp/rails_best_practices>
67
69
 
68
70
  RDoc: <http://rdoc.rails-bestpractices.com>
@@ -3,6 +3,8 @@ require 'fileutils'
3
3
 
4
4
  require 'progressbar'
5
5
  require 'colored'
6
+ require 'ap'
7
+
6
8
 
7
9
  module RailsBestPractices
8
10
  # RailsBestPractices Analyzer helps you to analyze your rails code, according to best practices on http://rails-bestpractices.
@@ -15,7 +17,7 @@ module RailsBestPractices
15
17
  #
16
18
  # After analyzing, output the violations.
17
19
  class Analyzer
18
- attr_accessor :runner
20
+ attr_accessor :runner, :errors_filter_block
19
21
 
20
22
  DEFAULT_CONFIG = File.join(File.dirname(__FILE__), "..", "..", "rails_best_practices.yml")
21
23
 
@@ -54,23 +56,15 @@ module RailsBestPractices
54
56
  @runner.debug = true if @options["debug"]
55
57
  @runner.color = !@options["without-color"]
56
58
 
57
- @bar = ProgressBar.new('Source Codes', parse_files.size * 3) if display_bar?
58
- ["lexical", "prepare", "review"].each { |process| send(:process, process) }
59
- @bar.finish if display_bar?
60
- end
59
+ analyze_source_codes
60
+ analyze_vcs
61
61
 
62
- def display_bar?
63
- !@options["debug"] && !@options["silent"]
62
+ errors_filter_block.call(errors) if errors_filter_block
64
63
  end
65
64
 
66
65
  # Output the analyze result.
67
66
  def output
68
67
  if @options["format"] == 'html'
69
- if @options["with-hg"]
70
- load_hg_info
71
- elsif @options["with-git"]
72
- load_git_info
73
- end
74
68
  output_html_errors
75
69
  else
76
70
  output_terminal_errors
@@ -172,19 +166,19 @@ module RailsBestPractices
172
166
 
173
167
  # output errors on terminal.
174
168
  def output_terminal_errors
175
- @runner.errors.each { |error| plain_output(error.to_s, 'red') }
169
+ errors.each { |error| plain_output(error.to_s, 'red') }
176
170
  plain_output("\nPlease go to http://rails-bestpractices.com to see more useful Rails Best Practices.", 'green')
177
- if @runner.errors.empty?
171
+ if errors.empty?
178
172
  plain_output("\nNo warning found. Cool!", 'green')
179
173
  else
180
- plain_output("\nFound #{@runner.errors.size} warnings.", 'red')
174
+ plain_output("\nFound #{errors.size} warnings.", 'red')
181
175
  end
182
176
  end
183
177
 
184
178
  # load hg commit and hg username info.
185
179
  def load_hg_info
186
- hg_progressbar = ProgressBar.new('Hg Info', @runner.errors.size) if display_bar?
187
- @runner.errors.each do |error|
180
+ hg_progressbar = ProgressBar.new('Hg Info', errors.size) if display_bar?
181
+ errors.each do |error|
188
182
  hg_info = `cd #{@runner.class.base_path}; hg blame -lvcu #{error.filename[@runner.class.base_path.size..-1].gsub(/^\//, "")} | sed -n /:#{error.line_number.split(',').first}:/p`
189
183
  unless hg_info == ""
190
184
  hg_commit_username = hg_info.split(':')[0].strip
@@ -198,9 +192,9 @@ module RailsBestPractices
198
192
 
199
193
  # load git commit and git username info.
200
194
  def load_git_info
201
- git_progressbar = ProgressBar.new('Git Info', @runner.errors.size) if display_bar?
195
+ git_progressbar = ProgressBar.new('Git Info', errors.size) if display_bar?
202
196
  start = @runner.class.base_path =~ /\/$/ ? @runner.class.base_path.size : @runner.class.base_path.size + 1
203
- @runner.errors.each do |error|
197
+ errors.each do |error|
204
198
  git_info = `cd #{@runner.class.base_path}; git blame -L #{error.line_number.split(',').first},+1 #{error.filename[start..-1]}`
205
199
  unless git_info == ""
206
200
  git_commit, git_username = git_info.split(/\d{4}-\d{2}-\d{2}/).first.split("(")
@@ -223,7 +217,7 @@ module RailsBestPractices
223
217
  File.open(@options["output-file"], "w+") do |file|
224
218
  eruby = Erubis::Eruby.new(template)
225
219
  file.puts eruby.evaluate(
226
- :errors => @runner.errors,
220
+ :errors => errors,
227
221
  :error_types => error_types,
228
222
  :textmate => @options["with-textmate"],
229
223
  :mvim => @options["with-mvim"],
@@ -248,9 +242,34 @@ module RailsBestPractices
248
242
  end
249
243
  end
250
244
 
245
+ # analyze source codes.
246
+ def analyze_source_codes
247
+ @bar = ProgressBar.new('Source Codes', parse_files.size * 3) if display_bar?
248
+ ["lexical", "prepare", "review"].each { |process| send(:process, process) }
249
+ @bar.finish if display_bar?
250
+ end
251
+
252
+ # analyze version control system info.
253
+ def analyze_vcs
254
+ if @options["format"] == 'html'
255
+ load_git_info if @options["with-git"]
256
+ load_hg_info if @options["with-hg"]
257
+ end
258
+ end
259
+
260
+ # if disaply progress bar.
261
+ def display_bar?
262
+ !@options["debug"] && !@options["silent"]
263
+ end
264
+
251
265
  # unique error types.
252
266
  def error_types
253
- @runner.errors.map(&:type).uniq
267
+ errors.map(&:type).uniq
268
+ end
269
+
270
+ # delegate errors to runner
271
+ def errors
272
+ @runner.errors
254
273
  end
255
274
  end
256
275
  end
@@ -14,6 +14,7 @@ require 'rails_best_practices/core/methods'
14
14
  require 'rails_best_practices/core/controllers'
15
15
  require 'rails_best_practices/core/helpers'
16
16
  require 'rails_best_practices/core/routes'
17
+ require 'rails_best_practices/core/configs'
17
18
 
18
19
  require 'rails_best_practices/core_ext/sexp'
19
20
  require 'rails_best_practices/core_ext/enumerable'
@@ -14,6 +14,7 @@ module RailsBestPractices
14
14
  SCHEMA_FILE = /db\/schema\.rb/
15
15
  HELPER_FILES = /helpers\/.*\.rb$/
16
16
  DEPLOY_FILES = /config\/deploy.*\.rb/
17
+ CONFIG_FILES = /config\/(application|environment|environments\/.*)\.rb/
17
18
 
18
19
  def initialize(options={})
19
20
  options.each do |key, value|
@@ -47,6 +48,9 @@ module RailsBestPractices
47
48
  # @param [Sexp] node
48
49
  def node_start(node)
49
50
  @node = node
51
+ if self.class.debug?
52
+ ap node
53
+ end
50
54
  Array(self.class.callbacks["start_#{node.sexp_type}"]).each do |callback|
51
55
  self.instance_exec node, &callback
52
56
  end
@@ -141,6 +145,14 @@ module RailsBestPractices
141
145
  callbacks[name] ||= []
142
146
  callbacks[name] << block
143
147
  end
148
+
149
+ def debug?
150
+ @debug == true
151
+ end
152
+
153
+ def debug
154
+ @debug = true
155
+ end
144
156
  end
145
157
 
146
158
  # Helper to parse the class name.
@@ -0,0 +1,7 @@
1
+ # encoding: utf-8
2
+ module RailsBestPractices
3
+ module Core
4
+ class Configs < Hash
5
+ end
6
+ end
7
+ end
@@ -6,7 +6,7 @@ module RailsBestPractices
6
6
  # it indicates the filenname, line number and error message for the violation.
7
7
  class Error
8
8
  attr_reader :filename, :line_number, :message, :type, :url
9
- attr_accessor :git_commit, :git_username, :hg_commit, :hg_username
9
+ attr_accessor :git_commit, :git_username, :hg_commit, :hg_username, :highlight
10
10
 
11
11
  def initialize(options={})
12
12
  @filename = options[:filename]
@@ -18,6 +18,7 @@ module RailsBestPractices
18
18
  @git_username = options[:git_username]
19
19
  @hg_commit = options[:hg_commit]
20
20
  @hg_username = options[:hg_username]
21
+ @highlight = false
21
22
  end
22
23
 
23
24
  def short_filename
@@ -8,7 +8,7 @@ module RailsBestPractices
8
8
  # @param [String] controller name
9
9
  # @param [String] action name
10
10
  def add_route(namespaces, controller_name, action_name)
11
- if controller_name.present?
11
+ if namespaces.present? || controller_name.present?
12
12
  self << Route.new(namespaces, controller_name, action_name)
13
13
  end
14
14
  end
@@ -19,14 +19,20 @@ module RailsBestPractices
19
19
 
20
20
  def initialize(namespaces, controller_name, action_name)
21
21
  @namespaces = namespaces
22
- entities = controller_name.split('/')
23
- @namespaces += entities[0..-2] if entities.size > 1
24
- @controller_name = entities.last
22
+ if controller_name
23
+ entities = controller_name.split('/')
24
+ @namespaces += entities[0..-2] if entities.size > 1
25
+ @controller_name = entities.last
26
+ end
25
27
  @action_name = action_name
26
28
  end
27
29
 
28
30
  def controller_name_with_namespaces
29
- namespaces.map { |namespace| "#{namespace.camelize}::" }.join("") + "#{controller_name.camelize}Controller"
31
+ if controller_name
32
+ namespaces.map { |namespace| "#{namespace.camelize}::" }.join("") + "#{controller_name.camelize}Controller"
33
+ else
34
+ namespaces.map { |namespace| namespace.camelize }.join("::") + "Controller"
35
+ end
30
36
  end
31
37
 
32
38
  def to_s
@@ -3,7 +3,11 @@ require 'yaml'
3
3
  require 'ripper'
4
4
  require 'active_support/inflector'
5
5
  require 'active_support/core_ext/object/blank'
6
- require 'active_support/core_ext/object/try'
6
+ begin
7
+ require 'active_support/core_ext/object/try'
8
+ rescue LoadError
9
+ require 'active_support/core_ext/try'
10
+ end
7
11
 
8
12
  module RailsBestPractices
9
13
  module Core
@@ -113,7 +117,7 @@ module RailsBestPractices
113
117
  #
114
118
  # @return [Array] all errors from lexicals and reviews
115
119
  def errors
116
- (@reviews + @lexicals).collect {|check| check.errors}.flatten
120
+ @errors ||= (@reviews + @lexicals).collect {|check| check.errors}.flatten
117
121
  end
118
122
 
119
123
  def after_lexical; end
@@ -503,7 +503,7 @@ class Sexp
503
503
  def statements
504
504
  stmts = []
505
505
  node = case sexp_type
506
- when :do_block
506
+ when :do_block, :brace_block
507
507
  self[2]
508
508
  when :bodystmt
509
509
  self[1]
@@ -788,6 +788,8 @@ class Sexp
788
788
  self[1].to_s[0..-2]
789
789
  when :aref
790
790
  "#{self[1]}[#{self[2]}]"
791
+ when :call, :field
792
+ "#{self.subject}.#{self.message}"
791
793
  else
792
794
  ""
793
795
  end
@@ -5,6 +5,7 @@ require 'rails_best_practices/prepares/schema_prepare'
5
5
  require 'rails_best_practices/prepares/controller_prepare'
6
6
  require 'rails_best_practices/prepares/route_prepare'
7
7
  require 'rails_best_practices/prepares/helper_prepare'
8
+ require 'rails_best_practices/prepares/config_prepare'
8
9
 
9
10
  module RailsBestPractices
10
11
  module Prepares
@@ -53,6 +54,10 @@ module RailsBestPractices
53
54
  @routes ||= Core::Routes.new
54
55
  end
55
56
 
57
+ def configs
58
+ @configs ||= Core::Configs.new
59
+ end
60
+
56
61
  # Clear all prepare objects.
57
62
  def clear
58
63
  instance_variables.each do |instance_variable|
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+ require 'rails_best_practices/core/check'
3
+
4
+ module RailsBestPractices
5
+ module Prepares
6
+ class ConfigPrepare < Core::Check
7
+ interesting_nodes :assign
8
+ interesting_files CONFIG_FILES
9
+
10
+ def initialize
11
+ @configs = Prepares.configs
12
+ end
13
+
14
+ def start_assign(node)
15
+ if node.left_value.grep_node(:sexp_type => [:vcall, :var_ref], :to_s => "config").present?
16
+ @configs[node.left_value.to_s] = node.right_value.to_s
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -5,7 +5,7 @@ module RailsBestPractices
5
5
  module Prepares
6
6
  # Remembber routes.
7
7
  class RoutePrepare < Core::Check
8
- interesting_nodes :command, :command_call, :method_add_block, :do_block
8
+ interesting_nodes :command, :command_call, :method_add_block, :do_block, :brace_block
9
9
  interesting_files ROUTE_FILES
10
10
 
11
11
  RESOURCES_ACTIONS = %w(index show new create edit update destroy)
@@ -29,23 +29,37 @@ module RailsBestPractices
29
29
  second_argument = node.arguments.all[1]
30
30
  if @controller_names.last
31
31
  if :bare_assoc_hash == first_argument.sexp_type
32
- action_name = first_argument.hash_values.first.to_s
32
+ action_names = [first_argument.hash_values.first.to_s]
33
+ elsif :array == first_argument.sexp_type
34
+ action_names = first_argument.array_values.map(&:to_s)
33
35
  else
34
- action_name = first_argument.to_s
36
+ action_names = [first_argument.to_s]
37
+ end
38
+ action_names.each do |action_name|
39
+ @routes.add_route(current_namespaces, current_controller_name, action_name)
35
40
  end
36
- @routes.add_route(current_namespaces, current_controller_name, action_name)
37
41
  else
38
42
  if :bare_assoc_hash == first_argument.sexp_type
39
43
  route_node = first_argument.hash_values.first
40
44
  # do not parse redirect block
41
45
  return if :method_add_arg == route_node.sexp_type
42
46
  controller_name, action_name = route_node.to_s.split('#')
43
- elsif :bare_assoc_hash == second_argument.try(:sexp_type) && second_argument.hash_value("to")
44
- controller_name, action_name = second_argument.hash_value("to").to_s.split('#')
47
+ elsif :array == first_argument.sexp_type
48
+ first_argument.array_values.map(&:to_s).each do |action_node|
49
+ @routes.add_route(current_namespaces, controller_name, action_node.to_s)
50
+ end
51
+ return
52
+ elsif :bare_assoc_hash == second_argument.try(:sexp_type)
53
+ if second_argument.hash_value("to").present?
54
+ controller_name, action_name = second_argument.hash_value("to").to_s.split('#')
55
+ else
56
+ controller_name = current_controller_name
57
+ action_name = second_argument.hash_value("action")
58
+ end
45
59
  else
46
60
  controller_name, action_name = first_argument.to_s.split('/')
47
61
  end
48
- @routes.add_route(current_namespaces, controller_name.underscore, action_name)
62
+ @routes.add_route(current_namespaces, controller_name.try(:underscore), action_name)
49
63
  end
50
64
  when "match", "root"
51
65
  options = node.arguments.all.last
@@ -143,6 +157,9 @@ module RailsBestPractices
143
157
  @controller_names.pop
144
158
  end
145
159
 
160
+ alias_method :start_brace_block, :start_do_block
161
+ alias_method :end_brace_block, :end_do_block
162
+
146
163
  [:resources, :resource].each do |route_name|
147
164
  class_eval <<-EOF
148
165
  def add_#{route_name}_routes(node)