rails_best_practices 1.19.5 → 1.22.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/CHANGELOG.md +10 -16
- data/Gemfile +2 -1
- data/Gemfile.lock +51 -45
- data/Guardfile +2 -0
- data/Rakefile +2 -17
- data/assets/result.html.erb +2 -0
- data/lib/rails_best_practices/analyzer.rb +59 -48
- data/lib/rails_best_practices/core/check.rb +39 -32
- data/lib/rails_best_practices/core/checks_loader.rb +8 -6
- data/lib/rails_best_practices/core/configs.rb +1 -2
- data/lib/rails_best_practices/core/controllers.rb +1 -2
- data/lib/rails_best_practices/core/error.rb +1 -1
- data/lib/rails_best_practices/core/helpers.rb +1 -2
- data/lib/rails_best_practices/core/mailers.rb +1 -2
- data/lib/rails_best_practices/core/methods.rb +21 -16
- data/lib/rails_best_practices/core/model_associations.rb +9 -4
- data/lib/rails_best_practices/core/models.rb +1 -2
- data/lib/rails_best_practices/core/modules.rb +1 -1
- data/lib/rails_best_practices/core/routes.rb +2 -2
- data/lib/rails_best_practices/core/runner.rb +49 -34
- data/lib/rails_best_practices/inline_disables/comment_ripper.rb +19 -0
- data/lib/rails_best_practices/inline_disables/inline_disable.rb +50 -0
- data/lib/rails_best_practices/inline_disables.rb +3 -0
- data/lib/rails_best_practices/lexicals/long_line_check.rb +7 -3
- data/lib/rails_best_practices/option_parser.rb +22 -6
- data/lib/rails_best_practices/prepares/controller_prepare.rb +15 -3
- data/lib/rails_best_practices/prepares/gemfile_prepare.rb +1 -1
- data/lib/rails_best_practices/prepares/helper_prepare.rb +6 -1
- data/lib/rails_best_practices/prepares/initializer_prepare.rb +2 -2
- data/lib/rails_best_practices/prepares/mailer_prepare.rb +1 -0
- data/lib/rails_best_practices/prepares/model_prepare.rb +52 -12
- data/lib/rails_best_practices/prepares/route_prepare.rb +16 -10
- data/lib/rails_best_practices/prepares.rb +1 -1
- data/lib/rails_best_practices/reviews/add_model_virtual_attribute_review.rb +15 -13
- data/lib/rails_best_practices/reviews/always_add_db_index_review.rb +36 -31
- data/lib/rails_best_practices/reviews/check_destroy_return_value_review.rb +14 -5
- data/lib/rails_best_practices/reviews/check_save_return_value_review.rb +19 -8
- data/lib/rails_best_practices/reviews/hash_syntax_review.rb +5 -5
- data/lib/rails_best_practices/reviews/isolate_seed_data_review.rb +4 -4
- data/lib/rails_best_practices/reviews/keep_finders_on_their_own_model_review.rb +7 -8
- data/lib/rails_best_practices/reviews/law_of_demeter_review.rb +6 -6
- data/lib/rails_best_practices/reviews/move_code_into_controller_review.rb +1 -1
- data/lib/rails_best_practices/reviews/move_code_into_helper_review.rb +6 -7
- data/lib/rails_best_practices/reviews/move_finder_to_named_scope_review.rb +7 -8
- data/lib/rails_best_practices/reviews/needless_deep_nesting_review.rb +12 -10
- data/lib/rails_best_practices/reviews/not_use_default_route_review.rb +1 -2
- data/lib/rails_best_practices/reviews/overuse_route_customizations_review.rb +5 -5
- data/lib/rails_best_practices/reviews/protect_mass_assignment_review.rb +5 -2
- data/lib/rails_best_practices/reviews/remove_unused_methods_in_controllers_review.rb +6 -3
- data/lib/rails_best_practices/reviews/remove_unused_methods_in_helpers_review.rb +6 -4
- data/lib/rails_best_practices/reviews/remove_unused_methods_in_models_review.rb +29 -9
- data/lib/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review.rb +3 -3
- data/lib/rails_best_practices/reviews/restrict_auto_generated_routes_review.rb +17 -15
- data/lib/rails_best_practices/reviews/simplify_render_in_controllers_review.rb +1 -2
- data/lib/rails_best_practices/reviews/simplify_render_in_views_review.rb +3 -3
- data/lib/rails_best_practices/reviews/use_before_filter_review.rb +2 -1
- data/lib/rails_best_practices/reviews/use_model_association_review.rb +6 -6
- data/lib/rails_best_practices/reviews/use_multipart_alternative_as_content_type_of_email_review.rb +9 -8
- data/lib/rails_best_practices/reviews/use_observer_review.rb +9 -9
- data/lib/rails_best_practices/reviews/use_query_attribute_review.rb +26 -26
- data/lib/rails_best_practices/reviews/use_say_with_time_in_migrations_review.rb +8 -7
- data/lib/rails_best_practices/reviews/use_scope_access_review.rb +17 -15
- data/lib/rails_best_practices/reviews/use_turbo_sprockets_rails3_review.rb +2 -1
- data/lib/rails_best_practices/version.rb +1 -1
- data/lib/rails_best_practices.rb +2 -2
- data/rails_best_practices.gemspec +35 -36
- data/spec/fixtures/lib/rails_best_practices/plugins/reviews/not_use_rails_root_review.rb +1 -2
- data/spec/rails_best_practices/analyzer_spec.rb +73 -42
- data/spec/rails_best_practices/core/check_spec.rb +5 -5
- data/spec/rails_best_practices/core/checks_loader_spec.rb +3 -3
- data/spec/rails_best_practices/core/configs_spec.rb +1 -1
- data/spec/rails_best_practices/core/controllers_spec.rb +1 -1
- data/spec/rails_best_practices/core/error_spec.rb +21 -21
- data/spec/rails_best_practices/core/except_methods_spec.rb +7 -7
- data/spec/rails_best_practices/core/gems_spec.rb +4 -4
- data/spec/rails_best_practices/core/helpers_spec.rb +1 -1
- data/spec/rails_best_practices/core/klasses_spec.rb +3 -3
- data/spec/rails_best_practices/core/mailers_spec.rb +1 -1
- data/spec/rails_best_practices/core/methods_spec.rb +6 -6
- data/spec/rails_best_practices/core/model_associations_spec.rb +10 -6
- data/spec/rails_best_practices/core/model_attributes_spec.rb +4 -4
- data/spec/rails_best_practices/core/models_spec.rb +1 -1
- data/spec/rails_best_practices/core/modules_spec.rb +5 -5
- data/spec/rails_best_practices/core/routes_spec.rb +5 -5
- data/spec/rails_best_practices/core/runner_spec.rb +9 -7
- data/spec/rails_best_practices/core_ext/erubis_spec.rb +10 -10
- data/spec/rails_best_practices/inline_disables/inline_disable_spec.rb +62 -0
- data/spec/rails_best_practices/lexicals/long_line_check_spec.rb +11 -10
- data/spec/rails_best_practices/lexicals/remove_tab_check_spec.rb +6 -6
- data/spec/rails_best_practices/lexicals/remove_trailing_whitespace_check_spec.rb +6 -6
- data/spec/rails_best_practices/prepares/config_prepare_spec.rb +2 -2
- data/spec/rails_best_practices/prepares/controller_prepare_spec.rb +18 -10
- data/spec/rails_best_practices/prepares/gemfile_prepare_spec.rb +2 -2
- data/spec/rails_best_practices/prepares/helper_prepare_spec.rb +3 -3
- data/spec/rails_best_practices/prepares/initializer_prepare_spec.rb +3 -3
- data/spec/rails_best_practices/prepares/mailer_prepare_spec.rb +2 -2
- data/spec/rails_best_practices/prepares/model_prepare_spec.rb +79 -43
- data/spec/rails_best_practices/prepares/route_prepare_spec.rb +138 -77
- data/spec/rails_best_practices/prepares/schema_prepare_spec.rb +2 -2
- data/spec/rails_best_practices/reviews/add_model_virtual_attribute_review_spec.rb +18 -12
- data/spec/rails_best_practices/reviews/always_add_db_index_review_spec.rb +28 -22
- data/spec/rails_best_practices/reviews/check_destroy_return_value_review_spec.rb +15 -13
- data/spec/rails_best_practices/reviews/check_save_return_value_review_spec.rb +31 -21
- data/spec/rails_best_practices/reviews/default_scope_is_evil_review_spec.rb +6 -6
- data/spec/rails_best_practices/reviews/dry_bundler_in_capistrano_review_spec.rb +5 -5
- data/spec/rails_best_practices/reviews/hash_syntax_review_spec.rb +9 -9
- data/spec/rails_best_practices/reviews/isolate_seed_data_review_spec.rb +7 -7
- data/spec/rails_best_practices/reviews/keep_finders_on_their_own_model_review_spec.rb +9 -9
- data/spec/rails_best_practices/reviews/law_of_demeter_review_spec.rb +21 -14
- data/spec/rails_best_practices/reviews/move_code_into_controller_review_spec.rb +6 -6
- data/spec/rails_best_practices/reviews/move_code_into_helper_review_spec.rb +11 -6
- data/spec/rails_best_practices/reviews/move_code_into_model_review_spec.rb +26 -16
- data/spec/rails_best_practices/reviews/move_finder_to_named_scope_review_spec.rb +7 -7
- data/spec/rails_best_practices/reviews/move_model_logic_into_model_review_spec.rb +9 -7
- data/spec/rails_best_practices/reviews/needless_deep_nesting_review_spec.rb +9 -9
- data/spec/rails_best_practices/reviews/not_rescue_exception_review_spec.rb +9 -9
- data/spec/rails_best_practices/reviews/not_use_default_route_review_spec.rb +5 -5
- data/spec/rails_best_practices/reviews/not_use_time_ago_in_words_review_spec.rb +7 -7
- data/spec/rails_best_practices/reviews/overuse_route_customizations_review_spec.rb +7 -7
- data/spec/rails_best_practices/reviews/protect_mass_assignment_review_spec.rb +24 -19
- data/spec/rails_best_practices/reviews/remove_empty_helpers_review_spec.rb +6 -6
- data/spec/rails_best_practices/reviews/remove_unused_methods_in_controllers_review_spec.rb +44 -31
- data/spec/rails_best_practices/reviews/remove_unused_methods_in_helpers_review_spec.rb +17 -12
- data/spec/rails_best_practices/reviews/remove_unused_methods_in_models_review_spec.rb +46 -44
- data/spec/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review_spec.rb +10 -8
- data/spec/rails_best_practices/reviews/replace_instance_variable_with_local_variable_review_spec.rb +16 -10
- data/spec/rails_best_practices/reviews/restrict_auto_generated_routes_review_spec.rb +54 -31
- data/spec/rails_best_practices/reviews/simplify_render_in_controllers_review_spec.rb +9 -9
- data/spec/rails_best_practices/reviews/simplify_render_in_views_review_spec.rb +13 -13
- data/spec/rails_best_practices/reviews/use_before_filter_review_spec.rb +11 -9
- data/spec/rails_best_practices/reviews/use_model_association_review_spec.rb +7 -7
- data/spec/rails_best_practices/reviews/use_multipart_alternative_as_content_type_of_email_review_spec.rb +21 -17
- data/spec/rails_best_practices/reviews/use_observer_review_spec.rb +6 -6
- data/spec/rails_best_practices/reviews/use_parentheses_in_method_def_review_spec.rb +9 -7
- data/spec/rails_best_practices/reviews/use_query_attribute_review_spec.rb +31 -24
- data/spec/rails_best_practices/reviews/use_say_with_time_in_migrations_review_spec.rb +15 -11
- data/spec/rails_best_practices/reviews/use_scope_access_review_spec.rb +14 -14
- data/spec/rails_best_practices/reviews/use_turbo_sprockets_rails3_review_spec.rb +10 -8
- metadata +16 -11
@@ -5,9 +5,9 @@ require 'spec_helper'
|
|
5
5
|
module RailsBestPractices
|
6
6
|
module Reviews
|
7
7
|
describe AlwaysAddDbIndexReview do
|
8
|
-
let(:runner) { Core::Runner.new(reviews:
|
8
|
+
let(:runner) { Core::Runner.new(reviews: described_class.new) }
|
9
9
|
|
10
|
-
it '
|
10
|
+
it 'alwayses add db index' do
|
11
11
|
content = <<-EOF
|
12
12
|
ActiveRecord::Schema.define(version: 20100603080629) do
|
13
13
|
create_table "comments", force: true do |t|
|
@@ -28,7 +28,7 @@ module RailsBestPractices
|
|
28
28
|
expect(runner.errors[1].to_s).to eq('db/schema.rb:2 - always add db index (comments => [user_id])')
|
29
29
|
end
|
30
30
|
|
31
|
-
it '
|
31
|
+
it 'alwayses add db index with polymorphic foreign key' do
|
32
32
|
content = <<-EOF
|
33
33
|
ActiveRecord::Schema.define(version: 20100603080629) do
|
34
34
|
create_table "versions", force: true do |t|
|
@@ -41,10 +41,12 @@ module RailsBestPractices
|
|
41
41
|
runner.review('db/schema.rb', content)
|
42
42
|
runner.after_review
|
43
43
|
expect(runner.errors.size).to eq(1)
|
44
|
-
expect(runner.errors[0].to_s).to eq(
|
44
|
+
expect(runner.errors[0].to_s).to eq(
|
45
|
+
'db/schema.rb:2 - always add db index (versions => [versioned_id, versioned_type])'
|
46
|
+
)
|
45
47
|
end
|
46
48
|
|
47
|
-
it '
|
49
|
+
it 'alwayses add db index with polymorphic foreign key and _type is defined before _id' do
|
48
50
|
content = <<-EOF
|
49
51
|
ActiveRecord::Schema.define(version: 20100603080629) do
|
50
52
|
create_table "versions", force: true do |t|
|
@@ -57,10 +59,12 @@ module RailsBestPractices
|
|
57
59
|
runner.review('db/schema.rb', content)
|
58
60
|
runner.after_review
|
59
61
|
expect(runner.errors.size).to eq(1)
|
60
|
-
expect(runner.errors[0].to_s).to eq(
|
62
|
+
expect(runner.errors[0].to_s).to eq(
|
63
|
+
'db/schema.rb:2 - always add db index (versions => [versioned_id, versioned_type])'
|
64
|
+
)
|
61
65
|
end
|
62
66
|
|
63
|
-
it '
|
67
|
+
it 'alwayses add db index with single index, but without polymorphic foreign key' do
|
64
68
|
content = <<-EOF
|
65
69
|
ActiveRecord::Schema.define(version: 20100603080629) do
|
66
70
|
create_table "taggings", force: true do |t|
|
@@ -77,10 +81,12 @@ module RailsBestPractices
|
|
77
81
|
runner.review('db/schema.rb', content)
|
78
82
|
runner.after_review
|
79
83
|
expect(runner.errors.size).to eq(1)
|
80
|
-
expect(runner.errors[0].to_s).to eq(
|
84
|
+
expect(runner.errors[0].to_s).to eq(
|
85
|
+
'db/schema.rb:2 - always add db index (taggings => [taggable_id, taggable_type])'
|
86
|
+
)
|
81
87
|
end
|
82
88
|
|
83
|
-
it '
|
89
|
+
it 'alwayses add db index with polymorphic foreign key, but without single index' do
|
84
90
|
content = <<-EOF
|
85
91
|
ActiveRecord::Schema.define(version: 20100603080629) do
|
86
92
|
create_table "taggings", force: true do |t|
|
@@ -100,7 +106,7 @@ module RailsBestPractices
|
|
100
106
|
expect(runner.errors[0].to_s).to eq('db/schema.rb:2 - always add db index (taggings => [tag_id])')
|
101
107
|
end
|
102
108
|
|
103
|
-
it '
|
109
|
+
it 'alwayses add db index only _id without non related _type column' do
|
104
110
|
content = <<-EOF
|
105
111
|
ActiveRecord::Schema.define(version: 20100603080629) do
|
106
112
|
create_table "websites", force: true do |t|
|
@@ -119,7 +125,7 @@ module RailsBestPractices
|
|
119
125
|
expect(runner.errors[0].to_s).to eq('db/schema.rb:2 - always add db index (websites => [user_id])')
|
120
126
|
end
|
121
127
|
|
122
|
-
it '
|
128
|
+
it 'does not always add db index with column has no id' do
|
123
129
|
content = <<-EOF
|
124
130
|
ActiveRecord::Schema.define(version: 20100603080629) do
|
125
131
|
create_table "comments", force: true do |t|
|
@@ -133,7 +139,7 @@ module RailsBestPractices
|
|
133
139
|
expect(runner.errors.size).to eq(0)
|
134
140
|
end
|
135
141
|
|
136
|
-
it '
|
142
|
+
it 'does not always add db index with add_index' do
|
137
143
|
content = <<-EOF
|
138
144
|
ActiveRecord::Schema.define(version: 20100603080629) do
|
139
145
|
create_table "comments", force: true do |t|
|
@@ -155,7 +161,7 @@ module RailsBestPractices
|
|
155
161
|
expect(runner.errors.size).to eq(0)
|
156
162
|
end
|
157
163
|
|
158
|
-
it '
|
164
|
+
it 'does not always add db index with t.index' do
|
159
165
|
# e.g. schema_plus creates indices like this https://github.com/lomba/schema_plus
|
160
166
|
content = <<-EOF
|
161
167
|
ActiveRecord::Schema.define(version: 20100603080629) do
|
@@ -173,7 +179,7 @@ module RailsBestPractices
|
|
173
179
|
expect(runner.errors.size).to eq(0)
|
174
180
|
end
|
175
181
|
|
176
|
-
it '
|
182
|
+
it 'does not always add db index with only _type column' do
|
177
183
|
content = <<-EOF
|
178
184
|
ActiveRecord::Schema.define(version: 20100603080629) do
|
179
185
|
create_table "versions", force: true do |t|
|
@@ -186,7 +192,7 @@ module RailsBestPractices
|
|
186
192
|
expect(runner.errors.size).to eq(0)
|
187
193
|
end
|
188
194
|
|
189
|
-
it '
|
195
|
+
it 'does not always add db index with multi-column index' do
|
190
196
|
content = <<-EOF
|
191
197
|
ActiveRecord::Schema.define(version: 20100603080629) do
|
192
198
|
create_table "versions", force: true do |t|
|
@@ -203,7 +209,7 @@ module RailsBestPractices
|
|
203
209
|
expect(runner.errors.size).to eq(0)
|
204
210
|
end
|
205
211
|
|
206
|
-
it '
|
212
|
+
it 'does not always add db index if there is an index contains more columns' do
|
207
213
|
content = <<-EOF
|
208
214
|
ActiveRecord::Schema.define(version: 20100603080629) do
|
209
215
|
create_table "taggings", force: true do |t|
|
@@ -220,7 +226,7 @@ module RailsBestPractices
|
|
220
226
|
expect(runner.errors.size).to eq(0)
|
221
227
|
end
|
222
228
|
|
223
|
-
it '
|
229
|
+
it 'does not always add db index if two indexes for polymorphic association' do
|
224
230
|
content = <<-EOF
|
225
231
|
ActiveRecord::Schema.define(version: 20100603080629) do
|
226
232
|
create_table "taggings", force: true do |t|
|
@@ -238,7 +244,7 @@ module RailsBestPractices
|
|
238
244
|
expect(runner.errors.size).to eq(0)
|
239
245
|
end
|
240
246
|
|
241
|
-
it '
|
247
|
+
it 'does not always add db index if table does not exist' do
|
242
248
|
content = <<-EOF
|
243
249
|
ActiveRecord::Schema.define(version: 20100603080629) do
|
244
250
|
create_table "comments", force: true do |t|
|
@@ -251,7 +257,7 @@ module RailsBestPractices
|
|
251
257
|
expect(runner.errors.size).to eq(0)
|
252
258
|
end
|
253
259
|
|
254
|
-
it '
|
260
|
+
it 'alwayses add db index if association_name is different to foreign_key' do
|
255
261
|
content = <<-EOF
|
256
262
|
class Comment < ActiveRecord::Base
|
257
263
|
belongs_to :commentor, class_name: "User"
|
@@ -278,8 +284,8 @@ module RailsBestPractices
|
|
278
284
|
expect(runner.errors[0].to_s).to eq('db/schema.rb:2 - always add db index (comments => [commentor_id])')
|
279
285
|
end
|
280
286
|
|
281
|
-
it '
|
282
|
-
runner = Core::Runner.new(reviews:
|
287
|
+
it 'does not check ignored files' do
|
288
|
+
runner = Core::Runner.new(reviews: described_class.new(ignored_files: %r{db/schema}))
|
283
289
|
content = <<-EOF
|
284
290
|
ActiveRecord::Schema.define(version: 20100603080629) do
|
285
291
|
create_table "comments", force: true do |t|
|
@@ -298,7 +304,7 @@ module RailsBestPractices
|
|
298
304
|
expect(runner.errors.size).to eq(0)
|
299
305
|
end
|
300
306
|
|
301
|
-
it '
|
307
|
+
it 'detects index option in column creation' do
|
302
308
|
content = <<-EOF
|
303
309
|
ActiveRecord::Schema.define(version: 20100603080629) do
|
304
310
|
create_table "comments", force: true do |t|
|
@@ -5,10 +5,10 @@ require 'spec_helper'
|
|
5
5
|
module RailsBestPractices
|
6
6
|
module Reviews
|
7
7
|
describe CheckDestroyReturnValueReview do
|
8
|
-
let(:runner) { Core::Runner.new(reviews:
|
8
|
+
let(:runner) { Core::Runner.new(reviews: described_class.new) }
|
9
9
|
|
10
10
|
describe 'check_destroy_return_value' do
|
11
|
-
it '
|
11
|
+
it 'warns you if you fail to check the destroy return value' do
|
12
12
|
content = <<-EOF
|
13
13
|
def my_method
|
14
14
|
post = Posts.create do |p|
|
@@ -19,10 +19,12 @@ module RailsBestPractices
|
|
19
19
|
EOF
|
20
20
|
runner.review('app/helpers/posts_helper.rb', content)
|
21
21
|
expect(runner.errors.size).to eq(1)
|
22
|
-
expect(runner.errors[0].to_s).to eq(
|
22
|
+
expect(runner.errors[0].to_s).to eq(
|
23
|
+
"app/helpers/posts_helper.rb:5 - check 'destroy' return value or use 'destroy!'"
|
24
|
+
)
|
23
25
|
end
|
24
26
|
|
25
|
-
it '
|
27
|
+
it 'allows destroy return value if assigned to a var' do
|
26
28
|
content = <<-EOF
|
27
29
|
def my_method
|
28
30
|
post = Posts.create do |p|
|
@@ -35,7 +37,7 @@ module RailsBestPractices
|
|
35
37
|
expect(runner.errors.size).to eq(0)
|
36
38
|
end
|
37
39
|
|
38
|
-
it '
|
40
|
+
it 'allows destroy return value used in if' do
|
39
41
|
content = <<-EOF
|
40
42
|
def my_method
|
41
43
|
post = Posts.create do |p|
|
@@ -52,7 +54,7 @@ module RailsBestPractices
|
|
52
54
|
expect(runner.errors.size).to eq(0)
|
53
55
|
end
|
54
56
|
|
55
|
-
it '
|
57
|
+
it 'allows destroy return value used in elsif' do
|
56
58
|
content = <<-EOF
|
57
59
|
def my_method
|
58
60
|
post = Posts.create do |p|
|
@@ -71,7 +73,7 @@ module RailsBestPractices
|
|
71
73
|
expect(runner.errors.size).to eq(0)
|
72
74
|
end
|
73
75
|
|
74
|
-
it '
|
76
|
+
it 'allows destroy return value used in unless' do
|
75
77
|
content = <<-EOF
|
76
78
|
def my_method
|
77
79
|
unless @post.destroy
|
@@ -83,7 +85,7 @@ module RailsBestPractices
|
|
83
85
|
expect(runner.errors.size).to eq(0)
|
84
86
|
end
|
85
87
|
|
86
|
-
it '
|
88
|
+
it 'allows destroy return value used in if_mod' do
|
87
89
|
content = <<-EOF
|
88
90
|
def my_method
|
89
91
|
post = Posts.create do |p|
|
@@ -96,7 +98,7 @@ module RailsBestPractices
|
|
96
98
|
expect(runner.errors.size).to eq(0)
|
97
99
|
end
|
98
100
|
|
99
|
-
it '
|
101
|
+
it 'allows destroy return value used in unless_mod' do
|
100
102
|
content = <<-EOF
|
101
103
|
def my_method
|
102
104
|
post = Posts.create do |p|
|
@@ -109,7 +111,7 @@ module RailsBestPractices
|
|
109
111
|
expect(runner.errors.size).to eq(0)
|
110
112
|
end
|
111
113
|
|
112
|
-
it '
|
114
|
+
it 'allows destroy return value used in unless with &&' do
|
113
115
|
content = <<-EOF
|
114
116
|
def my_method
|
115
117
|
unless some_method(1) && other_method(2) && @post.destroy
|
@@ -121,7 +123,7 @@ module RailsBestPractices
|
|
121
123
|
expect(runner.errors.size).to eq(0)
|
122
124
|
end
|
123
125
|
|
124
|
-
it '
|
126
|
+
it 'allows destroy!' do
|
125
127
|
content = <<-EOF
|
126
128
|
def my_method
|
127
129
|
post = Posts.create do |p|
|
@@ -135,8 +137,8 @@ module RailsBestPractices
|
|
135
137
|
end
|
136
138
|
end
|
137
139
|
|
138
|
-
it '
|
139
|
-
runner = Core::Runner.new(reviews:
|
140
|
+
it 'does not check ignored files' do
|
141
|
+
runner = Core::Runner.new(reviews: described_class.new(ignored_files: /helpers/))
|
140
142
|
content = <<-EOF
|
141
143
|
def my_method
|
142
144
|
post = Posts.create do |p|
|
@@ -5,10 +5,10 @@ require 'spec_helper'
|
|
5
5
|
module RailsBestPractices
|
6
6
|
module Reviews
|
7
7
|
describe CheckSaveReturnValueReview do
|
8
|
-
let(:runner) { Core::Runner.new(reviews:
|
8
|
+
let(:runner) { Core::Runner.new(reviews: described_class.new) }
|
9
9
|
|
10
10
|
describe 'check_save_return_value' do
|
11
|
-
it '
|
11
|
+
it 'warns you if you fail to check save return value' do
|
12
12
|
content = <<-EOF
|
13
13
|
def my_method
|
14
14
|
post = Posts.new do |p|
|
@@ -19,10 +19,12 @@ module RailsBestPractices
|
|
19
19
|
EOF
|
20
20
|
runner.review('app/helpers/posts_helper.rb', content)
|
21
21
|
expect(runner.errors.size).to eq(1)
|
22
|
-
expect(runner.errors[0].to_s).to eq(
|
22
|
+
expect(runner.errors[0].to_s).to eq(
|
23
|
+
"app/helpers/posts_helper.rb:5 - check 'save' return value or use 'save!'"
|
24
|
+
)
|
23
25
|
end
|
24
26
|
|
25
|
-
it '
|
27
|
+
it 'allows save return value assigned to var' do
|
26
28
|
content = <<-EOF
|
27
29
|
def my_method
|
28
30
|
post = Posts.new do |p|
|
@@ -35,7 +37,7 @@ module RailsBestPractices
|
|
35
37
|
expect(runner.errors.size).to eq(0)
|
36
38
|
end
|
37
39
|
|
38
|
-
it '
|
40
|
+
it 'allows save return value used in if' do
|
39
41
|
content = <<-EOF
|
40
42
|
def my_method
|
41
43
|
post = Posts.new do |p|
|
@@ -52,7 +54,7 @@ module RailsBestPractices
|
|
52
54
|
expect(runner.errors.size).to eq(0)
|
53
55
|
end
|
54
56
|
|
55
|
-
it '
|
57
|
+
it 'allows save return value used in elsif' do
|
56
58
|
content = <<-EOF
|
57
59
|
def my_method
|
58
60
|
post = Posts.new do |p|
|
@@ -71,7 +73,7 @@ module RailsBestPractices
|
|
71
73
|
expect(runner.errors.size).to eq(0)
|
72
74
|
end
|
73
75
|
|
74
|
-
it '
|
76
|
+
it 'allows save return value used in unless' do
|
75
77
|
content = <<-EOF
|
76
78
|
def my_method
|
77
79
|
unless @post.save
|
@@ -83,7 +85,7 @@ module RailsBestPractices
|
|
83
85
|
expect(runner.errors.size).to eq(0)
|
84
86
|
end
|
85
87
|
|
86
|
-
it '
|
88
|
+
it 'allows save return value used in if_mod' do
|
87
89
|
content = <<-EOF
|
88
90
|
def my_method
|
89
91
|
post = Posts.new do |p|
|
@@ -96,7 +98,7 @@ module RailsBestPractices
|
|
96
98
|
expect(runner.errors.size).to eq(0)
|
97
99
|
end
|
98
100
|
|
99
|
-
it '
|
101
|
+
it 'allows save return value used in unless_mod' do
|
100
102
|
content = <<-EOF
|
101
103
|
def my_method
|
102
104
|
post = Posts.new do |p|
|
@@ -109,7 +111,7 @@ module RailsBestPractices
|
|
109
111
|
expect(runner.errors.size).to eq(0)
|
110
112
|
end
|
111
113
|
|
112
|
-
it '
|
114
|
+
it 'allows save return value used in unless with &&' do
|
113
115
|
content = <<-EOF
|
114
116
|
def my_method
|
115
117
|
unless some_method(1) && other_method(2) && @post.save
|
@@ -121,7 +123,7 @@ module RailsBestPractices
|
|
121
123
|
expect(runner.errors.size).to eq(0)
|
122
124
|
end
|
123
125
|
|
124
|
-
it '
|
126
|
+
it 'allows save!' do
|
125
127
|
content = <<-EOF
|
126
128
|
def my_method
|
127
129
|
post = Posts.new do |p|
|
@@ -134,7 +136,7 @@ module RailsBestPractices
|
|
134
136
|
expect(runner.errors.size).to eq(0)
|
135
137
|
end
|
136
138
|
|
137
|
-
it '
|
139
|
+
it 'warns you if you fail to check update_attributes return value' do
|
138
140
|
content = <<-EOF
|
139
141
|
def my_method
|
140
142
|
@post.update_attributes params
|
@@ -142,10 +144,12 @@ module RailsBestPractices
|
|
142
144
|
EOF
|
143
145
|
runner.review('app/helpers/posts_helper.rb', content)
|
144
146
|
expect(runner.errors.size).to eq(1)
|
145
|
-
expect(runner.errors[0].to_s).to eq(
|
147
|
+
expect(runner.errors[0].to_s).to eq(
|
148
|
+
"app/helpers/posts_helper.rb:2 - check 'update_attributes' return value or use 'update_attributes!'"
|
149
|
+
)
|
146
150
|
end
|
147
151
|
|
148
|
-
it '
|
152
|
+
it 'allows update_attributes if return value is checked' do
|
149
153
|
content = <<-EOF
|
150
154
|
def my_method
|
151
155
|
@post.update_attributes(params) or raise "failed to save"
|
@@ -176,10 +180,12 @@ module RailsBestPractices
|
|
176
180
|
EOF
|
177
181
|
runner.review('app/controllers/posts_controller.rb', content)
|
178
182
|
expect(runner.errors.size).to eq(1)
|
179
|
-
expect(runner.errors[0].to_s).to eq(
|
183
|
+
expect(runner.errors[0].to_s).to eq(
|
184
|
+
"app/controllers/posts_controller.rb:12 - check 'update_attributes' return value or use 'update_attributes!'"
|
185
|
+
)
|
180
186
|
end
|
181
187
|
|
182
|
-
it '
|
188
|
+
it 'warns you if you use create which is always unsafe' do
|
183
189
|
content = <<-EOF
|
184
190
|
class Post < ActiveRecord::Base
|
185
191
|
end
|
@@ -195,10 +201,12 @@ module RailsBestPractices
|
|
195
201
|
EOF
|
196
202
|
runner.review('app/helpers/posts_helper.rb', content)
|
197
203
|
expect(runner.errors.size).to eq(1)
|
198
|
-
expect(runner.errors[0].to_s).to eq(
|
204
|
+
expect(runner.errors[0].to_s).to eq(
|
205
|
+
"app/helpers/posts_helper.rb:2 - use 'create!' instead of 'create' as the latter may not always save"
|
206
|
+
)
|
199
207
|
end
|
200
208
|
|
201
|
-
it '
|
209
|
+
it 'warns you if you use create with a block which is always unsafe' do
|
202
210
|
content = <<-EOF
|
203
211
|
module Blog
|
204
212
|
class Post < ActiveRecord::Base
|
@@ -223,7 +231,9 @@ module RailsBestPractices
|
|
223
231
|
EOF
|
224
232
|
runner.review('app/helpers/blog/posts_helper.rb', content)
|
225
233
|
expect(runner.errors.size).to eq(1)
|
226
|
-
expect(runner.errors[0].to_s).to eq(
|
234
|
+
expect(runner.errors[0].to_s).to eq(
|
235
|
+
"app/helpers/blog/posts_helper.rb:4 - use 'create!' instead of 'create' as the latter may not always save"
|
236
|
+
)
|
227
237
|
end
|
228
238
|
|
229
239
|
it 'allows create called on non-model classes' do
|
@@ -241,8 +251,8 @@ module RailsBestPractices
|
|
241
251
|
end
|
242
252
|
end
|
243
253
|
|
244
|
-
it '
|
245
|
-
runner = Core::Runner.new(reviews:
|
254
|
+
it 'does not check ignored files' do
|
255
|
+
runner = Core::Runner.new(reviews: described_class.new(ignored_files: /helpers/))
|
246
256
|
content = <<-EOF
|
247
257
|
def my_method
|
248
258
|
post = Posts.new do |p|
|
@@ -5,9 +5,9 @@ require 'spec_helper'
|
|
5
5
|
module RailsBestPractices
|
6
6
|
module Reviews
|
7
7
|
describe DefaultScopeIsEvilReview do
|
8
|
-
let(:runner) { Core::Runner.new(reviews:
|
8
|
+
let(:runner) { Core::Runner.new(reviews: described_class.new) }
|
9
9
|
|
10
|
-
it '
|
10
|
+
it 'detects default_scope with -> syntax' do
|
11
11
|
content = <<-EOF
|
12
12
|
class User < ActiveRecord::Base
|
13
13
|
default_scope -> { order('created_at desc') }
|
@@ -18,7 +18,7 @@ module RailsBestPractices
|
|
18
18
|
expect(runner.errors[0].to_s).to eq('app/models/user.rb:2 - default_scope is evil')
|
19
19
|
end
|
20
20
|
|
21
|
-
it '
|
21
|
+
it 'detects default_scope with old syntax' do
|
22
22
|
content = <<-EOF
|
23
23
|
class User < ActiveRecord::Base
|
24
24
|
default_scope order('created_at desc')
|
@@ -29,7 +29,7 @@ module RailsBestPractices
|
|
29
29
|
expect(runner.errors[0].to_s).to eq('app/models/user.rb:2 - default_scope is evil')
|
30
30
|
end
|
31
31
|
|
32
|
-
it '
|
32
|
+
it 'does not detect default_scope' do
|
33
33
|
content = <<-EOF
|
34
34
|
class User < ActiveRecord::Base
|
35
35
|
scope :default, -> { order('created_at desc') }
|
@@ -39,8 +39,8 @@ module RailsBestPractices
|
|
39
39
|
expect(runner.errors.size).to eq(0)
|
40
40
|
end
|
41
41
|
|
42
|
-
it '
|
43
|
-
runner = Core::Runner.new(reviews:
|
42
|
+
it 'does not check ignored files' do
|
43
|
+
runner = Core::Runner.new(reviews: described_class.new(ignored_files: /user/))
|
44
44
|
content = <<-EOF
|
45
45
|
class User < ActiveRecord::Base
|
46
46
|
default_scope -> { order('created_at desc') }
|
@@ -5,9 +5,9 @@ require 'spec_helper'
|
|
5
5
|
module RailsBestPractices
|
6
6
|
module Reviews
|
7
7
|
describe DryBundlerInCapistranoReview do
|
8
|
-
let(:runner) { Core::Runner.new(reviews:
|
8
|
+
let(:runner) { Core::Runner.new(reviews: described_class.new) }
|
9
9
|
|
10
|
-
it '
|
10
|
+
it 'dries bundler in capistrno' do
|
11
11
|
content = <<-EOF
|
12
12
|
namespace :bundler do
|
13
13
|
task :create_symlink, roles: :app do
|
@@ -29,7 +29,7 @@ module RailsBestPractices
|
|
29
29
|
expect(runner.errors[0].to_s).to eq('config/deploy.rb:1 - dry bundler in capistrano')
|
30
30
|
end
|
31
31
|
|
32
|
-
it '
|
32
|
+
it 'does not dry bundler in capistrano' do
|
33
33
|
content = <<-EOF
|
34
34
|
require 'bundler/capistrano'
|
35
35
|
EOF
|
@@ -37,8 +37,8 @@ module RailsBestPractices
|
|
37
37
|
expect(runner.errors.size).to eq(0)
|
38
38
|
end
|
39
39
|
|
40
|
-
it '
|
41
|
-
runner = Core::Runner.new(reviews:
|
40
|
+
it 'does not check ignored files' do
|
41
|
+
runner = Core::Runner.new(reviews: described_class.new(ignored_files: /deploy\.rb/))
|
42
42
|
content = <<-EOF
|
43
43
|
namespace :bundler do
|
44
44
|
task :create_symlink, roles: :app do
|
@@ -5,9 +5,9 @@ require 'spec_helper'
|
|
5
5
|
module RailsBestPractices
|
6
6
|
module Reviews
|
7
7
|
describe HashSyntaxReview do
|
8
|
-
let(:runner) { Core::Runner.new(reviews:
|
8
|
+
let(:runner) { Core::Runner.new(reviews: described_class.new) }
|
9
9
|
|
10
|
-
it '
|
10
|
+
it 'finds 1.8 Hash with symbol' do
|
11
11
|
content = <<-EOF
|
12
12
|
class User < ActiveRecord::Base
|
13
13
|
CONST = { :foo => :bar }
|
@@ -18,7 +18,7 @@ module RailsBestPractices
|
|
18
18
|
expect(runner.errors[0].to_s).to eq('app/models/user.rb:2 - change Hash Syntax to 1.9')
|
19
19
|
end
|
20
20
|
|
21
|
-
it '
|
21
|
+
it 'does not find 1.8 Hash with string' do
|
22
22
|
content = <<-EOF
|
23
23
|
class User < ActiveRecord::Base
|
24
24
|
CONST = { "foo" => "bar" }
|
@@ -28,7 +28,7 @@ module RailsBestPractices
|
|
28
28
|
expect(runner.errors.size).to eq(0)
|
29
29
|
end
|
30
30
|
|
31
|
-
it '
|
31
|
+
it 'does not alert on 1.9 Syntax' do
|
32
32
|
content = <<-EOF
|
33
33
|
class User < ActiveRecord::Base
|
34
34
|
CONST = { foo: :bar }
|
@@ -38,7 +38,7 @@ module RailsBestPractices
|
|
38
38
|
expect(runner.errors.size).to eq(0)
|
39
39
|
end
|
40
40
|
|
41
|
-
it '
|
41
|
+
it 'ignores haml_out' do
|
42
42
|
content = <<~EOF
|
43
43
|
%div{ class: "foo1" }
|
44
44
|
.div{ class: "foo2" }
|
@@ -48,7 +48,7 @@ module RailsBestPractices
|
|
48
48
|
expect(runner.errors.size).to eq(0)
|
49
49
|
end
|
50
50
|
|
51
|
-
it '
|
51
|
+
it 'does not consider hash with array key' do
|
52
52
|
content = <<-EOF
|
53
53
|
transition [:unverified, :verified] => :deleted
|
54
54
|
EOF
|
@@ -56,7 +56,7 @@ module RailsBestPractices
|
|
56
56
|
expect(runner.errors.size).to eq(0)
|
57
57
|
end
|
58
58
|
|
59
|
-
it '
|
59
|
+
it 'does not consider hash with charaters not valid for symbol' do
|
60
60
|
content = <<-EOF
|
61
61
|
receiver.stub(:` => 'Error')
|
62
62
|
EOF
|
@@ -64,8 +64,8 @@ module RailsBestPractices
|
|
64
64
|
expect(runner.errors.size).to eq(0)
|
65
65
|
end
|
66
66
|
|
67
|
-
it '
|
68
|
-
runner = Core::Runner.new(reviews:
|
67
|
+
it 'does not check ignored files' do
|
68
|
+
runner = Core::Runner.new(reviews: described_class.new(ignored_files: /user/))
|
69
69
|
content = <<-EOF
|
70
70
|
class User < ActiveRecord::Base
|
71
71
|
CONST = { :foo => :bar }
|
@@ -5,10 +5,10 @@ require 'spec_helper'
|
|
5
5
|
module RailsBestPractices
|
6
6
|
module Reviews
|
7
7
|
describe IsolateSeedDataReview do
|
8
|
-
let(:runner) { Core::Runner.new(reviews:
|
8
|
+
let(:runner) { Core::Runner.new(reviews: described_class.new) }
|
9
9
|
|
10
10
|
context 'create' do
|
11
|
-
it '
|
11
|
+
it 'isolates seed data' do
|
12
12
|
content = <<-EOF
|
13
13
|
class CreateRoles < ActiveRecord::Migration
|
14
14
|
def self.up
|
@@ -33,7 +33,7 @@ module RailsBestPractices
|
|
33
33
|
end
|
34
34
|
|
35
35
|
context 'new and save' do
|
36
|
-
it '
|
36
|
+
it 'isolates seed data for local variable' do
|
37
37
|
content = <<-EOF
|
38
38
|
class CreateRoles < ActiveRecord::Migration
|
39
39
|
def self.up
|
@@ -57,7 +57,7 @@ module RailsBestPractices
|
|
57
57
|
expect(runner.errors[0].to_s).to eq('db/migrate/20090818130258_create_roles.rb:9 - isolate seed data')
|
58
58
|
end
|
59
59
|
|
60
|
-
it '
|
60
|
+
it 'isolates seed data for instance variable' do
|
61
61
|
content = <<-EOF
|
62
62
|
class CreateRoles < ActiveRecord::Migration
|
63
63
|
def self.up
|
@@ -82,7 +82,7 @@ module RailsBestPractices
|
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
85
|
-
it '
|
85
|
+
it 'does not isolate seed data without data insert' do
|
86
86
|
content = <<-EOF
|
87
87
|
class CreateRoles < ActiveRecord::Migration
|
88
88
|
def self.up
|
@@ -100,8 +100,8 @@ module RailsBestPractices
|
|
100
100
|
expect(runner.errors.size).to eq(0)
|
101
101
|
end
|
102
102
|
|
103
|
-
it '
|
104
|
-
runner = Core::Runner.new(reviews:
|
103
|
+
it 'does not check ignored files' do
|
104
|
+
runner = Core::Runner.new(reviews: described_class.new(ignored_files: /create_roles/))
|
105
105
|
content = <<-EOF
|
106
106
|
class CreateRoles < ActiveRecord::Migration
|
107
107
|
def self.up
|