rails_best_practices 1.9.0 → 1.9.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 (81) hide show
  1. data/.travis.yml +4 -1
  2. data/Gemfile +0 -3
  3. data/Gemfile.lock +10 -9
  4. data/README.md +2 -0
  5. data/lib/rails_best_practices/analyzer.rb +40 -21
  6. data/lib/rails_best_practices/core.rb +1 -0
  7. data/lib/rails_best_practices/core/check.rb +12 -0
  8. data/lib/rails_best_practices/core/configs.rb +7 -0
  9. data/lib/rails_best_practices/core/error.rb +2 -1
  10. data/lib/rails_best_practices/core/routes.rb +11 -5
  11. data/lib/rails_best_practices/core/runner.rb +6 -2
  12. data/lib/rails_best_practices/core_ext/sexp.rb +3 -1
  13. data/lib/rails_best_practices/prepares.rb +5 -0
  14. data/lib/rails_best_practices/prepares/config_prepare.rb +21 -0
  15. data/lib/rails_best_practices/prepares/route_prepare.rb +24 -7
  16. data/lib/rails_best_practices/reviews/protect_mass_assignment_review.rb +11 -3
  17. data/lib/rails_best_practices/reviews/remove_unused_methods_in_models_review.rb +7 -3
  18. data/lib/rails_best_practices/version.rb +1 -1
  19. data/rails_best_practices.gemspec +1 -0
  20. data/spec/rails_best_practices/analyzer_spec.rb +52 -32
  21. data/spec/rails_best_practices/core/check_spec.rb +64 -45
  22. data/spec/rails_best_practices/core/checking_visitor_spec.rb +65 -64
  23. data/spec/rails_best_practices/core/configs_spec.rb +7 -0
  24. data/spec/rails_best_practices/core/controllers_spec.rb +4 -2
  25. data/spec/rails_best_practices/core/error_spec.rb +28 -22
  26. data/spec/rails_best_practices/core/helpers_spec.rb +4 -2
  27. data/spec/rails_best_practices/core/klasses_spec.rb +8 -6
  28. data/spec/rails_best_practices/core/mailers_spec.rb +4 -2
  29. data/spec/rails_best_practices/core/methods_spec.rb +37 -35
  30. data/spec/rails_best_practices/core/model_associations_spec.rb +17 -15
  31. data/spec/rails_best_practices/core/model_attributes_spec.rb +17 -15
  32. data/spec/rails_best_practices/core/models_spec.rb +4 -2
  33. data/spec/rails_best_practices/core/modules_spec.rb +21 -19
  34. data/spec/rails_best_practices/core/nil_spec.rb +23 -21
  35. data/spec/rails_best_practices/core/routes_spec.rb +21 -14
  36. data/spec/rails_best_practices/core/runner_spec.rb +17 -15
  37. data/spec/rails_best_practices/core_ext/sexp_spec.rb +32 -7
  38. data/spec/rails_best_practices/lexicals/remove_tab_check_spec.rb +35 -31
  39. data/spec/rails_best_practices/lexicals/remove_trailing_whitespace_check_spec.rb +35 -31
  40. data/spec/rails_best_practices/prepares/config_prepare_spec.rb +24 -0
  41. data/spec/rails_best_practices/prepares/controller_prepare_spec.rb +122 -123
  42. data/spec/rails_best_practices/prepares/helper_prepare_spec.rb +36 -32
  43. data/spec/rails_best_practices/prepares/mailer_prepare_spec.rb +12 -8
  44. data/spec/rails_best_practices/prepares/model_prepare_spec.rb +326 -322
  45. data/spec/rails_best_practices/prepares/route_prepare_spec.rb +619 -573
  46. data/spec/rails_best_practices/prepares/schema_prepare_spec.rb +25 -21
  47. data/spec/rails_best_practices/reviews/add_model_virtual_attribute_review_spec.rb +85 -87
  48. data/spec/rails_best_practices/reviews/always_add_db_index_review_spec.rb +224 -222
  49. data/spec/rails_best_practices/reviews/dry_bundler_in_capistrano_review_spec.rb +30 -26
  50. data/spec/rails_best_practices/reviews/isolate_seed_data_review_spec.rb +79 -75
  51. data/spec/rails_best_practices/reviews/keep_finders_on_their_own_model_review_spec.rb +76 -72
  52. data/spec/rails_best_practices/reviews/law_of_demeter_review_spec.rb +138 -140
  53. data/spec/rails_best_practices/reviews/move_code_into_controller_review_spec.rb +38 -34
  54. data/spec/rails_best_practices/reviews/move_code_into_helper_review_spec.rb +22 -18
  55. data/spec/rails_best_practices/reviews/move_code_into_model_review_spec.rb +57 -53
  56. data/spec/rails_best_practices/reviews/move_finder_to_named_scope_review_spec.rb +62 -63
  57. data/spec/rails_best_practices/reviews/move_model_logic_into_model_review_spec.rb +51 -50
  58. data/spec/rails_best_practices/reviews/needless_deep_nesting_review_spec.rb +140 -136
  59. data/spec/rails_best_practices/reviews/not_use_default_route_review_spec.rb +48 -44
  60. data/spec/rails_best_practices/reviews/not_use_times_ago_in_words_review_spec.rb +42 -38
  61. data/spec/rails_best_practices/reviews/overuse_route_customizations_review_spec.rb +151 -149
  62. data/spec/rails_best_practices/reviews/protect_mass_assignment_review_spec.rb +86 -55
  63. data/spec/rails_best_practices/reviews/remove_empty_helpers_review_spec.rb +23 -19
  64. data/spec/rails_best_practices/reviews/remove_unused_methods_in_controllers_review_spec.rb +290 -286
  65. data/spec/rails_best_practices/reviews/remove_unused_methods_in_helpers_review_spec.rb +76 -72
  66. data/spec/rails_best_practices/reviews/remove_unused_methods_in_models_review_spec.rb +601 -597
  67. data/spec/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review_spec.rb +55 -54
  68. data/spec/rails_best_practices/reviews/replace_instance_variable_with_local_variable_review_spec.rb +34 -30
  69. data/spec/rails_best_practices/reviews/restrict_auto_generated_routes_review_spec.rb +288 -289
  70. data/spec/rails_best_practices/reviews/simplify_render_in_controllers_review_spec.rb +59 -55
  71. data/spec/rails_best_practices/reviews/simplify_render_in_views_review_spec.rb +73 -69
  72. data/spec/rails_best_practices/reviews/use_before_filter_review_spec.rb +89 -98
  73. data/spec/rails_best_practices/reviews/use_model_association_review_spec.rb +52 -52
  74. data/spec/rails_best_practices/reviews/use_multipart_alternative_as_content_type_of_email_review_spec.rb +192 -190
  75. data/spec/rails_best_practices/reviews/use_observer_review_spec.rb +114 -121
  76. data/spec/rails_best_practices/reviews/use_query_attribute_review_spec.rb +189 -190
  77. data/spec/rails_best_practices/reviews/use_say_with_time_in_migrations_review_spec.rb +97 -93
  78. data/spec/rails_best_practices/reviews/use_scope_access_review_spec.rb +146 -151
  79. data/spec/spec_helper.rb +11 -20
  80. metadata +42 -26
  81. data/.watchr.example +0 -65
@@ -1,41 +1,45 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe RailsBestPractices::Prepares::HelperPrepare do
4
- let(:runner) { RailsBestPractices::Core::Runner.new(:prepares => RailsBestPractices::Prepares::HelperPrepare.new) }
3
+ module RailsBestPractices
4
+ module Prepares
5
+ describe HelperPrepare do
6
+ let(:runner) { Core::Runner.new(:prepares => HelperPrepare.new) }
5
7
 
6
- context "methods" do
7
- it "should parse helper methods" do
8
- content =<<-EOF
9
- module PostsHelper
10
- def used; end
11
- def unused; end
12
- end
13
- EOF
14
- runner.prepare('app/helpers/posts_helper.rb', content)
15
- methods = RailsBestPractices::Prepares.helper_methods
16
- methods.get_methods("PostsHelper").map(&:method_name).should == ["used", "unused"]
17
- end
8
+ context "methods" do
9
+ it "should parse helper methods" do
10
+ content =<<-EOF
11
+ module PostsHelper
12
+ def used; end
13
+ def unused; end
14
+ end
15
+ EOF
16
+ runner.prepare('app/helpers/posts_helper.rb', content)
17
+ methods = Prepares.helper_methods
18
+ methods.get_methods("PostsHelper").map(&:method_name).should == ["used", "unused"]
19
+ end
18
20
 
19
- it "should parse helpers" do
20
- content =<<-EOF
21
- module PostsHelper
22
- end
23
- EOF
24
- runner.prepare('app/helpers/posts_helper.rb', content)
25
- content =<<-EOF
26
- module Admin::UsersHelper
27
- end
28
- EOF
29
- runner.prepare('app/helpers/users_helper.rb', content)
30
- content =<<-EOF
31
- module Admin
32
- module BaseHelper
21
+ it "should parse helpers" do
22
+ content =<<-EOF
23
+ module PostsHelper
24
+ end
25
+ EOF
26
+ runner.prepare('app/helpers/posts_helper.rb', content)
27
+ content =<<-EOF
28
+ module Admin::UsersHelper
29
+ end
30
+ EOF
31
+ runner.prepare('app/helpers/users_helper.rb', content)
32
+ content =<<-EOF
33
+ module Admin
34
+ module BaseHelper
35
+ end
36
+ end
37
+ EOF
38
+ runner.prepare("app/helpers/base_helper.rb", content)
39
+ helpers = Prepares.helpers
40
+ helpers.map(&:to_s).should == ["PostsHelper", "Admin::UsersHelper", "Admin", "Admin::BaseHelper"]
33
41
  end
34
42
  end
35
- EOF
36
- runner.prepare("app/helpers/base_helper.rb", content)
37
- helpers = RailsBestPractices::Prepares.helpers
38
- helpers.map(&:to_s).should == ["PostsHelper", "Admin::UsersHelper", "Admin", "Admin::BaseHelper"]
39
43
  end
40
44
  end
41
45
  end
@@ -1,14 +1,18 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe RailsBestPractices::Prepares::MailerPrepare do
4
- let(:runner) { RailsBestPractices::Core::Runner.new(:prepares => RailsBestPractices::Prepares::MailerPrepare.new) }
3
+ module RailsBestPractices
4
+ module Prepares
5
+ describe MailerPrepare do
6
+ let(:runner) { Core::Runner.new(:prepares => MailerPrepare.new) }
5
7
 
6
- it "should parse mailer names" do
7
- content =<<-EOF
8
- class ProjectMailer < ActionMailer::Base
8
+ it "should parse mailer names" do
9
+ content =<<-EOF
10
+ class ProjectMailer < ActionMailer::Base
11
+ end
12
+ EOF
13
+ runner.prepare('app/mailers/project_mailer.rb', content)
14
+ Prepares.mailers.map(&:to_s).should == ["ProjectMailer"]
15
+ end
9
16
  end
10
- EOF
11
- runner.prepare('app/mailers/project_mailer.rb', content)
12
- RailsBestPractices::Prepares.mailers.map(&:to_s).should == ["ProjectMailer"]
13
17
  end
14
18
  end
@@ -1,378 +1,382 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe RailsBestPractices::Prepares::ModelPrepare do
4
- let(:runner) { RailsBestPractices::Core::Runner.new(:prepares => RailsBestPractices::Prepares::ModelPrepare.new) }
3
+ module RailsBestPractices
4
+ module Prepares
5
+ describe ModelPrepare do
6
+ let(:runner) { Core::Runner.new(:prepares => ModelPrepare.new) }
5
7
 
6
- before :each do
7
- runner.whiny = true
8
- end
9
-
10
- context "models" do
11
- it "class_name with modules ::" do
12
- content =<<-EOF
13
- class Blog::Post < ActiveRecord::Base
8
+ before :each do
9
+ runner.whiny = true
14
10
  end
15
- EOF
16
- runner.prepare("app/models/admin/post.rb", content)
17
- models = RailsBestPractices::Prepares.models
18
- models.map(&:to_s).should == ["Blog::Post"]
19
- end
20
11
 
21
- it "class_name with modules" do
22
- content =<<-EOF
23
- module Blog
24
- class Post < ActiveRecord::Base
12
+ context "models" do
13
+ it "class_name with modules ::" do
14
+ content =<<-EOF
15
+ class Blog::Post < ActiveRecord::Base
16
+ end
17
+ EOF
18
+ runner.prepare("app/models/admin/post.rb", content)
19
+ models = Prepares.models
20
+ models.map(&:to_s).should == ["Blog::Post"]
25
21
  end
26
- end
27
- EOF
28
- runner.prepare("app/models/admin/post.rb", content)
29
- models = RailsBestPractices::Prepares.models
30
- models.map(&:to_s).should == ["Blog::Post"]
31
- end
32
- end
33
22
 
34
- context "associations" do
35
- it "should parse model associations" do
36
- content =<<-EOF
37
- class Project < ActiveRecord::Base
38
- belongs_to :portfolio
39
- has_one :project_manager
40
- has_many :milestones
41
- has_and_belongs_to_many :categories
23
+ it "class_name with modules" do
24
+ content =<<-EOF
25
+ module Blog
26
+ class Post < ActiveRecord::Base
27
+ end
28
+ end
29
+ EOF
30
+ runner.prepare("app/models/admin/post.rb", content)
31
+ models = Prepares.models
32
+ models.map(&:to_s).should == ["Blog::Post"]
33
+ end
42
34
  end
43
- EOF
44
- runner.prepare('app/models/project.rb', content)
45
- model_associations = RailsBestPractices::Prepares.model_associations
46
- model_associations.get_association("Project", "portfolio").should == {"meta" => "belongs_to", "class_name" => "Portfolio"}
47
- model_associations.get_association("Project", "project_manager").should == {"meta" => "has_one", "class_name" => "ProjectManager"}
48
- model_associations.get_association("Project", "milestones").should == {"meta" => "has_many", "class_name" => "Milestone"}
49
- model_associations.get_association("Project", "categories").should == {"meta" => "has_and_belongs_to_many", "class_name" => "Category"}
50
- end
51
35
 
52
- context "with class_name option" do
53
- it "should parse belongs_to" do
54
- content =<<-EOF
55
- class Post < ActiveRecord::Base
56
- belongs_to :author, "class_name" => "Person"
36
+ context "associations" do
37
+ it "should parse model associations" do
38
+ content =<<-EOF
39
+ class Project < ActiveRecord::Base
40
+ belongs_to :portfolio
41
+ has_one :project_manager
42
+ has_many :milestones
43
+ has_and_belongs_to_many :categories
44
+ end
45
+ EOF
46
+ runner.prepare('app/models/project.rb', content)
47
+ model_associations = Prepares.model_associations
48
+ model_associations.get_association("Project", "portfolio").should == {"meta" => "belongs_to", "class_name" => "Portfolio"}
49
+ model_associations.get_association("Project", "project_manager").should == {"meta" => "has_one", "class_name" => "ProjectManager"}
50
+ model_associations.get_association("Project", "milestones").should == {"meta" => "has_many", "class_name" => "Milestone"}
51
+ model_associations.get_association("Project", "categories").should == {"meta" => "has_and_belongs_to_many", "class_name" => "Category"}
57
52
  end
58
- EOF
59
- runner.prepare("app/models/post.rb", content)
60
- model_associations = RailsBestPractices::Prepares.model_associations
61
- model_associations.get_association("Post", "author").should == {"meta" => "belongs_to", "class_name" => "Person"}
62
- end
63
53
 
64
- it "should parse has_one" do
65
- content =<<-EOF
66
- class Project < ActiveRecord::Base
67
- has_one :project_manager, "class_name" => "Person"
54
+ context "with class_name option" do
55
+ it "should parse belongs_to" do
56
+ content =<<-EOF
57
+ class Post < ActiveRecord::Base
58
+ belongs_to :author, "class_name" => "Person"
59
+ end
60
+ EOF
61
+ runner.prepare("app/models/post.rb", content)
62
+ model_associations = Prepares.model_associations
63
+ model_associations.get_association("Post", "author").should == {"meta" => "belongs_to", "class_name" => "Person"}
64
+ end
65
+
66
+ it "should parse has_one" do
67
+ content =<<-EOF
68
+ class Project < ActiveRecord::Base
69
+ has_one :project_manager, "class_name" => "Person"
70
+ end
71
+ EOF
72
+ runner.prepare("app/models/post.rb", content)
73
+ model_associations = Prepares.model_associations
74
+ model_associations.get_association("Project", "project_manager").should == {"meta" => "has_one", "class_name" => "Person"}
75
+ end
76
+
77
+ it "should parse has_many" do
78
+ content =<<-EOF
79
+ class Project < ActiveRecord::Base
80
+ has_many :people, "class_name" => "Person"
81
+ end
82
+ EOF
83
+ runner.prepare("app/models/project.rb", content)
84
+ model_associations = Prepares.model_associations
85
+ model_associations.get_association("Project", "people").should == {"meta" => "has_many", "class_name" => "Person"}
86
+ end
87
+
88
+ it "should parse has_and_belongs_to_many" do
89
+ content =<<-EOF
90
+ class Citizen < ActiveRecord::Base
91
+ has_and_belongs_to_many :nations, "class_name" => "Country"
92
+ end
93
+ EOF
94
+ runner.prepare("app/models/citizen.rb", content)
95
+ model_associations = Prepares.model_associations
96
+ model_associations.get_association("Citizen", "nations").should == {"meta" => "has_and_belongs_to_many", "class_name" => "Country"}
97
+ end
98
+
99
+ context "namespace" do
100
+ it "should parse with namespace" do
101
+ content =<<-EOF
102
+ class Community < ActiveRecord::Base
103
+ has_many :members
104
+ end
105
+ EOF
106
+ runner.prepare("app/models/community.rb", content)
107
+ content =<<-EOF
108
+ class Community::Member < ActiveRecord::Base
109
+ belongs_to :community
110
+ end
111
+ EOF
112
+ runner.prepare("app/models/community/member.rb", content)
113
+ runner.after_prepare
114
+ model_associations = Prepares.model_associations
115
+ model_associations.get_association("Community", "members").should == {"meta" => "has_many", "class_name" => "Community::Member"}
116
+ model_associations.get_association("Community::Member", "community").should == {"meta" => "belongs_to", "class_name" => "Community"}
117
+ end
118
+
119
+ it "should parse without namespace" do
120
+ content =<<-EOF
121
+ class Community::Member::Rating < ActiveRecord::Base
122
+ belongs_to :member
123
+ end
124
+ EOF
125
+ runner.prepare("app/models/community/member/rating.rb", content)
126
+ content =<<-EOF
127
+ class Community::Member < ActiveRecord::Base
128
+ has_many :ratings
129
+ end
130
+ EOF
131
+ runner.prepare("app/models/community/member.rb", content)
132
+ runner.after_prepare
133
+ model_associations = Prepares.model_associations
134
+ model_associations.get_association("Community::Member::Rating", "member").should == {"meta" => "belongs_to", "class_name" => "Community::Member"}
135
+ model_associations.get_association("Community::Member", "ratings").should == {"meta" => "has_many", "class_name" => "Community::Member::Rating"}
136
+ end
137
+ end
68
138
  end
69
- EOF
70
- runner.prepare("app/models/post.rb", content)
71
- model_associations = RailsBestPractices::Prepares.model_associations
72
- model_associations.get_association("Project", "project_manager").should == {"meta" => "has_one", "class_name" => "Person"}
73
- end
74
139
 
75
- it "should parse has_many" do
76
- content =<<-EOF
77
- class Project < ActiveRecord::Base
78
- has_many :people, "class_name" => "Person"
140
+ context "mongoid embeds" do
141
+ it "should parse embeds_many" do
142
+ content =<<-EOF
143
+ class Person
144
+ include Mongoid::Document
145
+ embeds_many :addresses
146
+ end
147
+ EOF
148
+ runner.prepare("app/models/person.rb", content)
149
+ model_associations = Prepares.model_associations
150
+ model_associations.get_association("Person", "addresses").should == {"meta" => "embeds_many", "class_name" => "Address"}
151
+ end
152
+
153
+ it "should parse embeds_one" do
154
+ content =<<-EOF
155
+ class Lush
156
+ include Mongoid::Document
157
+ embeds_one :whiskey, class_name: "Drink", inverse_of: :alcoholic
158
+ end
159
+ EOF
160
+ runner.prepare("app/models/lush.rb", content)
161
+ model_associations = Prepares.model_associations
162
+ model_associations.get_association("Lush", "whiskey").should == {"meta" => "embeds_one", "class_name" => "Drink"}
163
+ end
164
+
165
+ it "should parse embedded_in" do
166
+ content =<<-EOF
167
+ class Drink
168
+ include Mongoid::Document
169
+ embedded_in :alcoholic, class_name: "Lush", inverse_of: :whiskey
170
+ end
171
+ EOF
172
+ runner.prepare("app/models/drink.rb", content)
173
+ model_associations = Prepares.model_associations
174
+ model_associations.get_association("Drink", "alcoholic").should == {"meta" => "embedded_in", "class_name" => "Lush"}
175
+ end
79
176
  end
80
- EOF
81
- runner.prepare("app/models/project.rb", content)
82
- model_associations = RailsBestPractices::Prepares.model_associations
83
- model_associations.get_association("Project", "people").should == {"meta" => "has_many", "class_name" => "Person"}
84
- end
85
177
 
86
- it "should parse has_and_belongs_to_many" do
87
- content =<<-EOF
88
- class Citizen < ActiveRecord::Base
89
- has_and_belongs_to_many :nations, "class_name" => "Country"
178
+ context "mongomapper many/one" do
179
+ it "should parse one" do
180
+ content =<<-EOF
181
+ class Employee
182
+ include MongoMapper::Document
183
+ one :desk
184
+ end
185
+ EOF
186
+ runner.prepare("app/models/employee.rb", content)
187
+ model_associations = Prepares.model_associations
188
+ model_associations.get_association("Employee", "desk").should == {"meta" => "one", "class_name" => "Desk"}
189
+ end
190
+
191
+ it "should parse many" do
192
+ content =<<-EOF
193
+ class Tree
194
+ include MongoMapper::Document
195
+ many :birds
196
+ end
197
+ EOF
198
+ runner.prepare("app/models/tree.rb", content)
199
+ model_associations = Prepares.model_associations
200
+ model_associations.get_association("Tree", "birds").should == {"meta" => "many", "class_name" => "Bird"}
201
+ end
90
202
  end
91
- EOF
92
- runner.prepare("app/models/citizen.rb", content)
93
- model_associations = RailsBestPractices::Prepares.model_associations
94
- model_associations.get_association("Citizen", "nations").should == {"meta" => "has_and_belongs_to_many", "class_name" => "Country"}
95
203
  end
96
204
 
97
- context "namespace" do
98
- it "should parse with namespace" do
205
+ context "methods" do
206
+ it "should parse model methods" do
99
207
  content =<<-EOF
100
- class Community < ActiveRecord::Base
101
- has_many :members
208
+ class Post < ActiveRecord::Base
209
+ def save; end
210
+ def find; end
102
211
  end
103
212
  EOF
104
- runner.prepare("app/models/community.rb", content)
213
+ runner.prepare("app/models/post.rb", content)
214
+ methods = Prepares.model_methods
215
+ methods.get_methods("Post").map(&:method_name).should == ["save", "find"]
216
+ end
217
+
218
+ it "should parse model methods with access control" do
105
219
  content =<<-EOF
106
- class Community::Member < ActiveRecord::Base
107
- belongs_to :community
220
+ class Post < ActiveRecord::Base
221
+ def save; end
222
+ def find; end
223
+ protected
224
+ def create_or_update; end
225
+ private
226
+ def find_by_sql; end
108
227
  end
109
228
  EOF
110
- runner.prepare("app/models/community/member.rb", content)
111
- runner.after_prepare
112
- model_associations = RailsBestPractices::Prepares.model_associations
113
- model_associations.get_association("Community", "members").should == {"meta" => "has_many", "class_name" => "Community::Member"}
114
- model_associations.get_association("Community::Member", "community").should == {"meta" => "belongs_to", "class_name" => "Community"}
229
+ runner.prepare("app/models/post.rb", content)
230
+ methods = Prepares.model_methods
231
+ methods.get_methods("Post").map(&:method_name).should == ["save", "find", "create_or_update", "find_by_sql"]
232
+ methods.get_methods("Post", "public").map(&:method_name).should == ["save", "find"]
233
+ methods.get_methods("Post", "protected").map(&:method_name).should == ["create_or_update"]
234
+ methods.get_methods("Post", "private").map(&:method_name).should == ["find_by_sql"]
115
235
  end
116
236
 
117
- it "should parse without namespace" do
237
+ it "should parse model methods with module ::" do
118
238
  content =<<-EOF
119
- class Community::Member::Rating < ActiveRecord::Base
120
- belongs_to :member
239
+ class Admin::Blog::Post < ActiveRecord::Base
240
+ def save; end
241
+ def find; end
121
242
  end
122
243
  EOF
123
- runner.prepare("app/models/community/member/rating.rb", content)
244
+ runner.prepare("app/models/admin/blog/post.rb", content)
245
+ methods = Prepares.model_methods
246
+ methods.get_methods("Admin::Blog::Post").map(&:method_name).should == ["save", "find"]
247
+ end
248
+
249
+ it "should parse model methods with module" do
124
250
  content =<<-EOF
125
- class Community::Member < ActiveRecord::Base
126
- has_many :ratings
251
+ module Admin
252
+ module Blog
253
+ class Post < ActiveRecord::Base
254
+ def save; end
255
+ def find; end
256
+ end
257
+ end
127
258
  end
128
259
  EOF
129
- runner.prepare("app/models/community/member.rb", content)
130
- runner.after_prepare
131
- model_associations = RailsBestPractices::Prepares.model_associations
132
- model_associations.get_association("Community::Member::Rating", "member").should == {"meta" => "belongs_to", "class_name" => "Community::Member"}
133
- model_associations.get_association("Community::Member", "ratings").should == {"meta" => "has_many", "class_name" => "Community::Member::Rating"}
134
- end
135
- end
136
- end
137
-
138
- context "mongoid embeds" do
139
- it "should parse embeds_many" do
140
- content =<<-EOF
141
- class Person
142
- include Mongoid::Document
143
- embeds_many :addresses
260
+ runner.prepare("app/models/admin/blog/post.rb", content)
261
+ methods = Prepares.model_methods
262
+ methods.get_methods("Admin::Blog::Post").map(&:method_name).should == ["save", "find"]
144
263
  end
145
- EOF
146
- runner.prepare("app/models/person.rb", content)
147
- model_associations = RailsBestPractices::Prepares.model_associations
148
- model_associations.get_association("Person", "addresses").should == {"meta" => "embeds_many", "class_name" => "Address"}
149
264
  end
150
265
 
151
- it "should parse embeds_one" do
152
- content =<<-EOF
153
- class Lush
154
- include Mongoid::Document
155
- embeds_one :whiskey, class_name: "Drink", inverse_of: :alcoholic
266
+ context "scope" do
267
+ it "should treat named_scope as method" do
268
+ content =<<-EOF
269
+ class Post < ActiveRecord::Base
270
+ named_scope :active, :conditions => {:active => true}
271
+ end
272
+ EOF
273
+ runner.prepare("app/models/post.rb", content)
274
+ methods = Prepares.model_methods
275
+ methods.get_methods("Post").map(&:method_name).should == ["active"]
156
276
  end
157
- EOF
158
- runner.prepare("app/models/lush.rb", content)
159
- model_associations = RailsBestPractices::Prepares.model_associations
160
- model_associations.get_association("Lush", "whiskey").should == {"meta" => "embeds_one", "class_name" => "Drink"}
161
- end
162
277
 
163
- it "should parse embedded_in" do
164
- content =<<-EOF
165
- class Drink
166
- include Mongoid::Document
167
- embedded_in :alcoholic, class_name: "Lush", inverse_of: :whiskey
278
+ it "should treat scope as method" do
279
+ content =<<-EOF
280
+ class Post < ActiveRecord::Base
281
+ scope :active, where(:active => true)
282
+ end
283
+ EOF
284
+ runner.prepare("app/models/post.rb", content)
285
+ methods = Prepares.model_methods
286
+ methods.get_methods("Post").map(&:method_name).should == ["active"]
168
287
  end
169
- EOF
170
- runner.prepare("app/models/drink.rb", content)
171
- model_associations = RailsBestPractices::Prepares.model_associations
172
- model_associations.get_association("Drink", "alcoholic").should == {"meta" => "embedded_in", "class_name" => "Lush"}
173
288
  end
174
- end
175
289
 
176
- context "mongomapper many/one" do
177
- it "should parse one" do
178
- content =<<-EOF
179
- class Employee
180
- include MongoMapper::Document
181
- one :desk
290
+ context "alias" do
291
+ it "should treat alias as method" do
292
+ content =<<-EOF
293
+ class Post < ActiveRecord::Base
294
+ alias :new :old
295
+ end
296
+ EOF
297
+ runner.prepare("app/models/post.rb", content)
298
+ methods = Prepares.model_methods
299
+ methods.get_methods("Post").map(&:method_name).should == ["new"]
182
300
  end
183
- EOF
184
- runner.prepare("app/models/employee.rb", content)
185
- model_associations = RailsBestPractices::Prepares.model_associations
186
- model_associations.get_association("Employee", "desk").should == {"meta" => "one", "class_name" => "Desk"}
187
- end
188
301
 
189
- it "should parse many" do
190
- content =<<-EOF
191
- class Tree
192
- include MongoMapper::Document
193
- many :birds
302
+ it "should treat alias_method as method" do
303
+ content =<<-EOF
304
+ class Post < ActiveRecord::Base
305
+ alias_method :new, :old
306
+ end
307
+ EOF
308
+ runner.prepare("app/models/post.rb", content)
309
+ methods = Prepares.model_methods
310
+ methods.get_methods("Post").map(&:method_name).should == ["new"]
194
311
  end
195
- EOF
196
- runner.prepare("app/models/tree.rb", content)
197
- model_associations = RailsBestPractices::Prepares.model_associations
198
- model_associations.get_association("Tree", "birds").should == {"meta" => "many", "class_name" => "Bird"}
199
- end
200
- end
201
- end
202
312
 
203
- context "methods" do
204
- it "should parse model methods" do
205
- content =<<-EOF
206
- class Post < ActiveRecord::Base
207
- def save; end
208
- def find; end
209
- end
210
- EOF
211
- runner.prepare("app/models/post.rb", content)
212
- methods = RailsBestPractices::Prepares.model_methods
213
- methods.get_methods("Post").map(&:method_name).should == ["save", "find"]
214
- end
215
-
216
- it "should parse model methods with access control" do
217
- content =<<-EOF
218
- class Post < ActiveRecord::Base
219
- def save; end
220
- def find; end
221
- protected
222
- def create_or_update; end
223
- private
224
- def find_by_sql; end
225
- end
226
- EOF
227
- runner.prepare("app/models/post.rb", content)
228
- methods = RailsBestPractices::Prepares.model_methods
229
- methods.get_methods("Post").map(&:method_name).should == ["save", "find", "create_or_update", "find_by_sql"]
230
- methods.get_methods("Post", "public").map(&:method_name).should == ["save", "find"]
231
- methods.get_methods("Post", "protected").map(&:method_name).should == ["create_or_update"]
232
- methods.get_methods("Post", "private").map(&:method_name).should == ["find_by_sql"]
233
- end
234
-
235
- it "should parse model methods with module ::" do
236
- content =<<-EOF
237
- class Admin::Blog::Post < ActiveRecord::Base
238
- def save; end
239
- def find; end
240
- end
241
- EOF
242
- runner.prepare("app/models/admin/blog/post.rb", content)
243
- methods = RailsBestPractices::Prepares.model_methods
244
- methods.get_methods("Admin::Blog::Post").map(&:method_name).should == ["save", "find"]
245
- end
246
-
247
- it "should parse model methods with module" do
248
- content =<<-EOF
249
- module Admin
250
- module Blog
313
+ it "should treat alias_method_chain as method" do
314
+ content =<<-EOF
251
315
  class Post < ActiveRecord::Base
252
- def save; end
253
- def find; end
316
+ alias_method_chain :method, :feature
254
317
  end
318
+ EOF
319
+ runner.prepare("app/models/post.rb", content)
320
+ methods = Prepares.model_methods
321
+ methods.get_methods("Post").map(&:method_name).should == ["method_with_feature", "method"]
255
322
  end
256
323
  end
257
- EOF
258
- runner.prepare("app/models/admin/blog/post.rb", content)
259
- methods = RailsBestPractices::Prepares.model_methods
260
- methods.get_methods("Admin::Blog::Post").map(&:method_name).should == ["save", "find"]
261
- end
262
- end
263
-
264
- context "scope" do
265
- it "should treat named_scope as method" do
266
- content =<<-EOF
267
- class Post < ActiveRecord::Base
268
- named_scope :active, :conditions => {:active => true}
269
- end
270
- EOF
271
- runner.prepare("app/models/post.rb", content)
272
- methods = RailsBestPractices::Prepares.model_methods
273
- methods.get_methods("Post").map(&:method_name).should == ["active"]
274
- end
275
-
276
- it "should treat scope as method" do
277
- content =<<-EOF
278
- class Post < ActiveRecord::Base
279
- scope :active, where(:active => true)
280
- end
281
- EOF
282
- runner.prepare("app/models/post.rb", content)
283
- methods = RailsBestPractices::Prepares.model_methods
284
- methods.get_methods("Post").map(&:method_name).should == ["active"]
285
- end
286
- end
287
-
288
- context "alias" do
289
- it "should treat alias as method" do
290
- content =<<-EOF
291
- class Post < ActiveRecord::Base
292
- alias :new :old
293
- end
294
- EOF
295
- runner.prepare("app/models/post.rb", content)
296
- methods = RailsBestPractices::Prepares.model_methods
297
- methods.get_methods("Post").map(&:method_name).should == ["new"]
298
- end
299
324
 
300
- it "should treat alias_method as method" do
301
- content =<<-EOF
302
- class Post < ActiveRecord::Base
303
- alias_method :new, :old
304
- end
305
- EOF
306
- runner.prepare("app/models/post.rb", content)
307
- methods = RailsBestPractices::Prepares.model_methods
308
- methods.get_methods("Post").map(&:method_name).should == ["new"]
309
- end
310
-
311
- it "should treat alias_method_chain as method" do
312
- content =<<-EOF
313
- class Post < ActiveRecord::Base
314
- alias_method_chain :method, :feature
315
- end
316
- EOF
317
- runner.prepare("app/models/post.rb", content)
318
- methods = RailsBestPractices::Prepares.model_methods
319
- methods.get_methods("Post").map(&:method_name).should == ["method_with_feature", "method"]
320
- end
321
- end
322
-
323
- context "attributes" do
324
- it "should parse mongoid field" do
325
- content =<<-EOF
326
- class Post
327
- include Mongoid::Document
328
- field :title
329
- field :tags, type: Array
330
- field :comments_count, type: Integer
331
- field :deleted_at, type: DateTime
332
- field :active, type: Boolean
333
- end
334
- EOF
335
- runner.prepare("app/models/post.rb", content)
336
- model_attributes = RailsBestPractices::Prepares.model_attributes
337
- model_attributes.get_attribute_type("Post", "title").should == "String"
338
- model_attributes.get_attribute_type("Post", "tags").should == "Array"
339
- model_attributes.get_attribute_type("Post", "comments_count").should == "Integer"
340
- model_attributes.get_attribute_type("Post", "deleted_at").should == "DateTime"
341
- model_attributes.get_attribute_type("Post", "active").should == "Boolean"
342
- end
325
+ context "attributes" do
326
+ it "should parse mongoid field" do
327
+ content =<<-EOF
328
+ class Post
329
+ include Mongoid::Document
330
+ field :title
331
+ field :tags, type: Array
332
+ field :comments_count, type: Integer
333
+ field :deleted_at, type: DateTime
334
+ field :active, type: Boolean
335
+ end
336
+ EOF
337
+ runner.prepare("app/models/post.rb", content)
338
+ model_attributes = Prepares.model_attributes
339
+ model_attributes.get_attribute_type("Post", "title").should == "String"
340
+ model_attributes.get_attribute_type("Post", "tags").should == "Array"
341
+ model_attributes.get_attribute_type("Post", "comments_count").should == "Integer"
342
+ model_attributes.get_attribute_type("Post", "deleted_at").should == "DateTime"
343
+ model_attributes.get_attribute_type("Post", "active").should == "Boolean"
344
+ end
343
345
 
344
- it "should parse mongomapper field" do
345
- content =<<-EOF
346
- class Post
347
- include MongoMapper::Document
348
- key :first_name, String
349
- key :last_name, String
350
- key :age, Integer
351
- key :born_at, Time
352
- key :active, Boolean
353
- key :fav_colors, Array
346
+ it "should parse mongomapper field" do
347
+ content =<<-EOF
348
+ class Post
349
+ include MongoMapper::Document
350
+ key :first_name, String
351
+ key :last_name, String
352
+ key :age, Integer
353
+ key :born_at, Time
354
+ key :active, Boolean
355
+ key :fav_colors, Array
356
+ end
357
+ EOF
358
+ runner.prepare("app/models/post.rb", content)
359
+ model_attributes = Prepares.model_attributes
360
+ model_attributes.get_attribute_type("Post", "first_name").should == "String"
361
+ model_attributes.get_attribute_type("Post", "last_name").should == "String"
362
+ model_attributes.get_attribute_type("Post", "age").should == "Integer"
363
+ model_attributes.get_attribute_type("Post", "born_at").should == "Time"
364
+ model_attributes.get_attribute_type("Post", "active").should == "Boolean"
365
+ model_attributes.get_attribute_type("Post", "fav_colors").should == "Array"
366
+ end
354
367
  end
355
- EOF
356
- runner.prepare("app/models/post.rb", content)
357
- model_attributes = RailsBestPractices::Prepares.model_attributes
358
- model_attributes.get_attribute_type("Post", "first_name").should == "String"
359
- model_attributes.get_attribute_type("Post", "last_name").should == "String"
360
- model_attributes.get_attribute_type("Post", "age").should == "Integer"
361
- model_attributes.get_attribute_type("Post", "born_at").should == "Time"
362
- model_attributes.get_attribute_type("Post", "active").should == "Boolean"
363
- model_attributes.get_attribute_type("Post", "fav_colors").should == "Array"
364
- end
365
- end
366
368
 
367
- context "no error" do
368
- it "should raised for finder_sql option" do
369
- content =<<-EOF
370
- class EventSubscription < ActiveRecord::Base
371
- has_many :event_notification_template, :finder_sql => ?
369
+ context "no error" do
370
+ it "should raised for finder_sql option" do
371
+ content =<<-EOF
372
+ class EventSubscription < ActiveRecord::Base
373
+ has_many :event_notification_template, :finder_sql => ?
374
+ end
375
+ EOF
376
+ content.sub!('?', '\'SELECT event_notification_templates.* from event_notification_templates where event_type_id=#{event_type_id} and delivery_method_id=#{delivery_method_id}\'')
377
+ lambda { runner.prepare('app/models/event_subscription.rb', content) }.should_not raise_error
378
+ end
372
379
  end
373
- EOF
374
- content.sub!('?', '\'SELECT event_notification_templates.* from event_notification_templates where event_type_id=#{event_type_id} and delivery_method_id=#{delivery_method_id}\'')
375
- lambda { runner.prepare('app/models/event_subscription.rb', content) }.should_not raise_error
376
380
  end
377
381
  end
378
382
  end