rails_best_practices 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/README.textile +33 -2
- data/Rakefile +4 -2
- data/VERSION +1 -1
- data/lib/rails_best_practices/checks.rb +2 -1
- data/lib/rails_best_practices/checks/overuse_route_customizations_check.rb +34 -0
- data/lib/rails_best_practices/core/runner.rb +2 -1
- data/lib/rails_best_practices/core/visitable_sexp.rb +2 -1
- data/rails_best_practices.gemspec +98 -0
- data/rails_best_practices.yml +4 -1
- data/spec/rails_best_practices/checks/overuse_route_customizations_check_spec.rb +29 -2
- metadata +28 -5
data/.gitignore
ADDED
data/README.textile
CHANGED
@@ -1,3 +1,30 @@
|
|
1
|
+
h1. rails_best_practices
|
2
|
+
|
3
|
+
rails_best_practices is a gem to check quality of rails app files according to ihower's presentation "Rails Best Practices".
|
4
|
+
rails_best_practices is a static file parser tool based on ruby_parser.
|
5
|
+
|
6
|
+
*************************************************
|
7
|
+
|
8
|
+
h2. Install
|
9
|
+
|
10
|
+
<pre><code>
|
11
|
+
sudo gem install rails_best_practices --source http://gemcutter.org
|
12
|
+
</code></pre>
|
13
|
+
|
14
|
+
*************************************************
|
15
|
+
|
16
|
+
h2. Usage
|
17
|
+
|
18
|
+
at the root of rails
|
19
|
+
|
20
|
+
<pre><code>
|
21
|
+
rails_best_practices .
|
22
|
+
</code></pre>
|
23
|
+
|
24
|
+
*************************************************
|
25
|
+
|
26
|
+
h2. Progress
|
27
|
+
|
1
28
|
* Lesson 1. Move code from Controller to Model
|
2
29
|
## [-Move finder to named_scope-]
|
3
30
|
## [-Use model association-]
|
@@ -11,7 +38,7 @@
|
|
11
38
|
## Nested Model Forms (one-to-many)
|
12
39
|
|
13
40
|
* Lesson 2. RESTful Conventions
|
14
|
-
## Overuse route customizations
|
41
|
+
## [-Overuse route customizations-]
|
15
42
|
## Needless deep nesting
|
16
43
|
## Not use default route
|
17
44
|
|
@@ -38,4 +65,8 @@
|
|
38
65
|
## Move code into helper
|
39
66
|
## Replace instance variable with local variable
|
40
67
|
## Use Form Builder
|
41
|
-
## Organize Helper files
|
68
|
+
## Organize Helper files
|
69
|
+
|
70
|
+
*************************************************
|
71
|
+
|
72
|
+
Copyright © 2009 Richard Huang (flyerhzm@gmail.com), released under the MIT license
|
data/Rakefile
CHANGED
@@ -22,10 +22,12 @@ end
|
|
22
22
|
|
23
23
|
Jeweler::Tasks.new do |gemspec|
|
24
24
|
gemspec.name = "rails_best_practices"
|
25
|
-
gemspec.summary = ""
|
26
|
-
gemspec.description = ""
|
25
|
+
gemspec.summary = "check rails files according to ihower's presentation 'rails best practices'"
|
26
|
+
gemspec.description = "check rails files according to ihower's presentation 'rails best practices'"
|
27
27
|
gemspec.email = "flyerhzm@gmail.com"
|
28
28
|
gemspec.homepage = "http://github.com/flyerhzm/rails_best_practices"
|
29
29
|
gemspec.authors = ["Richard Huang"]
|
30
|
+
gemspec.add_dependency 'ruby_parser'
|
31
|
+
gemspec.add_dependency 'ruby2ruby'
|
30
32
|
end
|
31
33
|
Jeweler::GemcutterTasks.new
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.1
|
@@ -6,4 +6,5 @@ require 'rails_best_practices/checks/use_model_callback_check'
|
|
6
6
|
require 'rails_best_practices/checks/replace_complex_creation_with_factory_method_check'
|
7
7
|
require 'rails_best_practices/checks/move_model_logic_into_model_check'
|
8
8
|
require 'rails_best_practices/checks/many_to_many_collection_check'
|
9
|
-
require 'rails_best_practices/checks/nested_model_forms_check'
|
9
|
+
require 'rails_best_practices/checks/nested_model_forms_check'
|
10
|
+
require 'rails_best_practices/checks/overuse_route_customizations_check'
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'rails_best_practices/checks/check'
|
2
|
+
|
3
|
+
module RailsBestPractices
|
4
|
+
module Checks
|
5
|
+
class OveruseRouteCustomizationsCheck < Check
|
6
|
+
|
7
|
+
def interesting_nodes
|
8
|
+
[:call]
|
9
|
+
end
|
10
|
+
|
11
|
+
def interesting_files
|
12
|
+
/config\/routes.rb/
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize(options = {})
|
16
|
+
super()
|
17
|
+
@customize_count = options['customize_count'] || 3
|
18
|
+
end
|
19
|
+
|
20
|
+
def evaluate_start(node)
|
21
|
+
if s(:lvar, :map) == node.subject and :resources == node.message
|
22
|
+
add_error "overuse route customizations" if member_and_collection_count(node) > @customize_count
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def member_and_collection_count(node)
|
29
|
+
customize_hash = eval(Ruby2Ruby.new.process(node.grep_nodes(:node_type => :hash).first))
|
30
|
+
(customize_hash[:member].size || 0) + (customize_hash[:collection].size || 0)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -32,12 +32,13 @@ class Sexp
|
|
32
32
|
|
33
33
|
def grep_nodes(options)
|
34
34
|
return self if options.empty?
|
35
|
+
node_type = options[:node_type]
|
35
36
|
subject = options[:subject]
|
36
37
|
message = options[:message]
|
37
38
|
arguments = options[:arguments]
|
38
39
|
nodes = []
|
39
40
|
self.recursive_children do |child|
|
40
|
-
if (!subject or subject == child.subject) and (!message or message == child.message) and (!arguments or arguments == child.arguments)
|
41
|
+
if (!node_type or node_type == child.node_type) and (!subject or subject == child.subject) and (!message or message == child.message) and (!arguments or arguments == child.arguments)
|
41
42
|
nodes << child
|
42
43
|
end
|
43
44
|
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{rails_best_practices}
|
8
|
+
s.version = "0.1.1"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Richard Huang"]
|
12
|
+
s.date = %q{2009-11-05}
|
13
|
+
s.default_executable = %q{rails_best_practices}
|
14
|
+
s.description = %q{check rails files according to ihower's presentation 'rails best practices'}
|
15
|
+
s.email = %q{flyerhzm@gmail.com}
|
16
|
+
s.executables = ["rails_best_practices"]
|
17
|
+
s.extra_rdoc_files = [
|
18
|
+
"LICENSE",
|
19
|
+
"README.textile"
|
20
|
+
]
|
21
|
+
s.files = [
|
22
|
+
".gitignore",
|
23
|
+
"LICENSE",
|
24
|
+
"README.textile",
|
25
|
+
"Rakefile",
|
26
|
+
"VERSION",
|
27
|
+
"bin/rails_best_practices",
|
28
|
+
"lib/rails_best_practices.rb",
|
29
|
+
"lib/rails_best_practices/checks.rb",
|
30
|
+
"lib/rails_best_practices/checks/add_model_virtual_attribute_check.rb",
|
31
|
+
"lib/rails_best_practices/checks/check.rb",
|
32
|
+
"lib/rails_best_practices/checks/many_to_many_collection_check.rb",
|
33
|
+
"lib/rails_best_practices/checks/move_finder_to_named_scope_check.rb",
|
34
|
+
"lib/rails_best_practices/checks/move_model_logic_into_model_check.rb",
|
35
|
+
"lib/rails_best_practices/checks/nested_model_forms_check.rb",
|
36
|
+
"lib/rails_best_practices/checks/overuse_route_customizations_check.rb",
|
37
|
+
"lib/rails_best_practices/checks/replace_complex_creation_with_factory_method_check.rb",
|
38
|
+
"lib/rails_best_practices/checks/use_model_association_check.rb",
|
39
|
+
"lib/rails_best_practices/checks/use_model_callback_check.rb",
|
40
|
+
"lib/rails_best_practices/checks/use_scope_access_check.rb",
|
41
|
+
"lib/rails_best_practices/command.rb",
|
42
|
+
"lib/rails_best_practices/core.rb",
|
43
|
+
"lib/rails_best_practices/core/checking_visitor.rb",
|
44
|
+
"lib/rails_best_practices/core/core_ext.rb",
|
45
|
+
"lib/rails_best_practices/core/error.rb",
|
46
|
+
"lib/rails_best_practices/core/runner.rb",
|
47
|
+
"lib/rails_best_practices/core/visitable_sexp.rb",
|
48
|
+
"rails_best_practices.gemspec",
|
49
|
+
"rails_best_practices.yml",
|
50
|
+
"spec/rails_best_practices/checks/add_model_virtual_attribute_check_spec.rb",
|
51
|
+
"spec/rails_best_practices/checks/many_to_many_collection_check_spec.rb",
|
52
|
+
"spec/rails_best_practices/checks/move_finder_to_named_scope_check_spec.rb",
|
53
|
+
"spec/rails_best_practices/checks/move_model_logic_into_model_check_spec.rb",
|
54
|
+
"spec/rails_best_practices/checks/nested_model_forms_check_spec.rb",
|
55
|
+
"spec/rails_best_practices/checks/overuse_route_customizations_check_spec.rb",
|
56
|
+
"spec/rails_best_practices/checks/replace_complex_creation_with_factory_method_check_spec.rb",
|
57
|
+
"spec/rails_best_practices/checks/use_model_association_check_spec.rb",
|
58
|
+
"spec/rails_best_practices/checks/use_model_callback_check_spec.rb",
|
59
|
+
"spec/rails_best_practices/checks/use_scope_access_check_spec.rb",
|
60
|
+
"spec/spec.opts",
|
61
|
+
"spec/spec_helper.rb"
|
62
|
+
]
|
63
|
+
s.homepage = %q{http://github.com/flyerhzm/rails_best_practices}
|
64
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
65
|
+
s.require_paths = ["lib"]
|
66
|
+
s.rubygems_version = %q{1.3.5}
|
67
|
+
s.summary = %q{check rails files according to ihower's presentation 'rails best practices'}
|
68
|
+
s.test_files = [
|
69
|
+
"spec/rails_best_practices/checks/use_scope_access_check_spec.rb",
|
70
|
+
"spec/rails_best_practices/checks/add_model_virtual_attribute_check_spec.rb",
|
71
|
+
"spec/rails_best_practices/checks/use_model_callback_check_spec.rb",
|
72
|
+
"spec/rails_best_practices/checks/many_to_many_collection_check_spec.rb",
|
73
|
+
"spec/rails_best_practices/checks/use_model_association_check_spec.rb",
|
74
|
+
"spec/rails_best_practices/checks/move_model_logic_into_model_check_spec.rb",
|
75
|
+
"spec/rails_best_practices/checks/replace_complex_creation_with_factory_method_check_spec.rb",
|
76
|
+
"spec/rails_best_practices/checks/nested_model_forms_check_spec.rb",
|
77
|
+
"spec/rails_best_practices/checks/move_finder_to_named_scope_check_spec.rb",
|
78
|
+
"spec/rails_best_practices/checks/overuse_route_customizations_check_spec.rb",
|
79
|
+
"spec/spec_helper.rb"
|
80
|
+
]
|
81
|
+
|
82
|
+
if s.respond_to? :specification_version then
|
83
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
84
|
+
s.specification_version = 3
|
85
|
+
|
86
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
87
|
+
s.add_runtime_dependency(%q<ruby_parser>, [">= 0"])
|
88
|
+
s.add_runtime_dependency(%q<ruby2ruby>, [">= 0"])
|
89
|
+
else
|
90
|
+
s.add_dependency(%q<ruby_parser>, [">= 0"])
|
91
|
+
s.add_dependency(%q<ruby2ruby>, [">= 0"])
|
92
|
+
end
|
93
|
+
else
|
94
|
+
s.add_dependency(%q<ruby_parser>, [">= 0"])
|
95
|
+
s.add_dependency(%q<ruby2ruby>, [">= 0"])
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
data/rails_best_practices.yml
CHANGED
@@ -4,4 +4,7 @@ UseScopeAccessCheck: { }
|
|
4
4
|
AddModelVirtualAttributeCheck: { }
|
5
5
|
# UseModelCallbackCheck: { }
|
6
6
|
ReplaceComplexCreationWithFactoryMethodCheck: { attribute_assignment_count: 2 }
|
7
|
-
MoveModelLogicIntoModelCheck: { called_count: 4 }
|
7
|
+
MoveModelLogicIntoModelCheck: { called_count: 4 }
|
8
|
+
# ManyToManyCollectionCheck: { }
|
9
|
+
# NestedModelFormsCheck: { }
|
10
|
+
OveruseRouteCustomizations: { customize_count: 3 }
|
@@ -10,12 +10,39 @@ describe RailsBestPractices::Checks::OveruseRouteCustomizationsCheck do
|
|
10
10
|
ActionController::Routing::Routes.draw do |map|
|
11
11
|
map.resources :posts, :member => { :comments => :get,
|
12
12
|
:create_comment => :post,
|
13
|
-
:
|
13
|
+
:update_comment => :post,
|
14
14
|
:delete_comment => :post }
|
15
15
|
end
|
16
16
|
EOF
|
17
17
|
@runner.check('config/routes.rb', content)
|
18
18
|
errors = @runner.errors
|
19
19
|
errors.should_not be_empty
|
20
|
+
errors[0].to_s.should == "config/routes.rb:2 - overuse route customizations"
|
20
21
|
end
|
21
|
-
|
22
|
+
|
23
|
+
it "should overuse route customizations with collection" do
|
24
|
+
content = <<-EOF
|
25
|
+
ActionController::Routing::Routes.draw do |map|
|
26
|
+
map.resources :posts, :member => { :create_comment => :post,
|
27
|
+
:update_comment => :post,
|
28
|
+
:delete_comment => :post },
|
29
|
+
:collection => { :comments => :get }
|
30
|
+
end
|
31
|
+
EOF
|
32
|
+
@runner.check('config/routes.rb', content)
|
33
|
+
errors = @runner.errors
|
34
|
+
errors.should_not be_empty
|
35
|
+
errors[0].to_s.should == "config/routes.rb:2 - overuse route customizations"
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should not overuse route customizations when customize route is only one" do
|
39
|
+
content = <<-EOF
|
40
|
+
ActionController::Routing::Routes.draw do |map|
|
41
|
+
map.resources :posts, :member => { :vote => :post }
|
42
|
+
end
|
43
|
+
EOF
|
44
|
+
@runner.check('config/routes.rb', content)
|
45
|
+
errors = @runner.errors
|
46
|
+
errors.should be_empty
|
47
|
+
end
|
48
|
+
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.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Richard Huang
|
@@ -11,9 +11,28 @@ cert_chain: []
|
|
11
11
|
|
12
12
|
date: 2009-11-05 00:00:00 +08:00
|
13
13
|
default_executable: rails_best_practices
|
14
|
-
dependencies:
|
15
|
-
|
16
|
-
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: ruby_parser
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: ruby2ruby
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: "0"
|
34
|
+
version:
|
35
|
+
description: check rails files according to ihower's presentation 'rails best practices'
|
17
36
|
email: flyerhzm@gmail.com
|
18
37
|
executables:
|
19
38
|
- rails_best_practices
|
@@ -23,6 +42,7 @@ extra_rdoc_files:
|
|
23
42
|
- LICENSE
|
24
43
|
- README.textile
|
25
44
|
files:
|
45
|
+
- .gitignore
|
26
46
|
- LICENSE
|
27
47
|
- README.textile
|
28
48
|
- Rakefile
|
@@ -36,6 +56,7 @@ files:
|
|
36
56
|
- lib/rails_best_practices/checks/move_finder_to_named_scope_check.rb
|
37
57
|
- lib/rails_best_practices/checks/move_model_logic_into_model_check.rb
|
38
58
|
- lib/rails_best_practices/checks/nested_model_forms_check.rb
|
59
|
+
- lib/rails_best_practices/checks/overuse_route_customizations_check.rb
|
39
60
|
- lib/rails_best_practices/checks/replace_complex_creation_with_factory_method_check.rb
|
40
61
|
- lib/rails_best_practices/checks/use_model_association_check.rb
|
41
62
|
- lib/rails_best_practices/checks/use_model_callback_check.rb
|
@@ -47,12 +68,14 @@ files:
|
|
47
68
|
- lib/rails_best_practices/core/error.rb
|
48
69
|
- lib/rails_best_practices/core/runner.rb
|
49
70
|
- lib/rails_best_practices/core/visitable_sexp.rb
|
71
|
+
- rails_best_practices.gemspec
|
50
72
|
- rails_best_practices.yml
|
51
73
|
- spec/rails_best_practices/checks/add_model_virtual_attribute_check_spec.rb
|
52
74
|
- spec/rails_best_practices/checks/many_to_many_collection_check_spec.rb
|
53
75
|
- spec/rails_best_practices/checks/move_finder_to_named_scope_check_spec.rb
|
54
76
|
- spec/rails_best_practices/checks/move_model_logic_into_model_check_spec.rb
|
55
77
|
- spec/rails_best_practices/checks/nested_model_forms_check_spec.rb
|
78
|
+
- spec/rails_best_practices/checks/overuse_route_customizations_check_spec.rb
|
56
79
|
- spec/rails_best_practices/checks/replace_complex_creation_with_factory_method_check_spec.rb
|
57
80
|
- spec/rails_best_practices/checks/use_model_association_check_spec.rb
|
58
81
|
- spec/rails_best_practices/checks/use_model_callback_check_spec.rb
|
@@ -86,7 +109,7 @@ rubyforge_project:
|
|
86
109
|
rubygems_version: 1.3.5
|
87
110
|
signing_key:
|
88
111
|
specification_version: 3
|
89
|
-
summary:
|
112
|
+
summary: check rails files according to ihower's presentation 'rails best practices'
|
90
113
|
test_files:
|
91
114
|
- spec/rails_best_practices/checks/use_scope_access_check_spec.rb
|
92
115
|
- spec/rails_best_practices/checks/add_model_virtual_attribute_check_spec.rb
|