rubocop 1.59.0 → 1.65.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/LICENSE.txt +1 -1
- data/README.md +3 -4
- data/assets/output.css.erb +159 -0
- data/assets/output.html.erb +1 -160
- data/config/default.yml +93 -17
- data/lib/rubocop/cached_data.rb +11 -3
- data/lib/rubocop/cli/command/auto_generate_config.rb +12 -3
- data/lib/rubocop/cli/command/lsp.rb +2 -2
- data/lib/rubocop/cli/command/show_docs_url.rb +2 -2
- data/lib/rubocop/cli.rb +10 -1
- data/lib/rubocop/config.rb +36 -12
- data/lib/rubocop/config_finder.rb +12 -2
- data/lib/rubocop/config_loader.rb +1 -2
- data/lib/rubocop/config_loader_resolver.rb +9 -3
- data/lib/rubocop/config_obsoletion.rb +1 -1
- data/lib/rubocop/config_validator.rb +14 -7
- data/lib/rubocop/cop/autocorrect_logic.rb +6 -1
- data/lib/rubocop/cop/base.rb +63 -16
- data/lib/rubocop/cop/bundler/gem_version.rb +3 -5
- data/lib/rubocop/cop/cop.rb +22 -4
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +4 -8
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +5 -13
- data/lib/rubocop/cop/documentation.rb +16 -6
- data/lib/rubocop/cop/exclude_limit.rb +1 -1
- data/lib/rubocop/cop/force.rb +12 -0
- data/lib/rubocop/cop/gemspec/add_runtime_dependency.rb +38 -0
- data/lib/rubocop/cop/gemspec/dependency_version.rb +3 -5
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +2 -2
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +5 -1
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +3 -3
- data/lib/rubocop/cop/internal_affairs/example_description.rb +6 -5
- data/lib/rubocop/cop/internal_affairs/method_name_end_with.rb +8 -6
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +122 -28
- data/lib/rubocop/cop/internal_affairs/redundant_expect_offense_arguments.rb +34 -0
- data/lib/rubocop/cop/internal_affairs.rb +1 -0
- data/lib/rubocop/cop/layout/assignment_indentation.rb +3 -2
- data/lib/rubocop/cop/layout/case_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/condition_position.rb +0 -4
- data/lib/rubocop/cop/layout/empty_comment.rb +3 -1
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +14 -7
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +1 -1
- data/lib/rubocop/cop/layout/end_alignment.rb +8 -2
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +18 -1
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +1 -1
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +1 -1
- data/lib/rubocop/cop/layout/line_length.rb +20 -20
- data/lib/rubocop/cop/layout/redundant_line_break.rb +14 -2
- data/lib/rubocop/cop/layout/space_around_operators.rb +3 -0
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +19 -10
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +3 -4
- data/lib/rubocop/cop/legacy/corrector.rb +12 -2
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +0 -2
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +0 -2
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +0 -2
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
- data/lib/rubocop/cop/lint/boolean_symbol.rb +0 -2
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +0 -13
- data/lib/rubocop/cop/lint/debugger.rb +27 -6
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +0 -10
- data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -5
- data/lib/rubocop/cop/lint/duplicate_hash_key.rb +0 -4
- data/lib/rubocop/cop/lint/duplicate_methods.rb +0 -10
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +0 -4
- data/lib/rubocop/cop/lint/else_layout.rb +0 -2
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +2 -2
- data/lib/rubocop/cop/lint/empty_ensure.rb +1 -11
- data/lib/rubocop/cop/lint/empty_interpolation.rb +0 -4
- data/lib/rubocop/cop/lint/empty_when.rb +1 -3
- data/lib/rubocop/cop/lint/ensure_return.rb +1 -6
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +21 -14
- data/lib/rubocop/cop/lint/float_comparison.rb +3 -1
- data/lib/rubocop/cop/lint/float_out_of_range.rb +0 -4
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +0 -10
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +15 -12
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +0 -7
- data/lib/rubocop/cop/lint/interpolation_check.rb +0 -4
- data/lib/rubocop/cop/lint/literal_as_condition.rb +1 -1
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +13 -6
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +0 -4
- data/lib/rubocop/cop/lint/loop.rb +6 -12
- data/lib/rubocop/cop/lint/mixed_case_range.rb +9 -4
- data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -7
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +0 -4
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +0 -5
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +1 -1
- data/lib/rubocop/cop/lint/percent_string_array.rb +0 -4
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +0 -4
- data/lib/rubocop/cop/lint/rand_one.rb +0 -4
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +3 -1
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +14 -9
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +0 -4
- data/lib/rubocop/cop/lint/redundant_with_index.rb +4 -0
- data/lib/rubocop/cop/lint/require_parentheses.rb +0 -4
- data/lib/rubocop/cop/lint/rescue_exception.rb +0 -4
- data/lib/rubocop/cop/lint/rescue_type.rb +1 -3
- data/lib/rubocop/cop/lint/return_in_void_context.rb +0 -2
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +0 -4
- data/lib/rubocop/cop/lint/script_permission.rb +3 -3
- data/lib/rubocop/cop/lint/shadowed_argument.rb +1 -0
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +6 -10
- data/lib/rubocop/cop/lint/syntax.rb +6 -3
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +1 -3
- data/lib/rubocop/cop/lint/unified_integer.rb +0 -4
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -0
- data/lib/rubocop/cop/lint/unreachable_code.rb +4 -7
- data/lib/rubocop/cop/lint/unreachable_loop.rb +8 -2
- data/lib/rubocop/cop/lint/useless_assignment.rb +1 -5
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +0 -4
- data/lib/rubocop/cop/lint/useless_setter_call.rb +0 -4
- data/lib/rubocop/cop/lint/useless_times.rb +1 -1
- data/lib/rubocop/cop/lint/void.rb +11 -1
- data/lib/rubocop/cop/metrics/block_nesting.rb +19 -7
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +5 -5
- data/lib/rubocop/cop/mixin/alignment.rb +5 -1
- data/lib/rubocop/cop/mixin/allowed_methods.rb +7 -1
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +15 -3
- data/lib/rubocop/cop/mixin/code_length.rb +12 -1
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -0
- data/lib/rubocop/cop/mixin/configurable_max.rb +5 -1
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +9 -2
- data/lib/rubocop/cop/mixin/method_complexity.rb +15 -6
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
- data/lib/rubocop/cop/mixin/rescue_node.rb +4 -0
- data/lib/rubocop/cop/mixin/safe_assignment.rb +1 -1
- data/lib/rubocop/cop/naming/block_forwarding.rb +32 -5
- data/lib/rubocop/cop/naming/file_name.rb +2 -2
- data/lib/rubocop/cop/naming/inclusive_language.rb +1 -2
- data/lib/rubocop/cop/naming/predicate_name.rb +54 -28
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +10 -1
- data/lib/rubocop/cop/registry.rb +1 -1
- data/lib/rubocop/cop/security/compound_hash.rb +2 -2
- data/lib/rubocop/cop/security/open.rb +2 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +50 -0
- data/lib/rubocop/cop/style/alias.rb +1 -0
- data/lib/rubocop/cop/style/arguments_forwarding.rb +89 -17
- data/lib/rubocop/cop/style/case_like_if.rb +1 -1
- data/lib/rubocop/cop/style/class_vars.rb +3 -3
- data/lib/rubocop/cop/style/collection_compact.rb +14 -5
- data/lib/rubocop/cop/style/commented_keyword.rb +5 -2
- data/lib/rubocop/cop/style/conditional_assignment.rb +6 -7
- data/lib/rubocop/cop/style/copyright.rb +31 -21
- data/lib/rubocop/cop/style/def_with_parentheses.rb +0 -2
- data/lib/rubocop/cop/style/documentation.rb +24 -24
- data/lib/rubocop/cop/style/documentation_method.rb +20 -0
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +7 -8
- data/lib/rubocop/cop/style/eval_with_location.rb +15 -23
- data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -1
- data/lib/rubocop/cop/style/file_read.rb +2 -5
- data/lib/rubocop/cop/style/file_write.rb +2 -5
- data/lib/rubocop/cop/style/for.rb +2 -0
- data/lib/rubocop/cop/style/format_string.rb +9 -9
- data/lib/rubocop/cop/style/global_std_stream.rb +7 -1
- data/lib/rubocop/cop/style/hash_each_methods.rb +29 -8
- data/lib/rubocop/cop/style/hash_except.rb +8 -5
- data/lib/rubocop/cop/style/hash_syntax.rb +24 -2
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +4 -1
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +5 -4
- data/lib/rubocop/cop/style/inverse_methods.rb +8 -8
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +46 -4
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +81 -50
- data/lib/rubocop/cop/style/map_into_array.rb +175 -0
- data/lib/rubocop/cop/style/map_to_hash.rb +10 -6
- data/lib/rubocop/cop/style/map_to_set.rb +1 -1
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +18 -5
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -4
- data/lib/rubocop/cop/style/missing_else.rb +0 -4
- data/lib/rubocop/cop/style/multiline_method_signature.rb +10 -1
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +5 -3
- data/lib/rubocop/cop/style/multiline_when_then.rb +0 -4
- data/lib/rubocop/cop/style/nil_comparison.rb +2 -0
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
- data/lib/rubocop/cop/style/numeric_predicate.rb +10 -2
- data/lib/rubocop/cop/style/object_then.rb +5 -3
- data/lib/rubocop/cop/style/one_line_conditional.rb +1 -1
- data/lib/rubocop/cop/style/parallel_assignment.rb +3 -5
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +8 -0
- data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +4 -1
- data/lib/rubocop/cop/style/redundant_argument.rb +25 -2
- data/lib/rubocop/cop/style/redundant_assignment.rb +10 -2
- data/lib/rubocop/cop/style/redundant_begin.rb +1 -1
- data/lib/rubocop/cop/style/redundant_condition.rb +0 -1
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +5 -4
- data/lib/rubocop/cop/style/redundant_each.rb +7 -4
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +1 -1
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +17 -2
- data/lib/rubocop/cop/style/redundant_parentheses.rb +18 -2
- data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +8 -24
- data/lib/rubocop/cop/style/redundant_return.rb +6 -0
- data/lib/rubocop/cop/style/require_order.rb +1 -1
- data/lib/rubocop/cop/style/sample.rb +1 -3
- data/lib/rubocop/cop/style/send.rb +4 -4
- data/lib/rubocop/cop/style/send_with_literal_method_name.rb +104 -0
- data/lib/rubocop/cop/style/slicing_with_range.rb +76 -10
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +21 -2
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -2
- data/lib/rubocop/cop/style/super_arguments.rb +174 -0
- data/lib/rubocop/cop/style/symbol_proc.rb +75 -5
- data/lib/rubocop/cop/style/top_level_method_definition.rb +1 -1
- data/lib/rubocop/cop/style/while_until_do.rb +0 -2
- data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +32 -24
- data/lib/rubocop/cop/team.rb +13 -0
- data/lib/rubocop/cop/util.rb +7 -1
- data/lib/rubocop/cop/utils/regexp_ranges.rb +1 -1
- data/lib/rubocop/cop/variable_force.rb +13 -1
- data/lib/rubocop/cops_documentation_generator.rb +16 -4
- data/lib/rubocop/core_ext/string.rb +2 -6
- data/lib/rubocop/directive_comment.rb +10 -8
- data/lib/rubocop/ext/regexp_node.rb +18 -35
- data/lib/rubocop/ext/regexp_parser.rb +4 -21
- data/lib/rubocop/formatter/clang_style_formatter.rb +3 -7
- data/lib/rubocop/formatter/disabled_config_formatter.rb +23 -8
- data/lib/rubocop/formatter/formatter_set.rb +7 -1
- data/lib/rubocop/formatter/html_formatter.rb +32 -10
- data/lib/rubocop/formatter/json_formatter.rb +0 -1
- data/lib/rubocop/formatter/offense_count_formatter.rb +12 -2
- data/lib/rubocop/formatter/tap_formatter.rb +3 -7
- data/lib/rubocop/formatter.rb +1 -1
- data/lib/rubocop/lockfile.rb +56 -7
- data/lib/rubocop/lsp/logger.rb +1 -1
- data/lib/rubocop/lsp/routes.rb +12 -15
- data/lib/rubocop/lsp/runtime.rb +1 -1
- data/lib/rubocop/lsp/server.rb +7 -2
- data/lib/rubocop/lsp/severity.rb +1 -1
- data/lib/rubocop/lsp.rb +36 -0
- data/lib/rubocop/magic_comment.rb +1 -1
- data/lib/rubocop/options.rb +17 -12
- data/lib/rubocop/path_util.rb +6 -2
- data/lib/rubocop/rake_task.rb +1 -1
- data/lib/rubocop/rspec/cop_helper.rb +8 -2
- data/lib/rubocop/rspec/expect_offense.rb +16 -8
- data/lib/rubocop/rspec/shared_contexts.rb +73 -16
- data/lib/rubocop/rspec/support.rb +3 -0
- data/lib/rubocop/runner.rb +14 -3
- data/lib/rubocop/server/cache.rb +11 -2
- data/lib/rubocop/server/client_command/exec.rb +2 -3
- data/lib/rubocop/server/client_command/start.rb +1 -1
- data/lib/rubocop/server/core.rb +4 -0
- data/lib/rubocop/server/server_command/exec.rb +0 -1
- data/lib/rubocop/target_finder.rb +84 -78
- data/lib/rubocop/target_ruby.rb +82 -80
- data/lib/rubocop/version.rb +19 -4
- data/lib/rubocop.rb +9 -0
- metadata +18 -11
- /data/lib/rubocop/formatter/{git_hub_actions_formatter.rb → github_actions_formatter.rb} +0 -0
@@ -12,13 +12,23 @@ module RuboCop
|
|
12
12
|
if corr.is_a?(CorrectionsProxy)
|
13
13
|
merge!(corr.send(:corrector))
|
14
14
|
else
|
15
|
-
|
15
|
+
unless corr.empty?
|
16
|
+
warn Rainbow(<<~WARNING).yellow, uplevel: 1
|
17
|
+
`Corrector.new` with corrections is deprecated.
|
18
|
+
See https://docs.rubocop.org/rubocop/v1_upgrade_notes.html
|
19
|
+
WARNING
|
20
|
+
end
|
21
|
+
|
16
22
|
corr.each { |c| corrections << c }
|
17
23
|
end
|
18
24
|
end
|
19
25
|
|
20
26
|
def corrections
|
21
|
-
|
27
|
+
warn Rainbow(<<~WARNING).yellow, uplevel: 1
|
28
|
+
`Corrector#corrections` is deprecated. Open an issue if you have a valid usecase.
|
29
|
+
See https://docs.rubocop.org/rubocop/v1_upgrade_notes.html
|
30
|
+
WARNING
|
31
|
+
|
22
32
|
CorrectionsProxy.new(self)
|
23
33
|
end
|
24
34
|
end
|
@@ -50,7 +50,7 @@ module RuboCop
|
|
50
50
|
MSG_WITHOUT_SAFE_ASSIGNMENT_ALLOWED =
|
51
51
|
'Use `==` if you meant to do a comparison or move the assignment ' \
|
52
52
|
'up out of the condition.'
|
53
|
-
ASGN_TYPES = [:begin, *AST::Node::EQUALS_ASSIGNMENTS, :send].freeze
|
53
|
+
ASGN_TYPES = [:begin, *AST::Node::EQUALS_ASSIGNMENTS, :send, :csend].freeze
|
54
54
|
|
55
55
|
def on_if(node)
|
56
56
|
return if node.condition.block_type?
|
@@ -88,7 +88,7 @@ module RuboCop
|
|
88
88
|
end
|
89
89
|
|
90
90
|
def skip_children?(asgn_node)
|
91
|
-
(asgn_node.
|
91
|
+
(asgn_node.call_type? && !asgn_node.assignment_method?) ||
|
92
92
|
empty_condition?(asgn_node) ||
|
93
93
|
(safe_assignment_allowed? && safe_assignment?(asgn_node))
|
94
94
|
end
|
@@ -11,39 +11,26 @@ module RuboCop
|
|
11
11
|
# @example
|
12
12
|
#
|
13
13
|
# # bad
|
14
|
-
#
|
15
14
|
# def bake(pie: pie)
|
16
15
|
# pie.heat_up
|
17
16
|
# end
|
18
17
|
#
|
19
|
-
# @example
|
20
|
-
#
|
21
18
|
# # good
|
22
|
-
#
|
23
19
|
# def bake(pie:)
|
24
20
|
# pie.refrigerate
|
25
21
|
# end
|
26
22
|
#
|
27
|
-
# @example
|
28
|
-
#
|
29
23
|
# # good
|
30
|
-
#
|
31
24
|
# def bake(pie: self.pie)
|
32
25
|
# pie.feed_to(user)
|
33
26
|
# end
|
34
27
|
#
|
35
|
-
# @example
|
36
|
-
#
|
37
28
|
# # bad
|
38
|
-
#
|
39
29
|
# def cook(dry_ingredients = dry_ingredients)
|
40
30
|
# dry_ingredients.reduce(&:+)
|
41
31
|
# end
|
42
32
|
#
|
43
|
-
# @example
|
44
|
-
#
|
45
33
|
# # good
|
46
|
-
#
|
47
34
|
# def cook(dry_ingredients = self.dry_ingredients)
|
48
35
|
# dry_ingredients.combine
|
49
36
|
# end
|
@@ -29,6 +29,11 @@ module RuboCop
|
|
29
29
|
# MyDebugger.debug_this
|
30
30
|
# ----
|
31
31
|
#
|
32
|
+
# Some gems also ship files that will start a debugging session when required,
|
33
|
+
# for example `require 'debug/start'` from `ruby/debug`. These requires can
|
34
|
+
# be configured through `DebuggerRequires`. It has the same structure as
|
35
|
+
# `DebuggerMethods`, which you can read about above.
|
36
|
+
#
|
32
37
|
# @example
|
33
38
|
#
|
34
39
|
# # bad (ok during development)
|
@@ -39,8 +44,6 @@ module RuboCop
|
|
39
44
|
# do_something
|
40
45
|
# end
|
41
46
|
#
|
42
|
-
# @example
|
43
|
-
#
|
44
47
|
# # bad (ok during development)
|
45
48
|
#
|
46
49
|
# # using byebug
|
@@ -49,8 +52,6 @@ module RuboCop
|
|
49
52
|
# do_something
|
50
53
|
# end
|
51
54
|
#
|
52
|
-
# @example
|
53
|
-
#
|
54
55
|
# # good
|
55
56
|
#
|
56
57
|
# def some_method
|
@@ -64,14 +65,20 @@ module RuboCop
|
|
64
65
|
# def some_method
|
65
66
|
# my_debugger
|
66
67
|
# end
|
68
|
+
#
|
69
|
+
# @example DebuggerRequires: [my_debugger/start]
|
70
|
+
#
|
71
|
+
# # bad (ok during development)
|
72
|
+
#
|
73
|
+
# require 'my_debugger/start'
|
67
74
|
class Debugger < Base
|
68
75
|
MSG = 'Remove debugger entry point `%<source>s`.'
|
69
76
|
BLOCK_TYPES = %i[block numblock kwbegin].freeze
|
70
77
|
|
71
78
|
def on_send(node)
|
72
|
-
return if
|
79
|
+
return if assumed_usage_context?(node)
|
73
80
|
|
74
|
-
add_offense(node)
|
81
|
+
add_offense(node) if debugger_method?(node) || debugger_require?(node)
|
75
82
|
end
|
76
83
|
|
77
84
|
private
|
@@ -87,12 +94,26 @@ module RuboCop
|
|
87
94
|
end
|
88
95
|
end
|
89
96
|
|
97
|
+
def debugger_requires
|
98
|
+
@debugger_requires ||= begin
|
99
|
+
config = cop_config.fetch('DebuggerRequires', [])
|
100
|
+
config.is_a?(Array) ? config : config.values.flatten
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
90
104
|
def debugger_method?(send_node)
|
91
105
|
return false if send_node.parent&.send_type? && send_node.parent.receiver == send_node
|
92
106
|
|
93
107
|
debugger_methods.include?(chained_method_name(send_node))
|
94
108
|
end
|
95
109
|
|
110
|
+
def debugger_require?(send_node)
|
111
|
+
return false unless send_node.method?(:require) && send_node.arguments.one?
|
112
|
+
return false unless (argument = send_node.first_argument).str_type?
|
113
|
+
|
114
|
+
debugger_requires.include?(argument.value)
|
115
|
+
end
|
116
|
+
|
96
117
|
def assumed_usage_context?(node)
|
97
118
|
# Basically, debugger methods are not used as a method argument without arguments.
|
98
119
|
return false unless node.arguments.empty? && node.each_ancestor(:send, :csend).any?
|
@@ -52,7 +52,7 @@ module RuboCop
|
|
52
52
|
# @!method deprecated_class_method?(node)
|
53
53
|
def_node_matcher :deprecated_class_method?, <<~PATTERN
|
54
54
|
{
|
55
|
-
(send (const {cbase nil?}
|
55
|
+
(send (const {cbase nil?} :ENV) {:clone :dup :freeze})
|
56
56
|
(send (const {cbase nil?} {:File :Dir}) :exists? _)
|
57
57
|
(send (const {cbase nil?} :Socket) {:gethostbyaddr :gethostbyname} ...)
|
58
58
|
(send nil? :attr _ boolean)
|
@@ -9,28 +9,18 @@ module RuboCop
|
|
9
9
|
#
|
10
10
|
# @example
|
11
11
|
#
|
12
|
-
# # Example for OpenSSL::Cipher instantiation.
|
13
|
-
#
|
14
12
|
# # bad
|
15
13
|
# OpenSSL::Cipher::AES.new(128, :GCM)
|
16
14
|
#
|
17
15
|
# # good
|
18
16
|
# OpenSSL::Cipher.new('aes-128-gcm')
|
19
17
|
#
|
20
|
-
# @example
|
21
|
-
#
|
22
|
-
# # Example for OpenSSL::Digest instantiation.
|
23
|
-
#
|
24
18
|
# # bad
|
25
19
|
# OpenSSL::Digest::SHA256.new
|
26
20
|
#
|
27
21
|
# # good
|
28
22
|
# OpenSSL::Digest.new('SHA256')
|
29
23
|
#
|
30
|
-
# @example
|
31
|
-
#
|
32
|
-
# # Example for ::Digest inherited class methods.
|
33
|
-
#
|
34
24
|
# # bad
|
35
25
|
# OpenSSL::Digest::SHA256.digest('foo')
|
36
26
|
#
|
@@ -9,7 +9,6 @@ module RuboCop
|
|
9
9
|
# @example
|
10
10
|
#
|
11
11
|
# # bad
|
12
|
-
#
|
13
12
|
# case x
|
14
13
|
# when 'first'
|
15
14
|
# do_something
|
@@ -17,10 +16,7 @@ module RuboCop
|
|
17
16
|
# do_something_else
|
18
17
|
# end
|
19
18
|
#
|
20
|
-
# @example
|
21
|
-
#
|
22
19
|
# # good
|
23
|
-
#
|
24
20
|
# case x
|
25
21
|
# when 'first'
|
26
22
|
# do_something
|
@@ -32,7 +28,7 @@ module RuboCop
|
|
32
28
|
|
33
29
|
def on_case(case_node)
|
34
30
|
case_node.when_branches.each_with_object(Set.new) do |when_node, previous|
|
35
|
-
when_node.
|
31
|
+
when_node.conditions.each do |condition|
|
36
32
|
add_offense(condition) unless previous.add?(condition)
|
37
33
|
end
|
38
34
|
end
|
@@ -9,7 +9,6 @@ module RuboCop
|
|
9
9
|
# @example
|
10
10
|
#
|
11
11
|
# # bad
|
12
|
-
#
|
13
12
|
# def foo
|
14
13
|
# 1
|
15
14
|
# end
|
@@ -18,20 +17,14 @@ module RuboCop
|
|
18
17
|
# 2
|
19
18
|
# end
|
20
19
|
#
|
21
|
-
# @example
|
22
|
-
#
|
23
20
|
# # bad
|
24
|
-
#
|
25
21
|
# def foo
|
26
22
|
# 1
|
27
23
|
# end
|
28
24
|
#
|
29
25
|
# alias foo bar
|
30
26
|
#
|
31
|
-
# @example
|
32
|
-
#
|
33
27
|
# # good
|
34
|
-
#
|
35
28
|
# def foo
|
36
29
|
# 1
|
37
30
|
# end
|
@@ -40,10 +33,7 @@ module RuboCop
|
|
40
33
|
# 2
|
41
34
|
# end
|
42
35
|
#
|
43
|
-
# @example
|
44
|
-
#
|
45
36
|
# # good
|
46
|
-
#
|
47
37
|
# def foo
|
48
38
|
# 1
|
49
39
|
# end
|
@@ -12,13 +12,9 @@ module RuboCop
|
|
12
12
|
# @example
|
13
13
|
#
|
14
14
|
# # bad
|
15
|
-
#
|
16
15
|
# sum = numbers.each_with_object(0) { |e, a| a += e }
|
17
16
|
#
|
18
|
-
# @example
|
19
|
-
#
|
20
17
|
# # good
|
21
|
-
#
|
22
18
|
# num = 0
|
23
19
|
# sum = numbers.each_with_object(num) { |e, a| a += e }
|
24
20
|
class EachWithObjectArgument < Base
|
@@ -104,7 +104,7 @@ module RuboCop
|
|
104
104
|
def correct_other_branches(corrector, node)
|
105
105
|
return unless require_other_branches_correction?(node)
|
106
106
|
|
107
|
-
if node.else_branch&.if_type?
|
107
|
+
if node.else_branch&.if_type? && !node.else_branch.modifier_form?
|
108
108
|
# Replace an orphaned `elsif` with `if`
|
109
109
|
corrector.replace(node.else_branch.loc.keyword, 'if')
|
110
110
|
else
|
@@ -146,7 +146,7 @@ module RuboCop
|
|
146
146
|
node.source_range.with(end_pos: node.condition.source_range.end_pos)
|
147
147
|
elsif all_branches_body_missing?(node)
|
148
148
|
if_node = node.ancestors.detect(&:if?)
|
149
|
-
node.source_range.
|
149
|
+
node.source_range.join(if_node.loc.end.end)
|
150
150
|
else
|
151
151
|
node.source_range
|
152
152
|
end
|
@@ -3,40 +3,30 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Lint
|
6
|
-
# Checks for empty `ensure` blocks
|
6
|
+
# Checks for empty `ensure` blocks.
|
7
7
|
#
|
8
8
|
# @example
|
9
9
|
#
|
10
10
|
# # bad
|
11
|
-
#
|
12
11
|
# def some_method
|
13
12
|
# do_something
|
14
13
|
# ensure
|
15
14
|
# end
|
16
15
|
#
|
17
|
-
# @example
|
18
|
-
#
|
19
16
|
# # bad
|
20
|
-
#
|
21
17
|
# begin
|
22
18
|
# do_something
|
23
19
|
# ensure
|
24
20
|
# end
|
25
21
|
#
|
26
|
-
# @example
|
27
|
-
#
|
28
22
|
# # good
|
29
|
-
#
|
30
23
|
# def some_method
|
31
24
|
# do_something
|
32
25
|
# ensure
|
33
26
|
# do_something_else
|
34
27
|
# end
|
35
28
|
#
|
36
|
-
# @example
|
37
|
-
#
|
38
29
|
# # good
|
39
|
-
#
|
40
30
|
# begin
|
41
31
|
# do_something
|
42
32
|
# ensure
|
@@ -14,8 +14,6 @@ module RuboCop
|
|
14
14
|
# when baz
|
15
15
|
# end
|
16
16
|
#
|
17
|
-
# @example
|
18
|
-
#
|
19
17
|
# # good
|
20
18
|
# case condition
|
21
19
|
# when foo
|
@@ -50,7 +48,7 @@ module RuboCop
|
|
50
48
|
MSG = 'Avoid `when` branches without a body.'
|
51
49
|
|
52
50
|
def on_case(node)
|
53
|
-
node.
|
51
|
+
node.when_branches.each do |when_node|
|
54
52
|
next if when_node.body
|
55
53
|
next if cop_config['AllowComments'] && contains_comments?(when_node)
|
56
54
|
|
@@ -13,7 +13,6 @@ module RuboCop
|
|
13
13
|
# @example
|
14
14
|
#
|
15
15
|
# # bad
|
16
|
-
#
|
17
16
|
# def foo
|
18
17
|
# do_something
|
19
18
|
# ensure
|
@@ -21,10 +20,7 @@ module RuboCop
|
|
21
20
|
# return self
|
22
21
|
# end
|
23
22
|
#
|
24
|
-
# @example
|
25
|
-
#
|
26
23
|
# # good
|
27
|
-
#
|
28
24
|
# def foo
|
29
25
|
# do_something
|
30
26
|
# self
|
@@ -32,8 +28,7 @@ module RuboCop
|
|
32
28
|
# cleanup
|
33
29
|
# end
|
34
30
|
#
|
35
|
-
# #
|
36
|
-
#
|
31
|
+
# # good
|
37
32
|
# def foo
|
38
33
|
# begin
|
39
34
|
# do_something
|
@@ -65,17 +65,15 @@ module RuboCop
|
|
65
65
|
|
66
66
|
minimum_target_ruby_version 2.6
|
67
67
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
'`ERB.new(str, eoutvar: %<arg_value>s)` instead.'
|
78
|
-
].freeze
|
68
|
+
MESSAGE_SAFE_LEVEL = 'Passing safe_level with the 2nd argument of `ERB.new` is ' \
|
69
|
+
'deprecated. Do not use it, and specify other arguments as ' \
|
70
|
+
'keyword arguments.'
|
71
|
+
MESSAGE_TRIM_MODE = 'Passing trim_mode with the 3rd argument of `ERB.new` is ' \
|
72
|
+
'deprecated. Use keyword argument like ' \
|
73
|
+
'`ERB.new(str, trim_mode: %<arg_value>s)` instead.'
|
74
|
+
MESSAGE_EOUTVAR = 'Passing eoutvar with the 4th argument of `ERB.new` is ' \
|
75
|
+
'deprecated. Use keyword argument like ' \
|
76
|
+
'`ERB.new(str, eoutvar: %<arg_value>s)` instead.'
|
79
77
|
|
80
78
|
RESTRICT_ON_SEND = %i[new].freeze
|
81
79
|
|
@@ -92,10 +90,8 @@ module RuboCop
|
|
92
90
|
arguments[1..3].each_with_index do |argument, i|
|
93
91
|
next if !argument || argument.hash_type?
|
94
92
|
|
95
|
-
message = format(MESSAGES[i], arg_value: argument.source)
|
96
|
-
|
97
93
|
add_offense(
|
98
|
-
argument.source_range, message: message
|
94
|
+
argument.source_range, message: message(i, argument.source)
|
99
95
|
) do |corrector|
|
100
96
|
autocorrect(corrector, node)
|
101
97
|
end
|
@@ -105,6 +101,17 @@ module RuboCop
|
|
105
101
|
|
106
102
|
private
|
107
103
|
|
104
|
+
def message(positional_argument_index, arg_value)
|
105
|
+
case positional_argument_index
|
106
|
+
when 0
|
107
|
+
MESSAGE_SAFE_LEVEL
|
108
|
+
when 1
|
109
|
+
format(MESSAGE_TRIM_MODE, arg_value: arg_value)
|
110
|
+
when 2
|
111
|
+
format(MESSAGE_EOUTVAR, arg_value: arg_value)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
108
115
|
def autocorrect(corrector, node)
|
109
116
|
str_arg = node.first_argument.source
|
110
117
|
|
@@ -66,7 +66,9 @@ module RuboCop
|
|
66
66
|
end
|
67
67
|
|
68
68
|
def literal_zero?(node)
|
69
|
-
|
69
|
+
# TODO: https://github.com/rubocop/rubocop-ast/pull/304 is released,
|
70
|
+
# replace this condition with `node&.numeric_type? && node.value.zero?`.
|
71
|
+
node&.numeric_type? && node.node_parts[0].zero?
|
70
72
|
end
|
71
73
|
|
72
74
|
# rubocop:disable Metrics/PerceivedComplexity
|
@@ -14,25 +14,15 @@ module RuboCop
|
|
14
14
|
# @example
|
15
15
|
#
|
16
16
|
# # bad
|
17
|
-
#
|
18
17
|
# format('A value: %s and another: %i', a_value)
|
19
18
|
#
|
20
|
-
# @example
|
21
|
-
#
|
22
19
|
# # good
|
23
|
-
#
|
24
20
|
# format('A value: %s and another: %i', a_value, another)
|
25
21
|
#
|
26
|
-
# @example
|
27
|
-
#
|
28
22
|
# # bad
|
29
|
-
#
|
30
23
|
# format('Unnumbered format: %s and numbered: %2$s', a_value, another)
|
31
24
|
#
|
32
|
-
# @example
|
33
|
-
#
|
34
25
|
# # good
|
35
|
-
#
|
36
26
|
# format('Numbered format: %1$s and numbered %2$s', a_value, another)
|
37
27
|
class FormatParameterMismatch < Base
|
38
28
|
# http://rubular.com/r/CvpbxkcTzy
|
@@ -9,13 +9,9 @@ module RuboCop
|
|
9
9
|
# @example
|
10
10
|
#
|
11
11
|
# # bad
|
12
|
-
#
|
13
12
|
# array = ['Item 1' 'Item 2']
|
14
13
|
#
|
15
|
-
# @example
|
16
|
-
#
|
17
14
|
# # good
|
18
|
-
#
|
19
15
|
# array = ['Item 1Item 2']
|
20
16
|
# array = ['Item 1' + 'Item 2']
|
21
17
|
# array = [
|
@@ -23,27 +19,34 @@ module RuboCop
|
|
23
19
|
# 'Item 2'
|
24
20
|
# ]
|
25
21
|
class ImplicitStringConcatenation < Base
|
26
|
-
|
22
|
+
extend AutoCorrector
|
23
|
+
|
24
|
+
MSG = 'Combine %<lhs>s and %<rhs>s into a single string ' \
|
27
25
|
'literal, rather than using implicit string concatenation.'
|
28
26
|
FOR_ARRAY = ' Or, if they were intended to be separate array ' \
|
29
27
|
'elements, separate them with a comma.'
|
30
28
|
FOR_METHOD = ' Or, if they were intended to be separate method ' \
|
31
29
|
'arguments, separate them with a comma.'
|
32
30
|
|
31
|
+
# rubocop:disable Metrics/AbcSize
|
33
32
|
def on_dstr(node)
|
34
|
-
each_bad_cons(node) do |
|
35
|
-
range
|
36
|
-
message = format(MSG,
|
37
|
-
string1: display_str(child_node1),
|
38
|
-
string2: display_str(child_node2))
|
33
|
+
each_bad_cons(node) do |lhs_node, rhs_node|
|
34
|
+
range = lhs_node.source_range.join(rhs_node.source_range)
|
35
|
+
message = format(MSG, lhs: display_str(lhs_node), rhs: display_str(rhs_node))
|
39
36
|
if node.parent&.array_type?
|
40
37
|
message << FOR_ARRAY
|
41
38
|
elsif node.parent&.send_type?
|
42
39
|
message << FOR_METHOD
|
43
40
|
end
|
44
|
-
|
41
|
+
|
42
|
+
add_offense(range, message: message) do |corrector|
|
43
|
+
preferred = "#{lhs_node.source} + #{rhs_node.source}"
|
44
|
+
|
45
|
+
corrector.replace(range, preferred)
|
46
|
+
end
|
45
47
|
end
|
46
48
|
end
|
49
|
+
# rubocop:enable Metrics/AbcSize
|
47
50
|
|
48
51
|
private
|
49
52
|
|
@@ -73,7 +76,7 @@ module RuboCop
|
|
73
76
|
end
|
74
77
|
|
75
78
|
def string_literal?(node)
|
76
|
-
node.str_type? ||
|
79
|
+
node.str_type? || node.dstr_type?
|
77
80
|
end
|
78
81
|
|
79
82
|
def string_literals?(node1, node2)
|
@@ -11,7 +11,6 @@ module RuboCop
|
|
11
11
|
# @example
|
12
12
|
#
|
13
13
|
# # bad
|
14
|
-
#
|
15
14
|
# class C
|
16
15
|
# private
|
17
16
|
#
|
@@ -20,10 +19,7 @@ module RuboCop
|
|
20
19
|
# end
|
21
20
|
# end
|
22
21
|
#
|
23
|
-
# @example
|
24
|
-
#
|
25
22
|
# # good
|
26
|
-
#
|
27
23
|
# class C
|
28
24
|
# def self.method
|
29
25
|
# puts 'hi'
|
@@ -32,10 +28,7 @@ module RuboCop
|
|
32
28
|
# private_class_method :method
|
33
29
|
# end
|
34
30
|
#
|
35
|
-
# @example
|
36
|
-
#
|
37
31
|
# # good
|
38
|
-
#
|
39
32
|
# class C
|
40
33
|
# class << self
|
41
34
|
# private
|