rails_best_practices 0.2.10 → 0.2.11
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +2 -2
- data/VERSION +1 -1
- data/lib/rails_best_practices/checks/add_model_virtual_attribute_check.rb +11 -6
- data/lib/rails_best_practices/checks/check.rb +2 -2
- data/lib/rails_best_practices/command.rb +26 -9
- data/lib/rails_best_practices/core/runner.rb +1 -2
- data/rails_best_practices.gemspec +19 -19
- data/spec/rails_best_practices/checks/add_model_virtual_attribute_check_spec.rb +35 -0
- metadata +14 -14
data/Rakefile
CHANGED
@@ -27,7 +27,7 @@ Jeweler::Tasks.new do |gemspec|
|
|
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
|
+
gemspec.add_dependency 'ruby_parser', '>= 2.0.4'
|
31
|
+
gemspec.add_dependency 'ruby2ruby', '>= 1.2.4'
|
32
32
|
end
|
33
33
|
Jeweler::GemcutterTasks.new
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.11
|
@@ -34,23 +34,28 @@ module RailsBestPractices
|
|
34
34
|
|
35
35
|
def attribute_assignment(node)
|
36
36
|
variable = node.subject
|
37
|
-
|
37
|
+
arguments_node = nil
|
38
|
+
node.arguments.recursive_children do |child|
|
39
|
+
if :[] == child.message
|
40
|
+
arguments_node = child
|
41
|
+
break
|
42
|
+
end
|
43
|
+
end
|
44
|
+
return if variable.nil? or arguments_node.nil?
|
38
45
|
@variables[variable] ||= []
|
39
|
-
@variables[variable] << {:message => node.message, :arguments =>
|
46
|
+
@variables[variable] << {:message => node.message, :arguments => arguments_node}
|
40
47
|
end
|
41
48
|
|
42
49
|
def call_assignment(node)
|
43
50
|
if node.message == :save
|
44
51
|
variable = node.subject
|
45
|
-
add_error "add model virtual attribute (for #{node.subject.to_ruby})" if params_dup?(@variables[variable].collect {|h| h[:arguments]
|
52
|
+
add_error "add model virtual attribute (for #{node.subject.to_ruby})" if params_dup?(@variables[variable].collect {|h| h[:arguments]})
|
46
53
|
end
|
47
54
|
end
|
48
55
|
|
49
56
|
def params_dup?(nodes)
|
50
57
|
return false if nodes.nil?
|
51
|
-
|
52
|
-
params_arguments = params_nodes.collect{|node| node.arguments}
|
53
|
-
!params_arguments.dups.empty?
|
58
|
+
!nodes.dups.empty?
|
54
59
|
end
|
55
60
|
end
|
56
61
|
end
|
@@ -16,8 +16,8 @@ module RailsBestPractices
|
|
16
16
|
NODE_TYPES.each do |node|
|
17
17
|
start_node_method = "evaluate_start_#{node}"
|
18
18
|
end_node_method = "evaluate_end_#{node}"
|
19
|
-
define_method(start_node_method) { } unless self.respond_to?(start_node_method)
|
20
|
-
define_method(end_node_method) { } unless self.respond_to?(end_node_method)
|
19
|
+
define_method(start_node_method) { |node| } unless self.respond_to?(start_node_method)
|
20
|
+
define_method(end_node_method) { |node| } unless self.respond_to?(end_node_method)
|
21
21
|
end
|
22
22
|
|
23
23
|
def position(offset = 0)
|
@@ -1,8 +1,7 @@
|
|
1
1
|
require 'optparse'
|
2
2
|
|
3
3
|
def expand_dirs_to_files *dirs
|
4
|
-
|
5
|
-
extensions = ['rb', 'builder']
|
4
|
+
extensions = ['rb', 'erb', 'builder']
|
6
5
|
|
7
6
|
dirs.flatten.map { |p|
|
8
7
|
if File.directory? p
|
@@ -10,8 +9,12 @@ def expand_dirs_to_files *dirs
|
|
10
9
|
else
|
11
10
|
p
|
12
11
|
end
|
13
|
-
}.flatten
|
14
|
-
|
12
|
+
}.flatten
|
13
|
+
end
|
14
|
+
|
15
|
+
# for law_of_demeter_check
|
16
|
+
def model_first_sort files
|
17
|
+
files.sort { |a, b|
|
15
18
|
if a =~ /models\/.*rb/
|
16
19
|
-1
|
17
20
|
elsif b =~ /models\/.*rb/
|
@@ -23,13 +26,13 @@ def expand_dirs_to_files *dirs
|
|
23
26
|
end
|
24
27
|
|
25
28
|
# for always_add_db_index_check
|
26
|
-
def
|
29
|
+
def add_duplicate_migrations files
|
27
30
|
migration_files = files.select { |file| file.index("db/migrate") }
|
28
31
|
(files << migration_files).flatten
|
29
32
|
end
|
30
33
|
|
31
|
-
def
|
32
|
-
files.reject { |file| file.index(
|
34
|
+
def ignore_files files, pattern
|
35
|
+
files.reject { |file| file.index(pattern) }
|
33
36
|
end
|
34
37
|
|
35
38
|
options = {}
|
@@ -39,7 +42,13 @@ OptionParser.new do |opts|
|
|
39
42
|
opts.on("-d", "--debug", "Debug mode") do
|
40
43
|
options['debug'] = true
|
41
44
|
end
|
42
|
-
|
45
|
+
|
46
|
+
['vendor', 'spec', 'test', 'stories'].each do |pattern|
|
47
|
+
opts.on("--#{pattern}", "include #{pattern} files") do
|
48
|
+
options[pattern] = true
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
43
52
|
opts.on_tail("-h", "--help", "Show this message") do
|
44
53
|
puts opts
|
45
54
|
exit
|
@@ -50,7 +59,15 @@ end
|
|
50
59
|
|
51
60
|
runner = RailsBestPractices::Core::Runner.new
|
52
61
|
runner.set_debug if options['debug']
|
53
|
-
|
62
|
+
|
63
|
+
files = expand_dirs_to_files(ARGV)
|
64
|
+
files = model_first_sort(files)
|
65
|
+
files = add_duplicate_migrations(files)
|
66
|
+
['vendor', 'spec', 'test', 'stories'].each do |pattern|
|
67
|
+
files = ignore_files(files, "#{pattern}/") unless options[pattern]
|
68
|
+
end
|
69
|
+
files.each { |file| runner.check_file(file) }
|
70
|
+
|
54
71
|
runner.errors.each {|error| puts error}
|
55
72
|
puts "\nFound #{runner.errors.size} errors."
|
56
73
|
|
@@ -18,7 +18,6 @@ module RailsBestPractices
|
|
18
18
|
@checks = checks unless checks.empty?
|
19
19
|
@checks ||= load_checks
|
20
20
|
@checker ||= CheckingVisitor.new(@checks)
|
21
|
-
@parser = RubyParser.new
|
22
21
|
@debug = false
|
23
22
|
end
|
24
23
|
|
@@ -53,7 +52,7 @@ module RailsBestPractices
|
|
53
52
|
def parse(filename, content)
|
54
53
|
puts filename if @debug
|
55
54
|
begin
|
56
|
-
|
55
|
+
RubyParser.new.parse(content, filename)
|
57
56
|
rescue Exception => e
|
58
57
|
puts "#{filename} looks like it's not a valid Ruby file. Skipping..."
|
59
58
|
nil
|
@@ -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.
|
8
|
+
s.version = "0.2.11"
|
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"]
|
@@ -80,23 +80,23 @@ Gem::Specification.new do |s|
|
|
80
80
|
s.rubygems_version = %q{1.3.5}
|
81
81
|
s.summary = %q{check rails files according to ihower's presentation 'rails best practices'}
|
82
82
|
s.test_files = [
|
83
|
-
"spec/rails_best_practices/checks/
|
84
|
-
"spec/rails_best_practices/checks/
|
85
|
-
"spec/rails_best_practices/checks/
|
83
|
+
"spec/rails_best_practices/checks/use_scope_access_check_spec.rb",
|
84
|
+
"spec/rails_best_practices/checks/not_use_default_route_check_spec.rb",
|
85
|
+
"spec/rails_best_practices/checks/add_model_virtual_attribute_check_spec.rb",
|
86
86
|
"spec/rails_best_practices/checks/keep_finders_on_their_own_model_check_spec.rb",
|
87
|
-
"spec/rails_best_practices/checks/
|
87
|
+
"spec/rails_best_practices/checks/use_model_callback_check_spec.rb",
|
88
|
+
"spec/rails_best_practices/checks/isolate_seed_data_check_spec.rb",
|
88
89
|
"spec/rails_best_practices/checks/many_to_many_collection_check_spec.rb",
|
89
|
-
"spec/rails_best_practices/checks/
|
90
|
+
"spec/rails_best_practices/checks/use_model_association_check_spec.rb",
|
90
91
|
"spec/rails_best_practices/checks/move_model_logic_into_model_check_spec.rb",
|
91
|
-
"spec/rails_best_practices/checks/
|
92
|
-
"spec/rails_best_practices/checks/nested_model_forms_check_spec.rb",
|
93
|
-
"spec/rails_best_practices/checks/not_use_default_route_check_spec.rb",
|
94
|
-
"spec/rails_best_practices/checks/overuse_route_customizations_check_spec.rb",
|
92
|
+
"spec/rails_best_practices/checks/law_of_demeter_check_spec.rb",
|
95
93
|
"spec/rails_best_practices/checks/replace_complex_creation_with_factory_method_check_spec.rb",
|
96
|
-
"spec/rails_best_practices/checks/
|
97
|
-
"spec/rails_best_practices/checks/use_model_callback_check_spec.rb",
|
94
|
+
"spec/rails_best_practices/checks/nested_model_forms_check_spec.rb",
|
98
95
|
"spec/rails_best_practices/checks/use_observer_check_spec.rb",
|
99
|
-
"spec/rails_best_practices/checks/
|
96
|
+
"spec/rails_best_practices/checks/move_finder_to_named_scope_check_spec.rb",
|
97
|
+
"spec/rails_best_practices/checks/needless_deep_nesting_check_spec.rb",
|
98
|
+
"spec/rails_best_practices/checks/overuse_route_customizations_check_spec.rb",
|
99
|
+
"spec/rails_best_practices/checks/always_add_db_index_check_spec.rb",
|
100
100
|
"spec/spec_helper.rb"
|
101
101
|
]
|
102
102
|
|
@@ -105,15 +105,15 @@ Gem::Specification.new do |s|
|
|
105
105
|
s.specification_version = 3
|
106
106
|
|
107
107
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
108
|
-
s.add_runtime_dependency(%q<ruby_parser>, [">= 0"])
|
109
|
-
s.add_runtime_dependency(%q<ruby2ruby>, [">=
|
108
|
+
s.add_runtime_dependency(%q<ruby_parser>, [">= 2.0.4"])
|
109
|
+
s.add_runtime_dependency(%q<ruby2ruby>, [">= 1.2.4"])
|
110
110
|
else
|
111
|
-
s.add_dependency(%q<ruby_parser>, [">= 0"])
|
112
|
-
s.add_dependency(%q<ruby2ruby>, [">=
|
111
|
+
s.add_dependency(%q<ruby_parser>, [">= 2.0.4"])
|
112
|
+
s.add_dependency(%q<ruby2ruby>, [">= 1.2.4"])
|
113
113
|
end
|
114
114
|
else
|
115
|
-
s.add_dependency(%q<ruby_parser>, [">= 0"])
|
116
|
-
s.add_dependency(%q<ruby2ruby>, [">=
|
115
|
+
s.add_dependency(%q<ruby_parser>, [">= 2.0.4"])
|
116
|
+
s.add_dependency(%q<ruby2ruby>, [">= 1.2.4"])
|
117
117
|
end
|
118
118
|
end
|
119
119
|
|
@@ -75,4 +75,39 @@ describe RailsBestPractices::Checks::AddModelVirtualAttributeCheck do
|
|
75
75
|
errors = @runner.errors
|
76
76
|
errors.should be_empty
|
77
77
|
end
|
78
|
+
|
79
|
+
it "should add model virtual attribute with two dimension params" do
|
80
|
+
content = <<-EOF
|
81
|
+
class UsersController < ApplicationController
|
82
|
+
|
83
|
+
def create
|
84
|
+
@user = User.new(params[:user])
|
85
|
+
@user.first_name = params[:user][:full_name].split(' ', 2).first
|
86
|
+
@user.last_name = params[:user][:full_name].split(' ', 2).last
|
87
|
+
@user.save
|
88
|
+
end
|
89
|
+
end
|
90
|
+
EOF
|
91
|
+
@runner.check('app/controllers/users_controller.rb', content)
|
92
|
+
errors = @runner.errors
|
93
|
+
errors.should_not be_empty
|
94
|
+
errors[0].to_s.should == "app/controllers/users_controller.rb:3 - add model virtual attribute (for @user)"
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should no add model virtual attribute with two dimension params" do
|
98
|
+
content = <<-EOF
|
99
|
+
class UsersController < ApplicationController
|
100
|
+
|
101
|
+
def create
|
102
|
+
@user = User.new(params[:user])
|
103
|
+
@user.first_name = params[:user][:first_name]
|
104
|
+
@user.last_name = params[:user][:last_name]
|
105
|
+
@user.save
|
106
|
+
end
|
107
|
+
end
|
108
|
+
EOF
|
109
|
+
@runner.check('app/controllers/users_controller.rb', content)
|
110
|
+
errors = @runner.errors
|
111
|
+
errors.should be_empty
|
112
|
+
end
|
78
113
|
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.
|
4
|
+
version: 0.2.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Richard Huang
|
@@ -20,7 +20,7 @@ dependencies:
|
|
20
20
|
requirements:
|
21
21
|
- - ">="
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version:
|
23
|
+
version: 2.0.4
|
24
24
|
version:
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: ruby2ruby
|
@@ -30,7 +30,7 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 1.2.4
|
34
34
|
version:
|
35
35
|
description: check rails files according to ihower's presentation 'rails best practices'
|
36
36
|
email: flyerhzm@gmail.com
|
@@ -125,21 +125,21 @@ signing_key:
|
|
125
125
|
specification_version: 3
|
126
126
|
summary: check rails files according to ihower's presentation 'rails best practices'
|
127
127
|
test_files:
|
128
|
+
- spec/rails_best_practices/checks/use_scope_access_check_spec.rb
|
129
|
+
- spec/rails_best_practices/checks/not_use_default_route_check_spec.rb
|
128
130
|
- spec/rails_best_practices/checks/add_model_virtual_attribute_check_spec.rb
|
129
|
-
- spec/rails_best_practices/checks/always_add_db_index_check_spec.rb
|
130
|
-
- spec/rails_best_practices/checks/isolate_seed_data_check_spec.rb
|
131
131
|
- spec/rails_best_practices/checks/keep_finders_on_their_own_model_check_spec.rb
|
132
|
-
- spec/rails_best_practices/checks/
|
132
|
+
- spec/rails_best_practices/checks/use_model_callback_check_spec.rb
|
133
|
+
- spec/rails_best_practices/checks/isolate_seed_data_check_spec.rb
|
133
134
|
- spec/rails_best_practices/checks/many_to_many_collection_check_spec.rb
|
134
|
-
- spec/rails_best_practices/checks/
|
135
|
+
- spec/rails_best_practices/checks/use_model_association_check_spec.rb
|
135
136
|
- spec/rails_best_practices/checks/move_model_logic_into_model_check_spec.rb
|
136
|
-
- spec/rails_best_practices/checks/
|
137
|
-
- spec/rails_best_practices/checks/nested_model_forms_check_spec.rb
|
138
|
-
- spec/rails_best_practices/checks/not_use_default_route_check_spec.rb
|
139
|
-
- spec/rails_best_practices/checks/overuse_route_customizations_check_spec.rb
|
137
|
+
- spec/rails_best_practices/checks/law_of_demeter_check_spec.rb
|
140
138
|
- spec/rails_best_practices/checks/replace_complex_creation_with_factory_method_check_spec.rb
|
141
|
-
- spec/rails_best_practices/checks/
|
142
|
-
- spec/rails_best_practices/checks/use_model_callback_check_spec.rb
|
139
|
+
- spec/rails_best_practices/checks/nested_model_forms_check_spec.rb
|
143
140
|
- spec/rails_best_practices/checks/use_observer_check_spec.rb
|
144
|
-
- spec/rails_best_practices/checks/
|
141
|
+
- spec/rails_best_practices/checks/move_finder_to_named_scope_check_spec.rb
|
142
|
+
- spec/rails_best_practices/checks/needless_deep_nesting_check_spec.rb
|
143
|
+
- spec/rails_best_practices/checks/overuse_route_customizations_check_spec.rb
|
144
|
+
- spec/rails_best_practices/checks/always_add_db_index_check_spec.rb
|
145
145
|
- spec/spec_helper.rb
|