rubocop 1.62.1 → 1.67.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.
- checksums.yaml +4 -4
- data/README.md +67 -68
- data/config/default.yml +82 -12
- data/config/internal_affairs.yml +11 -0
- data/exe/rubocop +4 -3
- data/lib/rubocop/cached_data.rb +11 -3
- data/lib/rubocop/cli/command/auto_generate_config.rb +6 -7
- 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 +4 -0
- data/lib/rubocop/comment_config.rb +1 -1
- data/lib/rubocop/config.rb +37 -11
- data/lib/rubocop/config_loader.rb +15 -9
- data/lib/rubocop/config_loader_resolver.rb +13 -8
- data/lib/rubocop/config_obsoletion.rb +1 -1
- data/lib/rubocop/config_validator.rb +3 -2
- data/lib/rubocop/cop/base.rb +56 -16
- data/lib/rubocop/cop/bundler/gem_version.rb +4 -5
- data/lib/rubocop/cop/cop.rb +30 -4
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -0
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +1 -1
- data/lib/rubocop/cop/documentation.rb +32 -5
- 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/ruby_version_globals_usage.rb +3 -3
- data/lib/rubocop/cop/internal_affairs/cop_description.rb +0 -4
- data/lib/rubocop/cop/internal_affairs/empty_line_between_expect_offense_and_correction.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/example_description.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +6 -21
- data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +8 -1
- data/lib/rubocop/cop/internal_affairs/undefined_config.rb +11 -1
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +0 -5
- data/lib/rubocop/cop/internal_affairs.rb +16 -0
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +5 -1
- data/lib/rubocop/cop/layout/assignment_indentation.rb +3 -2
- data/lib/rubocop/cop/layout/block_alignment.rb +30 -12
- 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/def_end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/empty_comment.rb +3 -1
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +2 -1
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +8 -3
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -3
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +8 -0
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +5 -6
- data/lib/rubocop/cop/layout/leading_comment_space.rb +28 -1
- data/lib/rubocop/cop/layout/line_length.rb +20 -20
- data/lib/rubocop/cop/layout/space_around_operators.rb +3 -0
- 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_range.rb +4 -1
- 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/big_decimal_new.rb +4 -7
- data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -3
- 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/duplicate_set_element.rb +74 -0
- 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 +28 -7
- 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 -9
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +21 -14
- data/lib/rubocop/cop/lint/float_comparison.rb +1 -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 +23 -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/it_without_arguments_in_block.rb +5 -14
- data/lib/rubocop/cop/lint/literal_as_condition.rb +1 -1
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +1 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +25 -6
- 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/parentheses_as_grouped_expression.rb +5 -6
- 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 +1 -1
- 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 +3 -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/return_in_void_context.rb +0 -2
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +0 -4
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +105 -41
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +6 -10
- data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +2 -9
- 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/uri_regexp.rb +25 -7
- data/lib/rubocop/cop/lint/useless_assignment.rb +19 -16
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +0 -4
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +77 -0
- data/lib/rubocop/cop/lint/useless_setter_call.rb +0 -4
- data/lib/rubocop/cop/lint/void.rb +35 -8
- data/lib/rubocop/cop/metrics/block_length.rb +6 -5
- data/lib/rubocop/cop/metrics/block_nesting.rb +19 -7
- data/lib/rubocop/cop/metrics/class_length.rb +6 -5
- data/lib/rubocop/cop/metrics/method_length.rb +6 -5
- data/lib/rubocop/cop/metrics/module_length.rb +6 -5
- 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/annotation_comment.rb +0 -2
- data/lib/rubocop/cop/mixin/code_length.rb +12 -1
- data/lib/rubocop/cop/mixin/configurable_max.rb +5 -1
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +19 -9
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +9 -2
- data/lib/rubocop/cop/mixin/line_length_help.rb +7 -2
- data/lib/rubocop/cop/mixin/method_complexity.rb +15 -6
- data/lib/rubocop/cop/mixin/percent_array.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/mixin/statement_modifier.rb +3 -2
- data/lib/rubocop/cop/mixin/string_literals_help.rb +12 -0
- data/lib/rubocop/cop/naming/accessor_method_name.rb +5 -0
- data/lib/rubocop/cop/naming/block_forwarding.rb +31 -12
- data/lib/rubocop/cop/naming/file_name.rb +2 -2
- data/lib/rubocop/cop/naming/inclusive_language.rb +13 -5
- data/lib/rubocop/cop/naming/predicate_name.rb +53 -27
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +10 -1
- data/lib/rubocop/cop/offense.rb +2 -2
- data/lib/rubocop/cop/security/compound_hash.rb +2 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +62 -2
- data/lib/rubocop/cop/style/accessor_grouping.rb +10 -2
- data/lib/rubocop/cop/style/alias.rb +2 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +59 -11
- data/lib/rubocop/cop/style/block_delimiters.rb +14 -1
- data/lib/rubocop/cop/style/collection_compact.rb +9 -9
- data/lib/rubocop/cop/style/combinable_loops.rb +7 -0
- data/lib/rubocop/cop/style/commented_keyword.rb +7 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +2 -2
- data/lib/rubocop/cop/style/copyright.rb +31 -21
- data/lib/rubocop/cop/style/data_inheritance.rb +1 -1
- 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 +0 -1
- data/lib/rubocop/cop/style/empty_else.rb +6 -5
- data/lib/rubocop/cop/style/empty_heredoc.rb +1 -14
- data/lib/rubocop/cop/style/empty_literal.rb +31 -22
- data/lib/rubocop/cop/style/eval_with_location.rb +16 -13
- 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/format_string.rb +9 -9
- data/lib/rubocop/cop/style/format_string_token.rb +2 -2
- data/lib/rubocop/cop/style/global_std_stream.rb +7 -1
- data/lib/rubocop/cop/style/guard_clause.rb +3 -1
- data/lib/rubocop/cop/style/hash_each_methods.rb +6 -0
- data/lib/rubocop/cop/style/hash_except.rb +8 -5
- data/lib/rubocop/cop/style/hash_syntax.rb +20 -2
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +1 -1
- data/lib/rubocop/cop/style/if_inside_else.rb +1 -1
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +5 -4
- data/lib/rubocop/cop/style/if_with_semicolon.rb +49 -6
- data/lib/rubocop/cop/style/in_pattern_then.rb +6 -2
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +2 -2
- data/lib/rubocop/cop/style/lambda.rb +1 -1
- data/lib/rubocop/cop/style/magic_comment_format.rb +1 -1
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +77 -43
- data/lib/rubocop/cop/style/map_into_array.rb +228 -0
- data/lib/rubocop/cop/style/map_to_hash.rb +1 -1
- data/lib/rubocop/cop/style/map_to_set.rb +1 -1
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +17 -7
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +2 -2
- data/lib/rubocop/cop/style/missing_else.rb +0 -4
- data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
- data/lib/rubocop/cop/style/multiline_when_then.rb +0 -4
- data/lib/rubocop/cop/style/multiple_comparison.rb +3 -11
- data/lib/rubocop/cop/style/nested_modifier.rb +1 -1
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
- data/lib/rubocop/cop/style/numeric_predicate.rb +12 -4
- data/lib/rubocop/cop/style/one_line_conditional.rb +6 -2
- data/lib/rubocop/cop/style/operator_method_call.rb +25 -6
- data/lib/rubocop/cop/style/parallel_assignment.rb +5 -4
- data/lib/rubocop/cop/style/quoted_symbols.rb +1 -3
- data/lib/rubocop/cop/style/redundant_argument.rb +24 -1
- data/lib/rubocop/cop/style/redundant_begin.rb +5 -1
- data/lib/rubocop/cop/style/redundant_condition.rb +4 -4
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +1 -1
- data/lib/rubocop/cop/style/redundant_each.rb +1 -1
- 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_interpolation_unfreeze.rb +46 -0
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +15 -18
- data/lib/rubocop/cop/style/redundant_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +4 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +8 -24
- data/lib/rubocop/cop/style/require_order.rb +2 -2
- data/lib/rubocop/cop/style/rescue_modifier.rb +13 -1
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +54 -12
- data/lib/rubocop/cop/style/safe_navigation.rb +94 -52
- data/lib/rubocop/cop/style/select_by_regexp.rb +9 -6
- data/lib/rubocop/cop/style/semicolon.rb +1 -1
- 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/sole_nested_conditional.rb +21 -2
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -2
- data/lib/rubocop/cop/style/struct_inheritance.rb +1 -1
- data/lib/rubocop/cop/style/super_arguments.rb +174 -0
- data/lib/rubocop/cop/style/symbol_proc.rb +39 -5
- data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/top_level_method_definition.rb +1 -1
- data/lib/rubocop/cop/style/trivial_accessors.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 +27 -3
- data/lib/rubocop/cop/util.rb +8 -2
- data/lib/rubocop/cop/variable_force.rb +13 -1
- data/lib/rubocop/cops_documentation_generator.rb +73 -34
- data/lib/rubocop/core_ext/string.rb +2 -6
- data/lib/rubocop/ext/regexp_node.rb +9 -31
- data/lib/rubocop/ext/regexp_parser.rb +4 -21
- data/lib/rubocop/file_finder.rb +9 -4
- data/lib/rubocop/formatter/clang_style_formatter.rb +3 -7
- data/lib/rubocop/formatter/disabled_config_formatter.rb +13 -9
- data/lib/rubocop/formatter/formatter_set.rb +7 -1
- data/lib/rubocop/formatter/html_formatter.rb +3 -1
- data/lib/rubocop/formatter/junit_formatter.rb +70 -23
- data/lib/rubocop/formatter/tap_formatter.rb +3 -7
- data/lib/rubocop/lockfile.rb +58 -7
- data/lib/rubocop/lsp/routes.rb +10 -13
- data/lib/rubocop/lsp/runtime.rb +2 -0
- data/lib/rubocop/lsp/server.rb +2 -1
- data/lib/rubocop/lsp.rb +9 -2
- data/lib/rubocop/options.rb +6 -4
- data/lib/rubocop/rake_task.rb +1 -1
- data/lib/rubocop/remote_config.rb +5 -1
- data/lib/rubocop/result_cache.rb +2 -8
- data/lib/rubocop/rspec/expect_offense.rb +9 -0
- data/lib/rubocop/rspec/shared_contexts.rb +35 -3
- data/lib/rubocop/rspec/support.rb +1 -0
- data/lib/rubocop/runner.rb +8 -1
- data/lib/rubocop/server/cache.rb +16 -1
- data/lib/rubocop/server/client_command/exec.rb +2 -2
- data/lib/rubocop/server/client_command/start.rb +1 -1
- data/lib/rubocop/server/core.rb +5 -0
- data/lib/rubocop/target_ruby.rb +19 -15
- data/lib/rubocop/version.rb +7 -5
- data/lib/rubocop/yaml_duplication_checker.rb +20 -26
- data/lib/rubocop.rb +13 -1
- metadata +20 -32
|
@@ -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
|
|
@@ -57,6 +57,7 @@ module RuboCop
|
|
|
57
57
|
# # good
|
|
58
58
|
# (a.foo)..(b.bar)
|
|
59
59
|
class AmbiguousRange < Base
|
|
60
|
+
include RationalLiteral
|
|
60
61
|
extend AutoCorrector
|
|
61
62
|
|
|
62
63
|
MSG = 'Wrap complex range boundaries with parentheses to avoid ambiguity.'
|
|
@@ -79,12 +80,14 @@ module RuboCop
|
|
|
79
80
|
yield range.end if range.end
|
|
80
81
|
end
|
|
81
82
|
|
|
83
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
|
82
84
|
def acceptable?(node)
|
|
83
85
|
node.begin_type? ||
|
|
84
|
-
node.literal? ||
|
|
86
|
+
node.literal? || rational_literal?(node) ||
|
|
85
87
|
node.variable? || node.const_type? || node.self_type? ||
|
|
86
88
|
(node.call_type? && acceptable_call?(node))
|
|
87
89
|
end
|
|
90
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
|
88
91
|
|
|
89
92
|
def acceptable_call?(node)
|
|
90
93
|
return true if node.unary_operation?
|
|
@@ -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
|
|
@@ -17,8 +17,7 @@ module RuboCop
|
|
|
17
17
|
class BigDecimalNew < Base
|
|
18
18
|
extend AutoCorrector
|
|
19
19
|
|
|
20
|
-
MSG = '
|
|
21
|
-
'Use `%<double_colon>sBigDecimal()` instead.'
|
|
20
|
+
MSG = '`BigDecimal.new()` is deprecated. Use `BigDecimal()` instead.'
|
|
22
21
|
RESTRICT_ON_SEND = %i[new].freeze
|
|
23
22
|
|
|
24
23
|
# @!method big_decimal_new(node)
|
|
@@ -28,13 +27,11 @@ module RuboCop
|
|
|
28
27
|
PATTERN
|
|
29
28
|
|
|
30
29
|
def on_send(node)
|
|
31
|
-
big_decimal_new(node) do |
|
|
32
|
-
|
|
33
|
-
message = format(MSG, double_colon: double_colon)
|
|
34
|
-
|
|
35
|
-
add_offense(node.loc.selector, message: message) do |corrector|
|
|
30
|
+
big_decimal_new(node) do |cbase|
|
|
31
|
+
add_offense(node.loc.selector) do |corrector|
|
|
36
32
|
corrector.remove(node.loc.selector)
|
|
37
33
|
corrector.remove(node.loc.dot)
|
|
34
|
+
corrector.remove(cbase) if cbase
|
|
38
35
|
end
|
|
39
36
|
end
|
|
40
37
|
end
|
|
@@ -19,8 +19,6 @@ module RuboCop
|
|
|
19
19
|
# # good
|
|
20
20
|
# true
|
|
21
21
|
#
|
|
22
|
-
# @example
|
|
23
|
-
#
|
|
24
22
|
# # bad
|
|
25
23
|
# :false
|
|
26
24
|
#
|
|
@@ -38,7 +36,7 @@ module RuboCop
|
|
|
38
36
|
return unless boolean_symbol?(node)
|
|
39
37
|
|
|
40
38
|
parent = node.parent
|
|
41
|
-
return if parent&.array_type? && parent
|
|
39
|
+
return if parent&.array_type? && parent.percent_literal?(:symbol)
|
|
42
40
|
|
|
43
41
|
add_offense(node, message: format(MSG, boolean: node.value)) do |corrector|
|
|
44
42
|
autocorrect(corrector, node)
|
|
@@ -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
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Lint
|
|
6
|
+
# Checks for duplicate literal, constant, or variable elements in Set.
|
|
7
|
+
#
|
|
8
|
+
# @example
|
|
9
|
+
#
|
|
10
|
+
# # bad
|
|
11
|
+
# Set[:foo, :bar, :foo]
|
|
12
|
+
#
|
|
13
|
+
# # good
|
|
14
|
+
# Set[:foo, :bar]
|
|
15
|
+
#
|
|
16
|
+
# # bad
|
|
17
|
+
# Set.new([:foo, :bar, :foo])
|
|
18
|
+
#
|
|
19
|
+
# # good
|
|
20
|
+
# Set.new([:foo, :bar])
|
|
21
|
+
#
|
|
22
|
+
# # bad
|
|
23
|
+
# [:foo, :bar, :foo].to_set
|
|
24
|
+
#
|
|
25
|
+
# # good
|
|
26
|
+
# [:foo, :bar].to_set
|
|
27
|
+
#
|
|
28
|
+
class DuplicateSetElement < Base
|
|
29
|
+
extend AutoCorrector
|
|
30
|
+
|
|
31
|
+
MSG = 'Remove the duplicate element in Set.'
|
|
32
|
+
RESTRICT_ON_SEND = %i[\[\] new to_set].freeze
|
|
33
|
+
|
|
34
|
+
# @!method set_init_elements(node)
|
|
35
|
+
def_node_matcher :set_init_elements, <<~PATTERN
|
|
36
|
+
{
|
|
37
|
+
(send (const {nil? cbase} :Set) :[] $...)
|
|
38
|
+
(send (const {nil? cbase} :Set) :new (array $...))
|
|
39
|
+
(call (array $...) :to_set)
|
|
40
|
+
}
|
|
41
|
+
PATTERN
|
|
42
|
+
|
|
43
|
+
def on_send(node)
|
|
44
|
+
return unless (set_elements = set_init_elements(node))
|
|
45
|
+
|
|
46
|
+
seen_elements = Set[]
|
|
47
|
+
|
|
48
|
+
set_elements.each_with_index do |set_element, index|
|
|
49
|
+
# NOTE: Skip due to the possibility of corner cases where Set elements
|
|
50
|
+
# may have changing return values if they are not literals, constants, or variables.
|
|
51
|
+
next if !set_element.literal? && !set_element.const_type? && !set_element.variable?
|
|
52
|
+
|
|
53
|
+
if seen_elements.include?(set_element)
|
|
54
|
+
register_offense(set_element, set_elements[index - 1])
|
|
55
|
+
else
|
|
56
|
+
seen_elements << set_element
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
alias on_csend on_send
|
|
61
|
+
|
|
62
|
+
private
|
|
63
|
+
|
|
64
|
+
def register_offense(current_element, prev_element)
|
|
65
|
+
add_offense(current_element) do |corrector|
|
|
66
|
+
range = prev_element.source_range.end.join(current_element.source_range.end)
|
|
67
|
+
|
|
68
|
+
corrector.remove(range)
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
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
|
|
@@ -67,19 +67,31 @@ module RuboCop
|
|
|
67
67
|
|
|
68
68
|
MSG = 'Avoid `%<keyword>s` branches without a body.'
|
|
69
69
|
|
|
70
|
+
# rubocop:disable Metrics/AbcSize
|
|
70
71
|
def on_if(node)
|
|
71
72
|
return if node.body || same_line?(node.loc.begin, node.loc.end)
|
|
72
73
|
return if cop_config['AllowComments'] && contains_comments?(node)
|
|
73
74
|
|
|
74
|
-
|
|
75
|
+
range = offense_range(node)
|
|
76
|
+
|
|
77
|
+
add_offense(range, message: format(MSG, keyword: node.keyword)) do |corrector|
|
|
75
78
|
next if node.parent&.call_type?
|
|
76
79
|
|
|
77
80
|
autocorrect(corrector, node)
|
|
78
81
|
end
|
|
79
82
|
end
|
|
83
|
+
# rubocop:enable Metrics/AbcSize
|
|
80
84
|
|
|
81
85
|
private
|
|
82
86
|
|
|
87
|
+
def offense_range(node)
|
|
88
|
+
if node.loc.else
|
|
89
|
+
node.source_range.begin.join(node.loc.else.begin)
|
|
90
|
+
else
|
|
91
|
+
node.source_range
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
83
95
|
def autocorrect(corrector, node)
|
|
84
96
|
remove_comments(corrector, node)
|
|
85
97
|
remove_empty_branch(corrector, node)
|
|
@@ -93,13 +105,22 @@ module RuboCop
|
|
|
93
105
|
end
|
|
94
106
|
end
|
|
95
107
|
|
|
108
|
+
# rubocop:disable Metrics/AbcSize
|
|
96
109
|
def remove_empty_branch(corrector, node)
|
|
97
|
-
if empty_if_branch?(node) && else_branch?(node)
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
110
|
+
range = if empty_if_branch?(node) && else_branch?(node)
|
|
111
|
+
branch_range(node)
|
|
112
|
+
elsif same_line?(node, else_kw_loc = node.loc.else)
|
|
113
|
+
node.source_range.begin.join(else_kw_loc.begin)
|
|
114
|
+
elsif node.parent&.loc.respond_to?(:end) &&
|
|
115
|
+
same_line?(node, end_loc = node.parent.loc.end)
|
|
116
|
+
node.source_range.begin.join(end_loc.begin)
|
|
117
|
+
else
|
|
118
|
+
deletion_range(branch_range(node))
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
corrector.remove(range)
|
|
102
122
|
end
|
|
123
|
+
# rubocop:enable Metrics/AbcSize
|
|
103
124
|
|
|
104
125
|
def correct_other_branches(corrector, node)
|
|
105
126
|
return unless require_other_branches_correction?(node)
|
|
@@ -146,7 +167,7 @@ module RuboCop
|
|
|
146
167
|
node.source_range.with(end_pos: node.condition.source_range.end_pos)
|
|
147
168
|
elsif all_branches_body_missing?(node)
|
|
148
169
|
if_node = node.ancestors.detect(&:if?)
|
|
149
|
-
node.source_range.
|
|
170
|
+
node.source_range.join(if_node.loc.end.end)
|
|
150
171
|
else
|
|
151
172
|
node.source_range
|
|
152
173
|
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
|
|
@@ -45,9 +40,6 @@ module RuboCop
|
|
|
45
40
|
# cleanup
|
|
46
41
|
# end
|
|
47
42
|
class EnsureReturn < Base
|
|
48
|
-
extend AutoCorrector
|
|
49
|
-
include RangeHelp
|
|
50
|
-
|
|
51
43
|
MSG = 'Do not return from an `ensure` block.'
|
|
52
44
|
|
|
53
45
|
def on_ensure(node)
|