rails_best_practices 0.7.1 → 0.7.2

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 (35) hide show
  1. data/README.md +9 -1
  2. data/lib/rails_best_practices.rb +2 -0
  3. data/lib/rails_best_practices/core.rb +3 -1
  4. data/lib/rails_best_practices/core/check.rb +1 -1
  5. data/lib/rails_best_practices/core/model_associations.rb +25 -0
  6. data/lib/rails_best_practices/core/models.rb +7 -0
  7. data/lib/rails_best_practices/core/nil.rb +15 -0
  8. data/lib/rails_best_practices/core/runner.rb +17 -0
  9. data/lib/rails_best_practices/core/visitable_sexp.rb +12 -0
  10. data/lib/rails_best_practices/prepares.rb +1 -1
  11. data/lib/rails_best_practices/prepares/model_prepare.rb +15 -9
  12. data/lib/rails_best_practices/reviews/add_model_virtual_attribute_review.rb +7 -3
  13. data/lib/rails_best_practices/reviews/law_of_demeter_review.rb +2 -1
  14. data/lib/rails_best_practices/reviews/needless_deep_nesting_review.rb +1 -1
  15. data/lib/rails_best_practices/reviews/overuse_route_customizations_review.rb +3 -4
  16. data/lib/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review.rb +1 -1
  17. data/lib/rails_best_practices/reviews/review.rb +11 -0
  18. data/lib/rails_best_practices/reviews/use_before_filter_review.rb +6 -1
  19. data/lib/rails_best_practices/reviews/use_multipart_alternative_as_content_type_of_email_review.rb +11 -10
  20. data/lib/rails_best_practices/reviews/use_query_attribute_review.rb +6 -2
  21. data/lib/rails_best_practices/reviews/use_say_with_time_in_migrations_review.rb +6 -6
  22. data/lib/rails_best_practices/version.rb +1 -1
  23. data/rails_best_practices.yml +1 -1
  24. data/spec/rails_best_practices/core/check_spec.rb +1 -1
  25. data/spec/rails_best_practices/core/model_associations_spec.rb +22 -0
  26. data/spec/rails_best_practices/core/models_spec.rb +5 -0
  27. data/spec/rails_best_practices/core/nil_spec.rb +17 -0
  28. data/spec/rails_best_practices/prepares/model_prepare_spec.rb +50 -4
  29. data/spec/rails_best_practices/reviews/use_before_filter_review_spec.rb +18 -1
  30. data/spec/rails_best_practices/reviews/use_multipart_alternative_as_content_type_of_email_review_spec.rb +134 -154
  31. data/spec/rails_best_practices/reviews/use_say_with_time_in_migrations_review_spec.rb +14 -0
  32. data/spec/rails_best_practices_spec.rb +1 -0
  33. metadata +13 -7
  34. data/lib/rails_best_practices/core_ext/nil_class.rb +0 -8
  35. data/spec/rails_best_practices/core_ext/nil_class_spec.rb +0 -11
data/README.md CHANGED
@@ -98,7 +98,7 @@ Now you can customize this configuration file, the default configuration is as f
98
98
  UseObserverCheck: { }
99
99
  IsolateSeedDataCheck: { }
100
100
  AlwaysAddDbIndexCheck: { }
101
- UseBeforeFilterCheck: { }
101
+ UseBeforeFilterCheck: { customize_count: 1 }
102
102
  MoveCodeIntoControllerCheck: { }
103
103
  MoveCodeIntoModelCheck: { use_count: 2 }
104
104
  MoveCodeIntoHelperCheck: { array_count: 3 }
@@ -165,6 +165,11 @@ Other
165
165
 
166
166
  1. Remove Trailing Whitespace
167
167
 
168
+ Write Your Own Check List
169
+ -------------------------
170
+
171
+ If you want to write your own check list (some check list only for your rails projects), please read this first, [How to write your own check list?][1]
172
+
168
173
  Contribute
169
174
  ----------
170
175
 
@@ -181,3 +186,6 @@ Send us email: <team@rails-bestpractices.com>
181
186
 
182
187
 
183
188
  Copyright © 2009 - 2011 Richard Huang (flyerhzm@gmail.com), released under the MIT license
189
+
190
+
191
+ [1]:https://github.com/flyerhzm/rails_best_practices/wiki/How-to-write-your-own-check-list
@@ -70,6 +70,8 @@ module RailsBestPractices
70
70
  def start(path, options)
71
71
  @path = path || '.'
72
72
  @options = options
73
+ @options[:exclude] ||= []
74
+
73
75
  Core::Runner.base_path = @path
74
76
  @runner = Core::Runner.new
75
77
  @runner.debug = true if @options['debug']
@@ -3,7 +3,9 @@ require 'rails_best_practices/core/check'
3
3
  require 'rails_best_practices/core/runner'
4
4
  require 'rails_best_practices/core/checking_visitor'
5
5
  require 'rails_best_practices/core/error'
6
+ require 'rails_best_practices/core/nil'
6
7
  require 'rails_best_practices/core/visitable_sexp'
8
+ require 'rails_best_practices/core/models'
9
+ require 'rails_best_practices/core/model_associations'
7
10
 
8
11
  require 'rails_best_practices/core_ext/enumerable'
9
- require 'rails_best_practices/core_ext/nil_class'
@@ -22,7 +22,7 @@ module RailsBestPractices
22
22
 
23
23
  # default interesting nodes.
24
24
  def interesting_nodes
25
- []
25
+ NODE_TYPES
26
26
  end
27
27
 
28
28
  # default interesting files.
@@ -0,0 +1,25 @@
1
+ # encoding: utf-8
2
+ module RailsBestPractices
3
+ module Core
4
+ class ModelAssociations
5
+ def initialize
6
+ @associations = {}
7
+ end
8
+
9
+ def add_association(model_name, association_name, association_meta, association_class=nil)
10
+ @associations[model_name] ||= {}
11
+ @associations[model_name][association_name] = {:meta => association_meta, :class_name => association_class || association_name.classify}
12
+ end
13
+
14
+ def get_association(model_name, association_name)
15
+ associations = @associations[model_name]
16
+ associations and associations[association_name]
17
+ end
18
+
19
+ def is_association?(model_name, association_name)
20
+ associations = @associations[model_name]
21
+ associations && associations[association_name]
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,7 @@
1
+ # encoding: utf-8
2
+ module RailsBestPractices
3
+ module Core
4
+ class Models < Array
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,15 @@
1
+ # encoding: utf-8
2
+ module RailsBestPractices
3
+ module Core
4
+ class Nil
5
+ def to_s(*arguments)
6
+ self
7
+ end
8
+
9
+ # return self
10
+ def method_missing(method_sym, *arguments, &block)
11
+ self
12
+ end
13
+ end
14
+ end
15
+ end
@@ -44,6 +44,8 @@ module RailsBestPractices
44
44
  @prepares = prepares.empty? ? load_prepares : prepares
45
45
  @reviews = reviews.empty? ? load_reviews : reviews
46
46
 
47
+ load_plugin_reviews
48
+
47
49
  @checker ||= CheckingVisitor.new(:prepares => @prepares, :reviews => @reviews, :lexicals => @lexicals)
48
50
  @debug = false
49
51
  end
@@ -161,6 +163,21 @@ module RailsBestPractices
161
163
  }
162
164
  end
163
165
 
166
+ # load all plugin reviews.
167
+ def load_plugin_reviews
168
+ begin
169
+ plugins = "lib/rails_best_practices/plugins/reviews"
170
+ if File.directory?(plugins)
171
+ Dir[File.expand_path(File.join(plugins, "*.rb"))].each do |review|
172
+ require review
173
+ end
174
+ RailsBestPractices::Plugins::Reviews.constants.each do |review|
175
+ @reviews << RailsBestPractices::Plugins::Reviews.const_get(review).new
176
+ end
177
+ end
178
+ end
179
+ end
180
+
164
181
  # read the checks from yaml config.
165
182
  def checks_from_config
166
183
  @checks ||= YAML.load_file @config
@@ -427,4 +427,16 @@ class Sexp
427
427
  ""
428
428
  end
429
429
  end
430
+
431
+ # if the return value of these methods is nil, then return RailsBestPractices::Core::Nil.new instead
432
+ [:node_type, :subject, :message, :arguments, :class_name, :base_class, :method_name, :body, :conditional_statement, :true_node, :false_node, :left_value, :right_value].each do |method|
433
+ class_eval <<-EOS
434
+ alias_method :origin_#{method}, :#{method}
435
+
436
+ def #{method}
437
+ ret = origin_#{method}
438
+ ret.nil? ? RailsBestPractices::Core::Nil.new : ret
439
+ end
440
+ EOS
441
+ end
430
442
  end
@@ -5,7 +5,7 @@ require 'rails_best_practices/prepares/mailer_prepare'
5
5
  module RailsBestPractices
6
6
  module Prepares
7
7
  class <<self
8
- attr_accessor :model_associations, :mailer_names
8
+ attr_accessor :models, :model_associations, :mailer_names
9
9
  end
10
10
  end
11
11
  end
@@ -15,17 +15,20 @@ module RailsBestPractices
15
15
  end
16
16
 
17
17
  def initialize
18
- @associations = {}
18
+ @models = Core::Models.new
19
+ @model_associations = Core::ModelAssociations.new
19
20
  end
20
21
 
21
22
  # check class node to remember the last class name.
22
23
  def start_class(class_node)
23
24
  @last_klazz = class_node.class_name.to_s
25
+ @models << @last_klazz
24
26
  end
25
27
 
26
- # assign @associations to Prepare.model_associations.
28
+ # assign @model_associations to Prepare.model_associations.
27
29
  def end_class(class_node)
28
- Prepares.model_associations = @associations
30
+ Prepares.models = @models
31
+ Prepares.model_associations = @model_associations
29
32
  end
30
33
 
31
34
  # check call node to remember all assoications.
@@ -33,10 +36,10 @@ module RailsBestPractices
33
36
  # the remembered association names (@associations) are like
34
37
  # {
35
38
  # :Project=>{
36
- # "categories"=>:has_and_belongs_to_many,
37
- # "project_manager"=>:has_one,
38
- # "portfolio"=>:belongs_to,
39
- # "milestones=>:has_many"
39
+ # "categories" => {:has_and_belongs_to_many => "Category"},
40
+ # "project_manager" => {:has_one => "ProjectManager"},
41
+ # "portfolio" => {:belongs_to => "Portfolio"},
42
+ # "milestones => {:has_many" => "Milestone"}
40
43
  # }
41
44
  # }
42
45
  def start_call(node)
@@ -47,8 +50,11 @@ module RailsBestPractices
47
50
  def remember_association(association_node)
48
51
  association_meta = association_node.message
49
52
  association_name = association_node.arguments[1].to_s
50
- @associations[@last_klazz] ||= {}
51
- @associations[@last_klazz][association_name] = association_meta
53
+ if association_node.arguments[2] && :hash == association_node.arguments[2].node_type
54
+ association_options = eval(association_node.arguments[2].to_s)
55
+ association_class = association_options["class_name"]
56
+ end
57
+ @model_associations.add_association(@last_klazz, association_name, association_meta, association_class)
52
58
  end
53
59
 
54
60
  # default rails association methods.
@@ -94,8 +94,7 @@ module RailsBestPractices
94
94
  subject = node.subject
95
95
  arguments_node = node.arguments.grep_node(:message => :[])
96
96
  return if subject.nil? or arguments_node.nil?
97
- @attrasgns[subject] ||= []
98
- @attrasgns[subject] << {:message => node.message, :arguments => arguments_node}
97
+ attrasgns(subject) << {:message => node.message, :arguments => arguments_node}
99
98
  end
100
99
 
101
100
  # check a call node with message :save or :save!,
@@ -123,7 +122,7 @@ module RailsBestPractices
123
122
  def call_assignment(node)
124
123
  if [:save, :save!].include? node.message
125
124
  subject = node.subject
126
- add_error "add model virtual attribute (for #{subject})" if params_dup?(@attrasgns[subject].collect {|h| h[:arguments]})
125
+ add_error "add model virtual attribute (for #{subject})" if params_dup?(attrasgns(subject).collect {|h| h[:arguments]})
127
126
  end
128
127
  end
129
128
 
@@ -132,6 +131,11 @@ module RailsBestPractices
132
131
  return false if nodes.nil?
133
132
  !nodes.dups.empty?
134
133
  end
134
+
135
+ # get the attrasgns of subject, or empty array.
136
+ def attrasgns(subject)
137
+ @attrasgns[subject] ||= []
138
+ end
135
139
  end
136
140
  end
137
141
  end
@@ -63,7 +63,8 @@ module RailsBestPractices
63
63
  # and the message of subject of the call node is :user
64
64
  def need_delegate?(node)
65
65
  class_name = node.subject.subject.to_s(:remove_at => true).classify
66
- association_methods.include? model_associations[class_name][node.subject.message.to_s]
66
+ association = model_associations.get_association(class_name, node.subject.message.to_s)
67
+ association && association_methods.include?(association[:meta])
67
68
  end
68
69
 
69
70
  # only check belongs_to and has_one association.
@@ -114,7 +114,7 @@ module RailsBestPractices
114
114
  def recursively_check(node)
115
115
  if :iter == node.node_type && :resources == node.subject.message
116
116
  options = eval(node.subject.arguments[2].to_s)
117
- return if options["shallow"] == true
117
+ return if options && options["shallow"] == true
118
118
  @counter += 1
119
119
  recursively_check(node.body)
120
120
  @counter -= 1
@@ -127,9 +127,10 @@ module RailsBestPractices
127
127
  if :resources == node.message
128
128
  hash_node = node.arguments[2]
129
129
  if hash_node
130
- (hash_node.grep_nodes_count(:node_type => :lit) - hash_node.grep_nodes_count(:node_type => :hash)) / 2
130
+ return (hash_node.grep_nodes_count(:node_type => :lit) - hash_node.grep_nodes_count(:node_type => :hash)) / 2
131
131
  end
132
132
  end
133
+ 0
133
134
  end
134
135
 
135
136
  # check iter node to calculate the count of member and collection custom routes.
@@ -160,9 +161,7 @@ module RailsBestPractices
160
161
  # )
161
162
  # )
162
163
  def member_and_collection_count_for_rails3(node)
163
- if :resources == node.subject.message
164
- node.grep_nodes_count(:node_type => :call, :message => VERBS)
165
- end
164
+ :resources == node.subject.message ? node.grep_nodes_count(:node_type => :call, :message => VERBS) : 0
166
165
  end
167
166
  end
168
167
  end
@@ -60,7 +60,7 @@ module RailsBestPractices
60
60
  def check_variable_save(node)
61
61
  if [:save, :save!].include? node.message
62
62
  variable = node.subject
63
- if variable_use_count[variable] > @attrasgn_count
63
+ if variable_use_count[variable].to_i > @attrasgn_count
64
64
  add_error "replace complex creation with factory method (#{variable} attribute_assignment_count > #{@attrasgn_count})"
65
65
  end
66
66
  end
@@ -6,6 +6,10 @@ module RailsBestPractices
6
6
  module Reviews
7
7
  # A Review class that takes charge of reviewing one rails best practice.
8
8
  class Review < Core::Check
9
+ # default url.
10
+ def url
11
+ "#"
12
+ end
9
13
  # remember use count for the local or instance variable in the call or attrasgn node.
10
14
  #
11
15
  # find the local variable or instance variable in the call or attrasgn node,
@@ -56,6 +60,13 @@ module RailsBestPractices
56
60
  end
57
61
  end
58
62
 
63
+ # get the models from Prepares.
64
+ #
65
+ # @return [Array]
66
+ def models
67
+ @models ||= Prepares.models
68
+ end
69
+
59
70
  # get the model associations from Prepares.
60
71
  #
61
72
  # @return [Hash]
@@ -28,6 +28,11 @@ module RailsBestPractices
28
28
  CONTROLLER_FILES
29
29
  end
30
30
 
31
+ def initialize(options = {})
32
+ super()
33
+ @customize_count = options['customize_count'] || 1
34
+ end
35
+
31
36
  # check class define node to see if there are method define nodes whose first code line are duplicated.
32
37
  #
33
38
  # it will check every defn nodes in the class node until protected or private identification,
@@ -79,7 +84,7 @@ module RailsBestPractices
79
84
  remember_first_sentence(child_node) if :defn == child_node.node_type
80
85
  end
81
86
  @first_sentences.each do |first_sentence, defn_nodes|
82
- if defn_nodes.size > 1
87
+ if defn_nodes.size > @customize_count
83
88
  add_error "use before_filter for #{defn_nodes.collect(&:method_name).join(',')}", class_node.file, defn_nodes.collect(&:line).join(',')
84
89
  end
85
90
  end
@@ -35,26 +35,27 @@ module RailsBestPractices
35
35
  def start_defn(node)
36
36
  name = node.method_name
37
37
  return unless deliver_method?(name)
38
- if !rails2_mailer_views_exist?(name) && !rails3_mailer_views_exist?(name)
38
+ if rails2_canonical_mailer_views?(name) || rails3_canonical_mailer_views?(name)
39
39
  add_error("use multipart/alternative as content_type of email")
40
40
  end
41
41
  end
42
42
 
43
43
  private
44
- # check if rails2's syntax mailer views exist or not according to the method name.
44
+ # check if rails2's syntax mailer views are canonical.
45
+ #
45
46
  # @param [String] name method name in action_mailer
46
- def rails2_mailer_views_exist?(name)
47
- (exist?("#{name}.text.plain.erb") && exist?("#{name}.text.html.erb")) ||
48
- (exist?("#{name}.text.plain.haml") && exist?("#{name}.text.html.haml")) ||
49
- (exist?("#{name}.text.plain.rhtml") && exist?("#{name}.text.html.rhtml"))
47
+ def rails2_canonical_mailer_views?(name)
48
+ (exist?("#{name}.text.html.erb") && !exist?("#{name}.text.plain.erb")) ||
49
+ (exist?("#{name}.text.html.haml") && !exist?("#{name}.text.plain.haml")) ||
50
+ (exist?("#{name}.text.html.rhtml") && !exist?("#{name}.text.plain.rhtml"))
50
51
  end
51
52
 
52
- # check if rails3's syntax mailer views exist or not according to the method name.
53
+ # check if rails3's syntax mailer views are canonical.
53
54
  #
54
55
  # @param [String] name method name in action_mailer
55
- def rails3_mailer_views_exist?(name)
56
- (exist?("#{name}.text.erb") && exist?("#{name}.html.erb")) ||
57
- (exist?("#{name}.text.haml") && exist?("#{name}.html.haml"))
56
+ def rails3_canonical_mailer_views?(name)
57
+ (exist?("#{name}.html.erb") && !exist?("#{name}.text.erb")) ||
58
+ (exist?("#{name}.html.haml") && !exist?("#{name}.text.haml"))
58
59
  end
59
60
 
60
61
  # check if the filename existed in the mailer directory.
@@ -85,10 +85,14 @@ module RailsBestPractices
85
85
  !pluralize?(message.to_s) && (QUERY_METHODS.include?(node.message) || compare_with_empty_string?(node))
86
86
  end
87
87
 
88
+ # check if the subject is one of the models.
89
+ #
90
+ # subject, subject of call node, like
91
+ # s(:ivar, @user)
88
92
  def is_model?(subject)
89
93
  return false if :const == subject.node_type
90
94
  class_name = subject.to_s(:remove_at => true).classify
91
- !model_associations[class_name].nil?
95
+ models.include?(class_name)
92
96
  end
93
97
 
94
98
  # check if the subject and message is one of the model's aassociation.
@@ -101,7 +105,7 @@ module RailsBestPractices
101
105
  # :login
102
106
  def model_association?(subject, message)
103
107
  class_name = subject.to_s(:remove_at => true).classify
104
- !model_associations[class_name][message.to_s].nil?
108
+ model_associations.is_association?(class_name, message.to_s)
105
109
  end
106
110
 
107
111
 
@@ -17,7 +17,7 @@ module RailsBestPractices
17
17
  class UseSayWithTimeInMigrationsReview < Review
18
18
 
19
19
  DEFAULT_MIGRATION_METHODS = [:add_column, :add_index, :add_timestamps, :change_column, :change_column_default, :change_table, :create_table, :drop_table, :remove_column, :remove_index, :remove_timestamps, :rename_column, :rename_index, :rename_table]
20
- WITH_SAY_METHODS = DEFAULT_MIGRATION_METHODS + [:say, :say_with_time]
20
+ WITH_SAY_METHODS = [:say, :say_with_time]
21
21
 
22
22
  def url
23
23
  "http://rails-bestpractices.com/posts/46-use-say-and-say_with_time-in-migrations-to-make-a-useful-migration-log"
@@ -67,11 +67,11 @@ module RailsBestPractices
67
67
  def start_defs(node)
68
68
  block_node = node.grep_node(:node_type => :block)
69
69
  block_node.children.each do |child_node|
70
- if :iter == child_node.node_type
71
- subject_node = child_node.subject
72
- if :call == subject_node.node_type && !WITH_SAY_METHODS.include?(subject_node.message)
73
- add_error("use say with time in migrations", subject_node.file, subject_node.line)
74
- end
70
+ next if :iter != child_node.node_type || child_node.grep_nodes_count(:node_type => :call, :message => WITH_SAY_METHODS) > 0
71
+
72
+ subject_node = child_node.subject
73
+ if :call == subject_node.node_type && !DEFAULT_MIGRATION_METHODS.include?(subject_node.message)
74
+ add_error("use say with time in migrations", subject_node.file, subject_node.line)
75
75
  end
76
76
  end
77
77
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
  module RailsBestPractices
3
- VERSION = "0.7.1"
3
+ VERSION = "0.7.2"
4
4
  end
5
5
 
@@ -12,7 +12,7 @@ LawOfDemeterCheck: { }
12
12
  UseObserverCheck: { }
13
13
  IsolateSeedDataCheck: { }
14
14
  AlwaysAddDbIndexCheck: { }
15
- UseBeforeFilterCheck: { }
15
+ UseBeforeFilterCheck: { customize_count: 1 }
16
16
  MoveCodeIntoControllerCheck: { }
17
17
  MoveCodeIntoModelCheck: { use_count: 2 }
18
18
  MoveCodeIntoHelperCheck: { array_count: 3 }
@@ -4,7 +4,7 @@ describe RailsBestPractices::Core::Check do
4
4
  let(:check) { RailsBestPractices::Core::Check.new }
5
5
 
6
6
  it "should get empty interesting nodes" do
7
- check.interesting_nodes.should == []
7
+ check.interesting_nodes.should == RailsBestPractices::Core::Check::NODE_TYPES
8
8
  end
9
9
 
10
10
  it "should match all files of interesting files" do
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe RailsBestPractices::Core::ModelAssociations do
4
+ let(:model_associations) { RailsBestPractices::Core::ModelAssociations.new }
5
+
6
+ before :each do
7
+ model_associations.add_association("Project", "project_manager", :belongs_to)
8
+ model_associations.add_association("Project", "people", :has_many, "Person")
9
+ end
10
+
11
+ it "should get model associations" do
12
+ model_associations.get_association("Project", "project_manager").should == {:meta => :belongs_to, :class_name => "ProjectManager"}
13
+ model_associations.get_association("Project", "people").should == {:meta => :has_many, :class_name => "Person"}
14
+ model_associations.get_association("Project", "unknown").should be_nil
15
+ end
16
+
17
+ it "should check is model associatiosn" do
18
+ model_associations.get_association("Project", "project_manager").should be_true
19
+ model_associations.get_association("Project", "people").should be_true
20
+ model_associations.get_association("Project", "unknown").should be_false
21
+ end
22
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe RailsBestPractices::Core::Models do
4
+ it { should be_a_kind_of Array }
5
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe RailsBestPractices::Core::Nil do
4
+ let(:core_nil) { RailsBestPractices::Core::Nil.new }
5
+
6
+ context "to_s" do
7
+ it "should return self" do
8
+ core_nil.to_s.should == core_nil
9
+ end
10
+ end
11
+
12
+ context "method_missing" do
13
+ it "should return self" do
14
+ core_nil.undefined.should == core_nil
15
+ end
16
+ end
17
+ end
@@ -14,9 +14,55 @@ describe RailsBestPractices::Prepares::ModelPrepare do
14
14
  EOF
15
15
  runner.prepare('app/models/project.rb', content)
16
16
  model_associations = RailsBestPractices::Prepares.model_associations
17
- model_associations["Project"]["portfolio"].should == :belongs_to
18
- model_associations["Project"]["project_manager"].should == :has_one
19
- model_associations["Project"]["milestones"].should == :has_many
20
- model_associations["Project"]["categories"].should == :has_and_belongs_to_many
17
+ model_associations.get_association("Project", "portfolio").should == {:meta => :belongs_to, :class_name => "Portfolio"}
18
+ model_associations.get_association("Project", "project_manager").should == {:meta => :has_one, :class_name => "ProjectManager"}
19
+ model_associations.get_association("Project", "milestones").should == {:meta => :has_many, :class_name => "Milestone"}
20
+ model_associations.get_association("Project", "categories").should == {:meta => :has_and_belongs_to_many, :class_name => "Category"}
21
+ end
22
+
23
+ context "class_name" do
24
+ it "should parse belongs_to" do
25
+ content =<<-EOF
26
+ class Post < ActiveRecord::Base
27
+ belongs_to :author, :class_name => "Person"
28
+ end
29
+ EOF
30
+ runner.prepare("app/models/post.rb", content)
31
+ model_associations = RailsBestPractices::Prepares.model_associations
32
+ model_associations.get_association("Post", "author").should == {:meta => :belongs_to, :class_name => "Person"}
33
+ end
34
+
35
+ it "should parse has_one" do
36
+ content =<<-EOF
37
+ class Project < ActiveRecord::Base
38
+ has_one :project_manager, :class_name => "Person"
39
+ end
40
+ EOF
41
+ runner.prepare("app/models/post.rb", content)
42
+ model_associations = RailsBestPractices::Prepares.model_associations
43
+ model_associations.get_association("Project", "project_manager").should == {:meta => :has_one, :class_name => "Person"}
44
+ end
45
+
46
+ it "should parse has_many" do
47
+ content =<<-EOF
48
+ class Project < ActiveRecord::Base
49
+ has_many :people, :class_name => "Person"
50
+ end
51
+ EOF
52
+ runner.prepare("app/models/project.rb", content)
53
+ model_associations = RailsBestPractices::Prepares.model_associations
54
+ model_associations.get_association("Project", "people").should == {:meta => :has_many, :class_name => "Person"}
55
+ end
56
+
57
+ it "should parse has_and_belongs_to_many" do
58
+ content =<<-EOF
59
+ class Citizen < ActiveRecord::Base
60
+ has_and_belongs_to_many :nations, :class_name => "Country"
61
+ end
62
+ EOF
63
+ runner.prepare("app/models/citizen.rb", content)
64
+ model_associations = RailsBestPractices::Prepares.model_associations
65
+ model_associations.get_association("Citizen", "nations").should == {:meta => :has_and_belongs_to_many, :class_name => "Country"}
66
+ end
21
67
  end
22
68
  end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe RailsBestPractices::Reviews::UseBeforeFilterReview do
4
- let(:runner) { RailsBestPractices::Core::Runner.new(:reviews => RailsBestPractices::Reviews::UseBeforeFilterReview.new) }
4
+ let(:runner) { RailsBestPractices::Core::Runner.new(:reviews => RailsBestPractices::Reviews::UseBeforeFilterReview.new('customize_count' => 2)) }
5
5
 
6
6
  it "should use before_filter" do
7
7
  content = <<-EOF
@@ -32,6 +32,23 @@ describe RailsBestPractices::Reviews::UseBeforeFilterReview do
32
32
  runner.errors[0].to_s.should == "app/controllers/posts_controller.rb:3,7,11,16 - use before_filter for show,edit,update,destroy"
33
33
  end
34
34
 
35
+ it "should not use before_filter when equal to customize count" do
36
+ content = <<-EOF
37
+ class PostsController < ApplicationController
38
+
39
+ def show
40
+ @post = Post.find(params[:id])
41
+ end
42
+
43
+ def edit
44
+ @post = Post.find(params[:id])
45
+ end
46
+ end
47
+ EOF
48
+ runner.review('app/controllers/posts_controller.rb', content)
49
+ runner.should have(0).errors
50
+ end
51
+
35
52
  it "should not use before_filter" do
36
53
  content = <<-EOF
37
54
  class PostsController < ApplicationController
@@ -3,108 +3,102 @@ require 'spec_helper'
3
3
  describe RailsBestPractices::Reviews::UseMultipartAlternativeAsContentTypeOfEmailReview do
4
4
  let(:runner) { RailsBestPractices::Core::Runner.new(:reviews => RailsBestPractices::Reviews::UseMultipartAlternativeAsContentTypeOfEmailReview.new) }
5
5
 
6
+ before :each do
7
+ RailsBestPractices::Core::Runner.stub!(:base_path).and_return(".")
8
+ end
9
+
10
+ def mock_email_files(entry_files, options={})
11
+ Dir.stub!(:entries).with("./app/views/project_mailer").and_return(entry_files)
12
+ File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.plain.erb").and_return(options["text.plain.erb"] || false)
13
+ File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.html.erb").and_return(options["text.html.erb"] || false)
14
+ File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.erb").and_return(options["text.erb"] || false)
15
+ File.stub!(:exist?).with("./app/views/project_mailer/send_email.html.erb").and_return(options["html.erb"] || false)
16
+ File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.plain.haml").and_return(options["text.plain.haml"] || false)
17
+ File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.html.haml").and_return(options["text.html.haml"] || false)
18
+ File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.haml").and_return(options["text.haml"] || false)
19
+ File.stub!(:exist?).with("./app/views/project_mailer/send_email.html.haml").and_return(options["html.haml"] || false)
20
+ File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.plain.rhtml").and_return(options["text.plain.rhtml"] || false)
21
+ File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.html.rhtml").and_return(options["text.html.rhtml"] || false)
22
+ end
23
+
6
24
  context "rails2" do
7
- before :each do
8
- RailsBestPractices::Core::Runner.stub!(:base_path).and_return(".")
9
- end
25
+ context "project_mailer" do
26
+ let(:content) {
27
+ <<-EOF
28
+ class ProjectMailer < ActionMailer::Base
29
+ def send_email(email)
30
+ subject email.subject
31
+ from email.from
32
+ recipients email.recipients
33
+ sent_on Time.now
34
+ body :email => email
35
+ end
36
+ end
37
+ EOF
38
+ }
10
39
 
11
- it "should use mulipart/alternative as content_type of email" do
12
- content =<<-EOF
13
- class ProjectMailer < ActionMailer::Base
14
- def send_email(email)
15
- subject email.subject
16
- from email.from
17
- recipients email.recipients
18
- sent_on Time.now
19
- body :email => email
40
+ context "erb" do
41
+ it "should use mulipart/alternative as content_type of email" do
42
+ mock_email_files(["send_email.text.html.erb"], "text.html.erb" => true)
43
+ runner.review('app/mailers/project_mailer.rb', content)
44
+ runner.should have(1).errors
45
+ runner.errors[0].to_s.should == "app/mailers/project_mailer.rb:2 - use multipart/alternative as content_type of email"
20
46
  end
21
- end
22
- EOF
23
- Dir.stub!(:entries).with("./app/views/project_mailer").and_return(["send_email.html.erb"])
24
- runner.review('app/mailers/project_mailer.rb', content)
25
- runner.should have(1).errors
26
- runner.errors[0].to_s.should == "app/mailers/project_mailer.rb:2 - use multipart/alternative as content_type of email"
27
- end
28
47
 
29
- it "should not use mulipart/alternative as content_type of email by erb" do
30
- content =<<-EOF
31
- class ProjectMailer < ActionMailer::Base
32
- def send_email(email)
33
- subject email.subject
34
- from email.from
35
- recipients email.recipients
36
- sent_on Time.now
37
- body :email => email
48
+ it "should not use multipart/alternative as content_type of email" do
49
+ mock_email_files(["send_email.text.html.erb"], "text.plain.erb" => true, "text.html.erb" => true)
50
+ runner.review('app/mailers/project_mailer.rb', content)
51
+ runner.should have(0).errors
52
+ end
53
+
54
+ it "should not use multiple/alternative as content_type of email when only plain text" do
55
+ mock_email_files(["send_email.text.plain.erb"], "text.plain.erb" => true)
56
+ runner.review('app/mailers/project_mailer.rb', content)
57
+ runner.should have(0).errors
38
58
  end
39
59
  end
40
- EOF
41
- Dir.stub!(:entries).with("./app/views/project_mailer").and_return(["send_email.html.erb"])
42
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.plain.erb").and_return(true)
43
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.html.erb").and_return(true)
44
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.erb").and_return(false)
45
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.html.erb").and_return(false)
46
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.plain.haml").and_return(false)
47
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.html.haml").and_return(false)
48
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.haml").and_return(false)
49
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.html.haml").and_return(false)
50
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.plain.rhtml").and_return(false)
51
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.html.rhtml").and_return(false)
52
- runner.review('app/mailers/project_mailer.rb', content)
53
- runner.should have(0).errors
54
- end
55
60
 
56
- it "should not use mulipart/alternative as content_type of email by haml" do
57
- content =<<-EOF
58
- class ProjectMailer < ActionMailer::Base
59
- def send_email(email)
60
- subject email.subject
61
- from email.from
62
- recipients email.recipients
63
- sent_on Time.now
64
- body :email => email
61
+ context "haml" do
62
+ it "should use mulipart/alternative as content_type of email" do
63
+ mock_email_files(["send_email.text.html.haml"], "text.html.haml" => true)
64
+ runner.review('app/mailers/project_mailer.rb', content)
65
+ runner.should have(1).errors
66
+ runner.errors[0].to_s.should == "app/mailers/project_mailer.rb:2 - use multipart/alternative as content_type of email"
67
+ end
68
+
69
+ it "should not use multipart/alternative as content_type of email" do
70
+ mock_email_files(["send_email.text.html.haml"], "text.plain.haml" => true, "text.html.haml" => true)
71
+ runner.review('app/mailers/project_mailer.rb', content)
72
+ runner.should have(0).errors
73
+ end
74
+
75
+ it "should not use multiple/alternative as content_type of email when only plain text" do
76
+ mock_email_files(["send_email.text.plain.haml"], "text.plain.haml" => true)
77
+ runner.review('app/mailers/project_mailer.rb', content)
78
+ runner.should have(0).errors
65
79
  end
66
80
  end
67
- EOF
68
- Dir.stub!(:entries).with("./app/views/project_mailer").and_return(["send_email.html.erb"])
69
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.plain.erb").and_return(false)
70
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.html.erb").and_return(false)
71
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.erb").and_return(false)
72
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.html.erb").and_return(false)
73
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.plain.haml").and_return(true)
74
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.html.haml").and_return(true)
75
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.haml").and_return(false)
76
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.html.haml").and_return(false)
77
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.plain.rhtml").and_return(false)
78
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.html.rhtml").and_return(false)
79
- runner.review('app/mailers/project_mailer.rb', content)
80
- runner.should have(0).errors
81
- end
82
81
 
83
- it "should not use mulipart/alternative as content_type of email by rhtml" do
84
- content =<<-EOF
85
- class ProjectMailer < ActionMailer::Base
86
- def send_email(email)
87
- subject email.subject
88
- from email.from
89
- recipients email.recipients
90
- sent_on Time.now
91
- body :email => email
82
+ context "rhtml" do
83
+ it "should use mulipart/alternative as content_type of email" do
84
+ mock_email_files(["send_email.text.html.rhtml"], "text.html.rhtml" => true)
85
+ runner.review('app/mailers/project_mailer.rb', content)
86
+ runner.should have(1).errors
87
+ runner.errors[0].to_s.should == "app/mailers/project_mailer.rb:2 - use multipart/alternative as content_type of email"
88
+ end
89
+
90
+ it "should not use multipart/alternative as content_type of email" do
91
+ mock_email_files(["send_email.text.html.rhtml"], "text.plain.rhtml" => true, "text.html.rhtml" => true)
92
+ runner.review('app/mailers/project_mailer.rb', content)
93
+ runner.should have(0).errors
94
+ end
95
+
96
+ it "should not use multiple/alternative as content_type of email when only plain text" do
97
+ mock_email_files(["send_email.text.plain.rhtml"], "text.plain.rhtml" => true)
98
+ runner.review('app/mailers/project_mailer.rb', content)
99
+ runner.should have(0).errors
92
100
  end
93
101
  end
94
- EOF
95
- Dir.stub!(:entries).with("./app/views/project_mailer").and_return(["send_email.html.erb"])
96
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.plain.erb").and_return(false)
97
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.html.erb").and_return(false)
98
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.erb").and_return(false)
99
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.html.erb").and_return(false)
100
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.plain.haml").and_return(false)
101
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.html.haml").and_return(false)
102
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.haml").and_return(false)
103
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.html.haml").and_return(false)
104
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.plain.rhtml").and_return(true)
105
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.html.rhtml").and_return(true)
106
- runner.review('app/mailers/project_mailer.rb', content)
107
- runner.should have(0).errors
108
102
  end
109
103
 
110
104
  it "should not use mulipart/alternative as content_type of email for non deliver method" do
@@ -114,83 +108,69 @@ describe RailsBestPractices::Reviews::UseMultipartAlternativeAsContentTypeOfEmai
114
108
  end
115
109
  end
116
110
  EOF
117
- Dir.stub!(:entries).with("./app/views/project_mailer").and_return(["send_email.html.erb"])
111
+ mock_email_files(["send_email.text.html.erb"])
118
112
  runner.review('app/mailers/project_mailer.rb', content)
119
113
  runner.should have(0).errors
120
114
  end
121
115
  end
122
116
 
123
117
  context "rails3" do
124
- it "should use mulipart/alternative as content_type of email" do
125
- content =<<-EOF
126
- class ProjectMailer < ActionMailer::Base
127
- def send_email(email)
128
- subject email.subject
129
- from email.from
130
- recipients email.recipients
131
- sent_on Time.now
132
- body :email => email
118
+ context "project_mailer" do
119
+ let(:content) {
120
+ <<-EOF
121
+ class ProjectMailer < ActionMailer::Base
122
+ def send_email(email)
123
+ subject email.subject
124
+ from email.from
125
+ recipients email.recipients
126
+ sent_on Time.now
127
+ body :email => email
128
+ end
133
129
  end
134
- end
135
- EOF
136
- Dir.stub!(:entries).with("./app/views/project_mailer").and_return(["send_email.html.erb"])
137
- runner.review('app/mailers/project_mailer.rb', content)
138
- runner.should have(1).errors
139
- runner.errors[0].to_s.should == "app/mailers/project_mailer.rb:2 - use multipart/alternative as content_type of email"
140
- end
130
+ EOF
131
+ }
141
132
 
142
- it "should not use mulipart/alternative as content_type of email by erb" do
143
- content =<<-EOF
144
- class ProjectMailer < ActionMailer::Base
145
- def send_email(email)
146
- subject email.subject
147
- from email.from
148
- recipients email.recipients
149
- sent_on Time.now
150
- body :email => email
133
+ context "erb" do
134
+ it "should use mulipart/alternative as content_type of email" do
135
+ mock_email_files(["send_email.html.erb"], "html.erb" => true)
136
+ runner.review('app/mailers/project_mailer.rb', content)
137
+ runner.should have(1).errors
138
+ runner.errors[0].to_s.should == "app/mailers/project_mailer.rb:2 - use multipart/alternative as content_type of email"
139
+ end
140
+
141
+ it "should not use multipart/alternative as content_type of email" do
142
+ mock_email_files(["send_email.html.erb"], "text.erb" => true, "html.erb" => true)
143
+ runner.review('app/mailers/project_mailer.rb', content)
144
+ runner.should have(0).errors
145
+ end
146
+
147
+ it "should not use multiple/alternative as content_type of email when only plain text" do
148
+ mock_email_files(["send_email.text.erb"], "text.erb" => true)
149
+ runner.review('app/mailers/project_mailer.rb', content)
150
+ runner.should have(0).errors
151
151
  end
152
152
  end
153
- EOF
154
- Dir.stub!(:entries).with("./app/views/project_mailer").and_return(["send_email.html.erb"])
155
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.plain.erb").and_return(false)
156
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.html.erb").and_return(false)
157
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.erb").and_return(true)
158
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.html.erb").and_return(true)
159
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.plain.haml").and_return(false)
160
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.html.haml").and_return(false)
161
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.haml").and_return(false)
162
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.html.haml").and_return(false)
163
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.plain.rhtml").and_return(false)
164
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.html.rhtml").and_return(false)
165
- runner.review('app/mailers/project_mailer.rb', content)
166
- runner.should have(0).errors
167
- end
168
153
 
169
- it "should not use mulipart/alternative as content_type of email by haml" do
170
- content =<<-EOF
171
- class ProjectMailer < ActionMailer::Base
172
- def send_email(email)
173
- subject email.subject
174
- from email.from
175
- recipients email.recipients
176
- sent_on Time.now
177
- body :email => email
154
+ context "haml" do
155
+ it "should use mulipart/alternative as content_type of email" do
156
+ mock_email_files(["send_email.html.haml"], "html.haml" => true)
157
+ runner.review('app/mailers/project_mailer.rb', content)
158
+ runner.should have(1).errors
159
+ runner.errors[0].to_s.should == "app/mailers/project_mailer.rb:2 - use multipart/alternative as content_type of email"
160
+ end
161
+
162
+ it "should not use multipart/alternative as content_type of email" do
163
+ mock_email_files(["send_email.html.haml"], "text.haml" => true, "html.haml" => true)
164
+ runner.review('app/mailers/project_mailer.rb', content)
165
+ runner.should have(0).errors
166
+ end
167
+
168
+ it "should not use multiple/alternative as content_type of email when only plain text" do
169
+ mock_email_files(["send_email.text.haml"], "text.haml" => true)
170
+ runner.review('app/mailers/project_mailer.rb', content)
171
+ runner.should have(0).errors
178
172
  end
179
173
  end
180
- EOF
181
- Dir.stub!(:entries).with("./app/views/project_mailer").and_return(["send_email.html.erb"])
182
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.plain.erb").and_return(false)
183
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.html.erb").and_return(false)
184
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.erb").and_return(false)
185
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.html.erb").and_return(false)
186
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.plain.haml").and_return(false)
187
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.html.haml").and_return(false)
188
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.haml").and_return(true)
189
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.html.haml").and_return(true)
190
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.plain.rhtml").and_return(false)
191
- File.stub!(:exist?).with("./app/views/project_mailer/send_email.text.html.rhtml").and_return(false)
192
- runner.review('app/mailers/project_mailer.rb', content)
193
- runner.should have(0).errors
194
174
  end
195
175
  end
196
176
  end
@@ -52,6 +52,20 @@ describe RailsBestPractices::Reviews::UseSayWithTimeInMigrationsReview do
52
52
  runner.should have(0).errors
53
53
  end
54
54
 
55
+ it "should not use say with time in migrations when not first code line" do
56
+ content =<<-EOF
57
+ def self.up
58
+ User.find_each do |user|
59
+ say_with_time 'Updating user with latest data' do
60
+ user.do_time_consuming_stuff
61
+ end
62
+ end
63
+ end
64
+ EOF
65
+ runner.review('db/migrate/20101010080658_update_users.rb', content)
66
+ runner.should have(0).errors
67
+ end
68
+
55
69
  it "should not use say with time when default migration message" do
56
70
  content =<<-EOF
57
71
  def self.up
@@ -33,6 +33,7 @@ describe RailsBestPractices do
33
33
  check1.add_error "law of demeter", "app/models/user.rb", 10
34
34
  check2.add_error "use query attribute", "app/models/post.rb", 100
35
35
  RailsBestPractices.runner = runner
36
+ RailsBestPractices.instance_variable_set("@options", {"without-color" => false})
36
37
 
37
38
  $origin_stdout = $stdout
38
39
  $stdout = StringIO.new
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_best_practices
3
3
  version: !ruby/object:Gem::Version
4
- hash: 1
4
+ hash: 7
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 7
9
- - 1
10
- version: 0.7.1
9
+ - 2
10
+ version: 0.7.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Richard Huang
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-02-24 00:00:00 +08:00
18
+ date: 2011-03-17 00:00:00 +08:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -216,10 +216,12 @@ files:
216
216
  - lib/rails_best_practices/core/check.rb
217
217
  - lib/rails_best_practices/core/checking_visitor.rb
218
218
  - lib/rails_best_practices/core/error.rb
219
+ - lib/rails_best_practices/core/model_associations.rb
220
+ - lib/rails_best_practices/core/models.rb
221
+ - lib/rails_best_practices/core/nil.rb
219
222
  - lib/rails_best_practices/core/runner.rb
220
223
  - lib/rails_best_practices/core/visitable_sexp.rb
221
224
  - lib/rails_best_practices/core_ext/enumerable.rb
222
- - lib/rails_best_practices/core_ext/nil_class.rb
223
225
  - lib/rails_best_practices/lexicals.rb
224
226
  - lib/rails_best_practices/lexicals/remove_trailing_whitespace_check.rb
225
227
  - lib/rails_best_practices/prepares.rb
@@ -257,9 +259,11 @@ files:
257
259
  - spec/rails_best_practices/core/check_spec.rb
258
260
  - spec/rails_best_practices/core/checking_visitor_spec.rb
259
261
  - spec/rails_best_practices/core/error_spec.rb
262
+ - spec/rails_best_practices/core/model_associations_spec.rb
263
+ - spec/rails_best_practices/core/models_spec.rb
264
+ - spec/rails_best_practices/core/nil_spec.rb
260
265
  - spec/rails_best_practices/core/visitable_sexp_spec.rb
261
266
  - spec/rails_best_practices/core_ext/enumerable_spec.rb
262
- - spec/rails_best_practices/core_ext/nil_class_spec.rb
263
267
  - spec/rails_best_practices/lexicals/remove_trailing_whitespace_check_spec.rb
264
268
  - spec/rails_best_practices/prepares/mailer_prepare_spec.rb
265
269
  - spec/rails_best_practices/prepares/model_prepare_spec.rb
@@ -343,9 +347,11 @@ test_files:
343
347
  - spec/rails_best_practices/core/check_spec.rb
344
348
  - spec/rails_best_practices/core/checking_visitor_spec.rb
345
349
  - spec/rails_best_practices/core/error_spec.rb
350
+ - spec/rails_best_practices/core/model_associations_spec.rb
351
+ - spec/rails_best_practices/core/models_spec.rb
352
+ - spec/rails_best_practices/core/nil_spec.rb
346
353
  - spec/rails_best_practices/core/visitable_sexp_spec.rb
347
354
  - spec/rails_best_practices/core_ext/enumerable_spec.rb
348
- - spec/rails_best_practices/core_ext/nil_class_spec.rb
349
355
  - spec/rails_best_practices/lexicals/remove_trailing_whitespace_check_spec.rb
350
356
  - spec/rails_best_practices/prepares/mailer_prepare_spec.rb
351
357
  - spec/rails_best_practices/prepares/model_prepare_spec.rb
@@ -1,8 +0,0 @@
1
- # encoding: utf-8
2
- class NilClass
3
- # do not raise error when calling messages on nil object.
4
- def method_missing(method_sym, *arguments, &block)
5
- return nil
6
- end
7
- end
8
-
@@ -1,11 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe NilClass do
4
- it "should return nil when calling undefined methods on nil" do
5
- nil.undefined.should == nil
6
- end
7
-
8
- it "should do not return nil when calling exist methods" do
9
- nil.nil?.should be_true
10
- end
11
- end