rails_best_practices 1.14.4 → 1.15.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.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/.travis.yml +1 -0
  4. data/README.md +26 -6
  5. data/lib/rails_best_practices/core/check.rb +15 -2
  6. data/lib/rails_best_practices/core/klasses.rb +13 -3
  7. data/lib/rails_best_practices/core/model_associations.rb +1 -1
  8. data/lib/rails_best_practices/core/runner.rb +2 -0
  9. data/lib/rails_best_practices/lexicals/long_line_check.rb +1 -1
  10. data/lib/rails_best_practices/prepares/route_prepare.rb +17 -1
  11. data/lib/rails_best_practices/reviews/always_add_db_index_review.rb +2 -2
  12. data/lib/rails_best_practices/reviews/isolate_seed_data_review.rb +2 -2
  13. data/lib/rails_best_practices/reviews/keep_finders_on_their_own_model_review.rb +1 -1
  14. data/lib/rails_best_practices/reviews/move_code_into_helper_review.rb +1 -1
  15. data/lib/rails_best_practices/reviews/move_code_into_model_review.rb +1 -1
  16. data/lib/rails_best_practices/reviews/move_model_logic_into_model_review.rb +1 -1
  17. data/lib/rails_best_practices/reviews/needless_deep_nesting_review.rb +1 -1
  18. data/lib/rails_best_practices/reviews/overuse_route_customizations_review.rb +1 -1
  19. data/lib/rails_best_practices/reviews/remove_unused_methods_in_models_review.rb +1 -2
  20. data/lib/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review.rb +1 -1
  21. data/lib/rails_best_practices/reviews/restrict_auto_generated_routes_review.rb +2 -1
  22. data/lib/rails_best_practices/reviews/use_multipart_alternative_as_content_type_of_email_review.rb +15 -26
  23. data/lib/rails_best_practices/reviews/use_turbo_sprockets_rails3_review.rb +4 -2
  24. data/lib/rails_best_practices/version.rb +1 -1
  25. data/spec/rails_best_practices/analyzer_spec.rb +11 -11
  26. data/spec/rails_best_practices/core/check_spec.rb +1 -1
  27. data/spec/rails_best_practices/core/error_spec.rb +6 -6
  28. data/spec/rails_best_practices/core/klasses_spec.rb +26 -2
  29. data/spec/rails_best_practices/core/methods_spec.rb +18 -18
  30. data/spec/rails_best_practices/core/model_associations_spec.rb +6 -6
  31. data/spec/rails_best_practices/core/model_attributes_spec.rb +6 -6
  32. data/spec/rails_best_practices/core/modules_spec.rb +3 -3
  33. data/spec/rails_best_practices/core/routes_spec.rb +4 -4
  34. data/spec/rails_best_practices/core/runner_spec.rb +1 -1
  35. data/spec/rails_best_practices/lexicals/long_line_check_spec.rb +18 -6
  36. data/spec/rails_best_practices/lexicals/remove_tab_check_spec.rb +18 -5
  37. data/spec/rails_best_practices/lexicals/remove_trailing_whitespace_check_spec.rb +17 -5
  38. data/spec/rails_best_practices/prepares/config_prepare_spec.rb +1 -1
  39. data/spec/rails_best_practices/prepares/controller_prepare_spec.rb +13 -13
  40. data/spec/rails_best_practices/prepares/gemfile_prepare_spec.rb +1 -1
  41. data/spec/rails_best_practices/prepares/helper_prepare_spec.rb +2 -2
  42. data/spec/rails_best_practices/prepares/initializer_prepare_spec.rb +2 -2
  43. data/spec/rails_best_practices/prepares/mailer_prepare_spec.rb +1 -1
  44. data/spec/rails_best_practices/prepares/model_prepare_spec.rb +44 -44
  45. data/spec/rails_best_practices/prepares/route_prepare_spec.rb +102 -78
  46. data/spec/rails_best_practices/prepares/schema_prepare_spec.rb +6 -6
  47. data/spec/rails_best_practices/reviews/add_model_virtual_attribute_review_spec.rb +25 -9
  48. data/spec/rails_best_practices/reviews/always_add_db_index_review_spec.rb +43 -23
  49. data/spec/rails_best_practices/reviews/check_save_return_value_spec.rb +34 -20
  50. data/spec/rails_best_practices/reviews/default_scope_is_evil_review_spec.rb +16 -5
  51. data/spec/rails_best_practices/reviews/dry_bundler_in_capistrano_review_spec.rb +25 -3
  52. data/spec/rails_best_practices/reviews/hash_syntax_review_spec.rb +18 -7
  53. data/spec/rails_best_practices/reviews/isolate_seed_data_review_spec.rb +30 -7
  54. data/spec/rails_best_practices/reviews/keep_finders_on_their_own_model_review_spec.rb +24 -8
  55. data/spec/rails_best_practices/reviews/law_of_demeter_review_spec.rb +24 -12
  56. data/spec/rails_best_practices/reviews/move_code_into_controller_review_spec.rb +17 -5
  57. data/spec/rails_best_practices/reviews/move_code_into_helper_review_spec.rb +14 -3
  58. data/spec/rails_best_practices/reviews/move_code_into_model_review_spec.rb +24 -13
  59. data/spec/rails_best_practices/reviews/move_finder_to_named_scope_review_spec.rb +25 -6
  60. data/spec/rails_best_practices/reviews/move_model_logic_into_model_review_spec.rb +26 -4
  61. data/spec/rails_best_practices/reviews/needless_deep_nesting_review_spec.rb +31 -18
  62. data/spec/rails_best_practices/reviews/not_rescue_exception_spec.rb +23 -10
  63. data/spec/rails_best_practices/reviews/not_use_default_route_review_spec.rb +34 -7
  64. data/spec/rails_best_practices/reviews/not_use_times_ago_in_words_review_spec.rb +19 -8
  65. data/spec/rails_best_practices/reviews/overuse_route_customizations_review_spec.rb +33 -19
  66. data/spec/rails_best_practices/reviews/protect_mass_assignment_review_spec.rb +25 -13
  67. data/spec/rails_best_practices/reviews/remove_empty_helpers_review_spec.rb +14 -4
  68. data/spec/rails_best_practices/reviews/remove_unused_methods_in_controllers_review_spec.rb +91 -23
  69. data/spec/rails_best_practices/reviews/remove_unused_methods_in_helpers_review_spec.rb +20 -5
  70. data/spec/rails_best_practices/reviews/remove_unused_methods_in_models_review_spec.rb +66 -41
  71. data/spec/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review_spec.rb +28 -4
  72. data/spec/rails_best_practices/reviews/replace_instance_variable_with_local_variable_review_spec.rb +16 -7
  73. data/spec/rails_best_practices/reviews/restrict_auto_generated_routes_review_spec.rb +45 -32
  74. data/spec/rails_best_practices/reviews/simplify_render_in_controllers_review_spec.rb +20 -9
  75. data/spec/rails_best_practices/reviews/simplify_render_in_views_review_spec.rb +23 -14
  76. data/spec/rails_best_practices/reviews/use_before_filter_review_spec.rb +34 -7
  77. data/spec/rails_best_practices/reviews/use_model_association_review_spec.rb +21 -6
  78. data/spec/rails_best_practices/reviews/use_multipart_alternative_as_content_type_of_email_review_spec.rb +124 -79
  79. data/spec/rails_best_practices/reviews/use_observer_review_spec.rb +12 -12
  80. data/spec/rails_best_practices/reviews/use_parenthesis_in_method_def_spec.rb +16 -4
  81. data/spec/rails_best_practices/reviews/use_query_attribute_review_spec.rb +39 -27
  82. data/spec/rails_best_practices/reviews/use_say_with_time_in_migrations_review_spec.rb +22 -8
  83. data/spec/rails_best_practices/reviews/use_scope_access_review_spec.rb +39 -21
  84. data/spec/rails_best_practices/reviews/use_turbo_sprockets_rails3_review_spec.rb +66 -7
  85. metadata +36 -37
  86. data/.ruby-gemset +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bae1e38364b51e6d840e048b2e0576f4743ae2fe
4
- data.tar.gz: 744f069382fc07105d5d947d54af8222e67dcb35
3
+ metadata.gz: aad6be6297629a1706250552dd2dc67a88d088f4
4
+ data.tar.gz: 7416b40f8860088f0ef6734f44fb7dc68531a226
5
5
  SHA512:
6
- metadata.gz: 6c15c03cd8ee2fe69488eb5cf49b298eb61b90d660cd023c96d9cd6b1858b5f71412628b26139ca83f692bc1dc7cce121b271a68809bd0b0aeabace30bb76cc4
7
- data.tar.gz: 3d9ade5bd5fc2490d4b72becc751481e87d91ad1cf5a790a3d20b52dcaccc1ab57f93f2919c2f3cd2d31f71d2e2c4391131c8878ed2dc63b663d7b26ea6d6614
6
+ metadata.gz: d3ccfe6ee0f2164b49c2d00db11505d858b0750c9167d39e7e9e3da251d3d7e4a122e7601dc158efc462bcc5a422c94c65e6e02ccce95fa68ac2a787fd30eaad
7
+ data.tar.gz: 1be5179a45ca10b0b5ebb3436bf56af16fcca01a35ff93d8846365eb8390bda417750945ea2c21eec659b68cbde1cfd17e67dbdbecbddb1ad2f2d4c5a337d93d
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- ruby-2.0.0
1
+ ruby-2.1.0
data/.travis.yml CHANGED
@@ -2,3 +2,4 @@ language: ruby
2
2
  rvm:
3
3
  - 1.9.3
4
4
  - 2.0.0
5
+ - 2.1.0
data/README.md CHANGED
@@ -3,10 +3,9 @@
3
3
  [![Gem Version](https://badge.fury.io/rb/rails_best_practices.png)](http://badge.fury.io/rb/rails_best_practices)
4
4
  [![Build Status](https://secure.travis-ci.org/railsbp/rails_best_practices.png)](http://travis-ci.org/railsbp/rails_best_practices)
5
5
  [![Coverage Status](https://coveralls.io/repos/railsbp/rails_best_practices/badge.png?branch=master)](https://coveralls.io/r/railsbp/rails_best_practices)
6
- [![Code Climate](https://codeclimate.com/repos/51eb7073f3ea00179b00db0b/badges/095127e7bb641dbc825b/gpa.png)](https://codeclimate.com/repos/51eb7073f3ea00179b00db0b/feed)
7
6
 
8
7
  [![Coderwall Endorse](http://api.coderwall.com/flyerhzm/endorsecount.png)](http://coderwall.com/flyerhzm)
9
- [![Click here to lend your support to: rails best practices and make a donation at www.pledgie.com !](http://www.pledgie.com/campaigns/12057.png?skin_name=chrome)](http://www.pledgie.com/campaigns/12057)
8
+ [![Click here to lend your support to: rails best practices and make a donation at www.pledgie.com !](https://pledgie.com/campaigns/12057.png?skin_name=chrome)](https://pledgie.com/campaigns/12057)
10
9
 
11
10
  rails_best_practices is a code metric tool to check the quality of rails codes.
12
11
 
@@ -23,12 +22,13 @@ following template engines:
23
22
  * slim
24
23
  * rabl
25
24
 
26
- rails_best_practices works well only in ruby 1.9.2 and ruby 1.9.3 so far. It is incompatible with ruby 1.8.
25
+ rails_best_practices works well only in ruby 1.9.3, 2.0.0, and 2.1.0 so far. It is incompatible with ruby 1.8.
27
26
 
28
27
  ## External Introduction
29
28
 
30
- <http://ruby5.envylabs.com/episodes/257-episode-253-march-9th-2012/stories/2253-rails_best_practices>
31
- <http://railscasts.com/episodes/252-metrics-metrics-metrics>
29
+ [Ruby5 - Episode #253](http://ruby5.envylabs.com/episodes/257-episode-253-march-9th-2012/stories/2253-rails_best_practices)
30
+
31
+ [Railscasts - #252 Metrics Metrics Metrics](http://railscasts.com/episodes/252-metrics-metrics-metrics)
32
32
 
33
33
  ## Usage
34
34
 
@@ -40,9 +40,24 @@ or html output
40
40
 
41
41
  rails_best_practices -f html .
42
42
 
43
- By default rails_best_practices will do parse codes in vendor, spec, test and features directories. If you need, see the command options:
43
+ By default rails_best_practices will do parse codes in vendor, spec, test and features directories.
44
+
45
+ ### Excluding folders
46
+
47
+ To exclude folder simply call it with -e or --exclude
48
+
49
+ rails_best_practices -e "db/migrate" .
50
+
51
+ To exclude multiple folders, separate them with comma
52
+
53
+ rails_best_practices -e "db/migrate,vendor" .
54
+
55
+ ### Other command line options
56
+
57
+ To see full list of commandline options call:
44
58
 
45
59
  $ rails_best_practices -h
60
+
46
61
  Usage: rails_best_practices [options]
47
62
  -d, --debug Debug mode
48
63
  -f, --format FORMAT output format
@@ -166,6 +181,11 @@ Now you can customize this configuration file, the default configuration is as f
166
181
 
167
182
  You can remove or comment one review to disable it, and you can change the options.
168
183
 
184
+ You can apply the `ignored_files` option on any rule by giving a regexp or array of regexps describing the path of the files you don't want to be checked:
185
+
186
+ DefaultScopeIsEvilCheck: { ignored_files: 'user\.rb' }
187
+ LongLineCheck: { max_line_length: 80, ignored_files: ['db/migrate', 'config/initializers'] }
188
+
169
189
  ## Implementation
170
190
 
171
191
  Move code from Controller to Model
@@ -32,6 +32,10 @@ module RailsBestPractices
32
32
  # @param [String] the file name of node.
33
33
  # @return [Boolean] true if the check will need to parse the file.
34
34
  def parse_file?(node_file)
35
+ is_interesting_file?(node_file) and !is_ignored?(node_file)
36
+ end
37
+
38
+ def is_interesting_file?(node_file)
35
39
  interesting_files.any? do |pattern|
36
40
  if pattern == ALL_FILES
37
41
  node_file =~ pattern && node_file !~ SKIP_FILES
@@ -41,6 +45,14 @@ module RailsBestPractices
41
45
  end
42
46
  end
43
47
 
48
+ def is_ignored?(node_file)
49
+ regex_ignored_files.map{ |r| !!r.match(node_file) }.inject(:|)
50
+ end
51
+
52
+ def regex_ignored_files
53
+ @regex_ignored_files ||= Array(@ignored_files).map{ |pattern| Regexp.new(pattern) }
54
+ end
55
+
44
56
  # add error if source code violates rails best practice.
45
57
  #
46
58
  # @param [String] message, is the string message for violation of the rails best practice
@@ -56,7 +68,7 @@ module RailsBestPractices
56
68
  )
57
69
  end
58
70
 
59
- # errors that vialote the rails best practices.
71
+ # errors that violate the rails best practices.
60
72
  def errors
61
73
  @errors ||= []
62
74
  end
@@ -116,7 +128,7 @@ module RailsBestPractices
116
128
  classable_modules.pop
117
129
  end
118
130
 
119
- # remember the class anem
131
+ # remember the class name
120
132
  add_callback :start_class do |node|
121
133
  @klass = Core::Klass.new(node.class_name.to_s, node.base_class.to_s, classable_modules)
122
134
  klasses << @klass
@@ -334,6 +346,7 @@ module RailsBestPractices
334
346
 
335
347
  # check if the method is in the except methods list.
336
348
  def excepted?(method)
349
+ is_ignored?(method.file) ||
337
350
  except_methods.any? do |except_method|
338
351
  class_name, method_name = except_method.split('#')
339
352
  (class_name == '*' && method_name == method.method_name) ||
@@ -14,21 +14,31 @@ module RailsBestPractices
14
14
 
15
15
  # Class info includes class name, extend class name and module names.
16
16
  class Klass
17
- attr_reader :class_name, :extend_class_name
18
-
19
17
  def initialize(class_name, extend_class_name, modules)
20
18
  @class_name = class_name
21
19
  @extend_class_name = extend_class_name
22
20
  @modules = modules.dup
23
21
  end
24
22
 
25
- def to_s
23
+ def class_name
26
24
  if @modules.empty?
27
25
  @class_name
28
26
  else
29
27
  @modules.map { |modu| "#{modu}::" }.join("") + @class_name
30
28
  end
31
29
  end
30
+
31
+ def extend_class_name
32
+ if @modules.empty?
33
+ @extend_class_name
34
+ else
35
+ @modules.map { |modu| "#{modu}::" }.join("") + @extend_class_name
36
+ end
37
+ end
38
+
39
+ def to_s
40
+ class_name
41
+ end
32
42
  end
33
43
  end
34
44
  end
@@ -34,7 +34,7 @@ module RailsBestPractices
34
34
  # @return [Boolean] true if it is the model's association
35
35
  def is_association?(model_name, association_name)
36
36
  associations = @associations[model_name]
37
- associations && associations[association_name]
37
+ !!(associations && associations[association_name])
38
38
  end
39
39
 
40
40
  # delegate each to @associations.
@@ -138,6 +138,7 @@ module RailsBestPractices
138
138
  begin
139
139
  check_name, options = *check
140
140
  klass = RailsBestPractices::Lexicals.const_get(check_name)
141
+ options = Hash(options)
141
142
  active_checks << (options.empty? ? klass.new : klass.new(options))
142
143
  rescue
143
144
  # the check does not exist in the Lexicals namepace.
@@ -157,6 +158,7 @@ module RailsBestPractices
157
158
  begin
158
159
  check_name, options = *check
159
160
  klass = RailsBestPractices::Reviews.const_get(check_name.gsub(/Check$/, 'Review'))
161
+ options = Hash(options)
160
162
  active_checks << (options.empty? ? klass.new : klass.new(options))
161
163
  rescue
162
164
  # the check does not exist in the Reviews namepace.
@@ -6,7 +6,7 @@ module RailsBestPractices
6
6
  interesting_files ALL_FILES
7
7
 
8
8
  def initialize(options = {})
9
- super()
9
+ super(options)
10
10
  @max_line_length = options['max_line_length'] || 80
11
11
  end
12
12
 
@@ -30,6 +30,9 @@ module RailsBestPractices
30
30
  action_names = [first_argument.hash_values.first.to_s]
31
31
  elsif :array == first_argument.sexp_type
32
32
  action_names = first_argument.array_values.map(&:to_s)
33
+ elsif :bare_assoc_hash == second_argument.try(:sexp_type) && second_argument.hash_value("to").present?
34
+ controller_name, action_name = second_argument.hash_value("to").to_s.split('#')
35
+ action_names = [action_name]
33
36
  else
34
37
  action_names = [first_argument.to_s]
35
38
  end
@@ -61,7 +64,7 @@ module RailsBestPractices
61
64
  @routes.add_route(current_namespaces, controller_name.underscore, action_name)
62
65
  end
63
66
  end
64
- when "match", "root"
67
+ when "match"
65
68
  options = node.arguments.all.last
66
69
  case options.sexp_type
67
70
  when :bare_assoc_hash
@@ -84,6 +87,19 @@ module RailsBestPractices
84
87
  else
85
88
  # do nothing
86
89
  end
90
+ when "root"
91
+ options = node.arguments.all.last
92
+ case options.sexp_type
93
+ when :bare_assoc_hash
94
+ route_node = options.hash_values.find { |value_node| :string_literal == value_node.sexp_type && value_node.to_s.include?('#') }
95
+ if route_node.present?
96
+ controller_name, action_name = route_node.to_s.split('#')
97
+ @routes.add_route(current_namespaces, controller_name.underscore, action_name)
98
+ end
99
+ when :string_literal
100
+ controller_name, action_name = options.to_s.split('#')
101
+ @routes.add_route(current_namespaces, controller_name.underscore, action_name)
102
+ end
87
103
  else
88
104
  # nothing to do
89
105
  end
@@ -26,8 +26,8 @@ module RailsBestPractices
26
26
  interesting_files SCHEMA_FILE
27
27
  url "http://rails-bestpractices.com/posts/21-always-add-db-index"
28
28
 
29
- def initialize
30
- super
29
+ def initialize(options={})
30
+ super(options)
31
31
  @index_columns = {}
32
32
  @foreign_keys = {}
33
33
  @table_nodes = {}
@@ -23,8 +23,8 @@ module RailsBestPractices
23
23
  interesting_files MIGRATION_FILES
24
24
  url "http://rails-bestpractices.com/posts/20-isolating-seed-data"
25
25
 
26
- def initialize
27
- super
26
+ def initialize(options={})
27
+ super(options)
28
28
  @new_variables = []
29
29
  end
30
30
 
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
  module RailsBestPractices
3
3
  module Reviews
4
- # Review model files to ake sure finders are on their own model.
4
+ # Review model files to make sure finders are on their own model.
5
5
  #
6
6
  # See the best practice details here http://rails-bestpractices.com/posts/13-keep-finders-on-their-own-model.
7
7
  #
@@ -22,7 +22,7 @@ module RailsBestPractices
22
22
  url "http://rails-bestpractices.com/posts/26-move-code-into-helper"
23
23
 
24
24
  def initialize(options = {})
25
- super()
25
+ super(options)
26
26
  @array_count = options['array_count'] || 3
27
27
  end
28
28
 
@@ -16,7 +16,7 @@ module RailsBestPractices
16
16
  url "http://rails-bestpractices.com/posts/25-move-code-into-model"
17
17
 
18
18
  def initialize(options={})
19
- super()
19
+ super(options)
20
20
  @use_count = options['use_count'] || 2
21
21
  end
22
22
 
@@ -18,7 +18,7 @@ module RailsBestPractices
18
18
  url "http://rails-bestpractices.com/posts/7-move-model-logic-into-the-model"
19
19
 
20
20
  def initialize(options = {})
21
- super()
21
+ super(options)
22
22
  @use_count = options['use_count'] || 4
23
23
  end
24
24
 
@@ -27,7 +27,7 @@ module RailsBestPractices
27
27
  url "http://rails-bestpractices.com/posts/11-needless-deep-nesting"
28
28
 
29
29
  def initialize(options = {})
30
- super()
30
+ super(options)
31
31
  @counter = 0
32
32
  @nested_count = options['nested_count'] || 2
33
33
  @shallow_nodes = []
@@ -33,7 +33,7 @@ module RailsBestPractices
33
33
  VERBS = %w(get post update delete)
34
34
 
35
35
  def initialize(options = {})
36
- super()
36
+ super(options)
37
37
  @customize_count = options['customize_count'] || 3
38
38
  end
39
39
 
@@ -94,8 +94,7 @@ module RailsBestPractices
94
94
  %w(
95
95
  initialize
96
96
  validate validate_each validate_on_create validate_on_update
97
- human_attribute_name
98
- assign_attributes
97
+ human_attribute_name assign_attributes attributes attribute
99
98
  to_xml to_json as_json to_param
100
99
  before_save before_create before_update before_destroy after_save after_create
101
100
  after_update after_destroy after_find after_initialize
@@ -21,7 +21,7 @@ module RailsBestPractices
21
21
  url "http://rails-bestpractices.com/posts/6-replace-complex-creation-with-factory-method"
22
22
 
23
23
  def initialize(options = {})
24
- super()
24
+ super(options)
25
25
  @assigns_count = options['attribute_assignment_count'] || 2
26
26
  end
27
27
 
@@ -20,7 +20,8 @@ module RailsBestPractices
20
20
  RESOURCE_METHODS = ["show", "new", "create", "edit", "update", "destroy"]
21
21
  RESOURCES_METHODS = RESOURCE_METHODS + ["index"]
22
22
 
23
- def initialize
23
+ def initialize(options={})
24
+ super(options)
24
25
  @namespaces = []
25
26
  @resource_controllers = []
26
27
  end
@@ -24,7 +24,7 @@ module RailsBestPractices
24
24
  # check def node and find if the corresponding views exist or not?
25
25
  add_callback :start_def do |node|
26
26
  name = node.method_name.to_s
27
- if deliver_method?(name) && rails_canonical_mailer_views?(name)
27
+ if !rails_canonical_mailer_views?(name)
28
28
  add_error("use multipart/alternative as content_type of email")
29
29
  end
30
30
  end
@@ -34,45 +34,34 @@ module RailsBestPractices
34
34
  #
35
35
  # @param [String] name method name in action_mailer
36
36
  def rails_canonical_mailer_views?(name)
37
- rails2_canonical_mailer_views?(name) || rails3_canonical_mailer_views?(name)
37
+ if Prepares.gems.gem_version("rails").to_i > 2
38
+ rails3_canonical_mailer_views?(name)
39
+ else
40
+ rails2_canonical_mailer_views?(name)
41
+ end
38
42
  end
39
43
 
40
44
  # check if rails2's syntax mailer views are canonical.
41
45
  #
42
46
  # @param [String] name method name in action_mailer
43
47
  def rails2_canonical_mailer_views?(name)
44
- (exist?("#{name}.text.html.erb") && !exist?("#{name}.text.plain.erb")) ||
45
- (exist?("#{name}.text.html.haml") && !exist?("#{name}.text.plain.haml")) ||
46
- (exist?("#{name}.text.html.slim") && !exist?("#{name}.text.plain.slim")) ||
47
- (exist?("#{name}.text.html.rhtml") && !exist?("#{name}.text.plain.rhtml"))
48
+ return true if mailer_files(name).length == 0
49
+ mailer_files(name).any? { |filename| filename.index 'text.html' } &&
50
+ mailer_files(name).any? { |filename| filename.index 'text.plain' }
48
51
  end
49
52
 
50
53
  # check if rails3's syntax mailer views are canonical.
51
54
  #
52
55
  # @param [String] name method name in action_mailer
53
56
  def rails3_canonical_mailer_views?(name)
54
- (exist?("#{name}.html.erb") && !html_tempalte_exists?("#{name}.text")) ||
55
- (exist?("#{name}.html.haml") && !html_tempalte_exists?("#{name}.text")) ||
56
- (exist?("#{name}.html.slim") && !html_tempalte_exists?("#{name}.text"))
57
+ return true if mailer_files(name).length == 0
58
+ mailer_files(name).any? { |filename| filename.index 'html' } &&
59
+ mailer_files(name).any? { |filename| filename.index 'text' }
57
60
  end
58
61
 
59
- # check if the filename existed in the mailer directory.
60
- def exist?(filename)
61
- File.exist? File.join(mailer_directory, filename)
62
- end
63
-
64
- # check if erb, haml or slim exists
65
- def html_tempalte_exists?(filename)
66
- exist?("#{filename}.erb") || exist?("#{filename}.haml") || exist?("#{filename}.slim")
67
- end
68
-
69
- # check if the method is a deliver_method.
70
- #
71
- # @param [String] name the name of the method
72
- def deliver_method?(name)
73
- Dir.entries(mailer_directory).find { |filename| filename.index name.to_s }
74
- rescue
75
- false
62
+ # all mail view files for a method name.
63
+ def mailer_files(name)
64
+ Dir.entries(mailer_directory) { |filename| filename.index name.to_s }
76
65
  end
77
66
 
78
67
  # the view directory of mailer.
@@ -16,8 +16,10 @@ module RailsBestPractices
16
16
 
17
17
  # check command node to see if load 'deploy/assets'
18
18
  add_callback :start_command do |node|
19
- if !Prepares.gems.has_gem?("turbo-sprockets-rails3") && "load" == node.message.to_s && "deploy/assets" == node.arguments.to_s
20
- add_error "speed up assets precompile with turbo-sprockets-rails3"
19
+ if Prepares.gems.gem_version("rails").to_i == 3
20
+ if !Prepares.gems.has_gem?("turbo-sprockets-rails3") && "load" == node.message.to_s && "deploy/assets" == node.arguments.to_s
21
+ add_error "speed up assets precompile with turbo-sprockets-rails3"
22
+ end
21
23
  end
22
24
  end
23
25
  end
@@ -1,4 +1,4 @@
1
1
  # encoding: utf-8
2
2
  module RailsBestPractices
3
- VERSION = "1.14.4"
3
+ VERSION = "1.15.1"
4
4
  end
@@ -7,21 +7,21 @@ module RailsBestPractices
7
7
 
8
8
  describe '::new' do
9
9
  it 'should expand a relative path to an absolute' do
10
- subject.path.should eq File.expand_path('.')
10
+ expect(subject.path).to eq File.expand_path('.')
11
11
  end
12
12
  end
13
13
 
14
14
  describe "expand_dirs_to_files" do
15
15
  it "should expand all files in spec directory" do
16
16
  dir = File.dirname(__FILE__)
17
- subject.expand_dirs_to_files(dir).should be_include(dir + '/analyzer_spec.rb')
17
+ expect(subject.expand_dirs_to_files(dir)).to be_include(dir + '/analyzer_spec.rb')
18
18
  end
19
19
  end
20
20
 
21
21
  describe "file_sort" do
22
22
  it "should get models first, mailers, helpers and then others" do
23
23
  files = ["app/controllers/users_controller.rb", "app/mailers/user_mailer.rb", "app/helpers/users_helper.rb", "app/models/user.rb", "app/views/users/index.html.haml", "app/views/users/show.html.slim", "lib/user.rb"]
24
- subject.file_sort(files).should == ["app/models/user.rb", "app/mailers/user_mailer.rb", "app/helpers/users_helper.rb", "app/controllers/users_controller.rb", "app/views/users/index.html.haml", "app/views/users/show.html.slim", "lib/user.rb"]
24
+ expect(subject.file_sort(files)).to eq(["app/models/user.rb", "app/mailers/user_mailer.rb", "app/helpers/users_helper.rb", "app/controllers/users_controller.rb", "app/views/users/index.html.haml", "app/views/users/show.html.slim", "lib/user.rb"])
25
25
  end
26
26
  end
27
27
 
@@ -32,11 +32,11 @@ module RailsBestPractices
32
32
  end
33
33
 
34
34
  it "should ignore lib" do
35
- subject.file_ignore(@all, 'lib/').should == @filtered
35
+ expect(subject.file_ignore(@all, 'lib/')).to eq(@filtered)
36
36
  end
37
37
 
38
38
  it "should ignore regexp patterns" do
39
- subject.file_ignore(@all, /lib/).should == @filtered
39
+ expect(subject.file_ignore(@all, /lib/)).to eq(@filtered)
40
40
  end
41
41
  end
42
42
 
@@ -55,7 +55,7 @@ module RailsBestPractices
55
55
  subject.output_terminal_errors
56
56
  result = $stdout.string
57
57
  $stdout = $origin_stdout
58
- result.should == ["app/models/user.rb:10 - law of demeter".red, "app/models/post.rb:100 - use query attribute".red, "\nPlease go to http://rails-bestpractices.com to see more useful Rails Best Practices.".green, "\nFound 2 warnings.".red].join("\n") + "\n"
58
+ expect(result).to eq(["app/models/user.rb:10 - law of demeter".red, "app/models/post.rb:100 - use query attribute".red, "\nPlease go to http://rails-bestpractices.com to see more useful Rails Best Practices.".green, "\nFound 2 warnings.".red].join("\n") + "\n")
59
59
  end
60
60
  end
61
61
 
@@ -67,7 +67,7 @@ module RailsBestPractices
67
67
  Dir.mkdir(File.join(random_dir, 'vendor', 'my_project'))
68
68
  File.open(File.join(random_dir, 'vendor', 'my_project', 'my_file.rb'), "w") { |file| file << 'woot' }
69
69
  analyzer = Analyzer.new(File.join(random_dir, 'vendor', 'my_project'))
70
- analyzer.parse_files.should be_include File.join(random_dir, 'vendor', 'my_project', 'my_file.rb')
70
+ expect(analyzer.parse_files).to be_include File.join(random_dir, 'vendor', 'my_project', 'my_file.rb')
71
71
  }
72
72
  end
73
73
 
@@ -77,7 +77,7 @@ module RailsBestPractices
77
77
  Dir.mkdir(File.join(random_dir, 'spec', 'my_project'))
78
78
  File.open(File.join(random_dir, 'spec', 'my_project', 'my_file.rb'), "w") { |file| file << 'woot' }
79
79
  analyzer = Analyzer.new(File.join(random_dir, 'spec', 'my_project'))
80
- analyzer.parse_files.should be_include File.join(random_dir, 'spec', 'my_project', 'my_file.rb')
80
+ expect(analyzer.parse_files).to be_include File.join(random_dir, 'spec', 'my_project', 'my_file.rb')
81
81
  }
82
82
  end
83
83
 
@@ -87,7 +87,7 @@ module RailsBestPractices
87
87
  Dir.mkdir(File.join(random_dir, 'test', 'my_project'))
88
88
  File.open(File.join(random_dir, 'test', 'my_project', 'my_file.rb'), "w") { |file| file << 'woot' }
89
89
  analyzer = Analyzer.new(File.join(random_dir, 'test', 'my_project'))
90
- analyzer.parse_files.should be_include File.join(random_dir, 'test', 'my_project', 'my_file.rb')
90
+ expect(analyzer.parse_files).to be_include File.join(random_dir, 'test', 'my_project', 'my_file.rb')
91
91
  }
92
92
  end
93
93
 
@@ -97,7 +97,7 @@ module RailsBestPractices
97
97
  Dir.mkdir(File.join(random_dir, 'test', 'my_project'))
98
98
  File.open(File.join(random_dir, 'test', 'my_project', 'my_file.rb'), "w") { |file| file << 'woot' }
99
99
  analyzer = Analyzer.new(File.join(random_dir, 'test', 'my_project'))
100
- analyzer.parse_files.should be_include File.join(random_dir, 'test', 'my_project', 'my_file.rb')
100
+ expect(analyzer.parse_files).to be_include File.join(random_dir, 'test', 'my_project', 'my_file.rb')
101
101
  }
102
102
  end
103
103
 
@@ -107,7 +107,7 @@ module RailsBestPractices
107
107
  Dir.mkdir(File.join(random_dir, 'tmp', 'my_project'))
108
108
  File.open(File.join(random_dir, 'tmp', 'my_project', 'my_file.rb'), "w") { |file| file << 'woot' }
109
109
  analyzer = Analyzer.new(File.join(random_dir, 'tmp', 'my_project'))
110
- analyzer.parse_files.should be_include File.join(random_dir, 'tmp', 'my_project', 'my_file.rb')
110
+ expect(analyzer.parse_files).to be_include File.join(random_dir, 'tmp', 'my_project', 'my_file.rb')
111
111
  }
112
112
  end
113
113
 
@@ -7,7 +7,7 @@ module RailsBestPractices::Core
7
7
  context "debug" do
8
8
  it "should be debug mode" do
9
9
  Check.debug
10
- Check.should be_debug
10
+ expect(Check).to be_debug
11
11
  Check.class_eval { @debug = false }
12
12
  end
13
13
  end
@@ -3,28 +3,28 @@ require 'spec_helper'
3
3
  module RailsBestPractices::Core
4
4
  describe Error do
5
5
  it "should return error with filename, line number and message" do
6
- Error.new(
6
+ expect(Error.new(
7
7
  filename: "app/models/user.rb",
8
8
  line_number: "100",
9
9
  message: "not good",
10
- type: "BogusReview").to_s.should == "app/models/user.rb:100 - not good"
10
+ type: "BogusReview").to_s).to eq("app/models/user.rb:100 - not good")
11
11
  end
12
12
 
13
13
  it "should return short filename" do
14
14
  Runner.base_path = "../rails-bestpractices.com"
15
- Error.new(
15
+ expect(Error.new(
16
16
  filename: "../rails-bestpractices.com/app/models/user.rb",
17
17
  line_number: "100",
18
18
  message: "not good",
19
- type: "BogusReview").short_filename.should == "app/models/user.rb"
19
+ type: "BogusReview").short_filename).to eq("app/models/user.rb")
20
20
  end
21
21
 
22
22
  it "should return first line number" do
23
- Error.new(
23
+ expect(Error.new(
24
24
  filename: "app/models/user.rb",
25
25
  line_number: "50,70,100",
26
26
  message: "not good",
27
- type: "BogusReview").first_line_number.should == "50"
27
+ type: "BogusReview").first_line_number).to eq("50")
28
28
  end
29
29
  end
30
30
  end
@@ -5,9 +5,33 @@ module RailsBestPractices::Core
5
5
  it { should be_a_kind_of Array }
6
6
 
7
7
  context "Klass" do
8
- it "should get to_s" do
8
+ context "#class_name" do
9
+ it "gets class name without module" do
10
+ klass = Klass.new("BlogPost", "Post", [])
11
+ expect(klass.class_name).to eq("BlogPost")
12
+ end
13
+
14
+ it "gets class name with moduel" do
15
+ klass = Klass.new("BlogPost", "Post", ["Admin"])
16
+ expect(klass.class_name).to eq("Admin::BlogPost")
17
+ end
18
+ end
19
+
20
+ context "#extend_class_name" do
21
+ it "gets extend class name without module" do
22
+ klass = Klass.new("BlogPost", "Post", [])
23
+ expect(klass.extend_class_name).to eq("Post")
24
+ end
25
+
26
+ it "gets extend class name with module" do
27
+ klass = Klass.new("BlogPost", "Post", ["Admin"])
28
+ expect(klass.extend_class_name).to eq("Admin::Post")
29
+ end
30
+ end
31
+
32
+ it "gets to_s equal to class_name" do
9
33
  klass = Klass.new("BlogPost", "Post", ["Admin"])
10
- klass.to_s.should == "Admin::BlogPost"
34
+ expect(klass.to_s).to eq(klass.class_name)
11
35
  end
12
36
  end
13
37
  end