rails_best_practices 1.9.1 → 1.10.0
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/.rvmrc +1 -1
- data/Gemfile +1 -1
- data/Gemfile.lock +10 -2
- data/README.md +33 -27
- data/lib/rails_best_practices/analyzer.rb +13 -13
- data/lib/rails_best_practices/core/check.rb +7 -6
- data/lib/rails_best_practices/core/checking_visitor.rb +1 -1
- data/lib/rails_best_practices/core/runner.rb +2 -3
- data/lib/rails_best_practices/core_ext/sexp.rb +18 -17
- data/lib/rails_best_practices/lexicals.rb +1 -0
- data/lib/rails_best_practices/lexicals/long_line_check.rb +31 -0
- data/lib/rails_best_practices/prepares/config_prepare.rb +1 -1
- data/lib/rails_best_practices/reviews.rb +2 -0
- data/lib/rails_best_practices/reviews/add_model_virtual_attribute_review.rb +2 -2
- data/lib/rails_best_practices/reviews/always_add_db_index_review.rb +1 -1
- data/lib/rails_best_practices/reviews/hash_syntax_review.rb +63 -0
- data/lib/rails_best_practices/reviews/keep_finders_on_their_own_model_review.rb +1 -1
- data/lib/rails_best_practices/reviews/move_code_into_model_review.rb +1 -1
- data/lib/rails_best_practices/reviews/move_finder_to_named_scope_review.rb +1 -1
- data/lib/rails_best_practices/reviews/move_model_logic_into_model_review.rb +1 -1
- data/lib/rails_best_practices/reviews/needless_deep_nesting_review.rb +1 -1
- data/lib/rails_best_practices/reviews/overuse_route_customizations_review.rb +1 -1
- data/lib/rails_best_practices/reviews/protect_mass_assignment_review.rb +15 -6
- data/lib/rails_best_practices/reviews/remove_unused_methods_in_models_review.rb +4 -2
- data/lib/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review.rb +8 -4
- data/lib/rails_best_practices/reviews/replace_instance_variable_with_local_variable_review.rb +2 -1
- data/lib/rails_best_practices/reviews/restrict_auto_generated_routes_review.rb +52 -8
- data/lib/rails_best_practices/reviews/simplify_render_in_views_review.rb +14 -2
- data/lib/rails_best_practices/reviews/use_before_filter_review.rb +8 -3
- data/lib/rails_best_practices/reviews/use_multipart_alternative_as_content_type_of_email_review.rb +2 -1
- data/lib/rails_best_practices/reviews/use_observer_review.rb +1 -1
- data/lib/rails_best_practices/reviews/use_parentheses_in_method_def_review.rb +33 -0
- data/lib/rails_best_practices/reviews/use_query_attribute_review.rb +16 -6
- data/lib/rails_best_practices/reviews/use_say_with_time_in_migrations_review.rb +9 -6
- data/lib/rails_best_practices/reviews/use_scope_access_review.rb +8 -3
- data/lib/rails_best_practices/version.rb +1 -1
- data/rails_best_practices.yml +28 -25
- data/rake_rubies.sh +1 -1
- data/spec/rails_best_practices/analyzer_spec.rb +1 -1
- data/spec/rails_best_practices/core/check_spec.rb +7 -7
- data/spec/rails_best_practices/core/checking_visitor_spec.rb +7 -7
- data/spec/rails_best_practices/core/error_spec.rb +12 -12
- data/spec/rails_best_practices/core_ext/sexp_spec.rb +103 -85
- data/spec/rails_best_practices/lexicals/long_line_check_spec.rb +47 -0
- data/spec/rails_best_practices/lexicals/remove_tab_check_spec.rb +1 -1
- data/spec/rails_best_practices/lexicals/remove_trailing_whitespace_check_spec.rb +1 -1
- data/spec/rails_best_practices/prepares/config_prepare_spec.rb +1 -1
- data/spec/rails_best_practices/prepares/controller_prepare_spec.rb +1 -1
- data/spec/rails_best_practices/prepares/helper_prepare_spec.rb +1 -1
- data/spec/rails_best_practices/prepares/mailer_prepare_spec.rb +1 -1
- data/spec/rails_best_practices/prepares/model_prepare_spec.rb +4 -4
- data/spec/rails_best_practices/prepares/route_prepare_spec.rb +54 -54
- data/spec/rails_best_practices/prepares/schema_prepare_spec.rb +6 -6
- data/spec/rails_best_practices/reviews/add_model_virtual_attribute_review_spec.rb +4 -4
- data/spec/rails_best_practices/reviews/always_add_db_index_review_spec.rb +46 -46
- data/spec/rails_best_practices/reviews/dry_bundler_in_capistrano_review_spec.rb +3 -3
- data/spec/rails_best_practices/reviews/hash_syntax_review_spec.rb +67 -0
- data/spec/rails_best_practices/reviews/isolate_seed_data_review_spec.rb +8 -8
- data/spec/rails_best_practices/reviews/keep_finders_on_their_own_model_review_spec.rb +9 -9
- data/spec/rails_best_practices/reviews/law_of_demeter_review_spec.rb +7 -7
- data/spec/rails_best_practices/reviews/move_code_into_controller_review_spec.rb +1 -1
- data/spec/rails_best_practices/reviews/move_code_into_helper_review_spec.rb +1 -1
- data/spec/rails_best_practices/reviews/move_code_into_model_review_spec.rb +1 -1
- data/spec/rails_best_practices/reviews/move_finder_to_named_scope_review_spec.rb +13 -13
- data/spec/rails_best_practices/reviews/move_model_logic_into_model_review_spec.rb +2 -2
- data/spec/rails_best_practices/reviews/needless_deep_nesting_review_spec.rb +3 -3
- data/spec/rails_best_practices/reviews/not_use_default_route_review_spec.rb +3 -3
- data/spec/rails_best_practices/reviews/not_use_times_ago_in_words_review_spec.rb +1 -1
- data/spec/rails_best_practices/reviews/overuse_route_customizations_review_spec.rb +26 -26
- data/spec/rails_best_practices/reviews/protect_mass_assignment_review_spec.rb +11 -2
- data/spec/rails_best_practices/reviews/remove_empty_helpers_review_spec.rb +1 -1
- data/spec/rails_best_practices/reviews/remove_unused_methods_in_controllers_review_spec.rb +8 -8
- data/spec/rails_best_practices/reviews/remove_unused_methods_in_helpers_review_spec.rb +2 -2
- data/spec/rails_best_practices/reviews/remove_unused_methods_in_models_review_spec.rb +25 -10
- data/spec/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review_spec.rb +3 -3
- data/spec/rails_best_practices/reviews/replace_instance_variable_with_local_variable_review_spec.rb +1 -1
- data/spec/rails_best_practices/reviews/restrict_auto_generated_routes_review_spec.rb +28 -28
- data/spec/rails_best_practices/reviews/simplify_render_in_controllers_review_spec.rb +4 -4
- data/spec/rails_best_practices/reviews/simplify_render_in_views_review_spec.rb +15 -7
- data/spec/rails_best_practices/reviews/use_before_filter_review_spec.rb +3 -3
- data/spec/rails_best_practices/reviews/use_model_association_review_spec.rb +3 -3
- data/spec/rails_best_practices/reviews/use_multipart_alternative_as_content_type_of_email_review_spec.rb +3 -3
- data/spec/rails_best_practices/reviews/use_observer_review_spec.rb +5 -5
- data/spec/rails_best_practices/reviews/use_parenthesis_in_method_def_spec.rb +41 -0
- data/spec/rails_best_practices/reviews/use_query_attribute_review_spec.rb +3 -3
- data/spec/rails_best_practices/reviews/use_say_with_time_in_migrations_review_spec.rb +8 -8
- data/spec/rails_best_practices/reviews/use_scope_access_review_spec.rb +9 -9
- data/spec/spec_helper.rb +1 -1
- metadata +36 -29
- data/.rspec.example +0 -2
- data/.rvmrc.example +0 -2
data/.rvmrc
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
rvm_gemset_create_on_use_flag=1
|
2
|
-
rvm gemset use ruby-1.9.3-
|
2
|
+
rvm gemset use ruby-1.9.3-p194@rails_best_practices
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
rails_best_practices (1.
|
4
|
+
rails_best_practices (1.10.0)
|
5
5
|
activesupport
|
6
6
|
awesome_print
|
7
7
|
colored
|
@@ -17,6 +17,7 @@ GEM
|
|
17
17
|
i18n (~> 0.6)
|
18
18
|
multi_json (~> 1.0)
|
19
19
|
awesome_print (1.0.2)
|
20
|
+
coderay (1.0.6)
|
20
21
|
colored (1.2)
|
21
22
|
diff-lcs (1.1.3)
|
22
23
|
erubis (2.7.0)
|
@@ -27,10 +28,15 @@ GEM
|
|
27
28
|
guard (>= 0.8.4)
|
28
29
|
haml (3.1.3)
|
29
30
|
i18n (0.6.0)
|
31
|
+
method_source (0.7.1)
|
30
32
|
multi_json (1.2.0)
|
31
33
|
progressbar (0.11.0)
|
34
|
+
pry (0.9.9.6)
|
35
|
+
coderay (~> 1.0.5)
|
36
|
+
method_source (~> 0.7.1)
|
37
|
+
slop (>= 2.4.4, < 3)
|
32
38
|
rake (0.9.2.2)
|
33
|
-
rb-fsevent (0.
|
39
|
+
rb-fsevent (0.9.1)
|
34
40
|
rspec (2.7.0)
|
35
41
|
rspec-core (~> 2.7.0)
|
36
42
|
rspec-expectations (~> 2.7.0)
|
@@ -43,6 +49,7 @@ GEM
|
|
43
49
|
slim (1.0.4)
|
44
50
|
temple (~> 0.3.4)
|
45
51
|
tilt (~> 1.3.2)
|
52
|
+
slop (2.4.4)
|
46
53
|
temple (0.3.4)
|
47
54
|
thor (0.14.6)
|
48
55
|
tilt (1.3.3)
|
@@ -56,6 +63,7 @@ DEPENDENCIES
|
|
56
63
|
guard
|
57
64
|
guard-rspec
|
58
65
|
haml
|
66
|
+
pry
|
59
67
|
rails_best_practices!
|
60
68
|
rake
|
61
69
|
rb-fsevent
|
data/README.md
CHANGED
@@ -112,40 +112,43 @@ to generate `rails_best_practices.yml` file.
|
|
112
112
|
|
113
113
|
Now you can customize this configuration file, the default configuration is as follows:
|
114
114
|
|
115
|
-
MoveFinderToNamedScopeCheck: { }
|
116
|
-
UseModelAssociationCheck: { }
|
117
|
-
UseScopeAccessCheck: { }
|
118
115
|
AddModelVirtualAttributeCheck: { }
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
NotUseDefaultRouteCheck: { }
|
116
|
+
AlwaysAddDbIndexCheck: { }
|
117
|
+
DryBundlerInCapistranoCheck: { }
|
118
|
+
HashSyntaxCheck: { only_symbol: false, only_string: false }
|
119
|
+
IsolateSeedDataCheck: { }
|
124
120
|
KeepFindersOnTheirOwnModelCheck: { }
|
125
121
|
LawOfDemeterCheck: { }
|
126
|
-
|
127
|
-
IsolateSeedDataCheck: { }
|
128
|
-
AlwaysAddDbIndexCheck: { }
|
129
|
-
UseBeforeFilterCheck: { customize_count: 2 }
|
122
|
+
LongLineCheck: { max_line_length: 80 }
|
130
123
|
MoveCodeIntoControllerCheck: { }
|
131
|
-
MoveCodeIntoModelCheck: { use_count: 2 }
|
132
124
|
MoveCodeIntoHelperCheck: { array_count: 3 }
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
125
|
+
MoveCodeIntoModelCheck: { use_count: 2 }
|
126
|
+
MoveFinderToNamedScopeCheck: { }
|
127
|
+
MoveModelLogicIntoModelCheck: { use_count: 4 }
|
128
|
+
NeedlessDeepNestingCheck: { nested_count: 2 }
|
129
|
+
NotUseDefaultRouteCheck: { }
|
130
|
+
NotUseTimeAgoInWordsCheck: {}
|
131
|
+
OveruseRouteCustomizationsCheck: { customize_count: 3 }
|
132
|
+
ProtectMassAssignmentCheck: {}
|
141
133
|
RemoveEmptyHelpersCheck: {}
|
142
134
|
RemoveTabCheck: {}
|
143
|
-
|
144
|
-
RemoveUnusedMethodsInModelsCheck: { except_methods: [] }
|
135
|
+
RemoveTrailingWhitespaceCheck: { }
|
145
136
|
RemoveUnusedMethodsInControllersCheck: { except_methods: [] }
|
146
137
|
RemoveUnusedMethodsInHelpersCheck: { except_methods: [] }
|
147
|
-
|
148
|
-
|
138
|
+
RemoveUnusedMethodsInModelsCheck: { except_methods: [] }
|
139
|
+
ReplaceComplexCreationWithFactoryMethodCheck: { attribute_assignment_count: 2 }
|
140
|
+
ReplaceInstanceVariableWithLocalVariableCheck: { }
|
141
|
+
RestrictAutoGeneratedRoutesCheck: { }
|
142
|
+
SimplifyRenderInControllersCheck: {}
|
143
|
+
SimplifyRenderInViewsCheck: {}
|
144
|
+
UseBeforeFilterCheck: { customize_count: 2 }
|
145
|
+
UseModelAssociationCheck: { }
|
146
|
+
UseMultipartAlternativeAsContentTypeOfEmailCheck: {}
|
147
|
+
UseObserverCheck: { }
|
148
|
+
UseParenthesesInMethodDefCheck: {}
|
149
|
+
UseQueryAttributeCheck: { }
|
150
|
+
UseSayWithTimeInMigrationsCheck: { }
|
151
|
+
UseScopeAccessCheck: { }
|
149
152
|
|
150
153
|
You can remove or comment one review to disable it, and you can change the options.
|
151
154
|
|
@@ -184,7 +187,7 @@ Mailer
|
|
184
187
|
Migration
|
185
188
|
|
186
189
|
1. Isolating seed data
|
187
|
-
2. Always add db
|
190
|
+
2. Always add db index
|
188
191
|
3. Use say with time in migrations
|
189
192
|
|
190
193
|
Controller
|
@@ -215,6 +218,9 @@ Other
|
|
215
218
|
|
216
219
|
1. Remove trailing whitespace
|
217
220
|
2. Remove tab
|
221
|
+
3. Hash Syntax
|
222
|
+
4. Use parentheses in method def
|
223
|
+
5. Long line
|
218
224
|
|
219
225
|
Write Your Own Check List
|
220
226
|
-------------------------
|
@@ -236,7 +242,7 @@ Follow us on twitter: <http://twitter.com/railsbp>
|
|
236
242
|
Send us email: <team@railsbp.com>
|
237
243
|
|
238
244
|
|
239
|
-
Copyright © 2009 -
|
245
|
+
Copyright © 2009 - 2012 Richard Huang (flyerhzm@gmail.com), released under the MIT license
|
240
246
|
|
241
247
|
|
242
248
|
[1]:https://github.com/railsbp/rails_best_practices/wiki/How-to-write-your-own-check-list
|
@@ -115,7 +115,7 @@ module RailsBestPractices
|
|
115
115
|
#
|
116
116
|
# @param [Array] dirs what directories to expand
|
117
117
|
# @return [Array] all files expanded
|
118
|
-
def expand_dirs_to_files
|
118
|
+
def expand_dirs_to_files(*dirs)
|
119
119
|
extensions = ['rb', 'erb', 'rake', 'rhtml', 'haml', 'slim', 'builder', 'rxml']
|
120
120
|
|
121
121
|
dirs.flatten.map { |entry|
|
@@ -135,7 +135,7 @@ module RailsBestPractices
|
|
135
135
|
#
|
136
136
|
# @param [Array] files
|
137
137
|
# @return [Array] sorted files
|
138
|
-
def file_sort
|
138
|
+
def file_sort(files)
|
139
139
|
models = files.find_all { |file| file =~ Core::Check::MODEL_FILES }
|
140
140
|
mailers = files.find_all { |file| file =~ Core::Check::MAILER_FILES }
|
141
141
|
helpers = files.find_all { |file| file =~ Core::Check::HELPER_FILES }
|
@@ -152,7 +152,7 @@ module RailsBestPractices
|
|
152
152
|
# @param [Array] files
|
153
153
|
# @param [Regexp] pattern files match the pattern will be ignored
|
154
154
|
# @return [Array] files that not match the pattern
|
155
|
-
def file_ignore
|
155
|
+
def file_ignore(files, pattern)
|
156
156
|
files.reject { |file| file.index(pattern) }
|
157
157
|
end
|
158
158
|
|
@@ -160,7 +160,7 @@ module RailsBestPractices
|
|
160
160
|
#
|
161
161
|
# @param [Array] files
|
162
162
|
# @param [Regexp] patterns, files match any pattern will be accepted
|
163
|
-
def file_accept
|
163
|
+
def file_accept(files, patterns)
|
164
164
|
files.reject { |file| !patterns.any? { |pattern| file =~ pattern } }
|
165
165
|
end
|
166
166
|
|
@@ -217,15 +217,15 @@ module RailsBestPractices
|
|
217
217
|
File.open(@options["output-file"], "w+") do |file|
|
218
218
|
eruby = Erubis::Eruby.new(template)
|
219
219
|
file.puts eruby.evaluate(
|
220
|
-
:
|
221
|
-
:
|
222
|
-
:
|
223
|
-
:
|
224
|
-
:
|
225
|
-
:
|
226
|
-
:
|
227
|
-
:
|
228
|
-
:
|
220
|
+
errors: errors,
|
221
|
+
error_types: error_types,
|
222
|
+
textmate: @options["with-textmate"],
|
223
|
+
mvim: @options["with-mvim"],
|
224
|
+
github: @options["with-github"],
|
225
|
+
github_name: @options["github-name"],
|
226
|
+
last_commit_id: last_commit_id,
|
227
|
+
git: @options["with-git"],
|
228
|
+
hg: @options["with-hg"]
|
229
229
|
)
|
230
230
|
end
|
231
231
|
end
|
@@ -81,11 +81,11 @@ module RailsBestPractices
|
|
81
81
|
# @param [Integer] line_number, is the line number of the source code which is reviewing
|
82
82
|
def add_error(message, filename = @node.file, line_number = @node.line)
|
83
83
|
errors << RailsBestPractices::Core::Error.new(
|
84
|
-
:
|
85
|
-
:
|
86
|
-
:
|
87
|
-
:
|
88
|
-
:
|
84
|
+
filename: filename,
|
85
|
+
line_number: line_number,
|
86
|
+
message: message,
|
87
|
+
type: self.class.to_s,
|
88
|
+
url: url
|
89
89
|
)
|
90
90
|
end
|
91
91
|
|
@@ -312,7 +312,7 @@ module RailsBestPractices
|
|
312
312
|
# remember hash values for hash key "methods".
|
313
313
|
#
|
314
314
|
# def to_xml(options = {})
|
315
|
-
# super options.merge(:
|
315
|
+
# super options.merge(exclude: :visible, methods: [:is_discussion_conversation])
|
316
316
|
# end
|
317
317
|
add_callback "start_bare_assoc_hash" do |node|
|
318
318
|
if node.hash_keys.include? "methods"
|
@@ -336,6 +336,7 @@ module RailsBestPractices
|
|
336
336
|
|
337
337
|
private
|
338
338
|
def mark_used(method_node)
|
339
|
+
return if method_node == :call
|
339
340
|
if :bare_assoc_hash == method_node.sexp_type
|
340
341
|
method_node.hash_values.each { |value_node| mark_used(value_node) }
|
341
342
|
elsif :array == method_node.sexp_type
|
@@ -17,7 +17,7 @@ module RailsBestPractices
|
|
17
17
|
# remember all the checks for prepare and review processes according to interesting_nodes.
|
18
18
|
#
|
19
19
|
# @param [Hash] options
|
20
|
-
# {:
|
20
|
+
# {lexicals: [], prepares: [], reviews: []}
|
21
21
|
def initialize(options={})
|
22
22
|
@lexicals = options[:lexicals]
|
23
23
|
[:prepare, :review].each do |process|
|
@@ -48,10 +48,9 @@ module RailsBestPractices
|
|
48
48
|
@lexicals = lexicals.empty? ? load_lexicals : lexicals
|
49
49
|
@prepares = prepares.empty? ? load_prepares : prepares
|
50
50
|
@reviews = reviews.empty? ? load_reviews : reviews
|
51
|
-
|
52
51
|
load_plugin_reviews if reviews.empty?
|
53
52
|
|
54
|
-
@checker ||= CheckingVisitor.new(:
|
53
|
+
@checker ||= CheckingVisitor.new(prepares: @prepares, reviews: @reviews, lexicals: @lexicals)
|
55
54
|
@debug = false
|
56
55
|
@whiny = false
|
57
56
|
end
|
@@ -169,7 +168,7 @@ module RailsBestPractices
|
|
169
168
|
elsif filename =~ /.*\.haml$/
|
170
169
|
begin
|
171
170
|
require 'haml'
|
172
|
-
content = Haml::Engine.new(content, {:
|
171
|
+
content = Haml::Engine.new(content, {ugly: true}).precompiled
|
173
172
|
# remove \xxx characters
|
174
173
|
content.gsub!(/\\\d{3}/, '')
|
175
174
|
rescue LoadError
|
@@ -21,11 +21,16 @@ class Sexp
|
|
21
21
|
# s(:@ident, "test", s(2, 12)
|
22
22
|
# => 2
|
23
23
|
def line
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
case sexp_type
|
25
|
+
when :def, :defs, :command, :command_call, :call, :fcall, :method_add_arg, :method_add_block,
|
26
|
+
:var_ref, :vcall, :const_ref, :const_path_ref, :class, :module, :if, :unless, :elsif, :ifop, :binary,
|
27
|
+
:alias, :symbol_literal, :symbol, :aref, :hash, :assoc_new, :string_literal
|
27
28
|
self[1].line
|
28
|
-
|
29
|
+
when :assoclist_from_args, :bare_assoc_hash
|
30
|
+
self[1][0].line
|
31
|
+
when :string_add
|
32
|
+
self[2].line
|
33
|
+
when :array
|
29
34
|
array_values.first.line
|
30
35
|
else
|
31
36
|
self.last.first if self.last.is_a? Array
|
@@ -53,10 +58,10 @@ class Sexp
|
|
53
58
|
#
|
54
59
|
# options is the grep conditions, like
|
55
60
|
#
|
56
|
-
# :
|
57
|
-
# :
|
58
|
-
# :
|
59
|
-
# :
|
61
|
+
# sexp_type: :call,
|
62
|
+
# subject: "Post",
|
63
|
+
# message: ["find", "new"]
|
64
|
+
# to_s: "devise"
|
60
65
|
#
|
61
66
|
# the condition key is one of :sexp_type, :subject, :message, :to_s,
|
62
67
|
# the condition value can be Symbol, Array or Sexp.
|
@@ -81,9 +86,9 @@ class Sexp
|
|
81
86
|
#
|
82
87
|
# options is the grep conditions, like
|
83
88
|
#
|
84
|
-
# :
|
85
|
-
# :
|
86
|
-
# :
|
89
|
+
# sexp_type: :call,
|
90
|
+
# subject: s(:const, Post),
|
91
|
+
# message: [:find, :new]
|
87
92
|
#
|
88
93
|
# the condition key is one of :sexp_type, :subject, :message, and to_s,
|
89
94
|
# the condition value can be Symbol, Array or Sexp.
|
@@ -326,7 +331,7 @@ class Sexp
|
|
326
331
|
#
|
327
332
|
# @return [Sexp] conditional statement of if node
|
328
333
|
def conditional_statement
|
329
|
-
if [:if, :unless, :elsif].include? sexp_type
|
334
|
+
if [:if, :unless, :elsif, :ifop].include? sexp_type
|
330
335
|
self[1]
|
331
336
|
end
|
332
337
|
end
|
@@ -745,11 +750,7 @@ class Sexp
|
|
745
750
|
def to_object
|
746
751
|
case sexp_type
|
747
752
|
when :array
|
748
|
-
|
749
|
-
[]
|
750
|
-
else
|
751
|
-
arguments.all.map(&:to_s)
|
752
|
-
end
|
753
|
+
array_values.map(&:to_s)
|
753
754
|
else
|
754
755
|
to_s
|
755
756
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'rails_best_practices/reviews/review'
|
3
|
+
module RailsBestPractices
|
4
|
+
module Lexicals
|
5
|
+
# Keep lines fewer than 80 characters.
|
6
|
+
class LongLineCheck < Core::Check
|
7
|
+
def initialize(options = {})
|
8
|
+
super()
|
9
|
+
@max_line_length = options['max_line_length'] || 80
|
10
|
+
end
|
11
|
+
|
12
|
+
# check if a line is over 80 characters
|
13
|
+
#
|
14
|
+
# @param [String] filename name of the file
|
15
|
+
# @param [String] content content of the file
|
16
|
+
def check(filename, content)
|
17
|
+
# Only check ruby files
|
18
|
+
if /\.rb$/ =~ filename
|
19
|
+
line_no = 0
|
20
|
+
content.each_line do |line|
|
21
|
+
line_no += 1
|
22
|
+
actual_line_length = line.sub(/\s+$/, '').length
|
23
|
+
if actual_line_length > @max_line_length
|
24
|
+
add_error("line is longer than #{@max_line_length} characters (#{actual_line_length} characters)", filename, line_no)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -12,7 +12,7 @@ module RailsBestPractices
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def start_assign(node)
|
15
|
-
if node.left_value.grep_node(:
|
15
|
+
if node.left_value.grep_node(sexp_type: [:vcall, :var_ref], to_s: "config").present?
|
16
16
|
@configs[node.left_value.to_s] = node.right_value.to_s
|
17
17
|
end
|
18
18
|
end
|
@@ -31,3 +31,5 @@ require 'rails_best_practices/reviews/remove_unused_methods_in_controllers_revie
|
|
31
31
|
require 'rails_best_practices/reviews/remove_unused_methods_in_helpers_review'
|
32
32
|
require 'rails_best_practices/reviews/not_use_time_ago_in_words_review'
|
33
33
|
require 'rails_best_practices/reviews/protect_mass_assignment_review'
|
34
|
+
require 'rails_best_practices/reviews/use_parentheses_in_method_def_review'
|
35
|
+
require 'rails_best_practices/reviews/hash_syntax_review'
|
@@ -53,9 +53,9 @@ module RailsBestPractices
|
|
53
53
|
left_value = node.left_value
|
54
54
|
right_value = node.right_value
|
55
55
|
return unless :field == left_value.sexp_type && :call == right_value.sexp_type
|
56
|
-
aref_node = right_value.grep_node(:
|
56
|
+
aref_node = right_value.grep_node(sexp_type: :aref)
|
57
57
|
if aref_node
|
58
|
-
assignments(left_value.subject.to_s) << {:
|
58
|
+
assignments(left_value.subject.to_s) << {message: left_value.message.to_s, arguments: aref_node.to_s}
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
@@ -17,7 +17,7 @@ module RailsBestPractices
|
|
17
17
|
# if the subject of command node is "add_index", then remember the index columns
|
18
18
|
# after all of these, at the end of review process
|
19
19
|
#
|
20
|
-
# ActiveRecord::Schema.define(:
|
20
|
+
# ActiveRecord::Schema.define(version: 20101201111111) do
|
21
21
|
# ......
|
22
22
|
# end
|
23
23
|
#
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'rails_best_practices/reviews/review'
|
3
|
+
|
4
|
+
module RailsBestPractices
|
5
|
+
module Reviews
|
6
|
+
# Check ruby 1.8 style hash and suggest to change hash syntax to 1.9.
|
7
|
+
#
|
8
|
+
# Review process:
|
9
|
+
# check hash nodes in all files,
|
10
|
+
# if the sexp type of hash key nodes is not :@lable,
|
11
|
+
# then the hash is ruby 1.8 style.
|
12
|
+
class HashSyntaxReview < Review
|
13
|
+
interesting_nodes :hash, :bare_assoc_hash
|
14
|
+
interesting_files ALL_FILES
|
15
|
+
|
16
|
+
def initialize(options = {})
|
17
|
+
super()
|
18
|
+
@only_symbol = options[:only_symbol]
|
19
|
+
@only_string = options[:only_string]
|
20
|
+
end
|
21
|
+
|
22
|
+
# check hash node to see if it is ruby 1.8 style.
|
23
|
+
def start_hash(node)
|
24
|
+
return if s(:hash, nil) == node
|
25
|
+
pair_nodes = node[1][1]
|
26
|
+
|
27
|
+
if hash_is_18?(pair_nodes)
|
28
|
+
add_error "change Hash Syntax to 1.9"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# check bare_assoc_hash node to see if it is ruby 1.8 style.
|
33
|
+
def start_bare_assoc_hash(node)
|
34
|
+
pair_nodes = node[1]
|
35
|
+
|
36
|
+
if hash_is_18?(pair_nodes)
|
37
|
+
add_error "change Hash Syntax to 1.9"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
protected
|
42
|
+
# check if hash key/value pairs are ruby 1.8 style.
|
43
|
+
#
|
44
|
+
# hash key of ruby 1.9 style is :@label,
|
45
|
+
# so if it is not, then it is ruby 1.8 style.
|
46
|
+
def hash_is_18?(pair_nodes)
|
47
|
+
return false if pair_nodes.blank?
|
48
|
+
pair_nodes.size.times do |i|
|
49
|
+
if @only_symbol
|
50
|
+
return true if :symbol_literal == pair_nodes[i][1].sexp_type
|
51
|
+
elsif @only_string
|
52
|
+
return true if :string_literal == pair_nodes[i][1].sexp_type
|
53
|
+
elsif :@label != pair_nodes[i][1].sexp_type
|
54
|
+
return true
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
false
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|