rails_best_practices 1.19.1 → 1.19.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/Guardfile +1 -1
- data/README.md +1 -0
- data/Rakefile +2 -2
- data/bin/rails_best_practices +2 -1
- data/lib/rails_best_practices.rb +2 -1
- data/lib/rails_best_practices/analyzer.rb +13 -12
- data/lib/rails_best_practices/colorize.rb +2 -0
- data/lib/rails_best_practices/command.rb +6 -5
- data/lib/rails_best_practices/core.rb +2 -1
- data/lib/rails_best_practices/core/check.rb +19 -17
- data/lib/rails_best_practices/core/checks_loader.rb +3 -2
- data/lib/rails_best_practices/core/configs.rb +2 -1
- data/lib/rails_best_practices/core/controllers.rb +4 -1
- data/lib/rails_best_practices/core/error.rb +3 -2
- data/lib/rails_best_practices/core/gems.rb +4 -3
- data/lib/rails_best_practices/core/helpers.rb +4 -1
- data/lib/rails_best_practices/core/klasses.rb +3 -2
- data/lib/rails_best_practices/core/mailers.rb +2 -1
- data/lib/rails_best_practices/core/methods.rb +9 -10
- data/lib/rails_best_practices/core/model_associations.rb +6 -5
- data/lib/rails_best_practices/core/model_attributes.rb +2 -1
- data/lib/rails_best_practices/core/models.rb +2 -1
- data/lib/rails_best_practices/core/modules.rb +2 -1
- data/lib/rails_best_practices/core/routes.rb +2 -1
- data/lib/rails_best_practices/core/runner.rb +7 -6
- data/lib/rails_best_practices/core_ext/erubis.rb +4 -5
- data/lib/rails_best_practices/lexicals.rb +2 -1
- data/lib/rails_best_practices/lexicals/long_line_check.rb +2 -1
- data/lib/rails_best_practices/lexicals/remove_tab_check.rb +2 -1
- data/lib/rails_best_practices/lexicals/remove_trailing_whitespace_check.rb +2 -1
- data/lib/rails_best_practices/prepares.rb +2 -1
- data/lib/rails_best_practices/prepares/config_prepare.rb +3 -2
- data/lib/rails_best_practices/prepares/controller_prepare.rb +9 -8
- data/lib/rails_best_practices/prepares/gemfile_prepare.rb +2 -1
- data/lib/rails_best_practices/prepares/helper_prepare.rb +4 -3
- data/lib/rails_best_practices/prepares/initializer_prepare.rb +2 -1
- data/lib/rails_best_practices/prepares/mailer_prepare.rb +3 -2
- data/lib/rails_best_practices/prepares/model_prepare.rb +12 -12
- data/lib/rails_best_practices/prepares/route_prepare.rb +8 -7
- data/lib/rails_best_practices/prepares/schema_prepare.rb +3 -2
- data/lib/rails_best_practices/reviews.rb +2 -1
- data/lib/rails_best_practices/reviews/add_model_virtual_attribute_review.rb +7 -4
- data/lib/rails_best_practices/reviews/always_add_db_index_review.rb +8 -7
- data/lib/rails_best_practices/reviews/check_destroy_return_value_review.rb +4 -3
- data/lib/rails_best_practices/reviews/check_save_return_value_review.rb +5 -4
- data/lib/rails_best_practices/reviews/default_scope_is_evil_review.rb +2 -1
- data/lib/rails_best_practices/reviews/dry_bundler_in_capistrano_review.rb +2 -1
- data/lib/rails_best_practices/reviews/hash_syntax_review.rb +2 -1
- data/lib/rails_best_practices/reviews/isolate_seed_data_review.rb +3 -2
- data/lib/rails_best_practices/reviews/keep_finders_on_their_own_model_review.rb +3 -2
- data/lib/rails_best_practices/reviews/law_of_demeter_review.rb +3 -2
- data/lib/rails_best_practices/reviews/move_code_into_controller_review.rb +3 -2
- data/lib/rails_best_practices/reviews/move_code_into_helper_review.rb +2 -1
- data/lib/rails_best_practices/reviews/move_code_into_model_review.rb +3 -2
- data/lib/rails_best_practices/reviews/move_finder_to_named_scope_review.rb +3 -2
- data/lib/rails_best_practices/reviews/move_model_logic_into_model_review.rb +3 -2
- data/lib/rails_best_practices/reviews/needless_deep_nesting_review.rb +5 -4
- data/lib/rails_best_practices/reviews/not_rescue_exception_review.rb +2 -1
- data/lib/rails_best_practices/reviews/not_use_default_route_review.rb +2 -1
- data/lib/rails_best_practices/reviews/not_use_time_ago_in_words_review.rb +2 -1
- data/lib/rails_best_practices/reviews/overuse_route_customizations_review.rb +3 -2
- data/lib/rails_best_practices/reviews/protect_mass_assignment_review.rb +4 -3
- data/lib/rails_best_practices/reviews/remove_empty_helpers_review.rb +2 -1
- data/lib/rails_best_practices/reviews/remove_unused_methods_in_controllers_review.rb +11 -10
- data/lib/rails_best_practices/reviews/remove_unused_methods_in_helpers_review.rb +4 -3
- data/lib/rails_best_practices/reviews/remove_unused_methods_in_models_review.rb +6 -5
- 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 -1
- data/lib/rails_best_practices/reviews/restrict_auto_generated_routes_review.rb +8 -8
- data/lib/rails_best_practices/reviews/review.rb +4 -3
- data/lib/rails_best_practices/reviews/simplify_render_in_controllers_review.rb +2 -1
- data/lib/rails_best_practices/reviews/simplify_render_in_views_review.rb +3 -2
- data/lib/rails_best_practices/reviews/use_before_filter_review.rb +5 -4
- 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 +5 -5
- data/lib/rails_best_practices/reviews/use_observer_review.rb +2 -1
- data/lib/rails_best_practices/reviews/use_parentheses_in_method_def_review.rb +2 -1
- data/lib/rails_best_practices/reviews/use_query_attribute_review.rb +4 -3
- data/lib/rails_best_practices/reviews/use_say_with_time_in_migrations_review.rb +4 -3
- data/lib/rails_best_practices/reviews/use_scope_access_review.rb +2 -1
- data/lib/rails_best_practices/reviews/use_turbo_sprockets_rails3_review.rb +2 -1
- data/lib/rails_best_practices/version.rb +3 -2
- data/rails_best_practices.gemspec +11 -10
- data/spec/fixtures/lib/rails_best_practices/plugins/reviews/not_use_rails_root_review.rb +3 -2
- data/spec/rails_best_practices/analyzer_spec.rb +6 -8
- data/spec/rails_best_practices/core/check_spec.rb +2 -0
- data/spec/rails_best_practices/core/checks_loader_spec.rb +2 -0
- data/spec/rails_best_practices/core/configs_spec.rb +2 -0
- data/spec/rails_best_practices/core/controllers_spec.rb +2 -0
- data/spec/rails_best_practices/core/error_spec.rb +2 -0
- data/spec/rails_best_practices/core/except_methods_spec.rb +2 -0
- data/spec/rails_best_practices/core/gems_spec.rb +2 -0
- data/spec/rails_best_practices/core/helpers_spec.rb +2 -0
- data/spec/rails_best_practices/core/klasses_spec.rb +2 -0
- data/spec/rails_best_practices/core/mailers_spec.rb +2 -0
- data/spec/rails_best_practices/core/methods_spec.rb +6 -4
- data/spec/rails_best_practices/core/model_associations_spec.rb +4 -2
- data/spec/rails_best_practices/core/model_attributes_spec.rb +2 -0
- data/spec/rails_best_practices/core/models_spec.rb +2 -0
- data/spec/rails_best_practices/core/modules_spec.rb +2 -0
- data/spec/rails_best_practices/core/routes_spec.rb +4 -2
- data/spec/rails_best_practices/core/runner_spec.rb +2 -0
- data/spec/rails_best_practices/core_ext/erubis_spec.rb +3 -1
- data/spec/rails_best_practices/lexicals/long_line_check_spec.rb +8 -7
- data/spec/rails_best_practices/lexicals/remove_tab_check_spec.rb +8 -6
- data/spec/rails_best_practices/lexicals/remove_trailing_whitespace_check_spec.rb +9 -7
- data/spec/rails_best_practices/prepares/config_prepare_spec.rb +3 -1
- data/spec/rails_best_practices/prepares/controller_prepare_spec.rb +23 -21
- data/spec/rails_best_practices/prepares/gemfile_prepare_spec.rb +3 -1
- data/spec/rails_best_practices/prepares/helper_prepare_spec.rb +7 -5
- data/spec/rails_best_practices/prepares/initializer_prepare_spec.rb +4 -2
- data/spec/rails_best_practices/prepares/mailer_prepare_spec.rb +3 -1
- data/spec/rails_best_practices/prepares/model_prepare_spec.rb +56 -54
- data/spec/rails_best_practices/prepares/route_prepare_spec.rb +39 -37
- data/spec/rails_best_practices/prepares/schema_prepare_spec.rb +3 -1
- data/spec/rails_best_practices/reviews/add_model_virtual_attribute_review_spec.rb +2 -0
- data/spec/rails_best_practices/reviews/always_add_db_index_review_spec.rb +7 -5
- data/spec/rails_best_practices/reviews/check_destroy_return_value_review_spec.rb +12 -10
- data/spec/rails_best_practices/reviews/check_save_return_value_review_spec.rb +20 -18
- data/spec/rails_best_practices/reviews/default_scope_is_evil_review_spec.rb +2 -0
- data/spec/rails_best_practices/reviews/dry_bundler_in_capistrano_review_spec.rb +2 -0
- data/spec/rails_best_practices/reviews/hash_syntax_review_spec.rb +9 -7
- data/spec/rails_best_practices/reviews/isolate_seed_data_review_spec.rb +2 -0
- data/spec/rails_best_practices/reviews/keep_finders_on_their_own_model_review_spec.rb +2 -0
- data/spec/rails_best_practices/reviews/law_of_demeter_review_spec.rb +2 -0
- data/spec/rails_best_practices/reviews/move_code_into_controller_review_spec.rb +2 -0
- data/spec/rails_best_practices/reviews/move_code_into_helper_review_spec.rb +2 -0
- data/spec/rails_best_practices/reviews/move_code_into_model_review_spec.rb +11 -9
- data/spec/rails_best_practices/reviews/move_finder_to_named_scope_review_spec.rb +2 -0
- data/spec/rails_best_practices/reviews/move_model_logic_into_model_review_spec.rb +2 -0
- data/spec/rails_best_practices/reviews/needless_deep_nesting_review_spec.rb +2 -0
- data/spec/rails_best_practices/reviews/not_rescue_exception_review_spec.rb +9 -7
- data/spec/rails_best_practices/reviews/not_use_default_route_review_spec.rb +2 -0
- data/spec/rails_best_practices/reviews/not_use_time_ago_in_words_review_spec.rb +7 -5
- data/spec/rails_best_practices/reviews/overuse_route_customizations_review_spec.rb +2 -0
- data/spec/rails_best_practices/reviews/protect_mass_assignment_review_spec.rb +21 -19
- data/spec/rails_best_practices/reviews/remove_empty_helpers_review_spec.rb +6 -4
- data/spec/rails_best_practices/reviews/remove_unused_methods_in_controllers_review_spec.rb +33 -31
- data/spec/rails_best_practices/reviews/remove_unused_methods_in_helpers_review_spec.rb +13 -11
- data/spec/rails_best_practices/reviews/remove_unused_methods_in_models_review_spec.rb +65 -63
- data/spec/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review_spec.rb +2 -0
- data/spec/rails_best_practices/reviews/replace_instance_variable_with_local_variable_review_spec.rb +2 -0
- data/spec/rails_best_practices/reviews/restrict_auto_generated_routes_review_spec.rb +24 -22
- data/spec/rails_best_practices/reviews/simplify_render_in_controllers_review_spec.rb +9 -7
- data/spec/rails_best_practices/reviews/simplify_render_in_views_review_spec.rb +13 -11
- data/spec/rails_best_practices/reviews/use_before_filter_review_spec.rb +3 -1
- data/spec/rails_best_practices/reviews/use_model_association_review_spec.rb +2 -0
- data/spec/rails_best_practices/reviews/use_multipart_alternative_as_content_type_of_email_review_spec.rb +2 -0
- data/spec/rails_best_practices/reviews/use_observer_review_spec.rb +7 -5
- data/spec/rails_best_practices/reviews/use_parentheses_in_method_def_review_spec.rb +2 -0
- data/spec/rails_best_practices/reviews/use_query_attribute_review_spec.rb +3 -1
- data/spec/rails_best_practices/reviews/use_say_with_time_in_migrations_review_spec.rb +9 -7
- data/spec/rails_best_practices/reviews/use_scope_access_review_spec.rb +2 -0
- data/spec/rails_best_practices/reviews/use_turbo_sprockets_rails3_review_spec.rb +2 -0
- data/spec/spec_helper.rb +2 -0
- metadata +26 -26
@@ -1,4 +1,5 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module RailsBestPractices
|
3
4
|
module Core
|
4
5
|
# Method container.
|
@@ -14,7 +15,7 @@ module RailsBestPractices
|
|
14
15
|
# @param [String] method name
|
15
16
|
# @param [Hash] method meta, file and line, {"file" => "app/models/post.rb", "line_number" => 5}
|
16
17
|
# @param [String] access control, public, protected or private
|
17
|
-
def add_method(class_name, method_name, meta={}, access_control='public')
|
18
|
+
def add_method(class_name, method_name, meta = {}, access_control = 'public')
|
18
19
|
return if class_name == ''
|
19
20
|
return if has_method?(class_name, method_name)
|
20
21
|
methods(class_name) << Method.new(class_name, method_name, access_control, meta)
|
@@ -28,7 +29,7 @@ module RailsBestPractices
|
|
28
29
|
# @param [String] class name
|
29
30
|
# @param [String] access control
|
30
31
|
# @return [Array] all methods of a class for such access control, if access control is nil, return all public/protected/private methods
|
31
|
-
def get_methods(class_name, access_control=nil)
|
32
|
+
def get_methods(class_name, access_control = nil)
|
32
33
|
if access_control
|
33
34
|
methods(class_name).select { |method| method.access_control == access_control }
|
34
35
|
else
|
@@ -42,7 +43,7 @@ module RailsBestPractices
|
|
42
43
|
# @param [String] method name
|
43
44
|
# @param [String] access control
|
44
45
|
# @return [Boolean] has a method or not
|
45
|
-
def has_method?(class_name, method_name, access_control=nil)
|
46
|
+
def has_method?(class_name, method_name, access_control = nil)
|
46
47
|
if access_control
|
47
48
|
!!methods(class_name).find { |method| method.method_name == method_name && method.access_control == access_control }
|
48
49
|
else
|
@@ -109,7 +110,7 @@ module RailsBestPractices
|
|
109
110
|
# @param [String] method name
|
110
111
|
# @param [String] access control
|
111
112
|
# @return [Method] Method object
|
112
|
-
def get_method(class_name, method_name, access_control=nil)
|
113
|
+
def get_method(class_name, method_name, access_control = nil)
|
113
114
|
if access_control
|
114
115
|
methods(class_name).find { |method| method.method_name == method_name && method.access_control == access_control }
|
115
116
|
else
|
@@ -121,12 +122,12 @@ module RailsBestPractices
|
|
121
122
|
#
|
122
123
|
# @param [String] access control
|
123
124
|
# @return [Array] array of Method
|
124
|
-
def get_all_unused_methods(access_control=nil)
|
125
|
-
@methods.inject([]) { |unused_methods, (
|
125
|
+
def get_all_unused_methods(access_control = nil)
|
126
|
+
@methods.inject([]) { |unused_methods, (_class_name, methods)|
|
126
127
|
unused_methods += if access_control
|
127
128
|
methods.select { |method| method.access_control == access_control && !method.used }
|
128
129
|
else
|
129
|
-
methods.
|
130
|
+
methods.reject { |method| method.used }
|
130
131
|
end
|
131
132
|
}.reject { |method| method.access_control == 'public' && @possible_methods[method.method_name] }
|
132
133
|
end
|
@@ -164,8 +165,6 @@ module RailsBestPractices
|
|
164
165
|
def publicize
|
165
166
|
@access_control = 'public'
|
166
167
|
end
|
167
|
-
|
168
168
|
end
|
169
169
|
end
|
170
170
|
end
|
171
|
-
|
@@ -1,4 +1,5 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module RailsBestPractices
|
3
4
|
module Core
|
4
5
|
# Model associations container.
|
@@ -12,9 +13,9 @@ module RailsBestPractices
|
|
12
13
|
# @param [String] association name
|
13
14
|
# @param [String] association meta, has_many, has_one, belongs_to and has_and_belongs_to_many
|
14
15
|
# @param [String] association class name
|
15
|
-
def add_association(model_name, association_name, association_meta, association_class=nil)
|
16
|
+
def add_association(model_name, association_name, association_meta, association_class = nil)
|
16
17
|
@associations[model_name] ||= {}
|
17
|
-
@associations[model_name][association_name] = {'meta' => association_meta, 'class_name' => association_class || association_name.classify}
|
18
|
+
@associations[model_name][association_name] = { 'meta' => association_meta, 'class_name' => association_class || association_name.classify }
|
18
19
|
end
|
19
20
|
|
20
21
|
# Get a model association.
|
@@ -48,8 +49,8 @@ module RailsBestPractices
|
|
48
49
|
# @param [String] association_name
|
49
50
|
# @return [String] association's class name
|
50
51
|
def get_association_class_name(table_name, association_name)
|
51
|
-
associations = @associations.select { |model,
|
52
|
-
association_meta = associations.select { |name,
|
52
|
+
associations = @associations.select { |model, _model_associations| model.gsub('::', '').tableize == table_name }.values.first and
|
53
|
+
association_meta = associations.select { |name, _meta| name == association_name }.values.first and
|
53
54
|
association_meta['class_name']
|
54
55
|
end
|
55
56
|
end
|
@@ -1,4 +1,5 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'yaml'
|
3
4
|
require 'active_support/core_ext/object/blank'
|
4
5
|
begin
|
@@ -45,13 +46,13 @@ module RailsBestPractices
|
|
45
46
|
# @return [String] the config path
|
46
47
|
def self.config_path
|
47
48
|
custom_config = @config_path || File.join(Runner.base_path, 'config/rails_best_practices.yml')
|
48
|
-
File.
|
49
|
+
File.exist?(custom_config) ? custom_config : RailsBestPractices::Analyzer::DEFAULT_CONFIG
|
49
50
|
end
|
50
51
|
|
51
52
|
# initialize the runner.
|
52
53
|
#
|
53
54
|
# @param [Hash] options pass the prepares and reviews.
|
54
|
-
def initialize(options={})
|
55
|
+
def initialize(options = {})
|
55
56
|
@config = self.class.config_path
|
56
57
|
|
57
58
|
lexicals = Array(options[:lexicals])
|
@@ -66,7 +67,7 @@ module RailsBestPractices
|
|
66
67
|
|
67
68
|
@lexical_checker ||= CodeAnalyzer::CheckingVisitor::Plain.new(checkers: @lexicals)
|
68
69
|
@plain_prepare_checker ||= CodeAnalyzer::CheckingVisitor::Plain.new(checkers: @prepares.select { |checker| checker.is_a? Prepares::GemfilePrepare })
|
69
|
-
@default_prepare_checker ||= CodeAnalyzer::CheckingVisitor::Default.new(checkers: @prepares.
|
70
|
+
@default_prepare_checker ||= CodeAnalyzer::CheckingVisitor::Default.new(checkers: @prepares.reject { |checker| checker.is_a? Prepares::GemfilePrepare })
|
70
71
|
@review_checker ||= CodeAnalyzer::CheckingVisitor::Default.new(checkers: @reviews)
|
71
72
|
end
|
72
73
|
|
@@ -156,7 +157,7 @@ module RailsBestPractices
|
|
156
157
|
|
157
158
|
# load all plugin reviews.
|
158
159
|
def load_plugin_reviews
|
159
|
-
|
160
|
+
|
160
161
|
plugins = File.join(Runner.base_path, 'lib', 'rails_best_practices', 'plugins', 'reviews')
|
161
162
|
if File.directory?(plugins)
|
162
163
|
Dir[File.expand_path(File.join(plugins, '*.rb'))].each do |review|
|
@@ -168,7 +169,7 @@ module RailsBestPractices
|
|
168
169
|
end
|
169
170
|
end
|
170
171
|
end
|
171
|
-
|
172
|
+
|
172
173
|
end
|
173
174
|
end
|
174
175
|
end
|
@@ -1,10 +1,10 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'erubis'
|
3
4
|
|
4
5
|
module Erubis
|
5
6
|
class OnlyRuby < Eruby
|
6
|
-
def add_preamble(src)
|
7
|
-
end
|
7
|
+
def add_preamble(src); end
|
8
8
|
|
9
9
|
def add_text(src, text)
|
10
10
|
src << text.gsub(/[^\s;]/, '')
|
@@ -30,7 +30,6 @@ module Erubis
|
|
30
30
|
src << ';'
|
31
31
|
end
|
32
32
|
|
33
|
-
def add_postamble(src)
|
34
|
-
end
|
33
|
+
def add_postamble(src); end
|
35
34
|
end
|
36
35
|
end
|
@@ -1,4 +1,5 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module RailsBestPractices
|
3
4
|
module Prepares
|
4
5
|
# Remember all configs
|
@@ -12,7 +13,7 @@ module RailsBestPractices
|
|
12
13
|
|
13
14
|
# check assignments to config
|
14
15
|
add_callback :start_assign do |node|
|
15
|
-
if node.left_value.grep_node(sexp_type: [
|
16
|
+
if node.left_value.grep_node(sexp_type: %i[vcall var_ref], to_s: 'config').present?
|
16
17
|
@configs[node.left_value.to_s] = node.right_value.to_s
|
17
18
|
end
|
18
19
|
end
|
@@ -1,4 +1,5 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module RailsBestPractices
|
3
4
|
module Prepares
|
4
5
|
# Remember controllers and controller methods
|
@@ -10,7 +11,7 @@ module RailsBestPractices
|
|
10
11
|
interesting_nodes :class, :var_ref, :vcall, :command, :def
|
11
12
|
interesting_files CONTROLLER_FILES
|
12
13
|
|
13
|
-
DEFAULT_ACTIONS = %w
|
14
|
+
DEFAULT_ACTIONS = %w[index show new create edit update destroy].freeze
|
14
15
|
|
15
16
|
def initialize
|
16
17
|
@controllers = Prepares.controllers
|
@@ -21,7 +22,7 @@ module RailsBestPractices
|
|
21
22
|
|
22
23
|
# check class node to remember the class name.
|
23
24
|
# also check if the controller is inherit from InheritedResources::Base.
|
24
|
-
add_callback :start_class do |
|
25
|
+
add_callback :start_class do |_node|
|
25
26
|
@controllers << @klass
|
26
27
|
if @inherited_resources
|
27
28
|
@actions = DEFAULT_ACTIONS
|
@@ -32,20 +33,20 @@ module RailsBestPractices
|
|
32
33
|
add_callback :end_class do |node|
|
33
34
|
if @inherited_resources && 'ApplicationController' != current_class_name
|
34
35
|
@actions.each do |action|
|
35
|
-
@methods.add_method(current_class_name, action,
|
36
|
+
@methods.add_method(current_class_name, action, 'file' => node.file, 'line_number' => node.line_number)
|
36
37
|
end
|
37
38
|
end
|
38
39
|
end
|
39
40
|
|
40
41
|
# check if there is a DSL call inherit_resources.
|
41
|
-
add_callback :start_var_ref do |
|
42
|
+
add_callback :start_var_ref do |_node|
|
42
43
|
if @inherited_resources
|
43
44
|
@actions = DEFAULT_ACTIONS
|
44
45
|
end
|
45
46
|
end
|
46
47
|
|
47
48
|
# check if there is a DSL call inherit_resources.
|
48
|
-
add_callback :start_vcall do |
|
49
|
+
add_callback :start_vcall do |_node|
|
49
50
|
if @inherited_resources
|
50
51
|
@actions = DEFAULT_ACTIONS
|
51
52
|
end
|
@@ -82,14 +83,14 @@ module RailsBestPractices
|
|
82
83
|
# }
|
83
84
|
add_callback :start_def do |node|
|
84
85
|
method_name = node.method_name.to_s
|
85
|
-
@methods.add_method(current_class_name, method_name, {'file' => node.file, 'line_number' => node.line_number}, current_access_control)
|
86
|
+
@methods.add_method(current_class_name, method_name, { 'file' => node.file, 'line_number' => node.line_number }, current_access_control)
|
86
87
|
end
|
87
88
|
|
88
89
|
# ask Reviews::RemoveUnusedMoethodsInHelperReview to check the controllers who include helpers.
|
89
90
|
add_callback :after_check do
|
90
91
|
descendants = @helpers.map(&:descendants).flatten
|
91
92
|
if descendants.present?
|
92
|
-
Reviews::RemoveUnusedMethodsInHelpersReview.interesting_files *descendants.map { |descendant|
|
93
|
+
Reviews::RemoveUnusedMethodsInHelpersReview.interesting_files *descendants.map { |descendant| /#{descendant.underscore}/ }
|
93
94
|
end
|
94
95
|
end
|
95
96
|
end
|
@@ -1,4 +1,5 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module RailsBestPractices
|
3
4
|
module Prepares
|
4
5
|
# Remember helper methods.
|
@@ -15,7 +16,7 @@ module RailsBestPractices
|
|
15
16
|
end
|
16
17
|
|
17
18
|
# check module node to remember the module name.
|
18
|
-
add_callback :start_module do |
|
19
|
+
add_callback :start_module do |_node|
|
19
20
|
@helpers << Core::Mod.new(current_module_name, [])
|
20
21
|
end
|
21
22
|
|
@@ -31,7 +32,7 @@ module RailsBestPractices
|
|
31
32
|
add_callback :start_def do |node|
|
32
33
|
if node.file =~ HELPER_FILES
|
33
34
|
method_name = node.method_name.to_s
|
34
|
-
@methods.add_method(current_module_name, method_name, {'file' => node.file, 'line_number' => node.line_number}, current_access_control)
|
35
|
+
@methods.add_method(current_module_name, method_name, { 'file' => node.file, 'line_number' => node.line_number }, current_access_control)
|
35
36
|
end
|
36
37
|
end
|
37
38
|
end
|
@@ -1,4 +1,5 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module RailsBestPractices
|
3
4
|
module Prepares
|
4
5
|
# Remember the mailer names.
|
@@ -16,7 +17,7 @@ module RailsBestPractices
|
|
16
17
|
#
|
17
18
|
# if it is a subclass of ActionMailer::Base,
|
18
19
|
# then remember its class name.
|
19
|
-
add_callback :start_class do |
|
20
|
+
add_callback :start_class do |_node|
|
20
21
|
if 'ActionMailer::Base' == current_extend_class_name
|
21
22
|
@mailers << @klass
|
22
23
|
end
|
@@ -1,4 +1,5 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module RailsBestPractices
|
3
4
|
module Prepares
|
4
5
|
# Remember models and model associations.
|
@@ -9,7 +10,7 @@ module RailsBestPractices
|
|
9
10
|
interesting_nodes :class, :def, :defs, :command, :alias
|
10
11
|
interesting_files MODEL_FILES
|
11
12
|
|
12
|
-
ASSOCIATION_METHODS = %w
|
13
|
+
ASSOCIATION_METHODS = %w[belongs_to has_one has_many has_and_belongs_to_many embeds_many embeds_one embedded_in many one].freeze
|
13
14
|
|
14
15
|
def initialize
|
15
16
|
@models = Prepares.models
|
@@ -19,7 +20,7 @@ module RailsBestPractices
|
|
19
20
|
end
|
20
21
|
|
21
22
|
# remember the class name.
|
22
|
-
add_callback :start_class do |
|
23
|
+
add_callback :start_class do |_node|
|
23
24
|
if 'ActionMailer::Base' != current_extend_class_name
|
24
25
|
@models << @klass
|
25
26
|
end
|
@@ -42,7 +43,7 @@ module RailsBestPractices
|
|
42
43
|
'ActionMailer::Base' != current_extend_class_name &&
|
43
44
|
(classable_modules.empty? || klasses.any?)
|
44
45
|
method_name = node.method_name.to_s
|
45
|
-
@methods.add_method(current_class_name, method_name, {'file' => node.file, 'line_number' => node.line_number}, current_access_control)
|
46
|
+
@methods.add_method(current_class_name, method_name, { 'file' => node.file, 'line_number' => node.line_number }, current_access_control)
|
46
47
|
end
|
47
48
|
end
|
48
49
|
|
@@ -61,7 +62,7 @@ module RailsBestPractices
|
|
61
62
|
add_callback :start_defs do |node|
|
62
63
|
if @klass && 'ActionMailer::Base' != current_extend_class_name
|
63
64
|
method_name = node.method_name.to_s
|
64
|
-
@methods.add_method(current_class_name, method_name, {'file' => node.file, 'line_number' => node.line_number}, current_access_control)
|
65
|
+
@methods.add_method(current_class_name, method_name, { 'file' => node.file, 'line_number' => node.line_number }, current_access_control)
|
65
66
|
end
|
66
67
|
end
|
67
68
|
|
@@ -78,13 +79,13 @@ module RailsBestPractices
|
|
78
79
|
# }
|
79
80
|
add_callback :start_command do |node|
|
80
81
|
case node.message.to_s
|
81
|
-
when
|
82
|
+
when 'named_scope', 'scope', 'alias_method'
|
82
83
|
method_name = node.arguments.all.first.to_s
|
83
|
-
@methods.add_method(current_class_name, method_name, {'file' => node.file, 'line_number' => node.line_number}, current_access_control)
|
84
|
+
@methods.add_method(current_class_name, method_name, { 'file' => node.file, 'line_number' => node.line_number }, current_access_control)
|
84
85
|
when 'alias_method_chain'
|
85
86
|
method, feature = *node.arguments.all.map(&:to_s)
|
86
|
-
@methods.add_method(current_class_name, "#{method}_with_#{feature}", {'file' => node.file, 'line_number' => node.line_number}, current_access_control)
|
87
|
-
@methods.add_method(current_class_name,
|
87
|
+
@methods.add_method(current_class_name, "#{method}_with_#{feature}", { 'file' => node.file, 'line_number' => node.line_number }, current_access_control)
|
88
|
+
@methods.add_method(current_class_name, method.to_s, { 'file' => node.file, 'line_number' => node.line_number }, current_access_control)
|
88
89
|
when 'field'
|
89
90
|
arguments = node.arguments.all
|
90
91
|
attribute_name = arguments.first.to_s
|
@@ -95,20 +96,19 @@ module RailsBestPractices
|
|
95
96
|
@model_attributes.add_attribute(current_class_name, attribute_name, attribute_type)
|
96
97
|
when *ASSOCIATION_METHODS
|
97
98
|
remember_association(node)
|
98
|
-
else
|
99
99
|
end
|
100
100
|
end
|
101
101
|
|
102
102
|
# check alias node to remembr the alias methods.
|
103
103
|
add_callback :start_alias do |node|
|
104
104
|
method_name = node.new_method.to_s
|
105
|
-
@methods.add_method(current_class_name, method_name, {'file' => node.file, 'line_number' => node.line_number}, current_access_control)
|
105
|
+
@methods.add_method(current_class_name, method_name, { 'file' => node.file, 'line_number' => node.line_number }, current_access_control)
|
106
106
|
end
|
107
107
|
|
108
108
|
# after prepare process, fix incorrect associations' class_name.
|
109
109
|
add_callback :after_check do
|
110
110
|
@model_associations.each do |model, model_associations|
|
111
|
-
model_associations.each do |
|
111
|
+
model_associations.each do |_association_name, association_meta|
|
112
112
|
unless @models.include?(association_meta['class_name'])
|
113
113
|
if @models.include?("#{model}::#{association_meta['class_name']}")
|
114
114
|
association_meta['class_name'] = "#{model}::#{association_meta['class_name']}"
|