rails_best_practices 0.7.3 → 0.7.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -12,7 +12,8 @@ module RailsBestPractices
12
12
  MAILER_FILES = /models\/.*mailer\.rb$|mailers\/.*mailer\.rb/
13
13
  VIEW_FILES = /views\/.*\.(erb|haml)$/
14
14
  PARTIAL_VIEW_FILES = /views\/.*\/_.*\.(erb|haml)$/
15
- ROUTE_FILE = /config\/routes.rb/
15
+ ROUTE_FILE = /config\/routes\.rb/
16
+ SCHEMA_FILE = /db\/schema\.rb/
16
17
 
17
18
  attr_reader :errors
18
19
 
@@ -22,4 +22,4 @@ module RailsBestPractices
22
22
  end
23
23
  end
24
24
  end
25
- end
25
+ end
@@ -0,0 +1,25 @@
1
+ # encoding: utf-8
2
+ module RailsBestPractices
3
+ module Core
4
+ class ModelAttributes
5
+ def initialize
6
+ @attributes = {}
7
+ end
8
+
9
+ def add_attribute(model_name, attribute_name, attribute_type)
10
+ @attributes[model_name] ||= {}
11
+ @attributes[model_name][attribute_name] = attribute_type
12
+ end
13
+
14
+ def get_attribute_type(model_name, attribute_name)
15
+ @attributes[model_name] ||= {}
16
+ @attributes[model_name][attribute_name]
17
+ end
18
+
19
+ def is_attribute?(model_name, attribute_name)
20
+ @attributes[model_name] ||= {}
21
+ !!@attributes[model_name][attribute_name]
22
+ end
23
+ end
24
+ end
25
+ end
@@ -148,7 +148,7 @@ module RailsBestPractices
148
148
 
149
149
  # load all prepares.
150
150
  def load_prepares
151
- [RailsBestPractices::Prepares::ModelPrepare.new, RailsBestPractices::Prepares::MailerPrepare.new]
151
+ [Prepares::ModelPrepare.new, Prepares::MailerPrepare.new, Prepares::SchemaPrepare.new]
152
152
  end
153
153
 
154
154
  # load all reviews according to configuration.
@@ -7,5 +7,6 @@ require 'rails_best_practices/core/nil'
7
7
  require 'rails_best_practices/core/visitable_sexp'
8
8
  require 'rails_best_practices/core/models'
9
9
  require 'rails_best_practices/core/model_associations'
10
+ require 'rails_best_practices/core/model_attributes'
10
11
 
11
12
  require 'rails_best_practices/core_ext/enumerable'
@@ -25,7 +25,7 @@ module RailsBestPractices
25
25
  @models << @last_klazz
26
26
  end
27
27
 
28
- # assign @model_associations to Prepare.model_associations.
28
+ # assign @model_associations to Prepares.model_associations.
29
29
  def end_class(class_node)
30
30
  Prepares.models = @models
31
31
  Prepares.model_associations = @model_associations
@@ -0,0 +1,44 @@
1
+ # encoding: utf-8
2
+ require 'rails_best_practices/core/check'
3
+
4
+ module RailsBestPractices
5
+ module Prepares
6
+ # Remember the model attributes.
7
+ class SchemaPrepare < Core::Check
8
+ # all attribute types
9
+ ATTRIBUTE_TYPES = [:integer, :float, :boolean, :string, :text, :date, :time, :datetime, :binary]
10
+
11
+ def interesting_nodes
12
+ [:call]
13
+ end
14
+
15
+ def interesting_files
16
+ SCHEMA_FILE
17
+ end
18
+
19
+ def initialize
20
+ @model_attributes = Core::ModelAttributes.new
21
+ end
22
+
23
+ # check call node to remember the model attributes.
24
+ def start_call(call_node)
25
+ case call_node.message
26
+ when :create_table
27
+ @last_klazz = call_node.arguments[1].to_s.classify
28
+ when *ATTRIBUTE_TYPES
29
+ attribute_name = call_node.arguments[1].to_s
30
+ @model_attributes.add_attribute(@last_klazz, attribute_name, call_node.message)
31
+ else
32
+ # nothing to do
33
+ end
34
+ end
35
+
36
+ # assign @model_attributes to Prepares.model_attributes.
37
+ def end_call(call_node)
38
+ if :create_table == call_node.message
39
+ Prepares.model_attributes = @model_attributes
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -1,11 +1,12 @@
1
1
  # encoding: utf-8
2
2
  require 'rails_best_practices/prepares/model_prepare'
3
3
  require 'rails_best_practices/prepares/mailer_prepare'
4
+ require 'rails_best_practices/prepares/schema_prepare'
4
5
 
5
6
  module RailsBestPractices
6
7
  module Prepares
7
8
  class <<self
8
- attr_accessor :models, :model_associations, :mailer_names
9
+ attr_accessor :models, :model_associations, :model_attributes, :mailer_names
9
10
  end
10
11
  end
11
12
  end
@@ -33,7 +33,7 @@ module RailsBestPractices
33
33
  end
34
34
 
35
35
  def interesting_files
36
- /db\/schema.rb/
36
+ SCHEMA_FILE
37
37
  end
38
38
 
39
39
  def initialize
@@ -63,14 +63,30 @@ 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 = model_associations.get_association(class_name, node.subject.message.to_s)
67
- association && association_methods.include?(association[:meta])
66
+ association_name = node.subject.message.to_s
67
+ association = model_associations.get_association(class_name, association_name)
68
+ attribute_name = node.message.to_s
69
+ association && association_methods.include?(association[:meta]) &&
70
+ is_association_attribute?(association[:class_name], association_name, attribute_name)
68
71
  end
69
72
 
70
73
  # only check belongs_to and has_one association.
71
74
  def association_methods
72
75
  [:belongs_to, :has_one]
73
76
  end
77
+
78
+ def is_association_attribute?(association_class, association_name, attribute_name)
79
+ if association_name =~ /able$/
80
+ models.each do |class_name|
81
+ if model_associations.is_association?(class_name, association_name.sub(/able$/, '')) ||
82
+ model_associations.is_association?(class_name, association_name.sub(/able$/, 's'))
83
+ return true if model_attributes.is_attribute?(class_name, attribute_name)
84
+ end
85
+ end
86
+ else
87
+ model_attributes.is_attribute?(association_class, attribute_name)
88
+ end
89
+ end
74
90
  end
75
91
  end
76
92
  end
@@ -47,32 +47,32 @@ module RailsBestPractices
47
47
 
48
48
  private
49
49
  # check if the arguments of options_for_select are complex.
50
- #
51
- # if the first argument is an array,
52
- # and the size of array is greater than @array_count you defined,
53
- # then it is complext, e.g.
54
- #
55
- # s(:call, nil, :options_for_select,
56
- # s(:arglist,
57
- # s(:array,
58
- # s(:array,
59
- # s(:call, nil, :t, s(:arglist, s(:lit, :draft))),
60
- # s(:str, "draft")
61
- # ),
62
- # s(:array,
63
- # s(:call, nil, :t, s(:arglist, s(:lit, :published))),
64
- # s(:str, "published")
65
- # )
66
- # ),
67
- # s(:call,
68
- # s(:call, nil, :params, s(:arglist)),
69
- # :[],
70
- # s(:arglist, s(:lit, :default_state))
71
- # )
72
- # )
73
- # )
50
+ #
51
+ # if the first argument is an array,
52
+ # and the size of array is greater than @array_count you defined,
53
+ # then it is complext, e.g.
54
+ #
55
+ # s(:call, nil, :options_for_select,
56
+ # s(:arglist,
57
+ # s(:array,
58
+ # s(:array,
59
+ # s(:call, nil, :t, s(:arglist, s(:lit, :draft))),
60
+ # s(:str, "draft")
61
+ # ),
62
+ # s(:array,
63
+ # s(:call, nil, :t, s(:arglist, s(:lit, :published))),
64
+ # s(:str, "published")
65
+ # )
66
+ # ),
67
+ # s(:call,
68
+ # s(:call, nil, :params, s(:arglist)),
69
+ # :[],
70
+ # s(:arglist, s(:lit, :default_state))
71
+ # )
72
+ # )
73
+ # )
74
74
  def complex_select_options?(node)
75
- :options_for_select == node.message and :array == node.arguments[1].node_type and node.arguments[1].size > @array_count
75
+ :options_for_select == node.message && :array == node.arguments[1].node_type && node.arguments[1].size > @array_count
76
76
  end
77
77
  end
78
78
  end
@@ -74,6 +74,13 @@ module RailsBestPractices
74
74
  @model_associations ||= Prepares.model_associations
75
75
  end
76
76
 
77
+ # get the model attributes from Prepares.
78
+ #
79
+ # @return [Hash]
80
+ def model_attributes
81
+ @model_attributes ||= Prepares.model_attributes
82
+ end
83
+
77
84
  # compare two sexp nodes' to_s.
78
85
  #
79
86
  # equal?(":test", :test) => true
@@ -65,7 +65,7 @@ module RailsBestPractices
65
65
  # if the node contains two method calls, e.g. @user.login.nil?
66
66
  #
67
67
  # for the first call, the subject should be one of the class names and
68
- # the message should not be one of the association name and the message should not be pluralize.
68
+ # the message should be one of the attribute name.
69
69
  #
70
70
  # for the second call, the message should be one of nil?, blank? or present? or
71
71
  # it is compared with an empty string.
@@ -81,8 +81,8 @@ module RailsBestPractices
81
81
  return false unless subject
82
82
  message = node.subject.message
83
83
 
84
- [:arglist] == node.subject.arguments && is_model?(subject) && !model_association?(subject, message) &&
85
- !pluralize?(message.to_s) && (QUERY_METHODS.include?(node.message) || compare_with_empty_string?(node))
84
+ [:arglist] == node.subject.arguments && is_model?(subject) && model_attribute?(subject, message) &&
85
+ (QUERY_METHODS.include?(node.message) || compare_with_empty_string?(node))
86
86
  end
87
87
 
88
88
  # check if the subject is one of the models.
@@ -95,23 +95,18 @@ module RailsBestPractices
95
95
  models.include?(class_name)
96
96
  end
97
97
 
98
- # check if the subject and message is one of the model's aassociation.
99
- # the subject should match one of the class model name, and the message should match one of association name.
98
+ # check if the subject and message is one of the model's attribute.
99
+ # the subject should match one of the class model name, and the message should match one of attribute name.
100
100
  #
101
101
  # subject, subject of call node, like
102
102
  # s(:ivar, @user)
103
103
  #
104
104
  # message, message of call node, like
105
105
  # :login
106
- def model_association?(subject, message)
106
+ def model_attribute?(subject, message)
107
107
  class_name = subject.to_s(:remove_at => true).classify
108
- model_associations.is_association?(class_name, message.to_s)
109
- end
110
-
111
-
112
- # check if the str is a pluralize string.
113
- def pluralize?(str)
114
- str.pluralize == str
108
+ attribute_type = model_attributes.get_attribute_type(class_name, message.to_s)
109
+ attribute_type && ![:integer, :float].include?(attribute_type)
115
110
  end
116
111
 
117
112
  # check if the node is with node type :call, node message :== and node arguments {:arglist, (:str, "")}
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
  module RailsBestPractices
3
- VERSION = "0.7.3"
3
+ VERSION = "0.7.4"
4
4
  end
5
5
 
@@ -113,8 +113,8 @@ module RailsBestPractices
113
113
  # @return [Array] all files for prepare process
114
114
  def prepare_files
115
115
  @prepare_files ||= begin
116
- ['models', 'mailers'].inject([]) { |files, name|
117
- files += expand_dirs_to_files(File.join(@path, 'app', name))
116
+ ['app/models', 'app/mailers', 'db/schema.rb'].inject([]) { |files, name|
117
+ files += expand_dirs_to_files(File.join(@path, name))
118
118
  }.compact
119
119
  end
120
120
  end
@@ -15,8 +15,8 @@ describe RailsBestPractices::Core::ModelAssociations do
15
15
  end
16
16
 
17
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
18
+ model_associations.is_association?("Project", "project_manager").should be_true
19
+ model_associations.is_association?("Project", "people").should be_true
20
+ model_associations.is_association?("Project", "unknown").should be_false
21
21
  end
22
- end
22
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe RailsBestPractices::Core::ModelAttributes do
4
+ let(:model_attributes) { RailsBestPractices::Core::ModelAttributes.new }
5
+
6
+ before :each do
7
+ model_attributes.add_attribute("Post", "title", :string)
8
+ model_attributes.add_attribute("Post", "user_id", :integer)
9
+ end
10
+
11
+ it "should get model attributes" do
12
+ model_attributes.get_attribute_type("Post", "title").should == :string
13
+ model_attributes.get_attribute_type("Post", "user_id").should == :integer
14
+ model_attributes.get_attribute_type("Post", "unknonw").should be_nil
15
+ end
16
+
17
+ it "should check is model attributes" do
18
+ model_attributes.is_attribute?("Post", "title").should be_true
19
+ model_attributes.is_attribute?("Post", "user_id").should be_true
20
+ model_attributes.is_attribute?("Post", "unknonw").should be_false
21
+ end
22
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ describe RailsBestPractices::Prepares::SchemaPrepare do
4
+ let(:runner) { RailsBestPractices::Core::Runner.new(:prepares => RailsBestPractices::Prepares::SchemaPrepare.new) }
5
+
6
+ it "should parse model attributes" do
7
+ content =<<-EOF
8
+ ActiveRecord::Schema.define(:version => 20110319172136) do
9
+ create_table "posts", :force => true do |t|
10
+ t.string "title"
11
+ t.text "body", :limit => 16777215
12
+ t.datetime "created_at"
13
+ t.integer "user_id"
14
+ t.integer "comments_count", :default => 0
15
+ t.boolean "published", :default => false, :null => false
16
+ end
17
+ end
18
+ EOF
19
+ runner.prepare("db/schema.rb", content)
20
+ model_attributes = RailsBestPractices::Prepares.model_attributes
21
+ model_attributes.get_attribute_type("Post", "title").should == :string
22
+ model_attributes.get_attribute_type("Post", "body").should == :text
23
+ model_attributes.get_attribute_type("Post", "created_at").should == :datetime
24
+ model_attributes.get_attribute_type("Post", "user_id").should == :integer
25
+ model_attributes.get_attribute_type("Post", "comments_count").should == :integer
26
+ model_attributes.get_attribute_type("Post", "published").should == :boolean
27
+ end
28
+ end
@@ -4,7 +4,7 @@ describe RailsBestPractices::Reviews::LawOfDemeterReview do
4
4
 
5
5
  let(:runner) {
6
6
  RailsBestPractices::Core::Runner.new(
7
- :prepares => RailsBestPractices::Prepares::ModelPrepare.new,
7
+ :prepares => [RailsBestPractices::Prepares::ModelPrepare.new, RailsBestPractices::Prepares::SchemaPrepare.new],
8
8
  :reviews => RailsBestPractices::Reviews::LawOfDemeterReview.new
9
9
  )
10
10
  }
@@ -17,6 +17,17 @@ describe RailsBestPractices::Reviews::LawOfDemeterReview do
17
17
  end
18
18
  EOF
19
19
  runner.prepare('app/models/invoice.rb', content)
20
+
21
+ content = <<-EOF
22
+ ActiveRecord::Schema.define(:version => 20110216150853) do
23
+ create_table "users", force => true do |t|
24
+ t.string :name
25
+ t.string :address
26
+ t.string :cellphone
27
+ end
28
+ end
29
+ EOF
30
+ runner.prepare('db/schema.rb', content)
20
31
  end
21
32
 
22
33
  it "should law of demeter" do
@@ -60,6 +71,16 @@ describe RailsBestPractices::Reviews::LawOfDemeterReview do
60
71
  end
61
72
  EOF
62
73
  runner.prepare('app/models/invoice.rb', content)
74
+
75
+ content = <<-EOF
76
+ ActiveRecord::Schema.define(:version => 20110216150853) do
77
+ create_table "prices", force => true do |t|
78
+ t.string :currency
79
+ t.integer :number
80
+ end
81
+ end
82
+ EOF
83
+ runner.prepare('db/schema.rb', content)
63
84
  end
64
85
 
65
86
  it "should law of demeter" do
@@ -73,6 +94,42 @@ describe RailsBestPractices::Reviews::LawOfDemeterReview do
73
94
  end
74
95
  end
75
96
 
97
+ context "polymorphic association" do
98
+ before :each do
99
+ content = <<-EOF
100
+ class Comment < ActiveRecord::Base
101
+ belongs_to :commentable, :polymorphic => true
102
+ end
103
+ EOF
104
+ runner.prepare('app/models/comment.rb', content)
105
+
106
+ content = <<-EOF
107
+ class Post < ActiveRecord::Base
108
+ has_many :comments
109
+ end
110
+ EOF
111
+ runner.prepare('app/models/comment.rb', content)
112
+
113
+ content = <<-EOF
114
+ ActiveRecord::Schema.define(:version => 20110216150853) do
115
+ create_table "posts", force => true do |t|
116
+ t.string :title
117
+ end
118
+ end
119
+ EOF
120
+ runner.prepare('db/schema.rb', content)
121
+ end
122
+
123
+ it "should law of demeter" do
124
+ content = <<-EOF
125
+ <%= @comment.commentable.title %>
126
+ EOF
127
+ runner.review('app/views/comments/index.html.erb', content)
128
+ runner.should have(1).errors
129
+ runner.errors[0].to_s.should == "app/views/comments/index.html.erb:1 - law of demeter"
130
+ end
131
+ end
132
+
76
133
  it "should no law of demeter with method call" do
77
134
  content = <<-EOF
78
135
  class Question < ActiveRecord::Base
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  describe RailsBestPractices::Reviews::UseQueryAttributeReview do
4
4
  let(:runner) {
5
5
  RailsBestPractices::Core::Runner.new(
6
- :prepares => RailsBestPractices::Prepares::ModelPrepare.new,
6
+ :prepares => [RailsBestPractices::Prepares::ModelPrepare.new, RailsBestPractices::Prepares::SchemaPrepare.new],
7
7
  :reviews => RailsBestPractices::Reviews::UseQueryAttributeReview.new
8
8
  )
9
9
  }
@@ -19,6 +19,16 @@ describe RailsBestPractices::Reviews::UseQueryAttributeReview do
19
19
  end
20
20
  EOF
21
21
  runner.prepare('app/models/user.rb', content)
22
+
23
+ content = <<-EOF
24
+ ActiveRecord::Schema.define(:version => 20110216150853) do
25
+ create_table "users", force => true do |t|
26
+ t.string :login
27
+ t.integer :age
28
+ end
29
+ end
30
+ EOF
31
+ runner.prepare('db/schema.rb', content)
22
32
  end
23
33
 
24
34
  it "should use query attribute by blank call" do
@@ -97,6 +107,16 @@ describe RailsBestPractices::Reviews::UseQueryAttributeReview do
97
107
  runner.should have(0).errors
98
108
  end
99
109
 
110
+ it "should not use query attribute for number" do
111
+ content =<<-EOF
112
+ <% unless @user.age.blank? %>
113
+ <%= @user.age %>
114
+ <% end %>
115
+ EOF
116
+ runner.review('app/views/users/show.html.erb', content)
117
+ runner.should have(0).errors
118
+ end
119
+
100
120
  it "should not review for pluralize attribute" do
101
121
  content = <<-EOF
102
122
  <% if @user.roles.blank? %>
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: 5
4
+ hash: 11
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 7
9
- - 3
10
- version: 0.7.3
9
+ - 4
10
+ version: 0.7.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Richard Huang
@@ -15,10 +15,12 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-03-23 00:00:00 +08:00
18
+ date: 2011-03-25 00:00:00 +08:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
+ prerelease: false
23
+ type: :runtime
22
24
  requirement: &id001 !ruby/object:Gem::Requirement
23
25
  none: false
24
26
  requirements:
@@ -30,11 +32,11 @@ dependencies:
30
32
  - 0
31
33
  - 4
32
34
  version: 2.0.4
33
- prerelease: false
34
35
  version_requirements: *id001
35
- type: :runtime
36
36
  name: ruby_parser
37
37
  - !ruby/object:Gem::Dependency
38
+ prerelease: false
39
+ type: :runtime
38
40
  requirement: &id002 !ruby/object:Gem::Requirement
39
41
  none: false
40
42
  requirements:
@@ -46,11 +48,11 @@ dependencies:
46
48
  - 0
47
49
  - 9
48
50
  version: 0.0.9
49
- prerelease: false
50
51
  version_requirements: *id002
51
- type: :runtime
52
52
  name: ruby-progressbar
53
53
  - !ruby/object:Gem::Dependency
54
+ prerelease: false
55
+ type: :runtime
54
56
  requirement: &id003 !ruby/object:Gem::Requirement
55
57
  none: false
56
58
  requirements:
@@ -61,11 +63,11 @@ dependencies:
61
63
  - 1
62
64
  - 2
63
65
  version: "1.2"
64
- prerelease: false
65
66
  version_requirements: *id003
66
- type: :runtime
67
67
  name: colored
68
68
  - !ruby/object:Gem::Dependency
69
+ prerelease: false
70
+ type: :runtime
69
71
  requirement: &id004 !ruby/object:Gem::Requirement
70
72
  none: false
71
73
  requirements:
@@ -77,11 +79,11 @@ dependencies:
77
79
  - 6
78
80
  - 6
79
81
  version: 2.6.6
80
- prerelease: false
81
82
  version_requirements: *id004
82
- type: :runtime
83
83
  name: erubis
84
84
  - !ruby/object:Gem::Dependency
85
+ prerelease: false
86
+ type: :runtime
85
87
  requirement: &id005 !ruby/object:Gem::Requirement
86
88
  none: false
87
89
  requirements:
@@ -93,11 +95,11 @@ dependencies:
93
95
  - 0
94
96
  - 18
95
97
  version: 3.0.18
96
- prerelease: false
97
98
  version_requirements: *id005
98
- type: :runtime
99
99
  name: haml
100
100
  - !ruby/object:Gem::Dependency
101
+ prerelease: false
102
+ type: :runtime
101
103
  requirement: &id006 !ruby/object:Gem::Requirement
102
104
  none: false
103
105
  requirements:
@@ -107,11 +109,11 @@ dependencies:
107
109
  segments:
108
110
  - 0
109
111
  version: "0"
110
- prerelease: false
111
112
  version_requirements: *id006
112
- type: :runtime
113
113
  name: i18n
114
114
  - !ruby/object:Gem::Dependency
115
+ prerelease: false
116
+ type: :runtime
115
117
  requirement: &id007 !ruby/object:Gem::Requirement
116
118
  none: false
117
119
  requirements:
@@ -121,11 +123,11 @@ dependencies:
121
123
  segments:
122
124
  - 0
123
125
  version: "0"
124
- prerelease: false
125
126
  version_requirements: *id007
126
- type: :runtime
127
127
  name: activesupport
128
128
  - !ruby/object:Gem::Dependency
129
+ prerelease: false
130
+ type: :development
129
131
  requirement: &id008 !ruby/object:Gem::Requirement
130
132
  none: false
131
133
  requirements:
@@ -135,11 +137,11 @@ dependencies:
135
137
  segments:
136
138
  - 0
137
139
  version: "0"
138
- prerelease: false
139
140
  version_requirements: *id008
140
- type: :development
141
141
  name: rake
142
142
  - !ruby/object:Gem::Dependency
143
+ prerelease: false
144
+ type: :development
143
145
  requirement: &id009 !ruby/object:Gem::Requirement
144
146
  none: false
145
147
  requirements:
@@ -151,11 +153,11 @@ dependencies:
151
153
  - 4
152
154
  - 0
153
155
  version: 2.4.0
154
- prerelease: false
155
156
  version_requirements: *id009
156
- type: :development
157
157
  name: rspec
158
158
  - !ruby/object:Gem::Dependency
159
+ prerelease: false
160
+ type: :development
159
161
  requirement: &id010 !ruby/object:Gem::Requirement
160
162
  none: false
161
163
  requirements:
@@ -166,11 +168,11 @@ dependencies:
166
168
  - 0
167
169
  - 6
168
170
  version: "0.6"
169
- prerelease: false
170
171
  version_requirements: *id010
171
- type: :development
172
172
  name: watchr
173
173
  - !ruby/object:Gem::Dependency
174
+ prerelease: false
175
+ type: :development
174
176
  requirement: &id011 !ruby/object:Gem::Requirement
175
177
  none: false
176
178
  requirements:
@@ -182,9 +184,7 @@ dependencies:
182
184
  - 0
183
185
  - 0
184
186
  version: 1.0.0
185
- prerelease: false
186
187
  version_requirements: *id011
187
- type: :development
188
188
  name: bundler
189
189
  description: a code metric tool for rails codes, written in Ruby.
190
190
  email:
@@ -217,6 +217,7 @@ files:
217
217
  - lib/rails_best_practices/core/checking_visitor.rb
218
218
  - lib/rails_best_practices/core/error.rb
219
219
  - lib/rails_best_practices/core/model_associations.rb
220
+ - lib/rails_best_practices/core/model_attributes.rb
220
221
  - lib/rails_best_practices/core/models.rb
221
222
  - lib/rails_best_practices/core/nil.rb
222
223
  - lib/rails_best_practices/core/runner.rb
@@ -227,6 +228,7 @@ files:
227
228
  - lib/rails_best_practices/prepares.rb
228
229
  - lib/rails_best_practices/prepares/mailer_prepare.rb
229
230
  - lib/rails_best_practices/prepares/model_prepare.rb
231
+ - lib/rails_best_practices/prepares/schema_prepare.rb
230
232
  - lib/rails_best_practices/reviews.rb
231
233
  - lib/rails_best_practices/reviews/add_model_virtual_attribute_review.rb
232
234
  - lib/rails_best_practices/reviews/always_add_db_index_review.rb
@@ -260,6 +262,7 @@ files:
260
262
  - spec/rails_best_practices/core/checking_visitor_spec.rb
261
263
  - spec/rails_best_practices/core/error_spec.rb
262
264
  - spec/rails_best_practices/core/model_associations_spec.rb
265
+ - spec/rails_best_practices/core/model_attributes_spec.rb
263
266
  - spec/rails_best_practices/core/models_spec.rb
264
267
  - spec/rails_best_practices/core/nil_spec.rb
265
268
  - spec/rails_best_practices/core/visitable_sexp_spec.rb
@@ -267,6 +270,7 @@ files:
267
270
  - spec/rails_best_practices/lexicals/remove_trailing_whitespace_check_spec.rb
268
271
  - spec/rails_best_practices/prepares/mailer_prepare_spec.rb
269
272
  - spec/rails_best_practices/prepares/model_prepare_spec.rb
273
+ - spec/rails_best_practices/prepares/schema_prepare_spec.rb
270
274
  - spec/rails_best_practices/reviews/add_model_virtual_attribute_review_spec.rb
271
275
  - spec/rails_best_practices/reviews/always_add_db_index_review_spec.rb
272
276
  - spec/rails_best_practices/reviews/dry_bundler_in_capistrano_review_spec.rb
@@ -339,7 +343,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
339
343
  requirements: []
340
344
 
341
345
  rubyforge_project:
342
- rubygems_version: 1.4.2
346
+ rubygems_version: 1.5.2
343
347
  signing_key:
344
348
  specification_version: 3
345
349
  summary: a code metric tool for rails codes.
@@ -348,6 +352,7 @@ test_files:
348
352
  - spec/rails_best_practices/core/checking_visitor_spec.rb
349
353
  - spec/rails_best_practices/core/error_spec.rb
350
354
  - spec/rails_best_practices/core/model_associations_spec.rb
355
+ - spec/rails_best_practices/core/model_attributes_spec.rb
351
356
  - spec/rails_best_practices/core/models_spec.rb
352
357
  - spec/rails_best_practices/core/nil_spec.rb
353
358
  - spec/rails_best_practices/core/visitable_sexp_spec.rb
@@ -355,6 +360,7 @@ test_files:
355
360
  - spec/rails_best_practices/lexicals/remove_trailing_whitespace_check_spec.rb
356
361
  - spec/rails_best_practices/prepares/mailer_prepare_spec.rb
357
362
  - spec/rails_best_practices/prepares/model_prepare_spec.rb
363
+ - spec/rails_best_practices/prepares/schema_prepare_spec.rb
358
364
  - spec/rails_best_practices/reviews/add_model_virtual_attribute_review_spec.rb
359
365
  - spec/rails_best_practices/reviews/always_add_db_index_review_spec.rb
360
366
  - spec/rails_best_practices/reviews/dry_bundler_in_capistrano_review_spec.rb