rails_best_practices 0.2.11 → 0.2.12

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/README.textile CHANGED
@@ -1,5 +1,4 @@
1
1
  h1. rails_best_practices
2
-
3
2
  rails_best_practices is a gem to check quality of rails app files according to ihower's presentation Rails Best Practices.
4
3
  rails_best_practices is a code static parser tool based on ruby_parser.
5
4
 
@@ -53,6 +52,7 @@ LawOfDemeterCheck: { }
53
52
  UseObserverCheck: { }
54
53
  IsolateSeedDataCheck: { }
55
54
  AlwaysAddDbIndexCheck: { }
55
+ UseFilterCheck: { }
56
56
  </code></pre>
57
57
 
58
58
  *************************************************
@@ -90,7 +90,7 @@ h2. Progress
90
90
  ## [-Always add DB index-]
91
91
 
92
92
  * Lesson 5. Controller
93
- ## Use before_filter
93
+ ## [-Use before_filter-]
94
94
  ## DRY Controller
95
95
 
96
96
  * Lesson 6. View
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.11
1
+ 0.2.12
@@ -15,3 +15,4 @@ require 'rails_best_practices/checks/law_of_demeter_check'
15
15
  require 'rails_best_practices/checks/use_observer_check'
16
16
  require 'rails_best_practices/checks/isolate_seed_data_check'
17
17
  require 'rails_best_practices/checks/always_add_db_index_check'
18
+ require 'rails_best_practices/checks/use_filter_check'
@@ -0,0 +1,36 @@
1
+ require 'rails_best_practices/checks/check'
2
+
3
+ module RailsBestPractices
4
+ module Checks
5
+ # Check a controller file to make sure to use filter to remove duplicate call in different action.
6
+ #
7
+ # Implementation: Check all methods' first call, if they are duplicate, then should use filter.
8
+ class UseFilterCheck < Check
9
+
10
+ def interesting_nodes
11
+ [:class]
12
+ end
13
+
14
+ def interesting_files
15
+ /_controller.rb$/
16
+ end
17
+
18
+ def evaluate_start(node)
19
+ @methods = {}
20
+ node.grep_nodes({:node_type => :defn}).each { |method_node| remember_method(method_node) }
21
+ @methods.each do |first_call, method_names|
22
+ add_error "use filter for #{first_call.to_ruby} in #{method_names.join(',')}" if method_names.size > 1
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def remember_method(method_node)
29
+ method_name = method_node.message_name
30
+ first_call = method_node.body[1]
31
+ @methods[first_call] ||= []
32
+ @methods[first_call] << method_name
33
+ end
34
+ end
35
+ end
36
+ end
@@ -93,8 +93,10 @@ class Sexp
93
93
  self[1..-1]
94
94
  elsif :class == node_type
95
95
  self[3]
96
+ elsif :defn == node_type
97
+ self[3][1]
96
98
  elsif :defs == node_type
97
- self[4]
99
+ self[4][1]
98
100
  end
99
101
  end
100
102
 
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{rails_best_practices}
8
- s.version = "0.2.11"
8
+ s.version = "0.2.12"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Richard Huang"]
@@ -41,6 +41,7 @@ Gem::Specification.new do |s|
41
41
  "lib/rails_best_practices/checks/not_use_default_route_check.rb",
42
42
  "lib/rails_best_practices/checks/overuse_route_customizations_check.rb",
43
43
  "lib/rails_best_practices/checks/replace_complex_creation_with_factory_method_check.rb",
44
+ "lib/rails_best_practices/checks/use_filter_check.rb",
44
45
  "lib/rails_best_practices/checks/use_model_association_check.rb",
45
46
  "lib/rails_best_practices/checks/use_model_callback_check.rb",
46
47
  "lib/rails_best_practices/checks/use_observer_check.rb",
@@ -67,6 +68,7 @@ Gem::Specification.new do |s|
67
68
  "spec/rails_best_practices/checks/not_use_default_route_check_spec.rb",
68
69
  "spec/rails_best_practices/checks/overuse_route_customizations_check_spec.rb",
69
70
  "spec/rails_best_practices/checks/replace_complex_creation_with_factory_method_check_spec.rb",
71
+ "spec/rails_best_practices/checks/use_filter_check_spec.rb",
70
72
  "spec/rails_best_practices/checks/use_model_association_check_spec.rb",
71
73
  "spec/rails_best_practices/checks/use_model_callback_check_spec.rb",
72
74
  "spec/rails_best_practices/checks/use_observer_check_spec.rb",
@@ -82,6 +84,7 @@ Gem::Specification.new do |s|
82
84
  s.test_files = [
83
85
  "spec/rails_best_practices/checks/use_scope_access_check_spec.rb",
84
86
  "spec/rails_best_practices/checks/not_use_default_route_check_spec.rb",
87
+ "spec/rails_best_practices/checks/use_filter_check_spec.rb",
85
88
  "spec/rails_best_practices/checks/add_model_virtual_attribute_check_spec.rb",
86
89
  "spec/rails_best_practices/checks/keep_finders_on_their_own_model_check_spec.rb",
87
90
  "spec/rails_best_practices/checks/use_model_callback_check_spec.rb",
@@ -15,3 +15,4 @@ LawOfDemeterCheck: { }
15
15
  UseObserverCheck: { }
16
16
  IsolateSeedDataCheck: { }
17
17
  AlwaysAddDbIndexCheck: { }
18
+ UseFilterCheck: { }
@@ -0,0 +1,62 @@
1
+ require File.join(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe RailsBestPractices::Checks::UseFilterCheck do
4
+ before(:each) do
5
+ @runner = RailsBestPractices::Core::Runner.new(RailsBestPractices::Checks::UseFilterCheck.new)
6
+ end
7
+
8
+ it "should use filter" do
9
+ content = <<-EOF
10
+ class PostsController < ApplicationController
11
+
12
+ def show
13
+ @post = current_user.posts.find(params[:id])
14
+ end
15
+
16
+ def edit
17
+ @post = current_user.posts.find(params[:id])
18
+ end
19
+
20
+ def update
21
+ @post = current_user.posts.find(params[:id])
22
+ @post.update_attributes(params[:post])
23
+ end
24
+
25
+ def destroy
26
+ @post = current_user.posts.find(params[:id])
27
+ @post.destroy
28
+ end
29
+
30
+ end
31
+ EOF
32
+ @runner.check('app/controllers/posts_controller.rb', content)
33
+ errors = @runner.errors
34
+ errors.should_not be_empty
35
+ errors[0].to_s.should == "app/controllers/posts_controller.rb:1 - use filter for @post = current_user.posts.find(params[:id]) in show,edit,update,destroy"
36
+ end
37
+
38
+ it "should not use filter" do
39
+ content = <<-EOF
40
+ class PostsController < ApplicationController
41
+ before_filter :find_post, :only => [:show, :edit, :update, :destroy]
42
+
43
+ def update
44
+ @post.update_attributes(params[:post])
45
+ end
46
+
47
+ def destroy
48
+ @post.destroy
49
+ end
50
+
51
+ protected
52
+
53
+ def find_post
54
+ @post = current_user.posts.find(params[:id])
55
+ end
56
+ end
57
+ EOF
58
+ @runner.check('app/controllers/posts_controller.rb', content)
59
+ errors = @runner.errors
60
+ errors.should be_empty
61
+ end
62
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_best_practices
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.11
4
+ version: 0.2.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Richard Huang
@@ -64,6 +64,7 @@ files:
64
64
  - lib/rails_best_practices/checks/not_use_default_route_check.rb
65
65
  - lib/rails_best_practices/checks/overuse_route_customizations_check.rb
66
66
  - lib/rails_best_practices/checks/replace_complex_creation_with_factory_method_check.rb
67
+ - lib/rails_best_practices/checks/use_filter_check.rb
67
68
  - lib/rails_best_practices/checks/use_model_association_check.rb
68
69
  - lib/rails_best_practices/checks/use_model_callback_check.rb
69
70
  - lib/rails_best_practices/checks/use_observer_check.rb
@@ -90,6 +91,7 @@ files:
90
91
  - spec/rails_best_practices/checks/not_use_default_route_check_spec.rb
91
92
  - spec/rails_best_practices/checks/overuse_route_customizations_check_spec.rb
92
93
  - spec/rails_best_practices/checks/replace_complex_creation_with_factory_method_check_spec.rb
94
+ - spec/rails_best_practices/checks/use_filter_check_spec.rb
93
95
  - spec/rails_best_practices/checks/use_model_association_check_spec.rb
94
96
  - spec/rails_best_practices/checks/use_model_callback_check_spec.rb
95
97
  - spec/rails_best_practices/checks/use_observer_check_spec.rb
@@ -127,6 +129,7 @@ summary: check rails files according to ihower's presentation 'rails best practi
127
129
  test_files:
128
130
  - spec/rails_best_practices/checks/use_scope_access_check_spec.rb
129
131
  - spec/rails_best_practices/checks/not_use_default_route_check_spec.rb
132
+ - spec/rails_best_practices/checks/use_filter_check_spec.rb
130
133
  - spec/rails_best_practices/checks/add_model_virtual_attribute_check_spec.rb
131
134
  - spec/rails_best_practices/checks/keep_finders_on_their_own_model_check_spec.rb
132
135
  - spec/rails_best_practices/checks/use_model_callback_check_spec.rb