rails_best_practices 1.19.0 → 1.19.1
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/Guardfile +2 -2
- data/Rakefile +8 -8
- data/bin/rails_best_practices +1 -1
- data/lib/rails_best_practices/analyzer.rb +45 -45
- data/lib/rails_best_practices/command.rb +40 -40
- data/lib/rails_best_practices/core/check.rb +15 -15
- data/lib/rails_best_practices/core/klasses.rb +1 -1
- data/lib/rails_best_practices/core/methods.rb +7 -7
- data/lib/rails_best_practices/core/model_associations.rb +3 -3
- data/lib/rails_best_practices/core/modules.rb +1 -1
- data/lib/rails_best_practices/core/routes.rb +2 -2
- data/lib/rails_best_practices/core/runner.rb +3 -3
- data/lib/rails_best_practices/core_ext/erubis.rb +4 -4
- data/lib/rails_best_practices/lexicals/remove_tab_check.rb +2 -2
- data/lib/rails_best_practices/lexicals/remove_trailing_whitespace_check.rb +2 -2
- data/lib/rails_best_practices/prepares/config_prepare.rb +1 -1
- data/lib/rails_best_practices/prepares/controller_prepare.rb +8 -8
- data/lib/rails_best_practices/prepares/helper_prepare.rb +1 -1
- data/lib/rails_best_practices/prepares/initializer_prepare.rb +4 -4
- data/lib/rails_best_practices/prepares/mailer_prepare.rb +1 -1
- data/lib/rails_best_practices/prepares/model_prepare.rb +19 -19
- data/lib/rails_best_practices/prepares/route_prepare.rb +34 -34
- data/lib/rails_best_practices/prepares/schema_prepare.rb +1 -1
- 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 +7 -7
- data/lib/rails_best_practices/reviews/check_save_return_value_review.rb +1 -1
- data/lib/rails_best_practices/reviews/default_scope_is_evil_review.rb +3 -3
- data/lib/rails_best_practices/reviews/dry_bundler_in_capistrano_review.rb +3 -3
- data/lib/rails_best_practices/reviews/hash_syntax_review.rb +1 -1
- data/lib/rails_best_practices/reviews/isolate_seed_data_review.rb +6 -6
- data/lib/rails_best_practices/reviews/keep_finders_on_their_own_model_review.rb +2 -2
- data/lib/rails_best_practices/reviews/law_of_demeter_review.rb +4 -4
- data/lib/rails_best_practices/reviews/move_code_into_controller_review.rb +3 -3
- data/lib/rails_best_practices/reviews/move_code_into_helper_review.rb +2 -2
- 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 +2 -2
- 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 +4 -4
- data/lib/rails_best_practices/reviews/not_rescue_exception_review.rb +2 -2
- data/lib/rails_best_practices/reviews/not_use_default_route_review.rb +4 -4
- data/lib/rails_best_practices/reviews/not_use_time_ago_in_words_review.rb +3 -3
- data/lib/rails_best_practices/reviews/overuse_route_customizations_review.rb +2 -2
- data/lib/rails_best_practices/reviews/protect_mass_assignment_review.rb +9 -9
- data/lib/rails_best_practices/reviews/remove_empty_helpers_review.rb +3 -3
- data/lib/rails_best_practices/reviews/remove_unused_methods_in_controllers_review.rb +11 -11
- data/lib/rails_best_practices/reviews/remove_unused_methods_in_helpers_review.rb +1 -1
- data/lib/rails_best_practices/reviews/remove_unused_methods_in_models_review.rb +8 -7
- data/lib/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review.rb +2 -2
- data/lib/rails_best_practices/reviews/replace_instance_variable_with_local_variable_review.rb +2 -2
- data/lib/rails_best_practices/reviews/restrict_auto_generated_routes_review.rb +22 -22
- data/lib/rails_best_practices/reviews/review.rb +2 -2
- data/lib/rails_best_practices/reviews/simplify_render_in_controllers_review.rb +3 -3
- data/lib/rails_best_practices/reviews/simplify_render_in_views_review.rb +4 -4
- data/lib/rails_best_practices/reviews/use_before_filter_review.rb +2 -2
- data/lib/rails_best_practices/reviews/use_model_association_review.rb +2 -2
- data/lib/rails_best_practices/reviews/use_multipart_alternative_as_content_type_of_email_review.rb +2 -2
- data/lib/rails_best_practices/reviews/use_observer_review.rb +3 -3
- data/lib/rails_best_practices/reviews/use_parentheses_in_method_def_review.rb +1 -1
- data/lib/rails_best_practices/reviews/use_query_attribute_review.rb +3 -3
- data/lib/rails_best_practices/reviews/use_say_with_time_in_migrations_review.rb +2 -2
- data/lib/rails_best_practices/reviews/use_scope_access_review.rb +5 -5
- data/lib/rails_best_practices/reviews/use_turbo_sprockets_rails3_review.rb +4 -4
- data/lib/rails_best_practices/version.rb +1 -1
- data/rails_best_practices.gemspec +24 -24
- data/spec/rails_best_practices/analyzer_spec.rb +43 -43
- data/spec/rails_best_practices/core/check_spec.rb +2 -2
- data/spec/rails_best_practices/core/checks_loader_spec.rb +4 -4
- data/spec/rails_best_practices/core/error_spec.rb +16 -16
- data/spec/rails_best_practices/core/except_methods_spec.rb +15 -15
- data/spec/rails_best_practices/core/gems_spec.rb +9 -9
- data/spec/rails_best_practices/core/klasses_spec.rb +17 -17
- data/spec/rails_best_practices/core/methods_spec.rb +28 -28
- data/spec/rails_best_practices/core/model_associations_spec.rb +10 -10
- data/spec/rails_best_practices/core/model_attributes_spec.rb +10 -10
- data/spec/rails_best_practices/core/modules_spec.rb +10 -10
- data/spec/rails_best_practices/core/routes_spec.rb +10 -10
- data/spec/rails_best_practices/core/runner_spec.rb +4 -4
- data/spec/rails_best_practices/core_ext/erubis_spec.rb +7 -7
- data/spec/rails_best_practices/lexicals/long_line_check_spec.rb +7 -7
- data/spec/rails_best_practices/lexicals/remove_tab_check_spec.rb +6 -6
- data/spec/rails_best_practices/lexicals/remove_trailing_whitespace_check_spec.rb +6 -6
- data/spec/rails_best_practices/prepares/config_prepare_spec.rb +3 -3
- data/spec/rails_best_practices/prepares/controller_prepare_spec.rb +26 -26
- data/spec/rails_best_practices/prepares/gemfile_prepare_spec.rb +3 -3
- data/spec/rails_best_practices/prepares/helper_prepare_spec.rb +6 -6
- data/spec/rails_best_practices/prepares/initializer_prepare_spec.rb +5 -5
- data/spec/rails_best_practices/prepares/mailer_prepare_spec.rb +2 -2
- data/spec/rails_best_practices/prepares/model_prepare_spec.rb +108 -108
- data/spec/rails_best_practices/prepares/route_prepare_spec.rb +77 -77
- data/spec/rails_best_practices/prepares/schema_prepare_spec.rb +8 -8
- data/spec/rails_best_practices/reviews/add_model_virtual_attribute_review_spec.rb +10 -10
- data/spec/rails_best_practices/reviews/always_add_db_index_review_spec.rb +27 -27
- data/spec/rails_best_practices/reviews/check_destroy_return_value_review_spec.rb +11 -11
- data/spec/rails_best_practices/reviews/check_save_return_value_review_spec.rb +17 -17
- data/spec/rails_best_practices/reviews/default_scope_is_evil_review_spec.rb +6 -6
- data/spec/rails_best_practices/reviews/dry_bundler_in_capistrano_review_spec.rb +4 -4
- data/spec/rails_best_practices/reviews/hash_syntax_review_spec.rb +8 -8
- data/spec/rails_best_practices/reviews/isolate_seed_data_review_spec.rb +10 -10
- 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 +16 -16
- data/spec/rails_best_practices/reviews/move_code_into_controller_review_spec.rb +6 -6
- data/spec/rails_best_practices/reviews/move_code_into_helper_review_spec.rb +4 -4
- data/spec/rails_best_practices/reviews/move_code_into_model_review_spec.rb +13 -13
- data/spec/rails_best_practices/reviews/move_finder_to_named_scope_review_spec.rb +7 -7
- data/spec/rails_best_practices/reviews/move_model_logic_into_model_review_spec.rb +5 -5
- data/spec/rails_best_practices/reviews/needless_deep_nesting_review_spec.rb +10 -10
- data/spec/rails_best_practices/reviews/not_rescue_exception_review_spec.rb +8 -8
- data/spec/rails_best_practices/reviews/not_use_default_route_review_spec.rb +4 -4
- data/spec/rails_best_practices/reviews/not_use_time_ago_in_words_review_spec.rb +11 -11
- data/spec/rails_best_practices/reviews/overuse_route_customizations_review_spec.rb +7 -7
- data/spec/rails_best_practices/reviews/protect_mass_assignment_review_spec.rb +16 -16
- data/spec/rails_best_practices/reviews/remove_empty_helpers_review_spec.rb +5 -5
- data/spec/rails_best_practices/reviews/remove_unused_methods_in_controllers_review_spec.rb +33 -33
- data/spec/rails_best_practices/reviews/remove_unused_methods_in_helpers_review_spec.rb +7 -7
- data/spec/rails_best_practices/reviews/remove_unused_methods_in_models_review_spec.rb +106 -106
- data/spec/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review_spec.rb +5 -5
- data/spec/rails_best_practices/reviews/replace_instance_variable_with_local_variable_review_spec.rb +8 -8
- data/spec/rails_best_practices/reviews/restrict_auto_generated_routes_review_spec.rb +29 -29
- data/spec/rails_best_practices/reviews/simplify_render_in_controllers_review_spec.rb +15 -15
- data/spec/rails_best_practices/reviews/simplify_render_in_views_review_spec.rb +15 -15
- data/spec/rails_best_practices/reviews/use_before_filter_review_spec.rb +7 -7
- data/spec/rails_best_practices/reviews/use_model_association_review_spec.rb +7 -7
- data/spec/rails_best_practices/reviews/use_multipart_alternative_as_content_type_of_email_review_spec.rb +29 -29
- data/spec/rails_best_practices/reviews/use_observer_review_spec.rb +6 -6
- data/spec/rails_best_practices/reviews/use_parentheses_in_method_def_review_spec.rb +5 -5
- data/spec/rails_best_practices/reviews/use_query_attribute_review_spec.rb +28 -28
- data/spec/rails_best_practices/reviews/use_say_with_time_in_migrations_review_spec.rb +9 -9
- data/spec/rails_best_practices/reviews/use_scope_access_review_spec.rb +23 -23
- data/spec/rails_best_practices/reviews/use_turbo_sprockets_rails3_review_spec.rb +6 -6
- data/spec/spec_helper.rb +1 -1
- metadata +7 -7
@@ -12,12 +12,12 @@ module RailsBestPractices
|
|
12
12
|
class RemoveEmptyHelpersReview < Review
|
13
13
|
interesting_nodes :module
|
14
14
|
interesting_files HELPER_FILES
|
15
|
-
url
|
15
|
+
url 'https://rails-bestpractices.com/posts/2011/04/09/remove-empty-helpers/'
|
16
16
|
|
17
17
|
# check the body of module node, if it is nil, then it should be removed.
|
18
18
|
add_callback :start_module do |module_node|
|
19
|
-
if
|
20
|
-
add_error
|
19
|
+
if 'ApplicationHelper' != module_node.module_name.to_s && empty_body?(module_node)
|
20
|
+
add_error 'remove empty helpers'
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
@@ -46,28 +46,28 @@ module RailsBestPractices
|
|
46
46
|
# mark corresponding action as used for cells' render and render_call.
|
47
47
|
add_callback :start_command, :start_method_add_arg do |node|
|
48
48
|
case node.message.to_s
|
49
|
-
when
|
49
|
+
when 'render_cell'
|
50
50
|
controller_name, action_name, _ = *node.arguments.all.map(&:to_s)
|
51
51
|
call_method(action_name, "#{controller_name}_cell".classify)
|
52
|
-
when
|
52
|
+
when 'render'
|
53
53
|
first_argument = node.arguments.all.first
|
54
|
-
if first_argument.present? && first_argument.hash_value(
|
55
|
-
action_name = first_argument.hash_value(
|
54
|
+
if first_argument.present? && first_argument.hash_value('state').present?
|
55
|
+
action_name = first_argument.hash_value('state').to_s
|
56
56
|
call_method(action_name, current_class_name)
|
57
57
|
end
|
58
|
-
when
|
58
|
+
when 'around_filter'
|
59
59
|
node.arguments.all.each { |argument| mark_used(argument) }
|
60
|
-
when
|
60
|
+
when 'layout'
|
61
61
|
first_argument = node.arguments.all.first
|
62
62
|
if first_argument.sexp_type == :symbol_literal
|
63
63
|
mark_used(first_argument)
|
64
64
|
end
|
65
|
-
when
|
65
|
+
when 'helper_method'
|
66
66
|
node.arguments.all.each { |argument| mark_publicize(argument.to_s) }
|
67
|
-
when
|
67
|
+
when 'delegate'
|
68
68
|
last_argument = node.arguments.all.last
|
69
|
-
if :bare_assoc_hash == last_argument.sexp_type &&
|
70
|
-
controller_name = current_module_name.sub(
|
69
|
+
if :bare_assoc_hash == last_argument.sexp_type && 'controller' == last_argument.hash_value('to').to_s
|
70
|
+
controller_name = current_module_name.sub('Helper', 'Controller')
|
71
71
|
node.arguments.all[0..-2].each { |method| mark_publicize(method.to_s, controller_name) }
|
72
72
|
end
|
73
73
|
else
|
@@ -85,7 +85,7 @@ module RailsBestPractices
|
|
85
85
|
# get all unused methods at the end of review process.
|
86
86
|
add_callback :after_check do
|
87
87
|
@routes.each do |route|
|
88
|
-
if
|
88
|
+
if '*' == route.action_name
|
89
89
|
action_names = @controller_methods.get_methods(route.controller_name_with_namespaces).map(&:method_name)
|
90
90
|
action_names.each { |action_name| call_method(action_name, route.controller_name_with_namespaces) }
|
91
91
|
else
|
@@ -32,12 +32,12 @@ module RailsBestPractices
|
|
32
32
|
add_callback :start_command do |node|
|
33
33
|
arguments = node.arguments.all
|
34
34
|
case node.message.to_s
|
35
|
-
when
|
35
|
+
when 'validate', 'validate_on_create', 'validate_on_update'
|
36
36
|
arguments.each { |argument| mark_used(argument) }
|
37
|
-
when
|
37
|
+
when 'collection_select'
|
38
38
|
mark_used(arguments[3])
|
39
39
|
mark_used(arguments[4])
|
40
|
-
when
|
40
|
+
when 'grouped_collection_select'
|
41
41
|
mark_used(arguments[3])
|
42
42
|
mark_used(arguments[4])
|
43
43
|
mark_used(arguments[5])
|
@@ -49,10 +49,10 @@ module RailsBestPractices
|
|
49
49
|
add_callback :start_command_call do |node|
|
50
50
|
arguments = node.arguments.all
|
51
51
|
case node.message.to_s
|
52
|
-
when
|
52
|
+
when 'collection_select'
|
53
53
|
mark_used(arguments[2])
|
54
54
|
mark_used(arguments[3])
|
55
|
-
when
|
55
|
+
when 'grouped_collection_select'
|
56
56
|
mark_used(arguments[2])
|
57
57
|
mark_used(arguments[3])
|
58
58
|
mark_used(arguments[4])
|
@@ -65,10 +65,10 @@ module RailsBestPractices
|
|
65
65
|
add_callback :start_method_add_arg do |node|
|
66
66
|
arguments = node.arguments.all
|
67
67
|
case node.message.to_s
|
68
|
-
when
|
68
|
+
when 'options_from_collection_for_select'
|
69
69
|
mark_used(arguments[1])
|
70
70
|
mark_used(arguments[2])
|
71
|
-
when
|
71
|
+
when 'option_groups_from_collection_for_select'
|
72
72
|
mark_used(arguments[1])
|
73
73
|
mark_used(arguments[2])
|
74
74
|
mark_used(arguments[3])
|
@@ -100,6 +100,7 @@ module RailsBestPractices
|
|
100
100
|
before_save before_create before_update before_destroy after_save after_create
|
101
101
|
after_update after_destroy after_find after_initialize
|
102
102
|
method_missing
|
103
|
+
table_name module_prefix
|
103
104
|
).map { |method_name| "*\##{method_name}" }
|
104
105
|
end
|
105
106
|
end
|
data/lib/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review.rb
CHANGED
@@ -17,7 +17,7 @@ module RailsBestPractices
|
|
17
17
|
class ReplaceComplexCreationWithFactoryMethodReview < Review
|
18
18
|
interesting_nodes :def
|
19
19
|
interesting_files CONTROLLER_FILES
|
20
|
-
url
|
20
|
+
url 'https://rails-bestpractices.com/posts/2010/07/21/replace-complex-creation-with-factory-method/'
|
21
21
|
|
22
22
|
def initialize(options = {})
|
23
23
|
super(options)
|
@@ -53,7 +53,7 @@ module RailsBestPractices
|
|
53
53
|
# and the count attribute assignment on the receiver of the call node is greater than @assign_count defined,
|
54
54
|
# then it is a complex creation, should be replaced with factory method.
|
55
55
|
def check_variable_save(node)
|
56
|
-
if [
|
56
|
+
if ['save', 'save!'].include? node.message.to_s
|
57
57
|
variable = node.receiver.to_s
|
58
58
|
if variable_use_count[variable].to_i > @assigns_count
|
59
59
|
hint = "#{variable} attribute_assignment_count > #{@assigns_count}"
|
data/lib/rails_best_practices/reviews/replace_instance_variable_with_local_variable_review.rb
CHANGED
@@ -13,13 +13,13 @@ module RailsBestPractices
|
|
13
13
|
class ReplaceInstanceVariableWithLocalVariableReview < Review
|
14
14
|
interesting_nodes :var_ref, :vcall
|
15
15
|
interesting_files PARTIAL_VIEW_FILES
|
16
|
-
url
|
16
|
+
url 'https://rails-bestpractices.com/posts/2010/07/24/replace-instance-variable-with-local-variable/'
|
17
17
|
|
18
18
|
# check ivar node in partial view file,
|
19
19
|
# it is an instance variable, and should be replaced with local variable.
|
20
20
|
add_callback :start_var_ref, :start_vcall do |node|
|
21
21
|
if node.to_s.start_with?('@')
|
22
|
-
add_error
|
22
|
+
add_error 'replace instance variable with local variable'
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
@@ -15,7 +15,7 @@ module RailsBestPractices
|
|
15
15
|
class RestrictAutoGeneratedRoutesReview < Review
|
16
16
|
interesting_nodes :command, :command_call, :method_add_block
|
17
17
|
interesting_files ROUTE_FILES
|
18
|
-
url
|
18
|
+
url 'https://rails-bestpractices.com/posts/2011/08/19/restrict-auto-generated-routes/'
|
19
19
|
|
20
20
|
def resource_methods
|
21
21
|
if Prepares.configs['config.api_only']
|
@@ -37,23 +37,23 @@ module RailsBestPractices
|
|
37
37
|
|
38
38
|
# check if the generated routes have the corresponding actions in controller for rails routes.
|
39
39
|
add_callback :start_command, :start_command_call do |node|
|
40
|
-
if
|
40
|
+
if 'resources' == node.message.to_s
|
41
41
|
if (mod = module_option(node))
|
42
42
|
@namespaces << mod
|
43
43
|
end
|
44
44
|
check_resources(node)
|
45
45
|
@resource_controllers << node.arguments.all.first.to_s
|
46
|
-
elsif
|
46
|
+
elsif 'resource' == node.message.to_s
|
47
47
|
check_resource(node)
|
48
48
|
@resource_controllers << node.arguments.all.first.to_s
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
52
|
add_callback :end_command do |node|
|
53
|
-
if
|
53
|
+
if 'resources' == node.message.to_s
|
54
54
|
@resource_controllers.pop
|
55
55
|
@namespaces.pop if module_option(node)
|
56
|
-
elsif
|
56
|
+
elsif 'resource' == node.message.to_s
|
57
57
|
@resource_controllers.pop
|
58
58
|
end
|
59
59
|
end
|
@@ -61,9 +61,9 @@ module RailsBestPractices
|
|
61
61
|
# remember the namespace.
|
62
62
|
add_callback :start_method_add_block do |node|
|
63
63
|
case node.message.to_s
|
64
|
-
when
|
64
|
+
when 'namespace'
|
65
65
|
@namespaces << node.arguments.all.first.to_s if check_method_add_block?(node)
|
66
|
-
when
|
66
|
+
when 'resources', 'resource'
|
67
67
|
@resource_controllers << node.arguments.all.first.to_s if check_method_add_block?(node)
|
68
68
|
when 'scope'
|
69
69
|
if check_method_add_block?(node) && (mod = module_option(node))
|
@@ -77,9 +77,9 @@ module RailsBestPractices
|
|
77
77
|
add_callback :end_method_add_block do |node|
|
78
78
|
if check_method_add_block?(node)
|
79
79
|
case node.message.to_s
|
80
|
-
when
|
80
|
+
when 'namespace'
|
81
81
|
@namespaces.pop
|
82
|
-
when
|
82
|
+
when 'resources', 'resource'
|
83
83
|
@resource_controllers.pop
|
84
84
|
when 'scope'
|
85
85
|
if check_method_add_block?(node) && module_option(node)
|
@@ -90,7 +90,7 @@ module RailsBestPractices
|
|
90
90
|
end
|
91
91
|
|
92
92
|
def check_method_add_block?(node)
|
93
|
-
:command == node[1].sexp_type || (:command_call == node[1].sexp_type &&
|
93
|
+
:command == node[1].sexp_type || (:command_call == node[1].sexp_type && 'map' != node.receiver.to_s)
|
94
94
|
end
|
95
95
|
|
96
96
|
private
|
@@ -109,13 +109,13 @@ module RailsBestPractices
|
|
109
109
|
def controller_name(node)
|
110
110
|
if option_with_hash(node)
|
111
111
|
option_node = node.arguments.all[1]
|
112
|
-
if hash_key_exist?(option_node,
|
113
|
-
name = option_node.hash_value(
|
112
|
+
if hash_key_exist?(option_node,'controller')
|
113
|
+
name = option_node.hash_value('controller').to_s
|
114
114
|
else
|
115
|
-
name = node.arguments.all.first.to_s.gsub(
|
115
|
+
name = node.arguments.all.first.to_s.gsub('::', '').tableize
|
116
116
|
end
|
117
117
|
else
|
118
|
-
name = node.arguments.all.first.to_s.gsub(
|
118
|
+
name = node.arguments.all.first.to_s.gsub('::', '').tableize
|
119
119
|
end
|
120
120
|
namespaced_class_name(name)
|
121
121
|
end
|
@@ -126,7 +126,7 @@ module RailsBestPractices
|
|
126
126
|
if @namespaces.empty?
|
127
127
|
class_name
|
128
128
|
else
|
129
|
-
@namespaces.map { |namespace| "#{namespace.camelize}::" }.join(
|
129
|
+
@namespaces.map { |namespace| "#{namespace.camelize}::" }.join('') + class_name
|
130
130
|
end
|
131
131
|
end
|
132
132
|
|
@@ -149,13 +149,13 @@ module RailsBestPractices
|
|
149
149
|
def _methods(node, methods)
|
150
150
|
if option_with_hash(node)
|
151
151
|
option_node = node.arguments.all[1]
|
152
|
-
if hash_key_exist?(option_node,
|
153
|
-
option_node.hash_value(
|
154
|
-
elsif hash_key_exist?(option_node,
|
155
|
-
if option_node.hash_value(
|
152
|
+
if hash_key_exist?(option_node, 'only')
|
153
|
+
option_node.hash_value('only').to_s == 'none' ? [] : Array(option_node.hash_value('only').to_object)
|
154
|
+
elsif hash_key_exist?(option_node, 'except')
|
155
|
+
if option_node.hash_value('except').to_s == 'all'
|
156
156
|
[]
|
157
157
|
else
|
158
|
-
(methods - Array(option_node.hash_value(
|
158
|
+
(methods - Array(option_node.hash_value('except').to_object))
|
159
159
|
end
|
160
160
|
else
|
161
161
|
methods
|
@@ -182,9 +182,9 @@ module RailsBestPractices
|
|
182
182
|
|
183
183
|
def friendly_route_name(node)
|
184
184
|
if @resource_controllers.last == node.arguments.to_s
|
185
|
-
[@namespaces.join(
|
185
|
+
[@namespaces.join('/'), @resource_controllers.join('/')].delete_if(&:blank?).join('/')
|
186
186
|
else
|
187
|
-
[@namespaces.join(
|
187
|
+
[@namespaces.join('/'), @resource_controllers.join('/'), node.arguments.to_s].delete_if(&:blank?).join('/')
|
188
188
|
end
|
189
189
|
end
|
190
190
|
end
|
@@ -4,7 +4,7 @@ module RailsBestPractices
|
|
4
4
|
# A Review class that takes charge of reviewing one rails best practice.
|
5
5
|
class Review < Core::Check
|
6
6
|
# default url.
|
7
|
-
url
|
7
|
+
url '#'
|
8
8
|
|
9
9
|
# remember use count for the variable in the call or assign node.
|
10
10
|
#
|
@@ -12,7 +12,7 @@ module RailsBestPractices
|
|
12
12
|
# then save it to as key in @variable_use_count hash, and add the call count (hash value).
|
13
13
|
def remember_variable_use_count(node)
|
14
14
|
variable_node = variable(node)
|
15
|
-
if variable_node &&
|
15
|
+
if variable_node && 'self' != variable_node.to_s && @last_variable_node != variable_node
|
16
16
|
@last_variable_node = variable_node
|
17
17
|
variable_use_count[variable_node.to_s] ||= 0
|
18
18
|
variable_use_count[variable_node.to_s] += 1
|
@@ -14,16 +14,16 @@ module RailsBestPractices
|
|
14
14
|
class SimplifyRenderInControllersReview < Review
|
15
15
|
interesting_nodes :command
|
16
16
|
interesting_files CONTROLLER_FILES
|
17
|
-
url
|
17
|
+
url 'https://rails-bestpractices.com/posts/2010/12/12/simplify-render-in-controllers/'
|
18
18
|
|
19
19
|
# check command node in the controller file,
|
20
20
|
# if its message is render and the arguments contain a key action, template or file,
|
21
21
|
# then it should be replaced by simplified syntax.
|
22
22
|
add_callback :start_command do |node|
|
23
|
-
if
|
23
|
+
if 'render' == node.message.to_s
|
24
24
|
keys = node.arguments.all.first.hash_keys
|
25
25
|
if keys && keys.size == 1 &&
|
26
|
-
(keys.include?(
|
26
|
+
(keys.include?('action') || keys.include?('template') || keys.include?('file'))
|
27
27
|
add_error 'simplify render in controllers'
|
28
28
|
end
|
29
29
|
end
|
@@ -13,7 +13,7 @@ module RailsBestPractices
|
|
13
13
|
class SimplifyRenderInViewsReview < Review
|
14
14
|
interesting_nodes :command
|
15
15
|
interesting_files VIEW_FILES
|
16
|
-
url
|
16
|
+
url 'https://rails-bestpractices.com/posts/2010/12/04/simplify-render-in-views/'
|
17
17
|
|
18
18
|
VALID_KEYS = %w(object collection locals)
|
19
19
|
|
@@ -21,7 +21,7 @@ module RailsBestPractices
|
|
21
21
|
# if its message is render and the arguments contain a key partial,
|
22
22
|
# then it should be replaced by simplified syntax.
|
23
23
|
add_callback :start_command do |node|
|
24
|
-
if
|
24
|
+
if 'render' == node.message.to_s
|
25
25
|
hash_node = node.arguments.all.first
|
26
26
|
if hash_node && :bare_assoc_hash == hash_node.sexp_type &&
|
27
27
|
include_partial?(hash_node) && valid_hash?(hash_node)
|
@@ -33,12 +33,12 @@ module RailsBestPractices
|
|
33
33
|
protected
|
34
34
|
|
35
35
|
def include_partial?(hash_node)
|
36
|
-
hash_node.hash_keys.include?(
|
36
|
+
hash_node.hash_keys.include?('partial') && !hash_node.hash_value('partial').to_s.include?('/')
|
37
37
|
end
|
38
38
|
|
39
39
|
def valid_hash?(hash_node)
|
40
40
|
keys = hash_node.hash_keys
|
41
|
-
keys.delete(
|
41
|
+
keys.delete('partial')
|
42
42
|
(keys - VALID_KEYS).empty?
|
43
43
|
end
|
44
44
|
end
|
@@ -14,7 +14,7 @@ module RailsBestPractices
|
|
14
14
|
class UseBeforeFilterReview < Review
|
15
15
|
interesting_nodes :class
|
16
16
|
interesting_files CONTROLLER_FILES
|
17
|
-
url
|
17
|
+
url 'https://rails-bestpractices.com/posts/2010/07/24/use-before_filter/'
|
18
18
|
|
19
19
|
def initialize(options = {})
|
20
20
|
super()
|
@@ -31,7 +31,7 @@ module RailsBestPractices
|
|
31
31
|
|
32
32
|
node.body.statements.each do |statement_node|
|
33
33
|
var_ref_or_vcall_included = [:var_ref, :vcall].include?(statement_node.sexp_type)
|
34
|
-
private_or_protected_included = [
|
34
|
+
private_or_protected_included = ['protected', 'private'].include?(statement_node.to_s)
|
35
35
|
break if var_ref_or_vcall_included && private_or_protected_included
|
36
36
|
remember_first_sentence(statement_node) if :def == statement_node.sexp_type
|
37
37
|
end
|
@@ -16,7 +16,7 @@ module RailsBestPractices
|
|
16
16
|
class UseModelAssociationReview < Review
|
17
17
|
interesting_nodes :def
|
18
18
|
interesting_files CONTROLLER_FILES
|
19
|
-
url
|
19
|
+
url 'https://rails-bestpractices.com/posts/2010/07/19/use-model-association/'
|
20
20
|
|
21
21
|
# check method define nodes to see if there are some attribute assignments that can use model association instead.
|
22
22
|
#
|
@@ -56,7 +56,7 @@ module RailsBestPractices
|
|
56
56
|
# if the receiver of call node exists in @assignments,
|
57
57
|
# then the attribute assignment should be replaced by using model association.
|
58
58
|
def call_assignment(node)
|
59
|
-
if [
|
59
|
+
if ['save', 'save!'].include? node.message.to_s
|
60
60
|
receiver = node.receiver.to_s
|
61
61
|
add_error "use model association (for #{receiver})" if @assignments[receiver]
|
62
62
|
end
|
data/lib/rails_best_practices/reviews/use_multipart_alternative_as_content_type_of_email_review.rb
CHANGED
@@ -13,7 +13,7 @@ module RailsBestPractices
|
|
13
13
|
class UseMultipartAlternativeAsContentTypeOfEmailReview < Review
|
14
14
|
interesting_nodes :class, :def
|
15
15
|
interesting_files MAILER_FILES
|
16
|
-
url
|
16
|
+
url 'https://rails-bestpractices.com/posts/2010/08/05/use-multipart-alternative-as-content_type-of-email/'
|
17
17
|
|
18
18
|
# check class node to remember the ActionMailer class name.
|
19
19
|
add_callback :start_class do |node|
|
@@ -24,7 +24,7 @@ module RailsBestPractices
|
|
24
24
|
add_callback :start_def do |node|
|
25
25
|
name = node.method_name.to_s
|
26
26
|
if !rails3_canonical_mailer_views?(name)
|
27
|
-
add_error(
|
27
|
+
add_error('use multipart/alternative as content_type of email')
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
@@ -20,7 +20,7 @@ module RailsBestPractices
|
|
20
20
|
class UseObserverReview < Review
|
21
21
|
interesting_nodes :def, :command
|
22
22
|
interesting_files MODEL_FILES
|
23
|
-
url
|
23
|
+
url 'https://rails-bestpractices.com/posts/2010/07/24/use-observer/'
|
24
24
|
|
25
25
|
def initialize(options = {})
|
26
26
|
super
|
@@ -42,7 +42,7 @@ module RailsBestPractices
|
|
42
42
|
# then it should be replaced by using observer.
|
43
43
|
add_callback :start_def do |node|
|
44
44
|
if callback_method?(node) && deliver_mailer?(node)
|
45
|
-
add_error
|
45
|
+
add_error 'use observer'
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
@@ -71,7 +71,7 @@ module RailsBestPractices
|
|
71
71
|
# then the call node is actionmailer deliver call.
|
72
72
|
def deliver_mailer?(node)
|
73
73
|
node.grep_nodes(sexp_type: :call) do |child_node|
|
74
|
-
if
|
74
|
+
if 'deliver' == child_node.message.to_s
|
75
75
|
if :method_add_arg == child_node.receiver.sexp_type &&
|
76
76
|
mailers.include?(child_node.receiver[1].receiver.to_s)
|
77
77
|
return true
|
@@ -14,7 +14,7 @@ module RailsBestPractices
|
|
14
14
|
# check def node to see if parameters are wrapped by parentheses.
|
15
15
|
add_callback :start_def do |node|
|
16
16
|
if no_parentheses_around_parameters?(node) && has_parameters?(node)
|
17
|
-
add_error(
|
17
|
+
add_error('use parentheses around parameters in method definitions')
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
@@ -16,7 +16,7 @@ module RailsBestPractices
|
|
16
16
|
class UseQueryAttributeReview < Review
|
17
17
|
interesting_nodes :if, :unless, :elsif, :ifop, :if_mod, :unless_mod
|
18
18
|
interesting_files ALL_FILES
|
19
|
-
url
|
19
|
+
url 'https://rails-bestpractices.com/posts/2010/10/03/use-query-attribute/'
|
20
20
|
|
21
21
|
QUERY_METHODS = %w(nil? blank? present?)
|
22
22
|
|
@@ -102,13 +102,13 @@ module RailsBestPractices
|
|
102
102
|
def model_attribute?(variable_node, message)
|
103
103
|
class_name = variable_node.to_s.sub(/^@/, '').classify
|
104
104
|
attribute_type = model_attributes.get_attribute_type(class_name, message)
|
105
|
-
attribute_type && ![
|
105
|
+
attribute_type && !['integer', 'float'].include?(attribute_type)
|
106
106
|
end
|
107
107
|
|
108
108
|
# check if the node is with node type :binary, node message :== and node argument is empty string.
|
109
109
|
def compare_with_empty_string?(node)
|
110
110
|
:binary == node.sexp_type &&
|
111
|
-
[
|
111
|
+
['==', '!='].include?(node.message.to_s) &&
|
112
112
|
s(:string_literal, s(:string_content)) == node.argument
|
113
113
|
end
|
114
114
|
end
|