rails_best_practices 1.13.5 → 1.13.8

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 (32) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.ruby-gemset +1 -0
  4. data/.ruby-version +1 -0
  5. data/lib/rails_best_practices/analyzer.rb +3 -2
  6. data/lib/rails_best_practices/command.rb +6 -1
  7. data/lib/rails_best_practices/core/check.rb +2 -1
  8. data/lib/rails_best_practices/core/gems.rb +21 -0
  9. data/lib/rails_best_practices/core/klasses.rb +1 -1
  10. data/lib/rails_best_practices/core/runner.rb +6 -3
  11. data/lib/rails_best_practices/lexicals/long_line_check.rb +2 -0
  12. data/lib/rails_best_practices/lexicals/remove_tab_check.rb +1 -0
  13. data/lib/rails_best_practices/lexicals/remove_trailing_whitespace_check.rb +1 -0
  14. data/lib/rails_best_practices/prepares/gemfile_prepare.rb +6 -6
  15. data/lib/rails_best_practices/prepares/initializer_prepare.rb +31 -0
  16. data/lib/rails_best_practices/prepares.rb +1 -0
  17. data/lib/rails_best_practices/reviews/protect_mass_assignment_review.rb +14 -0
  18. data/lib/rails_best_practices/reviews/remove_unused_methods_in_controllers_review.rb +8 -1
  19. data/lib/rails_best_practices/reviews/remove_unused_methods_in_models_review.rb +1 -1
  20. data/lib/rails_best_practices/reviews/restrict_auto_generated_routes_review.rb +16 -40
  21. data/lib/rails_best_practices/reviews/use_turbo_sprockets_rails3_review.rb +1 -1
  22. data/lib/rails_best_practices/version.rb +1 -1
  23. data/spec/rails_best_practices/core/gems_spec.rb +22 -0
  24. data/spec/rails_best_practices/prepares/gemfile_prepare_spec.rb +17 -5
  25. data/spec/rails_best_practices/prepares/initializer_prepare_spec.rb +32 -0
  26. data/spec/rails_best_practices/reviews/protect_mass_assignment_review_spec.rb +60 -8
  27. data/spec/rails_best_practices/reviews/remove_unused_methods_in_controllers_review_spec.rb +29 -0
  28. data/spec/rails_best_practices/reviews/restrict_auto_generated_routes_review_spec.rb +9 -9
  29. data/spec/rails_best_practices/reviews/use_turbo_sprockets_rails3_review_spec.rb +15 -7
  30. metadata +7 -4
  31. data/.coveralls.yml +0 -1
  32. data/.rvmrc +0 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c85e47e8a7e3168810ac545ece3d4dd9074c8325
4
- data.tar.gz: 969e22d76e6815743f3971e61d495c875f37d4fc
3
+ metadata.gz: 0bd66b9f885d3de24877f8f671c8caa7ec05a0de
4
+ data.tar.gz: 4c82581c64139d752d9205689a5c0c805735d7fe
5
5
  SHA512:
6
- metadata.gz: 4501aedb47b7c816495cda8936edd10a86d1f5025ac0dca814620d7a6cfedc7f7d3265540492d5fecdf332cd7e3cee908c08f5e1bef7b69b2d691e42acdb4c6f
7
- data.tar.gz: d481948983897dc84fe224e4d2cea953123b9ad3838c0e0c619c24e93a78fe7c3973b68911871bbfaac95b06038f54a3db42a95efd2b2e435b59c617847cadcb
6
+ metadata.gz: cc478b2544c16dd600bd97c126567638429bf16d3781e15123128e2e7381303019a795c15af8a05821d52d4619beae550c98b18bb6ae1b3c2013d8c126efa800
7
+ data.tar.gz: 0ea6abf20e3c61a99c42c4ebd311bc4b31f5eaa5055d07cfce79c7fdda8cd8ed866c8d34414837b9c050cf948c9cfbf8c19d981a7ae0e55b135a339b8129d476
data/.gitignore CHANGED
@@ -9,3 +9,4 @@ doc/**
9
9
  .yardoc/**
10
10
  rails_best_practices_output.*
11
11
  coverage/
12
+ .coveralls.yml
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ rails_best_practices
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ ruby-2.0.0
@@ -116,8 +116,9 @@ module RailsBestPractices
116
116
  files = file_ignore(files, pattern)
117
117
  end
118
118
 
119
- files.unshift File.join(@path, "Capfile")
120
- files.unshift File.join(@path, "Gemfile")
119
+ %w(Capfile Gemfile Gemfile.lock).each do |file|
120
+ files.unshift File.join(@path, file)
121
+ end
121
122
 
122
123
  files.compact
123
124
  end
@@ -44,7 +44,7 @@ OptionParser.new do |opts|
44
44
  opts.on("--with-textmate", "open file by textmate in html format") do
45
45
  options["with-textmate"] = true
46
46
  end
47
-
47
+
48
48
  opts.on("--with-sublime", "open file by sublime in html format") do
49
49
  options["with-sublime"] = true
50
50
  end
@@ -122,6 +122,11 @@ OptionParser.new do |opts|
122
122
  opts.parse!
123
123
  end
124
124
 
125
+ if ARGV.size > 0 && !File.exists?(ARGV.first)
126
+ puts "#{ARGV.first} doesn't exist"
127
+ exit 1
128
+ end
129
+
125
130
  if options["generate"]
126
131
  RailsBestPractices::Analyzer.new(ARGV.first).generate
127
132
  else
@@ -15,8 +15,9 @@ module RailsBestPractices
15
15
  HELPER_FILES = /app\/helpers\/.*\.rb$/
16
16
  DEPLOY_FILES = /config\/deploy.*\.rb/
17
17
  CONFIG_FILES = /config\/(application|environment|environments\/.*)\.rb/
18
+ INITIALIZER_FILES = /config\/initializers\/.*\.rb/
18
19
  CAPFILE = /Capfile/
19
- GEMFILE = /Gemfile/
20
+ GEMFILE_LOCK = /Gemfile\.lock/
20
21
 
21
22
  SKIP_FILES = /db\/schema.rb/
22
23
 
@@ -2,6 +2,27 @@
2
2
  module RailsBestPractices
3
3
  module Core
4
4
  class Gems < Array
5
+ def has_gem?(gem_name)
6
+ self.find { |gem| gem.name == gem_name }
7
+ end
8
+
9
+ def gem_version(gem_name)
10
+ self.find { |gem| gem.name == gem_name }.try(:version)
11
+ end
12
+ end
13
+
14
+ # Gem info includes gem name and gem version
15
+ class Gem
16
+ attr_reader :name, :version
17
+
18
+ def initialize(name, version)
19
+ @name = name
20
+ @version = version
21
+ end
22
+
23
+ def to_s
24
+ "#{@name} (#{@version})"
25
+ end
5
26
  end
6
27
  end
7
28
  end
@@ -12,7 +12,7 @@ module RailsBestPractices
12
12
  end
13
13
  end
14
14
 
15
- # Class info includes clas name, extend class name and module names.
15
+ # Class info includes class name, extend class name and module names.
16
16
  class Klass
17
17
  attr_reader :class_name, :extend_class_name
18
18
 
@@ -49,7 +49,8 @@ module RailsBestPractices
49
49
  load_plugin_reviews if reviews.empty?
50
50
 
51
51
  @lexical_checker ||= CodeAnalyzer::CheckingVisitor::Plain.new(checkers: @lexicals)
52
- @prepare_checker ||= CodeAnalyzer::CheckingVisitor::Default.new(checkers: @prepares)
52
+ @plain_prepare_checker ||= CodeAnalyzer::CheckingVisitor::Plain.new(checkers: @prepares.select { |checker| checker.is_a? Prepares::GemfilePrepare })
53
+ @default_prepare_checker ||= CodeAnalyzer::CheckingVisitor::Default.new(checkers: @prepares.select { |checker| !checker.is_a? Prepares::GemfilePrepare })
53
54
  @review_checker ||= CodeAnalyzer::CheckingVisitor::Default.new(checkers: @reviews)
54
55
  end
55
56
 
@@ -70,11 +71,13 @@ module RailsBestPractices
70
71
  # @param [String] filename of the file
71
72
  # @param [String] content of the file
72
73
  def prepare(filename, content)
73
- @prepare_checker.check(filename, content)
74
+ @plain_prepare_checker.check(filename, content)
75
+ @default_prepare_checker.check(filename, content)
74
76
  end
75
77
 
76
78
  def after_prepare
77
- @prepare_checker.after_check
79
+ @plain_prepare_checker.after_check
80
+ @default_prepare_checker.after_check
78
81
  end
79
82
 
80
83
  # review the file.
@@ -5,6 +5,8 @@ module RailsBestPractices
5
5
  module Lexicals
6
6
  # Keep lines fewer than 80 characters.
7
7
  class LongLineCheck < Core::Check
8
+ interesting_files ALL_FILES
9
+
8
10
  def initialize(options = {})
9
11
  super()
10
12
  @max_line_length = options['max_line_length'] || 80
@@ -7,6 +7,7 @@ module RailsBestPractices
7
7
  #
8
8
  # See the best practice details here http://rails-bestpractices.com/posts/81-remove-tab
9
9
  class RemoveTabCheck < Core::Check
10
+ interesting_files ALL_FILES
10
11
  url "http://rails-bestpractices.com/posts/81-remove-tab"
11
12
 
12
13
  # check if the content of file contains a tab.
@@ -7,6 +7,7 @@ module RailsBestPractices
7
7
  #
8
8
  # See the best practice details here http://rails-bestpractices.com/posts/60-remove-trailing-whitespace
9
9
  class RemoveTrailingWhitespaceCheck < Core::Check
10
+ interesting_files ALL_FILES
10
11
  url "http://rails-bestpractices.com/posts/60-remove-trailing-whitespace"
11
12
 
12
13
  # check if the content of file contain a trailing whitespace.
@@ -5,17 +5,17 @@ module RailsBestPractices
5
5
  module Prepares
6
6
  # Remember all gems in Gemfile
7
7
  class GemfilePrepare < Core::Check
8
- interesting_nodes :command
9
- interesting_files GEMFILE
8
+ interesting_files GEMFILE_LOCK
10
9
 
11
10
  def initialize
12
11
  @gems = Prepares.gems
13
12
  end
14
13
 
15
- # Check all command nodes to get gem names.
16
- add_callback :start_command do |node|
17
- if "gem" == node.message.to_s
18
- @gems << node.arguments.to_s
14
+ def check(filename, content)
15
+ content.split("\n").each do |line|
16
+ if line =~ /([^ ]+) \((\d.*)\)/
17
+ @gems << Core::Gem.new($1, $2)
18
+ end
19
19
  end
20
20
  end
21
21
  end
@@ -0,0 +1,31 @@
1
+ # encoding: utf-8
2
+ require 'rails_best_practices/core/check'
3
+
4
+ module RailsBestPractices
5
+ module Prepares
6
+ # Check all initializers
7
+ class InitializerPrepare < Core::Check
8
+ interesting_nodes :method_add_arg, :class
9
+ interesting_files INITIALIZER_FILES
10
+
11
+ def initialize
12
+ @configs = Prepares.configs
13
+ end
14
+
15
+ # check if AR include ActiveModel::ForbiddenAttributesProtection
16
+ add_callback :start_method_add_arg do |node|
17
+ if include_forbidden_attributes_protection?(node)
18
+ @configs["railsbp.include_forbidden_attributes_protection"] = "true"
19
+ end
20
+ end
21
+
22
+ # check if the node is
23
+ # ActiveRecord::Base.send(:include, ActiveModel::ForbiddenAttributesProtection)
24
+ def include_forbidden_attributes_protection?(node)
25
+ "ActiveRecord::Base" == node.receiver.to_s &&
26
+ "send" == node.message.to_s &&
27
+ ["include", "ActiveModel::ForbiddenAttributesProtection"] == node.arguments.all.map(&:to_s)
28
+ end
29
+ end
30
+ end
31
+ end
@@ -7,6 +7,7 @@ require 'rails_best_practices/prepares/route_prepare'
7
7
  require 'rails_best_practices/prepares/helper_prepare'
8
8
  require 'rails_best_practices/prepares/config_prepare'
9
9
  require 'rails_best_practices/prepares/gemfile_prepare'
10
+ require 'rails_best_practices/prepares/initializer_prepare'
10
11
 
11
12
  module RailsBestPractices
12
13
  module Prepares
@@ -20,7 +20,9 @@ module RailsBestPractices
20
20
  # we treat it as mass assignment by default.
21
21
  add_callback :start_class do |node|
22
22
  @mass_assignement = true
23
+ check_rails_version
23
24
  check_whitelist_attributes_config
25
+ check_include_forbidden_attributes_protection_config
24
26
  end
25
27
 
26
28
  # check if it is ActiveRecord::Base subclass and
@@ -52,12 +54,24 @@ module RailsBestPractices
52
54
  end
53
55
 
54
56
  private
57
+ def check_rails_version
58
+ if Prepares.gems.gem_version("rails").to_i > 3
59
+ @mass_assignement = false
60
+ end
61
+ end
62
+
55
63
  def check_whitelist_attributes_config
56
64
  if "true" == Prepares.configs["config.active_record.whitelist_attributes"]
57
65
  @whitelist_attributes = true
58
66
  end
59
67
  end
60
68
 
69
+ def check_include_forbidden_attributes_protection_config
70
+ if "true" == Prepares.configs["railsbp.include_forbidden_attributes_protection"]
71
+ @mass_assignement = false
72
+ end
73
+ end
74
+
61
75
  def check_rails_builtin(node)
62
76
  if @whitelist_attributes && [node.to_s, node.message.to_s].any? { |str| %w(attr_accessible attr_protected).include? str }
63
77
  @mass_assignement = false
@@ -19,7 +19,7 @@ module RailsBestPractices
19
19
  include Exceptable
20
20
  include InheritedResourcesable
21
21
 
22
- interesting_nodes :class, :command, :method_add_arg
22
+ interesting_nodes :class, :command, :method_add_arg, :assign
23
23
  interesting_files CONTROLLER_FILES, VIEW_FILES, HELPER_FILES
24
24
 
25
25
  INHERITED_RESOURCES_METHODS = %w(resource collection begin_of_association_chain build_resource)
@@ -77,6 +77,13 @@ module RailsBestPractices
77
77
  end
78
78
  end
79
79
 
80
+ # mark assignment as used, like current_user = @user
81
+ add_callback :start_assign do |node|
82
+ if :var_field == node.left_value.sexp_type
83
+ call_method "#{node.left_value}=", current_class_name
84
+ end
85
+ end
86
+
80
87
  # get all unused methods at the end of review process.
81
88
  add_callback :after_check do
82
89
  @routes.each do |route|
@@ -98,7 +98,7 @@ module RailsBestPractices
98
98
  validate validate_each validate_on_create validate_on_update
99
99
  human_attribute_name
100
100
  assign_attributes
101
- to_xml to_json to_param
101
+ to_xml to_json as_json to_param
102
102
  before_save before_create before_update before_destroy after_save after_create
103
103
  after_update after_destroy after_find after_initialize
104
104
  method_missing
@@ -23,7 +23,6 @@ module RailsBestPractices
23
23
  RESOURCES_METHODS = RESOURCE_METHODS + ["index"]
24
24
 
25
25
  def initialize
26
- super
27
26
  @namespaces = []
28
27
  @resource_controllers = []
29
28
  end
@@ -77,26 +76,12 @@ module RailsBestPractices
77
76
  private
78
77
  # check resources call, if the routes generated by resources does not exist in the controller.
79
78
  def check_resources(node)
80
- controller_name = controller_name(node)
81
- return unless Prepares.controllers.include? controller_name
82
- resources_methods = resources_methods(node)
83
- unless resources_methods.all? { |meth| Prepares.controller_methods.has_method?(controller_name, meth) }
84
- prepared_method_names = Prepares.controller_methods.get_methods(controller_name).map(&:method_name)
85
- only_methods = (resources_methods & prepared_method_names).map { |meth| ":#{meth}" }.join(", ")
86
- add_error "restrict auto-generated routes #{friendly_route_name(node)} (only: [#{only_methods}])"
87
- end
79
+ _check(node, RESOURCES_METHODS)
88
80
  end
89
81
 
90
82
  # check resource call, if the routes generated by resources does not exist in the controller.
91
83
  def check_resource(node)
92
- controller_name = controller_name(node)
93
- return unless Prepares.controllers.include? controller_name
94
- resource_methods = resource_methods(node)
95
- unless resource_methods.all? { |meth| Prepares.controller_methods.has_method?(controller_name, meth) }
96
- prepared_method_names = Prepares.controller_methods.get_methods(controller_name).map(&:method_name)
97
- only_methods = (resource_methods & prepared_method_names).map { |meth| ":#{meth}" }.join(", ")
98
- add_error "restrict auto-generated routes #{friendly_route_name(node)} (only: [#{only_methods}])"
99
- end
84
+ _check(node, RESOURCE_METHODS)
100
85
  end
101
86
 
102
87
  # get the controller name.
@@ -124,32 +109,23 @@ module RailsBestPractices
124
109
  end
125
110
  end
126
111
 
127
- # get the route actions that should be generated by resources call.
128
- def resources_methods(node)
129
- methods = RESOURCES_METHODS
130
-
131
- if option_with_hash(node)
132
- option_node = node.arguments.all[1]
133
- if hash_key_exist?(option_node, "only")
134
- option_node.hash_value("only").to_s == "none" ? [] : Array(option_node.hash_value("only").to_object)
135
- elsif hash_key_exist?(option_node, "except")
136
- if option_node.hash_value("except").to_s == "all"
137
- []
138
- else
139
- (methods - Array(option_node.hash_value("except").to_object))
140
- end
141
- else
142
- methods
143
- end
144
- else
145
- methods
112
+ def _check(node, methods)
113
+ controller_name = controller_name(node)
114
+ return unless Prepares.controllers.include? controller_name
115
+ _methods = _methods(node, methods)
116
+ unless _methods.all? { |meth| Prepares.controller_methods.has_method?(controller_name, meth) }
117
+ prepared_method_names = Prepares.controller_methods.get_methods(controller_name).map(&:method_name)
118
+ only_methods = (_methods & prepared_method_names).map { |meth| ":#{meth}" }
119
+ routes_message = if only_methods.size > 3
120
+ "except: [#{(methods.map { |meth| ":" + meth } - only_methods).join(', ')}]"
121
+ else
122
+ "only: [#{only_methods.join(', ')}]"
123
+ end
124
+ add_error "restrict auto-generated routes #{friendly_route_name(node)} (#{routes_message})"
146
125
  end
147
126
  end
148
127
 
149
- # get the route actions that should be generated by resource call.
150
- def resource_methods(node)
151
- methods = RESOURCE_METHODS
152
-
128
+ def _methods(node, methods)
153
129
  if option_with_hash(node)
154
130
  option_node = node.arguments.all[1]
155
131
  if hash_key_exist?(option_node, "only")
@@ -18,7 +18,7 @@ module RailsBestPractices
18
18
 
19
19
  # check command node to see if load 'deploy/assets'
20
20
  add_callback :start_command do |node|
21
- if !Prepares.gems.include?("turbo-sprockets-rails3") && "load" == node.message.to_s && "deploy/assets" == node.arguments.to_s
21
+ if !Prepares.gems.has_gem?("turbo-sprockets-rails3") && "load" == node.message.to_s && "deploy/assets" == node.arguments.to_s
22
22
  add_error "speed up assets precompile with turbo-sprockets-rails3"
23
23
  end
24
24
  end
@@ -1,4 +1,4 @@
1
1
  # encoding: utf-8
2
2
  module RailsBestPractices
3
- VERSION = "1.13.5"
3
+ VERSION = "1.13.8"
4
4
  end
@@ -3,5 +3,27 @@ require 'spec_helper'
3
3
  module RailsBestPractices::Core
4
4
  describe Gems do
5
5
  it { should be_a_kind_of Array }
6
+
7
+ let(:gems) { Gems.new }
8
+ before do
9
+ gems << Gem.new("rails", "4.0.0")
10
+ gems << Gem.new("mysql2", "0.2.0")
11
+ end
12
+
13
+ context "#has_gem?" do
14
+ it "has rails gem" do
15
+ expect(gems).to be_has_gem "rails"
16
+ end
17
+
18
+ it "hasn't sinatra gem" do
19
+ expect(gems).not_to be_has_gem "sinatra"
20
+ end
21
+ end
22
+
23
+ context "#gem_version" do
24
+ it "gets rails version" do
25
+ expect(gems.gem_version("rails")).to eq "4.0.0"
26
+ end
27
+ end
6
28
  end
7
29
  end
@@ -8,13 +8,25 @@ module RailsBestPractices
8
8
  context "gemfile" do
9
9
  it "should parse gems" do
10
10
  content =<<-EOF
11
- source 'http://rubygems.org'
12
- gem 'rails'
13
- gem 'mysql2'
11
+ GEM
12
+ remote: https://rubygems.org/
13
+ specs:
14
+ rails (3.2.13)
15
+ actionmailer (= 3.2.13)
16
+ actionpack (= 3.2.13)
17
+ activerecord (= 3.2.13)
18
+ activeresource (= 3.2.13)
19
+ activesupport (= 3.2.13)
20
+ bundler (~> 1.0)
21
+ railties (= 3.2.13)
22
+ mysql2 (0.3.12b6)
23
+
24
+ PLATFORMS
25
+ ruby
14
26
  EOF
15
- runner.prepare('Gemfile', content)
27
+ runner.prepare('Gemfile.lock', content)
16
28
  gems = Prepares.gems
17
- gems.should == %w(rails mysql2)
29
+ gems.map(&:to_s).should == ["rails (3.2.13)", "mysql2 (0.3.12b6)"]
18
30
  end
19
31
  end
20
32
  end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ module RailsBestPractices
4
+ module Prepares
5
+ describe InitializerPrepare do
6
+ let(:runner) { Core::Runner.new(prepares: InitializerPrepare.new) }
7
+
8
+ context "initializers" do
9
+ it "should set include_forbidden_attributes_protection config" do
10
+ content =<<-EOF
11
+ class AR
12
+ ActiveRecord::Base.send(:include, ActiveModel::ForbiddenAttributesProtection)
13
+ end
14
+ EOF
15
+ runner.prepare('config/initializers/ar.rb', content)
16
+ configs = Prepares.configs
17
+ configs["railsbp.include_forbidden_attributes_protection"].should == "true"
18
+ end
19
+
20
+ it "should not set include_forbidden_attributes_protection config" do
21
+ content =<<-EOF
22
+ class AR
23
+ end
24
+ EOF
25
+ runner.prepare('config/initializers/ar.rb', content)
26
+ configs = Prepares.configs
27
+ configs["railsbp.include_forbidden_attributes_protection"].should be_nil
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -3,7 +3,8 @@ require 'spec_helper'
3
3
  module RailsBestPractices
4
4
  module Reviews
5
5
  describe ProtectMassAssignmentReview do
6
- let(:runner) { Core::Runner.new(reviews: ProtectMassAssignmentReview.new) }
6
+ let(:runner) { Core::Runner.new(prepares: [Prepares::GemfilePrepare.new, Prepares::ConfigPrepare.new, Prepares::InitializerPrepare.new],
7
+ reviews: ProtectMassAssignmentReview.new) }
7
8
 
8
9
  it "should protect mass assignment" do
9
10
  content =<<-EOF
@@ -110,14 +111,65 @@ module RailsBestPractices
110
111
  runner.should have(0).errors
111
112
  end
112
113
 
113
- it "should not protect mass assignment for strong_parameters" do
114
- content =<<-EOF
115
- class User < ActiveRecord::Base
116
- include ActiveModel::ForbiddenAttributesProtection
114
+ context "strong_parameters" do
115
+ it "should not protect mass assignment for strong_parameters" do
116
+ content =<<-EOF
117
+ class User < ActiveRecord::Base
118
+ include ActiveModel::ForbiddenAttributesProtection
119
+ end
120
+ EOF
121
+ runner.review('app/models/user.rb', content)
122
+ runner.should have(0).errors
123
+ end
124
+
125
+ it "should not protect mass assignment for strong_parameters" do
126
+ content =<<-EOF
127
+ class AR
128
+ ActiveRecord::Base.send(:include, ActiveModel::ForbiddenAttributesProtection)
129
+ end
130
+ EOF
131
+ runner.prepare('config/initializers/ar.rb', content)
132
+ content =<<-EOF
133
+ class User < ActiveRecord::Base
134
+ end
135
+ EOF
136
+ runner.review('app/models/user.rb', content)
137
+ runner.should have(0).errors
138
+ end
139
+ end
140
+
141
+ context "rails 4" do
142
+ it "should not protect mass assignment for rails 4" do
143
+ content =<<-EOF
144
+ GEM
145
+ remote: http://rubygems.org
146
+ specs:
147
+ rails (4.0.0)
148
+ EOF
149
+ runner.prepare('Gemfile.lock', content)
150
+ content =<<-EOF
151
+ class User < ActiveRecord::Base
152
+ end
153
+ EOF
154
+ runner.review('app/models/user.rb', content)
155
+ runner.should have(0).errors
156
+ end
157
+
158
+ it "should protect mass assignment for rails 3" do
159
+ content =<<-EOF
160
+ GEM
161
+ remote: http://rubygems.org
162
+ specs:
163
+ rails (3.2.13)
164
+ EOF
165
+ runner.prepare('Gemfile.lock', content)
166
+ content =<<-EOF
167
+ class User < ActiveRecord::Base
168
+ end
169
+ EOF
170
+ runner.review('app/models/user.rb', content)
171
+ runner.should have(1).errors
117
172
  end
118
- EOF
119
- runner.review('app/models/user.rb', content)
120
- runner.should have(0).errors
121
173
  end
122
174
  end
123
175
  end
@@ -186,6 +186,35 @@ module RailsBestPractices
186
186
  end
187
187
  end
188
188
 
189
+ context "assignment" do
190
+ it "should not remove unused methods if call in base class" do
191
+ content =<<-EOF
192
+ RailsBestPracticesCom::Application.routes.draw do
193
+ resources :user, only: :show do; end
194
+ end
195
+ EOF
196
+ runner.prepare('config/routes.rb', content)
197
+ application_content =<<-EOF
198
+ class ApplicationController
199
+ def current_user=(user); end
200
+ end
201
+ EOF
202
+ runner.prepare('app/controllers/application_controller.rb', application_content)
203
+ users_content =<<-EOF
204
+ class UsersController < ApplicationController
205
+ def show
206
+ current_user = @user
207
+ end
208
+ end
209
+ EOF
210
+ runner.prepare('app/controllers/users_controller.rb', users_content)
211
+ runner.review('app/controllers/application_controller.rb', application_content)
212
+ runner.review('app/controllers/users_controller.rb', users_content)
213
+ runner.after_review
214
+ runner.should have(0).errors
215
+ end
216
+ end
217
+
189
218
  context "helper_method" do
190
219
  it "should remove unused methods if helper method is not called" do
191
220
  content = <<-EOF
@@ -29,7 +29,7 @@ module RailsBestPractices
29
29
  EOF
30
30
  runner.review('config/routes.rb', content)
31
31
  runner.should have(1).errors
32
- runner.errors[0].to_s.should == "config/routes.rb:2 - restrict auto-generated routes posts (only: [:show, :new, :create, :edit, :update, :destroy])"
32
+ runner.errors[0].to_s.should == "config/routes.rb:2 - restrict auto-generated routes posts (except: [:index])"
33
33
  end
34
34
 
35
35
  it "should not restrict auto-generated routes with only" do
@@ -81,7 +81,7 @@ module RailsBestPractices
81
81
  EOF
82
82
  runner.review('config/routes.rb', content)
83
83
  runner.should have(1).errors
84
- runner.errors[0].to_s.should == "config/routes.rb:2 - restrict auto-generated routes articles (only: [:show, :new, :create, :edit, :update, :destroy])"
84
+ runner.errors[0].to_s.should == "config/routes.rb:2 - restrict auto-generated routes articles (except: [:index])"
85
85
  end
86
86
  end
87
87
 
@@ -111,7 +111,7 @@ module RailsBestPractices
111
111
  EOF
112
112
  runner.review('config/routes.rb', content)
113
113
  runner.should have(1).errors
114
- runner.errors[0].to_s.should == "config/routes.rb:2 - restrict auto-generated routes posts (only: [:show, :new, :create, :edit, :update, :destroy])"
114
+ runner.errors[0].to_s.should == "config/routes.rb:2 - restrict auto-generated routes posts (except: [:index])"
115
115
  end
116
116
 
117
117
  it "should not restrict auto-generated routes with only" do
@@ -149,7 +149,7 @@ module RailsBestPractices
149
149
  EOF
150
150
  runner.review('config/routes.rb', content)
151
151
  runner.should have(1).errors
152
- runner.errors[0].to_s.should == "config/routes.rb:2 - restrict auto-generated routes posts (only: [:show, :new, :create, :edit, :update, :destroy])"
152
+ runner.errors[0].to_s.should == "config/routes.rb:2 - restrict auto-generated routes posts (except: [:index])"
153
153
  end
154
154
 
155
155
  it "should not restrict auto-generated routes with only" do
@@ -181,7 +181,7 @@ module RailsBestPractices
181
181
  EOF
182
182
  runner.review('config/routes.rb', content)
183
183
  runner.should have(1).errors
184
- runner.errors[0].to_s.should == "config/routes.rb:2 - restrict auto-generated routes articles (only: [:show, :new, :create, :edit, :update, :destroy])"
184
+ runner.errors[0].to_s.should == "config/routes.rb:2 - restrict auto-generated routes articles (except: [:index])"
185
185
  end
186
186
  end
187
187
 
@@ -208,7 +208,7 @@ module RailsBestPractices
208
208
  EOF
209
209
  runner.review('config/routes.rb', content)
210
210
  runner.should have(1).errors
211
- runner.errors[0].to_s.should == "config/routes.rb:3 - restrict auto-generated routes admin/comments (only: [:show, :new, :create, :edit, :update, :destroy])"
211
+ runner.errors[0].to_s.should == "config/routes.rb:3 - restrict auto-generated routes admin/comments (except: [:index])"
212
212
  end
213
213
  end
214
214
 
@@ -238,7 +238,7 @@ module RailsBestPractices
238
238
  EOF
239
239
  runner.review('config/routes.rb', content)
240
240
  runner.should have(1).errors
241
- runner.errors[0].to_s.should == "config/routes.rb:2 - restrict auto-generated routes posts (only: [:show, :new, :create, :edit, :update, :destroy])"
241
+ runner.errors[0].to_s.should == "config/routes.rb:2 - restrict auto-generated routes posts (except: [:index])"
242
242
  end
243
243
 
244
244
  it "should not restrict auto-generated routes with only" do
@@ -291,7 +291,7 @@ module RailsBestPractices
291
291
  EOF
292
292
  runner.review('config/routes.rb', content)
293
293
  runner.should have(1).errors
294
- runner.errors[0].to_s.should == "config/routes.rb:2 - restrict auto-generated routes account (only: [:show, :new, :create, :edit, :update])"
294
+ runner.errors[0].to_s.should == "config/routes.rb:2 - restrict auto-generated routes account (except: [:destroy])"
295
295
  end
296
296
 
297
297
  it "should not restrict auto-generated routes with only" do
@@ -324,7 +324,7 @@ module RailsBestPractices
324
324
  EOF
325
325
  runner.review('config/routes.rb', content)
326
326
  runner.should have(1).errors
327
- runner.errors[0].to_s.should == "config/routes.rb:2 - restrict auto-generated routes account (only: [:show, :new, :create, :edit, :update])"
327
+ runner.errors[0].to_s.should == "config/routes.rb:2 - restrict auto-generated routes account (except: [:destroy])"
328
328
  end
329
329
 
330
330
  it "should not restrict auto-generated routes with only" do
@@ -23,13 +23,22 @@ module RailsBestPractices
23
23
 
24
24
  it "should not use turbo-sprockets-rails3 with turbo-sprockets-rails3 gem" do
25
25
  content = <<-EOF
26
- source "http://rubygems.org"
27
- gem "rails"
28
- group :assets do
29
- gem "turbo-sprockets-rails3"
30
- end
26
+ GEM
27
+ remote: http://rubygems.org
28
+ specs:
29
+ rails (3.2.13)
30
+ actionmailer (= 3.2.13)
31
+ actionpack (= 3.2.13)
32
+ activerecord (= 3.2.13)
33
+ activeresource (= 3.2.13)
34
+ activesupport (= 3.2.13)
35
+ bundler (~> 1.0)
36
+ railties (= 3.2.13)
37
+ turbo-sprockets-rails3 (0.3.6)
38
+ railties (> 3.2.8, < 4.0.0)
39
+ sprockets (>= 2.0.0)
31
40
  EOF
32
- runner.prepare('Gemfile', content)
41
+ runner.prepare('Gemfile.lock', content)
33
42
  content = <<-EOF
34
43
  load 'deploy' if respond_to?(:namespace)
35
44
  load 'deploy/assets'
@@ -51,4 +60,3 @@ module RailsBestPractices
51
60
  end
52
61
  end
53
62
  end
54
-
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_best_practices
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.13.5
4
+ version: 1.13.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Richard Huang
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-05-06 00:00:00.000000000 Z
11
+ date: 2013-06-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: code_analyzer
@@ -186,11 +186,11 @@ executables:
186
186
  extensions: []
187
187
  extra_rdoc_files: []
188
188
  files:
189
- - .coveralls.yml
190
189
  - .gemtest
191
190
  - .gitignore
192
191
  - .rspec
193
- - .rvmrc
192
+ - .ruby-gemset
193
+ - .ruby-version
194
194
  - .travis.yml
195
195
  - Gemfile
196
196
  - Guardfile
@@ -229,6 +229,7 @@ files:
229
229
  - lib/rails_best_practices/prepares/controller_prepare.rb
230
230
  - lib/rails_best_practices/prepares/gemfile_prepare.rb
231
231
  - lib/rails_best_practices/prepares/helper_prepare.rb
232
+ - lib/rails_best_practices/prepares/initializer_prepare.rb
232
233
  - lib/rails_best_practices/prepares/mailer_prepare.rb
233
234
  - lib/rails_best_practices/prepares/model_prepare.rb
234
235
  - lib/rails_best_practices/prepares/route_prepare.rb
@@ -301,6 +302,7 @@ files:
301
302
  - spec/rails_best_practices/prepares/controller_prepare_spec.rb
302
303
  - spec/rails_best_practices/prepares/gemfile_prepare_spec.rb
303
304
  - spec/rails_best_practices/prepares/helper_prepare_spec.rb
305
+ - spec/rails_best_practices/prepares/initializer_prepare_spec.rb
304
306
  - spec/rails_best_practices/prepares/mailer_prepare_spec.rb
305
307
  - spec/rails_best_practices/prepares/model_prepare_spec.rb
306
308
  - spec/rails_best_practices/prepares/route_prepare_spec.rb
@@ -410,6 +412,7 @@ test_files:
410
412
  - spec/rails_best_practices/prepares/controller_prepare_spec.rb
411
413
  - spec/rails_best_practices/prepares/gemfile_prepare_spec.rb
412
414
  - spec/rails_best_practices/prepares/helper_prepare_spec.rb
415
+ - spec/rails_best_practices/prepares/initializer_prepare_spec.rb
413
416
  - spec/rails_best_practices/prepares/mailer_prepare_spec.rb
414
417
  - spec/rails_best_practices/prepares/model_prepare_spec.rb
415
418
  - spec/rails_best_practices/prepares/route_prepare_spec.rb
data/.coveralls.yml DELETED
@@ -1 +0,0 @@
1
- repo_token: HdiJjr0c7NCGp2GIL3areCAENLRMT21Er
data/.rvmrc DELETED
@@ -1,2 +0,0 @@
1
- rvm_gemset_create_on_use_flag=1
2
- rvm gemset use rails_best_practices