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.
- data/.travis.yml +4 -1
- data/Gemfile +0 -3
- data/Gemfile.lock +10 -9
- data/README.md +2 -0
- data/lib/rails_best_practices/analyzer.rb +40 -21
- data/lib/rails_best_practices/core.rb +1 -0
- data/lib/rails_best_practices/core/check.rb +12 -0
- data/lib/rails_best_practices/core/configs.rb +7 -0
- data/lib/rails_best_practices/core/error.rb +2 -1
- data/lib/rails_best_practices/core/routes.rb +11 -5
- data/lib/rails_best_practices/core/runner.rb +6 -2
- data/lib/rails_best_practices/core_ext/sexp.rb +3 -1
- data/lib/rails_best_practices/prepares.rb +5 -0
- data/lib/rails_best_practices/prepares/config_prepare.rb +21 -0
- data/lib/rails_best_practices/prepares/route_prepare.rb +24 -7
- data/lib/rails_best_practices/reviews/protect_mass_assignment_review.rb +11 -3
- data/lib/rails_best_practices/reviews/remove_unused_methods_in_models_review.rb +7 -3
- data/lib/rails_best_practices/version.rb +1 -1
- data/rails_best_practices.gemspec +1 -0
- data/spec/rails_best_practices/analyzer_spec.rb +52 -32
- data/spec/rails_best_practices/core/check_spec.rb +64 -45
- data/spec/rails_best_practices/core/checking_visitor_spec.rb +65 -64
- data/spec/rails_best_practices/core/configs_spec.rb +7 -0
- data/spec/rails_best_practices/core/controllers_spec.rb +4 -2
- data/spec/rails_best_practices/core/error_spec.rb +28 -22
- data/spec/rails_best_practices/core/helpers_spec.rb +4 -2
- data/spec/rails_best_practices/core/klasses_spec.rb +8 -6
- data/spec/rails_best_practices/core/mailers_spec.rb +4 -2
- data/spec/rails_best_practices/core/methods_spec.rb +37 -35
- data/spec/rails_best_practices/core/model_associations_spec.rb +17 -15
- data/spec/rails_best_practices/core/model_attributes_spec.rb +17 -15
- data/spec/rails_best_practices/core/models_spec.rb +4 -2
- data/spec/rails_best_practices/core/modules_spec.rb +21 -19
- data/spec/rails_best_practices/core/nil_spec.rb +23 -21
- data/spec/rails_best_practices/core/routes_spec.rb +21 -14
- data/spec/rails_best_practices/core/runner_spec.rb +17 -15
- data/spec/rails_best_practices/core_ext/sexp_spec.rb +32 -7
- data/spec/rails_best_practices/lexicals/remove_tab_check_spec.rb +35 -31
- data/spec/rails_best_practices/lexicals/remove_trailing_whitespace_check_spec.rb +35 -31
- data/spec/rails_best_practices/prepares/config_prepare_spec.rb +24 -0
- data/spec/rails_best_practices/prepares/controller_prepare_spec.rb +122 -123
- data/spec/rails_best_practices/prepares/helper_prepare_spec.rb +36 -32
- data/spec/rails_best_practices/prepares/mailer_prepare_spec.rb +12 -8
- data/spec/rails_best_practices/prepares/model_prepare_spec.rb +326 -322
- data/spec/rails_best_practices/prepares/route_prepare_spec.rb +619 -573
- data/spec/rails_best_practices/prepares/schema_prepare_spec.rb +25 -21
- data/spec/rails_best_practices/reviews/add_model_virtual_attribute_review_spec.rb +85 -87
- data/spec/rails_best_practices/reviews/always_add_db_index_review_spec.rb +224 -222
- data/spec/rails_best_practices/reviews/dry_bundler_in_capistrano_review_spec.rb +30 -26
- data/spec/rails_best_practices/reviews/isolate_seed_data_review_spec.rb +79 -75
- data/spec/rails_best_practices/reviews/keep_finders_on_their_own_model_review_spec.rb +76 -72
- data/spec/rails_best_practices/reviews/law_of_demeter_review_spec.rb +138 -140
- data/spec/rails_best_practices/reviews/move_code_into_controller_review_spec.rb +38 -34
- data/spec/rails_best_practices/reviews/move_code_into_helper_review_spec.rb +22 -18
- data/spec/rails_best_practices/reviews/move_code_into_model_review_spec.rb +57 -53
- data/spec/rails_best_practices/reviews/move_finder_to_named_scope_review_spec.rb +62 -63
- data/spec/rails_best_practices/reviews/move_model_logic_into_model_review_spec.rb +51 -50
- data/spec/rails_best_practices/reviews/needless_deep_nesting_review_spec.rb +140 -136
- data/spec/rails_best_practices/reviews/not_use_default_route_review_spec.rb +48 -44
- data/spec/rails_best_practices/reviews/not_use_times_ago_in_words_review_spec.rb +42 -38
- data/spec/rails_best_practices/reviews/overuse_route_customizations_review_spec.rb +151 -149
- data/spec/rails_best_practices/reviews/protect_mass_assignment_review_spec.rb +86 -55
- data/spec/rails_best_practices/reviews/remove_empty_helpers_review_spec.rb +23 -19
- data/spec/rails_best_practices/reviews/remove_unused_methods_in_controllers_review_spec.rb +290 -286
- data/spec/rails_best_practices/reviews/remove_unused_methods_in_helpers_review_spec.rb +76 -72
- data/spec/rails_best_practices/reviews/remove_unused_methods_in_models_review_spec.rb +601 -597
- data/spec/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review_spec.rb +55 -54
- data/spec/rails_best_practices/reviews/replace_instance_variable_with_local_variable_review_spec.rb +34 -30
- data/spec/rails_best_practices/reviews/restrict_auto_generated_routes_review_spec.rb +288 -289
- data/spec/rails_best_practices/reviews/simplify_render_in_controllers_review_spec.rb +59 -55
- data/spec/rails_best_practices/reviews/simplify_render_in_views_review_spec.rb +73 -69
- data/spec/rails_best_practices/reviews/use_before_filter_review_spec.rb +89 -98
- data/spec/rails_best_practices/reviews/use_model_association_review_spec.rb +52 -52
- data/spec/rails_best_practices/reviews/use_multipart_alternative_as_content_type_of_email_review_spec.rb +192 -190
- data/spec/rails_best_practices/reviews/use_observer_review_spec.rb +114 -121
- data/spec/rails_best_practices/reviews/use_query_attribute_review_spec.rb +189 -190
- data/spec/rails_best_practices/reviews/use_say_with_time_in_migrations_review_spec.rb +97 -93
- data/spec/rails_best_practices/reviews/use_scope_access_review_spec.rb +146 -151
- data/spec/spec_helper.rb +11 -20
- metadata +42 -26
- data/.watchr.example +0 -65
@@ -1,35 +1,39 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
module RailsBestPractices
|
4
|
+
module Reviews
|
5
|
+
describe DryBundlerInCapistranoReview do
|
6
|
+
let(:runner) { runner = Core::Runner.new(:reviews => DryBundlerInCapistranoReview.new) }
|
5
7
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
8
|
+
it "should dry bundler in capistrno" do
|
9
|
+
content = <<-EOF
|
10
|
+
namespace :bundler do
|
11
|
+
task :create_symlink, :roles => :app do
|
12
|
+
shared_dir = File.join(shared_path, 'bundle')
|
13
|
+
release_dir = File.join(current_release, '.bundle')
|
14
|
+
run("mkdir -p \#{shared_dir} && ln -s \#{shared_dir} \#{release_dir}")
|
15
|
+
end
|
16
|
+
|
17
|
+
task :bundle_new_release, :roles => :app do
|
18
|
+
bundler.create_symlink
|
19
|
+
run "cd \#{release_path} && bundle install --without development test"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
after 'deploy:update_code', 'bundler:bundle_new_release'
|
24
|
+
EOF
|
25
|
+
runner.review('config/deploy.rb', content)
|
26
|
+
runner.should have(1).errors
|
27
|
+
runner.errors[0].to_s.should == "config/deploy.rb:1 - dry bundler in capistrano"
|
13
28
|
end
|
14
29
|
|
15
|
-
|
16
|
-
|
17
|
-
|
30
|
+
it "should not dry bundler in capistrano" do
|
31
|
+
content = <<-EOF
|
32
|
+
require 'bundler/capistrano'
|
33
|
+
EOF
|
34
|
+
runner.review('config/deploy.rb', content)
|
35
|
+
runner.should have(0).errors
|
18
36
|
end
|
19
37
|
end
|
20
|
-
|
21
|
-
after 'deploy:update_code', 'bundler:bundle_new_release'
|
22
|
-
EOF
|
23
|
-
runner.review('config/deploy.rb', content)
|
24
|
-
runner.should have(1).errors
|
25
|
-
runner.errors[0].to_s.should == "config/deploy.rb:1 - dry bundler in capistrano"
|
26
|
-
end
|
27
|
-
|
28
|
-
it "should not dry bundler in capistrano" do
|
29
|
-
content = <<-EOF
|
30
|
-
require 'bundler/capistrano'
|
31
|
-
EOF
|
32
|
-
runner.review('config/deploy.rb', content)
|
33
|
-
runner.should have(0).errors
|
34
38
|
end
|
35
39
|
end
|
@@ -1,98 +1,102 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
module RailsBestPractices
|
4
|
+
module Reviews
|
5
|
+
describe IsolateSeedDataReview do
|
6
|
+
let(:runner) { Core::Runner.new(:reviews => IsolateSeedDataReview.new) }
|
5
7
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
8
|
+
context "create" do
|
9
|
+
it "should isolate seed data" do
|
10
|
+
content = <<-EOF
|
11
|
+
class CreateRoles < ActiveRecord::Migration
|
12
|
+
def self.up
|
13
|
+
create_table "roles", :force => true do |t|
|
14
|
+
t.string :name
|
15
|
+
end
|
14
16
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
17
|
+
["admin", "author", "editor", "account"].each do |name|
|
18
|
+
Role.create!(:name => name)
|
19
|
+
end
|
20
|
+
end
|
19
21
|
|
20
|
-
|
21
|
-
|
22
|
+
def self.down
|
23
|
+
drop_table "roles"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
EOF
|
27
|
+
runner.review('db/migrate/20090818130258_create_roles.rb', content)
|
28
|
+
runner.should have(1).errors
|
29
|
+
runner.errors[0].to_s.should == "db/migrate/20090818130258_create_roles.rb:8 - isolate seed data"
|
22
30
|
end
|
23
31
|
end
|
24
|
-
EOF
|
25
|
-
runner.review('db/migrate/20090818130258_create_roles.rb', content)
|
26
|
-
runner.should have(1).errors
|
27
|
-
runner.errors[0].to_s.should == "db/migrate/20090818130258_create_roles.rb:8 - isolate seed data"
|
28
|
-
end
|
29
|
-
end
|
30
32
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
33
|
+
context "new and save" do
|
34
|
+
it "should isolate seed data for local variable" do
|
35
|
+
content = <<-EOF
|
36
|
+
class CreateRoles < ActiveRecord::Migration
|
37
|
+
def self.up
|
38
|
+
create_table "roles", :force => true do |t|
|
39
|
+
t.string :name
|
40
|
+
end
|
41
|
+
|
42
|
+
["admin", "author", "editor", "account"].each do |name|
|
43
|
+
role = Role.new(:name => name)
|
44
|
+
role.save!
|
45
|
+
end
|
46
|
+
end
|
39
47
|
|
40
|
-
|
41
|
-
|
42
|
-
|
48
|
+
def self.down
|
49
|
+
drop_table "roles"
|
50
|
+
end
|
43
51
|
end
|
52
|
+
EOF
|
53
|
+
runner.review('db/migrate/20090818130258_create_roles.rb', content)
|
54
|
+
runner.should have(1).errors
|
55
|
+
runner.errors[0].to_s.should == "db/migrate/20090818130258_create_roles.rb:9 - isolate seed data"
|
44
56
|
end
|
45
57
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
runner.errors[0].to_s.should == "db/migrate/20090818130258_create_roles.rb:9 - isolate seed data"
|
54
|
-
end
|
58
|
+
it "should isolate seed data for instance variable" do
|
59
|
+
content = <<-EOF
|
60
|
+
class CreateRoles < ActiveRecord::Migration
|
61
|
+
def self.up
|
62
|
+
create_table "roles", :force => true do |t|
|
63
|
+
t.string :name
|
64
|
+
end
|
55
65
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
t.string :name
|
62
|
-
end
|
66
|
+
["admin", "author", "editor", "account"].each do |name|
|
67
|
+
@role = Role.new(:name => name)
|
68
|
+
@role.save!
|
69
|
+
end
|
70
|
+
end
|
63
71
|
|
64
|
-
|
65
|
-
|
66
|
-
|
72
|
+
def self.down
|
73
|
+
drop_table "roles"
|
74
|
+
end
|
67
75
|
end
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
76
|
+
EOF
|
77
|
+
runner.review('db/migrate/20090818130258_create_roles.rb', content)
|
78
|
+
runner.should have(1).errors
|
79
|
+
runner.errors[0].to_s.should == "db/migrate/20090818130258_create_roles.rb:9 - isolate seed data"
|
72
80
|
end
|
73
81
|
end
|
74
|
-
EOF
|
75
|
-
runner.review('db/migrate/20090818130258_create_roles.rb', content)
|
76
|
-
runner.should have(1).errors
|
77
|
-
runner.errors[0].to_s.should == "db/migrate/20090818130258_create_roles.rb:9 - isolate seed data"
|
78
|
-
end
|
79
|
-
end
|
80
82
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
83
|
+
it "should not isolate seed data without data insert" do
|
84
|
+
content = <<-EOF
|
85
|
+
class CreateRoles < ActiveRecord::Migration
|
86
|
+
def self.up
|
87
|
+
create_table "roles", :force => true do |t|
|
88
|
+
t.string :name
|
89
|
+
end
|
90
|
+
end
|
89
91
|
|
90
|
-
|
91
|
-
|
92
|
+
def self.down
|
93
|
+
drop_table "roles"
|
94
|
+
end
|
95
|
+
end
|
96
|
+
EOF
|
97
|
+
runner.review('db/migrate/20090818130258_create_roles.rb', content)
|
98
|
+
runner.should have(0).errors
|
92
99
|
end
|
93
100
|
end
|
94
|
-
EOF
|
95
|
-
runner.review('db/migrate/20090818130258_create_roles.rb', content)
|
96
|
-
runner.should have(0).errors
|
97
101
|
end
|
98
102
|
end
|
@@ -1,95 +1,99 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
module RailsBestPractices
|
4
|
+
module Reviews
|
5
|
+
describe KeepFindersOnTheirOwnModelReview do
|
6
|
+
let(:runner) { Core::Runner.new(:reviews => KeepFindersOnTheirOwnModelReview.new) }
|
5
7
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
8
|
+
it "should keep finders on thier own model" do
|
9
|
+
content = <<-EOF
|
10
|
+
class Post < ActiveRecord::Base
|
11
|
+
has_many :comments
|
10
12
|
|
11
|
-
|
12
|
-
|
13
|
-
|
13
|
+
def find_valid_comments
|
14
|
+
self.comment.find(:all, :conditions => { :is_spam => false },
|
15
|
+
:limit => 10)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
EOF
|
19
|
+
runner.review('app/models/post.rb', content)
|
20
|
+
runner.should have(1).errors
|
21
|
+
runner.errors[0].to_s.should == "app/models/post.rb:5 - keep finders on their own model"
|
14
22
|
end
|
15
|
-
end
|
16
|
-
EOF
|
17
|
-
runner.review('app/models/post.rb', content)
|
18
|
-
runner.should have(1).errors
|
19
|
-
runner.errors[0].to_s.should == "app/models/post.rb:5 - keep finders on their own model"
|
20
|
-
end
|
21
23
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
24
|
+
it "should keep finders on thier own model with all method" do
|
25
|
+
content = <<-EOF
|
26
|
+
class Post < ActiveRecord::Base
|
27
|
+
has_many :comments
|
26
28
|
|
27
|
-
|
28
|
-
|
29
|
-
|
29
|
+
def find_valid_comments
|
30
|
+
self.comment.all(:conditions => { :is_spam => false },
|
31
|
+
:limit => 10)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
EOF
|
35
|
+
runner.review('app/models/post.rb', content)
|
36
|
+
runner.should have(1).errors
|
37
|
+
runner.errors[0].to_s.should == "app/models/post.rb:5 - keep finders on their own model"
|
30
38
|
end
|
31
|
-
end
|
32
|
-
EOF
|
33
|
-
runner.review('app/models/post.rb', content)
|
34
|
-
runner.should have(1).errors
|
35
|
-
runner.errors[0].to_s.should == "app/models/post.rb:5 - keep finders on their own model"
|
36
|
-
end
|
37
39
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
40
|
+
it "should not keep finders on thier own model with self finder" do
|
41
|
+
content = <<-EOF
|
42
|
+
class Post < ActiveRecord::Base
|
43
|
+
has_many :comments
|
42
44
|
|
43
|
-
|
44
|
-
|
45
|
-
|
45
|
+
def find_valid_comments
|
46
|
+
self.find(:all, :conditions => { :is_spam => false },
|
47
|
+
:limit => 10)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
EOF
|
51
|
+
runner.review('app/models/post.rb', content)
|
52
|
+
runner.should have(0).errors
|
46
53
|
end
|
47
|
-
end
|
48
|
-
EOF
|
49
|
-
runner.review('app/models/post.rb', content)
|
50
|
-
runner.should have(0).errors
|
51
|
-
end
|
52
54
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
55
|
+
it "should not keep finders on thier own model with own finder" do
|
56
|
+
content = <<-EOF
|
57
|
+
class Post < ActiveRecord::Base
|
58
|
+
has_many :comments
|
57
59
|
|
58
|
-
|
59
|
-
|
60
|
-
|
60
|
+
def find_valid_comments
|
61
|
+
Post.find(:all, :conditions => { :is_spam => false },
|
62
|
+
:limit => 10)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
EOF
|
66
|
+
runner.review('app/models/post.rb', content)
|
67
|
+
runner.should have(0).errors
|
61
68
|
end
|
62
|
-
end
|
63
|
-
EOF
|
64
|
-
runner.review('app/models/post.rb', content)
|
65
|
-
runner.should have(0).errors
|
66
|
-
end
|
67
69
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
70
|
+
it "should not keep finders on their own model without finder" do
|
71
|
+
content = <<-EOF
|
72
|
+
class Post < ActiveRecord::Base
|
73
|
+
has_many :comments
|
72
74
|
|
73
|
-
|
74
|
-
|
75
|
+
def find_valid_comments
|
76
|
+
self.comments.destroy_all
|
77
|
+
end
|
78
|
+
end
|
79
|
+
EOF
|
80
|
+
runner.review('app/models/post.rb', content)
|
81
|
+
runner.should have(0).errors
|
75
82
|
end
|
76
|
-
end
|
77
|
-
EOF
|
78
|
-
runner.review('app/models/post.rb', content)
|
79
|
-
runner.should have(0).errors
|
80
|
-
end
|
81
83
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
84
|
+
it "should not keep finders on their own model with ruby Array#find" do
|
85
|
+
content = <<-EOF
|
86
|
+
class Post < ActiveRecord::Base
|
87
|
+
has_many :comments
|
86
88
|
|
87
|
-
|
88
|
-
|
89
|
+
def active_comments
|
90
|
+
self.comments.find {|comment| comment.status == 'active'}
|
91
|
+
end
|
92
|
+
end
|
93
|
+
EOF
|
94
|
+
runner.review('app/models/post.rb', content)
|
95
|
+
runner.should have(0).errors
|
89
96
|
end
|
90
97
|
end
|
91
|
-
EOF
|
92
|
-
runner.review('app/models/post.rb', content)
|
93
|
-
runner.should have(0).errors
|
94
98
|
end
|
95
99
|
end
|
@@ -1,167 +1,165 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
3
|
+
module RailsBestPractices
|
4
|
+
module Reviews
|
5
|
+
describe LawOfDemeterReview do
|
6
|
+
let(:runner) { Core::Runner.new(:prepares => [Prepares::ModelPrepare.new, Prepares::SchemaPrepare.new], :reviews => LawOfDemeterReview.new) }
|
7
|
+
|
8
|
+
describe "belongs_to" do
|
9
|
+
before(:each) do
|
10
|
+
content = <<-EOF
|
11
|
+
class Invoice < ActiveRecord::Base
|
12
|
+
belongs_to :user
|
13
|
+
end
|
14
|
+
EOF
|
15
|
+
runner.prepare('app/models/invoice.rb', content)
|
16
|
+
|
17
|
+
content = <<-EOF
|
18
|
+
ActiveRecord::Schema.define(:version => 20110216150853) do
|
19
|
+
create_table "users", force => true do |t|
|
20
|
+
t.string :name
|
21
|
+
t.string :address
|
22
|
+
t.string :cellphone
|
23
|
+
end
|
24
|
+
end
|
25
|
+
EOF
|
26
|
+
runner.prepare('db/schema.rb', content)
|
27
27
|
end
|
28
|
-
end
|
29
|
-
EOF
|
30
|
-
runner.prepare('db/schema.rb', content)
|
31
|
-
end
|
32
28
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
29
|
+
it "should law of demeter with erb" do
|
30
|
+
content = <<-EOF
|
31
|
+
<%= @invoice.user.name %>
|
32
|
+
<%= @invoice.user.address %>
|
33
|
+
<%= @invoice.user.cellphone %>
|
34
|
+
EOF
|
35
|
+
runner.review('app/views/invoices/show.html.erb', content)
|
36
|
+
runner.should have(3).errors
|
37
|
+
runner.errors[0].to_s.should == "app/views/invoices/show.html.erb:1 - law of demeter"
|
38
|
+
end
|
43
39
|
|
44
|
-
|
45
|
-
|
40
|
+
it "should law of demeter with haml" do
|
41
|
+
content = <<-EOF
|
46
42
|
= @invoice.user.name
|
47
43
|
= @invoice.user.address
|
48
44
|
= @invoice.user.cellphone
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
45
|
+
EOF
|
46
|
+
runner.review('app/views/invoices/show.html.haml', content)
|
47
|
+
runner.should have(3).errors
|
48
|
+
runner.errors[0].to_s.should == "app/views/invoices/show.html.haml:1 - law of demeter"
|
49
|
+
end
|
54
50
|
|
55
|
-
|
56
|
-
|
51
|
+
it "should law of demeter with slim" do
|
52
|
+
content = <<-EOF
|
57
53
|
= @invoice.user.name
|
58
54
|
= @invoice.user.address
|
59
55
|
= @invoice.user.cellphone
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
it "should no law of demeter" do
|
67
|
-
content = <<-EOF
|
68
|
-
<%= @invoice.user_name %>
|
69
|
-
<%= @invoice.user_address %>
|
70
|
-
<%= @invoice.user_cellphone %>
|
71
|
-
EOF
|
72
|
-
runner.review('app/views/invoices/show.html.erb', content)
|
73
|
-
runner.should have(0).errors
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
describe "has_one" do
|
78
|
-
before(:each) do
|
79
|
-
content = <<-EOF
|
80
|
-
class Invoice < ActiveRecord::Base
|
81
|
-
has_one :price
|
82
|
-
end
|
83
|
-
EOF
|
84
|
-
runner.prepare('app/models/invoice.rb', content)
|
56
|
+
EOF
|
57
|
+
runner.review('app/views/invoices/show.html.slim', content)
|
58
|
+
runner.should have(3).errors
|
59
|
+
runner.errors[0].to_s.should == "app/views/invoices/show.html.slim:1 - law of demeter"
|
60
|
+
end
|
85
61
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
62
|
+
it "should no law of demeter" do
|
63
|
+
content = <<-EOF
|
64
|
+
<%= @invoice.user_name %>
|
65
|
+
<%= @invoice.user_address %>
|
66
|
+
<%= @invoice.user_cellphone %>
|
67
|
+
EOF
|
68
|
+
runner.review('app/views/invoices/show.html.erb', content)
|
69
|
+
runner.should have(0).errors
|
91
70
|
end
|
92
71
|
end
|
93
|
-
EOF
|
94
|
-
runner.prepare('db/schema.rb', content)
|
95
|
-
end
|
96
72
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
73
|
+
describe "has_one" do
|
74
|
+
before(:each) do
|
75
|
+
content = <<-EOF
|
76
|
+
class Invoice < ActiveRecord::Base
|
77
|
+
has_one :price
|
78
|
+
end
|
79
|
+
EOF
|
80
|
+
runner.prepare('app/models/invoice.rb', content)
|
81
|
+
|
82
|
+
content = <<-EOF
|
83
|
+
ActiveRecord::Schema.define(:version => 20110216150853) do
|
84
|
+
create_table "prices", force => true do |t|
|
85
|
+
t.string :currency
|
86
|
+
t.integer :number
|
87
|
+
end
|
88
|
+
end
|
89
|
+
EOF
|
90
|
+
runner.prepare('db/schema.rb', content)
|
91
|
+
end
|
107
92
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
93
|
+
it "should law of demeter" do
|
94
|
+
content = <<-EOF
|
95
|
+
<%= @invoice.price.currency %>
|
96
|
+
<%= @invoice.price.number %>
|
97
|
+
EOF
|
98
|
+
runner.review('app/views/invoices/show.html.erb', content)
|
99
|
+
runner.should have(2).errors
|
100
|
+
runner.errors[0].to_s.should == "app/views/invoices/show.html.erb:1 - law of demeter"
|
101
|
+
end
|
113
102
|
end
|
114
|
-
EOF
|
115
|
-
runner.prepare('app/models/comment.rb', content)
|
116
103
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
104
|
+
context "polymorphic association" do
|
105
|
+
before :each do
|
106
|
+
content = <<-EOF
|
107
|
+
class Comment < ActiveRecord::Base
|
108
|
+
belongs_to :commentable, :polymorphic => true
|
109
|
+
end
|
110
|
+
EOF
|
111
|
+
runner.prepare('app/models/comment.rb', content)
|
112
|
+
|
113
|
+
content = <<-EOF
|
114
|
+
class Post < ActiveRecord::Base
|
115
|
+
has_many :comments
|
116
|
+
end
|
117
|
+
EOF
|
118
|
+
runner.prepare('app/models/comment.rb', content)
|
119
|
+
|
120
|
+
content = <<-EOF
|
121
|
+
ActiveRecord::Schema.define(:version => 20110216150853) do
|
122
|
+
create_table "posts", force => true do |t|
|
123
|
+
t.string :title
|
124
|
+
end
|
125
|
+
end
|
126
|
+
EOF
|
127
|
+
runner.prepare('db/schema.rb', content)
|
128
|
+
end
|
123
129
|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
130
|
+
it "should law of demeter" do
|
131
|
+
content = <<-EOF
|
132
|
+
<%= @comment.commentable.title %>
|
133
|
+
EOF
|
134
|
+
runner.review('app/views/comments/index.html.erb', content)
|
135
|
+
runner.should have(1).errors
|
136
|
+
runner.errors[0].to_s.should == "app/views/comments/index.html.erb:1 - law of demeter"
|
128
137
|
end
|
129
138
|
end
|
130
|
-
EOF
|
131
|
-
runner.prepare('db/schema.rb', content)
|
132
|
-
end
|
133
139
|
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
runner.prepare('app/models/answer.rb', content)
|
157
|
-
content = <<-EOF
|
158
|
-
class CommentsController < ApplicationController
|
159
|
-
def comment_url
|
160
|
-
question_path(@answer.question)
|
140
|
+
it "should no law of demeter with method call" do
|
141
|
+
content = <<-EOF
|
142
|
+
class Question < ActiveRecord::Base
|
143
|
+
has_many :answers, :dependent => :destroy
|
144
|
+
end
|
145
|
+
EOF
|
146
|
+
runner.prepare('app/models/question.rb', content)
|
147
|
+
content = <<-EOF
|
148
|
+
class Answer < ActiveRecord::Base
|
149
|
+
belongs_to :question, :counter_cache => true, :touch => true
|
150
|
+
end
|
151
|
+
EOF
|
152
|
+
runner.prepare('app/models/answer.rb', content)
|
153
|
+
content = <<-EOF
|
154
|
+
class CommentsController < ApplicationController
|
155
|
+
def comment_url
|
156
|
+
question_path(@answer.question)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
EOF
|
160
|
+
runner.review('app/controllers/comments_controller.rb', content)
|
161
|
+
runner.should have(0).errors
|
161
162
|
end
|
162
163
|
end
|
163
|
-
EOF
|
164
|
-
runner.review('app/controllers/comments_controller.rb', content)
|
165
|
-
runner.should have(0).errors
|
166
164
|
end
|
167
165
|
end
|