rubocop 1.71.1 → 1.92.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/LICENSE.txt +1 -1
- data/README.md +23 -19
- data/config/default.yml +885 -168
- data/config/internal_affairs.yml +20 -0
- data/config/obsoletion.yml +47 -4
- data/exe/rubocop +2 -9
- data/lib/rubocop/cache_config.rb +29 -0
- data/lib/rubocop/cached_data.rb +50 -5
- data/lib/rubocop/changed_files.rb +134 -0
- data/lib/rubocop/cli/command/auto_generate_config.rb +36 -4
- data/lib/rubocop/cli/command/cop_names.rb +57 -0
- data/lib/rubocop/cli/command/execute_runner.rb +54 -3
- data/lib/rubocop/cli/command/explain.rb +34 -0
- data/lib/rubocop/cli/command/list_enabled_cops_for.rb +40 -0
- data/lib/rubocop/cli/command/lsp.rb +1 -1
- data/lib/rubocop/cli/command/mcp.rb +19 -0
- data/lib/rubocop/cli/command/show_cops.rb +8 -2
- data/lib/rubocop/cli/command/show_docs_url.rb +8 -10
- data/lib/rubocop/cli/command/suggest_extensions.rb +8 -2
- data/lib/rubocop/cli.rb +59 -17
- data/lib/rubocop/comment_config/directive_range.rb +34 -0
- data/lib/rubocop/comment_config/disable_next.rb +143 -0
- data/lib/rubocop/comment_config/push_pop.rb +55 -0
- data/lib/rubocop/comment_config.rb +98 -45
- data/lib/rubocop/config.rb +137 -19
- data/lib/rubocop/config_finder.rb +1 -1
- data/lib/rubocop/config_loader.rb +75 -49
- data/lib/rubocop/config_loader_resolver.rb +124 -33
- data/lib/rubocop/config_obsoletion/cop_rule.rb +2 -1
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +6 -3
- data/lib/rubocop/config_obsoletion/removed_cop.rb +9 -1
- data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
- data/lib/rubocop/config_obsoletion.rb +47 -3
- data/lib/rubocop/config_store.rb +7 -2
- data/lib/rubocop/config_validator.rb +75 -12
- data/lib/rubocop/cop/autocorrect_logic.rb +43 -17
- data/lib/rubocop/cop/badge.rb +9 -1
- data/lib/rubocop/cop/base.rb +128 -35
- data/lib/rubocop/cop/bundler/gem_comment.rb +5 -4
- data/lib/rubocop/cop/bundler/gem_version.rb +28 -28
- data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -11
- data/lib/rubocop/cop/bundler.rb +19 -0
- data/lib/rubocop/cop/commissioner.rb +13 -11
- data/lib/rubocop/cop/cop_documentation.rb +81 -0
- data/lib/rubocop/cop/cop_explanation.rb +140 -0
- data/lib/rubocop/cop/corrector.rb +4 -4
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +92 -11
- data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +22 -7
- data/lib/rubocop/cop/correctors/empty_line_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +7 -2
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +29 -2
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1 -5
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +8 -1
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +73 -2
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors.rb +28 -0
- data/lib/rubocop/cop/documentation.rb +3 -4
- data/lib/rubocop/cop/exclude_limit.rb +31 -5
- data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
- data/lib/rubocop/cop/gemspec/dependency_version.rb +0 -6
- data/lib/rubocop/cop/gemspec/development_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +49 -17
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +2 -9
- data/lib/rubocop/cop/gemspec/require_mfa.rb +22 -5
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +12 -7
- data/lib/rubocop/cop/gemspec.rb +22 -0
- data/lib/rubocop/cop/generator/registration_injector.rb +188 -0
- data/lib/rubocop/cop/generator.rb +5 -1
- data/lib/rubocop/cop/internal_affairs/example_description.rb +9 -5
- data/lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +8 -8
- data/lib/rubocop/cop/internal_affairs/itblock_handler.rb +69 -0
- data/lib/rubocop/cop/internal_affairs/location_exists.rb +142 -0
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +16 -20
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +1 -2
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +6 -2
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +85 -0
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +2 -2
- data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
- data/lib/rubocop/cop/internal_affairs/redundant_context_config_parameter.rb +1 -7
- data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
- data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +5 -3
- data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +1 -7
- data/lib/rubocop/cop/internal_affairs/undefined_config.rb +13 -2
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +4 -4
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
- data/lib/rubocop/cop/internal_affairs.rb +3 -16
- data/lib/rubocop/cop/layout/argument_alignment.rb +4 -2
- data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +86 -4
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/case_indentation.rb +28 -10
- data/lib/rubocop/cop/layout/class_structure.rb +172 -36
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/comment_indentation.rb +17 -7
- data/lib/rubocop/cop/layout/condition_position.rb +13 -3
- data/lib/rubocop/cop/layout/def_end_alignment.rb +5 -1
- data/lib/rubocop/cop/layout/dot_position.rb +2 -2
- data/lib/rubocop/cop/layout/else_alignment.rb +3 -15
- data/lib/rubocop/cop/layout/empty_comment.rb +8 -10
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +27 -9
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +63 -5
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +14 -5
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +46 -21
- data/lib/rubocop/cop/layout/empty_lines.rb +5 -2
- data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +101 -0
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +34 -4
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +8 -29
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +2 -0
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +14 -3
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +17 -3
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +23 -1
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +22 -2
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +16 -2
- data/lib/rubocop/cop/layout/end_alignment.rb +20 -8
- data/lib/rubocop/cop/layout/extra_spacing.rb +109 -3
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +57 -3
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +18 -5
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +26 -0
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +25 -18
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +25 -25
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +6 -0
- data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +4 -0
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +11 -0
- data/lib/rubocop/cop/layout/hash_alignment.rb +20 -18
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +5 -3
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +48 -3
- data/lib/rubocop/cop/layout/indentation_style.rb +5 -2
- data/lib/rubocop/cop/layout/indentation_width.rb +159 -12
- data/lib/rubocop/cop/layout/leading_comment_space.rb +40 -1
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +10 -4
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +25 -9
- data/lib/rubocop/cop/layout/line_length.rb +201 -30
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +69 -57
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +8 -2
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +11 -1
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +63 -56
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +7 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +259 -40
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +4 -0
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +9 -5
- data/lib/rubocop/cop/layout/parameter_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/redundant_line_break.rb +111 -7
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +29 -9
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +10 -2
- data/lib/rubocop/cop/layout/space_after_comma.rb +2 -10
- data/lib/rubocop/cop/layout/space_after_not.rb +5 -0
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +10 -4
- data/lib/rubocop/cop/layout/space_around_keyword.rb +20 -3
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +30 -4
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +5 -1
- data/lib/rubocop/cop/layout/space_before_brackets.rb +6 -39
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -8
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +55 -36
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +32 -8
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +3 -0
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +1 -1
- data/lib/rubocop/cop/layout.rb +114 -0
- data/lib/rubocop/cop/lazy_loader.rb +41 -0
- data/lib/rubocop/cop/lint/ambiguous_assignment.rb +9 -17
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +72 -1
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +3 -11
- data/lib/rubocop/cop/lint/ambiguous_range.rb +6 -2
- data/lib/rubocop/cop/lint/argument_mismatch.rb +99 -0
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +2 -3
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +15 -1
- data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +47 -8
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +4 -3
- data/lib/rubocop/cop/lint/constant_reassignment.rb +94 -15
- data/lib/rubocop/cop/lint/constant_resolution.rb +31 -6
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +240 -0
- data/lib/rubocop/cop/lint/data_define_override.rb +63 -0
- data/lib/rubocop/cop/lint/debugger.rb +13 -4
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
- data/lib/rubocop/cop/lint/deprecated_constants.rb +2 -8
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +5 -2
- data/lib/rubocop/cop/lint/deprecated_reference.rb +194 -0
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +4 -4
- data/lib/rubocop/cop/lint/duplicate_methods.rb +506 -41
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +5 -42
- data/lib/rubocop/cop/lint/else_layout.rb +19 -0
- data/lib/rubocop/cop/lint/empty_block.rb +4 -4
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +22 -65
- data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
- data/lib/rubocop/cop/lint/empty_in_pattern.rb +8 -1
- data/lib/rubocop/cop/lint/empty_interpolation.rb +14 -1
- data/lib/rubocop/cop/lint/empty_when.rb +8 -1
- data/lib/rubocop/cop/lint/ensure_return.rb +19 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +4 -8
- data/lib/rubocop/cop/lint/float_comparison.rb +33 -10
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +1 -1
- data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -2
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -1
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -2
- data/lib/rubocop/cop/lint/inherit_exception.rb +53 -7
- data/lib/rubocop/cop/lint/interpolation_check.rb +25 -6
- data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
- data/lib/rubocop/cop/lint/literal_as_condition.rb +152 -11
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +11 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +75 -37
- data/lib/rubocop/cop/lint/loop.rb +24 -2
- data/lib/rubocop/cop/lint/misplaced_magic_comment.rb +245 -0
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +60 -23
- data/lib/rubocop/cop/lint/missing_super.rb +31 -1
- data/lib/rubocop/cop/lint/mixed_case_range.rb +2 -2
- data/lib/rubocop/cop/lint/multiple_comparison.rb +2 -2
- data/lib/rubocop/cop/lint/name_typo.rb +270 -0
- data/lib/rubocop/cop/lint/nested_method_definition.rb +2 -2
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +2 -0
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +20 -0
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +4 -2
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +4 -4
- data/lib/rubocop/cop/lint/number_conversion.rb +20 -11
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +11 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +1 -1
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +7 -7
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +15 -4
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +20 -14
- data/lib/rubocop/cop/lint/raise_exception.rb +30 -11
- data/lib/rubocop/cop/lint/rand_one.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +160 -39
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +53 -19
- data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +28 -6
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +5 -25
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +134 -12
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +13 -4
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +267 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +5 -3
- data/lib/rubocop/cop/lint/redundant_with_object.rb +8 -0
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +8 -1
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +9 -1
- data/lib/rubocop/cop/lint/require_parentheses.rb +13 -4
- data/lib/rubocop/cop/lint/require_range_parentheses.rb +3 -2
- data/lib/rubocop/cop/lint/require_relative_self_path.rb +7 -5
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -4
- data/lib/rubocop/cop/lint/rescue_type.rb +2 -2
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +28 -4
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +9 -5
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
- data/lib/rubocop/cop/lint/script_permission.rb +5 -1
- data/lib/rubocop/cop/lint/self_assignment.rb +63 -6
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -1
- data/lib/rubocop/cop/lint/shadowed_argument.rb +7 -7
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +27 -1
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +14 -1
- data/lib/rubocop/cop/lint/struct_new_override.rb +17 -1
- data/lib/rubocop/cop/lint/super_argument_mismatch.rb +179 -0
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +122 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +21 -4
- data/lib/rubocop/cop/lint/syntax.rb +25 -1
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +73 -5
- data/lib/rubocop/cop/lint/to_json.rb +20 -17
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +5 -1
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +54 -11
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +2 -0
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +2 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +16 -9
- data/lib/rubocop/cop/lint/unreachable_loop.rb +5 -5
- data/lib/rubocop/cop/lint/unreachable_pattern_branch.rb +113 -0
- data/lib/rubocop/cop/lint/unused_method_argument.rb +10 -0
- data/lib/rubocop/cop/lint/unused_private_method.rb +234 -0
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -0
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +31 -6
- data/lib/rubocop/cop/lint/useless_assignment.rb +63 -27
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +107 -0
- data/lib/rubocop/cop/lint/useless_default_value_argument.rb +92 -0
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +11 -10
- data/lib/rubocop/cop/lint/useless_or.rb +111 -0
- data/lib/rubocop/cop/lint/useless_rescue.rb +2 -3
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +13 -7
- data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -1
- data/lib/rubocop/cop/lint/useless_times.rb +22 -1
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +201 -0
- data/lib/rubocop/cop/lint/void.rb +68 -22
- data/lib/rubocop/cop/lint.rb +179 -0
- data/lib/rubocop/cop/message_annotator.rb +7 -3
- data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
- data/lib/rubocop/cop/metrics/block_length.rb +2 -1
- data/lib/rubocop/cop/metrics/block_nesting.rb +23 -0
- data/lib/rubocop/cop/metrics/class_length.rb +4 -2
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +1 -1
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +0 -4
- data/lib/rubocop/cop/metrics/method_length.rb +3 -2
- data/lib/rubocop/cop/metrics/module_length.rb +4 -2
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +37 -7
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4 -3
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +2 -2
- data/lib/rubocop/cop/metrics/utils/iterating_block.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/metrics.rb +31 -0
- data/lib/rubocop/cop/migration/department_name.rb +11 -5
- data/lib/rubocop/cop/migration.rb +13 -0
- data/lib/rubocop/cop/mixin/alignment.rb +7 -3
- data/lib/rubocop/cop/mixin/allowed_methods.rb +5 -5
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +9 -5
- data/lib/rubocop/cop/mixin/annotation_comment.rb +1 -1
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +44 -23
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +10 -8
- data/lib/rubocop/cop/mixin/code_length.rb +10 -2
- data/lib/rubocop/cop/mixin/comments_help.rb +2 -3
- data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -2
- data/lib/rubocop/cop/mixin/configurable_max.rb +6 -5
- data/lib/rubocop/cop/mixin/def_node.rb +1 -1
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +13 -2
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -7
- data/lib/rubocop/cop/mixin/endless_method_body_help.rb +69 -0
- data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +13 -5
- data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
- data/lib/rubocop/cop/mixin/forbidden_pattern.rb +20 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -2
- data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +59 -17
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +52 -25
- data/lib/rubocop/cop/mixin/hash_subset.rb +28 -6
- data/lib/rubocop/cop/mixin/hash_transform_method/autocorrection.rb +63 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +32 -78
- data/lib/rubocop/cop/mixin/indexed_method_arity.rb +94 -0
- data/lib/rubocop/cop/mixin/line_length_help.rb +52 -11
- data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
- data/lib/rubocop/cop/mixin/min_branches_count.rb +3 -1
- data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +11 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +3 -1
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +10 -1
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +2 -2
- data/lib/rubocop/cop/mixin/pattern_matching_help.rb +35 -0
- data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +79 -8
- data/lib/rubocop/cop/mixin/project_index_help.rb +203 -0
- data/lib/rubocop/cop/mixin/range_help.rb +16 -5
- data/lib/rubocop/cop/mixin/reparsed_equivalence.rb +181 -0
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +5 -4
- data/lib/rubocop/cop/mixin/statement_modifier.rb +66 -10
- data/lib/rubocop/cop/mixin/string_help.rb +1 -1
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +1 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +23 -6
- data/lib/rubocop/cop/mixin.rb +93 -0
- data/lib/rubocop/cop/naming/accessor_method_name.rb +8 -0
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +17 -1
- data/lib/rubocop/cop/naming/block_forwarding.rb +7 -4
- data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/file_name.rb +6 -5
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +9 -2
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +5 -3
- data/lib/rubocop/cop/naming/inclusive_language.rb +8 -2
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +13 -6
- data/lib/rubocop/cop/naming/method_name.rb +190 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +330 -0
- data/lib/rubocop/cop/naming/{predicate_name.rb → predicate_prefix.rb} +65 -8
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +11 -6
- data/lib/rubocop/cop/naming/variable_name.rb +51 -6
- data/lib/rubocop/cop/naming/variable_number.rb +3 -1
- data/lib/rubocop/cop/naming.rb +31 -0
- data/lib/rubocop/cop/offense.rb +108 -9
- data/lib/rubocop/cop/registry.rb +234 -65
- data/lib/rubocop/cop/security/eval.rb +17 -3
- data/lib/rubocop/cop/security/io_methods.rb +2 -2
- data/lib/rubocop/cop/security/json_load.rb +45 -11
- data/lib/rubocop/cop/security/marshal_load.rb +1 -1
- data/lib/rubocop/cop/security/open.rb +1 -0
- data/lib/rubocop/cop/security.rb +19 -0
- data/lib/rubocop/cop/severity.rb +12 -0
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +54 -13
- data/lib/rubocop/cop/style/accessor_grouping.rb +47 -10
- data/lib/rubocop/cop/style/alias.rb +33 -8
- data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +4 -3
- data/lib/rubocop/cop/style/and_or.rb +6 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +52 -37
- data/lib/rubocop/cop/style/array_first_last.rb +13 -3
- data/lib/rubocop/cop/style/array_intersect.rb +136 -38
- data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +50 -0
- data/lib/rubocop/cop/style/array_join.rb +4 -2
- data/lib/rubocop/cop/style/ascii_comments.rb +6 -3
- data/lib/rubocop/cop/style/attr.rb +8 -6
- data/lib/rubocop/cop/style/bare_percent_literals.rb +4 -3
- data/lib/rubocop/cop/style/begin_block.rb +3 -1
- data/lib/rubocop/cop/style/bitwise_predicate.rb +13 -5
- data/lib/rubocop/cop/style/block_delimiters.rb +71 -40
- data/lib/rubocop/cop/style/case_equality.rb +29 -15
- data/lib/rubocop/cop/style/case_like_if.rb +12 -11
- data/lib/rubocop/cop/style/character_literal.rb +2 -2
- data/lib/rubocop/cop/style/class_and_module_children.rb +179 -27
- data/lib/rubocop/cop/style/class_equality_comparison.rb +22 -14
- data/lib/rubocop/cop/style/class_methods_definitions.rb +19 -5
- data/lib/rubocop/cop/style/collection_compact.rb +37 -17
- data/lib/rubocop/cop/style/collection_methods.rb +1 -0
- data/lib/rubocop/cop/style/collection_querying.rb +167 -0
- data/lib/rubocop/cop/style/colon_method_call.rb +16 -7
- data/lib/rubocop/cop/style/combinable_loops.rb +88 -9
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +12 -5
- data/lib/rubocop/cop/style/comparable_between.rb +78 -0
- data/lib/rubocop/cop/style/comparable_clamp.rb +12 -1
- data/lib/rubocop/cop/style/concat_array_literals.rb +53 -9
- data/lib/rubocop/cop/style/conditional_assignment.rb +58 -24
- data/lib/rubocop/cop/style/constant_visibility.rb +23 -12
- data/lib/rubocop/cop/style/copyright.rb +27 -12
- data/lib/rubocop/cop/style/data_inheritance.rb +25 -0
- data/lib/rubocop/cop/style/date_time.rb +4 -4
- data/lib/rubocop/cop/style/def_with_parentheses.rb +22 -5
- data/lib/rubocop/cop/style/dig_chain.rb +6 -1
- data/lib/rubocop/cop/style/dir_empty.rb +4 -0
- data/lib/rubocop/cop/style/directive_scope.rb +304 -0
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +184 -20
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +6 -1
- data/lib/rubocop/cop/style/documentation.rb +53 -6
- data/lib/rubocop/cop/style/documentation_method.rb +8 -12
- data/lib/rubocop/cop/style/double_negation.rb +14 -3
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
- data/lib/rubocop/cop/style/each_with_object.rb +4 -3
- data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_case_condition.rb +13 -4
- data/lib/rubocop/cop/style/empty_class_definition.rb +126 -0
- data/lib/rubocop/cop/style/empty_heredoc.rb +4 -0
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_literal.rb +12 -3
- data/lib/rubocop/cop/style/empty_method.rb +15 -9
- data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +110 -0
- data/lib/rubocop/cop/style/encoding.rb +7 -1
- data/lib/rubocop/cop/style/end_block.rb +3 -1
- data/lib/rubocop/cop/style/endless_method.rb +252 -19
- data/lib/rubocop/cop/style/env_home.rb +4 -0
- data/lib/rubocop/cop/style/eval_with_location.rb +3 -3
- data/lib/rubocop/cop/style/even_odd.rb +11 -1
- data/lib/rubocop/cop/style/exact_regexp_match.rb +52 -8
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +62 -9
- data/lib/rubocop/cop/style/exponential_notation.rb +5 -4
- data/lib/rubocop/cop/style/fetch_env_var.rb +33 -7
- data/lib/rubocop/cop/style/file_null.rb +6 -4
- data/lib/rubocop/cop/style/file_open.rb +84 -0
- data/lib/rubocop/cop/style/file_write.rb +21 -16
- data/lib/rubocop/cop/style/float_division.rb +43 -15
- data/lib/rubocop/cop/style/for.rb +48 -1
- data/lib/rubocop/cop/style/format_string.rb +44 -9
- data/lib/rubocop/cop/style/format_string_token.rb +86 -16
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +5 -3
- data/lib/rubocop/cop/style/global_std_stream.rb +3 -0
- data/lib/rubocop/cop/style/global_vars.rb +5 -2
- data/lib/rubocop/cop/style/guard_clause.rb +41 -24
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +27 -9
- data/lib/rubocop/cop/style/hash_conversion.rb +52 -16
- data/lib/rubocop/cop/style/hash_each_methods.rb +4 -4
- data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
- data/lib/rubocop/cop/style/hash_lookup_method.rb +128 -0
- data/lib/rubocop/cop/style/hash_slice.rb +16 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +23 -6
- data/lib/rubocop/cop/style/hash_transform_keys.rb +19 -9
- data/lib/rubocop/cop/style/hash_transform_values.rb +19 -9
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +39 -11
- data/lib/rubocop/cop/style/if_inside_else.rb +46 -21
- data/lib/rubocop/cop/style/if_unless_modifier.rb +90 -66
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +19 -19
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +5 -2
- data/lib/rubocop/cop/style/if_with_semicolon.rb +61 -8
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inline_comment.rb +5 -2
- data/lib/rubocop/cop/style/inverse_methods.rb +34 -8
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +27 -7
- data/lib/rubocop/cop/style/ip_addresses.rb +3 -4
- data/lib/rubocop/cop/style/it_assignment.rb +69 -12
- data/lib/rubocop/cop/style/it_block_parameter.rb +150 -0
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +4 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +23 -11
- data/lib/rubocop/cop/style/lambda.rb +30 -1
- data/lib/rubocop/cop/style/lambda_call.rb +31 -10
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/magic_comment_format.rb +4 -4
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +11 -0
- data/lib/rubocop/cop/style/map_into_array.rb +6 -4
- data/lib/rubocop/cop/style/map_join.rb +123 -0
- data/lib/rubocop/cop/style/map_to_hash.rb +13 -5
- data/lib/rubocop/cop/style/map_to_set.rb +1 -3
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +75 -24
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +15 -2
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +58 -6
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +36 -8
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -1
- data/lib/rubocop/cop/style/method_def_parentheses.rb +36 -8
- data/lib/rubocop/cop/style/min_max_comparison.rb +17 -6
- data/lib/rubocop/cop/style/missing_else.rb +7 -1
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +40 -7
- data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
- data/lib/rubocop/cop/style/module_function.rb +4 -2
- data/lib/rubocop/cop/style/module_member_existence_check.rb +110 -0
- data/lib/rubocop/cop/style/multiline_block_chain.rb +2 -1
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +47 -5
- data/lib/rubocop/cop/style/multiline_if_then.rb +10 -4
- data/lib/rubocop/cop/style/multiline_in_pattern_then.rb +7 -0
- data/lib/rubocop/cop/style/multiline_memoization.rb +7 -1
- data/lib/rubocop/cop/style/multiline_method_signature.rb +15 -22
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +7 -3
- data/lib/rubocop/cop/style/multiline_when_then.rb +7 -0
- data/lib/rubocop/cop/style/multiple_comparison.rb +33 -22
- data/lib/rubocop/cop/style/mutable_constant.rb +139 -13
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +3 -3
- data/lib/rubocop/cop/style/negative_array_index.rb +228 -0
- data/lib/rubocop/cop/style/nested_modifier.rb +36 -12
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +26 -8
- data/lib/rubocop/cop/style/next.rb +68 -10
- data/lib/rubocop/cop/style/nil_comparison.rb +53 -13
- data/lib/rubocop/cop/style/nil_lambda.rb +9 -1
- data/lib/rubocop/cop/style/non_nil_check.rb +21 -11
- data/lib/rubocop/cop/style/not.rb +12 -3
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +11 -1
- data/lib/rubocop/cop/style/numeric_literals.rb +3 -2
- data/lib/rubocop/cop/style/numeric_predicate.rb +22 -6
- data/lib/rubocop/cop/style/object_then.rb +1 -0
- data/lib/rubocop/cop/style/one_class_per_file.rb +115 -0
- data/lib/rubocop/cop/style/one_line_conditional.rb +35 -15
- data/lib/rubocop/cop/style/open_struct_use.rb +1 -1
- data/lib/rubocop/cop/style/operator_method_call.rb +10 -2
- data/lib/rubocop/cop/style/option_hash.rb +1 -1
- data/lib/rubocop/cop/style/optional_arguments.rb +1 -0
- data/lib/rubocop/cop/style/parallel_assignment.rb +58 -27
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +6 -1
- data/lib/rubocop/cop/style/partition_instead_of_double_select.rb +270 -0
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +18 -3
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/perl_backrefs.rb +5 -3
- data/lib/rubocop/cop/style/predicate_with_kind.rb +84 -0
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +12 -12
- data/lib/rubocop/cop/style/proc.rb +4 -2
- data/lib/rubocop/cop/style/raise_args.rb +9 -9
- data/lib/rubocop/cop/style/reduce_to_hash.rb +216 -0
- data/lib/rubocop/cop/style/redundant_argument.rb +2 -0
- data/lib/rubocop/cop/style/redundant_array_constructor.rb +2 -2
- data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
- data/lib/rubocop/cop/style/redundant_assignment.rb +12 -2
- data/lib/rubocop/cop/style/redundant_begin.rb +58 -6
- data/lib/rubocop/cop/style/redundant_condition.rb +93 -18
- data/lib/rubocop/cop/style/redundant_constant_base.rb +42 -6
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +26 -4
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +17 -3
- data/lib/rubocop/cop/style/redundant_each.rb +4 -5
- data/lib/rubocop/cop/style/redundant_exception.rb +22 -4
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +11 -11
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +9 -0
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +1 -1
- data/lib/rubocop/cop/style/redundant_format.rb +319 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +12 -3
- data/lib/rubocop/cop/style/redundant_heredoc_delimiter_quotes.rb +6 -1
- data/lib/rubocop/cop/style/redundant_interpolation.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +26 -10
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +83 -119
- data/lib/rubocop/cop/style/redundant_min_max_by.rb +93 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +176 -83
- data/lib/rubocop/cop/style/redundant_percent_q.rb +5 -3
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +15 -0
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -5
- data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +27 -7
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +16 -0
- data/lib/rubocop/cop/style/redundant_return.rb +4 -3
- data/lib/rubocop/cop/style/redundant_self.rb +20 -7
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +2 -3
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +0 -5
- data/lib/rubocop/cop/style/redundant_sort.rb +7 -7
- data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
- data/lib/rubocop/cop/style/redundant_string_escape.rb +1 -2
- data/lib/rubocop/cop/style/redundant_struct_keyword_init.rb +133 -0
- data/lib/rubocop/cop/style/regexp_literal.rb +107 -29
- data/lib/rubocop/cop/style/require_order.rb +9 -0
- data/lib/rubocop/cop/style/rescue_modifier.rb +10 -12
- data/lib/rubocop/cop/style/return_nil.rb +19 -4
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +11 -1
- data/lib/rubocop/cop/style/reverse_find.rb +51 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +76 -20
- data/lib/rubocop/cop/style/sample.rb +19 -13
- data/lib/rubocop/cop/style/select_by_kind.rb +158 -0
- data/lib/rubocop/cop/style/select_by_range.rb +197 -0
- data/lib/rubocop/cop/style/select_by_regexp.rb +54 -22
- data/lib/rubocop/cop/style/self_assignment.rb +13 -16
- data/lib/rubocop/cop/style/semicolon.rb +56 -14
- data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +22 -8
- data/lib/rubocop/cop/style/single_line_methods.rb +28 -11
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +96 -104
- data/lib/rubocop/cop/style/special_global_vars.rb +7 -2
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +32 -6
- data/lib/rubocop/cop/style/static_class.rb +21 -0
- data/lib/rubocop/cop/style/string_concatenation.rb +38 -16
- data/lib/rubocop/cop/style/string_hash_keys.rb +1 -0
- data/lib/rubocop/cop/style/struct_inheritance.rb +38 -2
- data/lib/rubocop/cop/style/super_arguments.rb +7 -6
- data/lib/rubocop/cop/style/symbol_array.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +34 -14
- data/lib/rubocop/cop/style/tally_method.rb +181 -0
- data/lib/rubocop/cop/style/ternary_parentheses.rb +34 -1
- data/lib/rubocop/cop/style/time_now.rb +41 -0
- data/lib/rubocop/cop/style/top_level_method_definition.rb +3 -2
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +52 -1
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +2 -2
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -0
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +35 -32
- data/lib/rubocop/cop/style/trivial_accessors.rb +2 -2
- data/lib/rubocop/cop/style/unless_else.rb +10 -9
- data/lib/rubocop/cop/style/unless_logical_operators.rb +3 -3
- data/lib/rubocop/cop/style/while_until_do.rb +7 -0
- data/lib/rubocop/cop/style/while_until_modifier.rb +16 -1
- data/lib/rubocop/cop/style/word_array.rb +1 -0
- data/lib/rubocop/cop/style/yoda_condition.rb +26 -12
- data/lib/rubocop/cop/style/yoda_expression.rb +11 -2
- data/lib/rubocop/cop/style/zero_length_predicate.rb +6 -3
- data/lib/rubocop/cop/style.rb +311 -0
- data/lib/rubocop/cop/team.rb +172 -49
- data/lib/rubocop/cop/util.rb +7 -10
- data/lib/rubocop/cop/utils/format_string.rb +20 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +8 -4
- data/lib/rubocop/cop/variable_force/branch.rb +30 -6
- data/lib/rubocop/cop/variable_force/scope.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +42 -11
- data/lib/rubocop/cop/variable_force.rb +26 -9
- data/lib/rubocop/cops_documentation_generator.rb +49 -15
- data/lib/rubocop/directive_comment.rb +147 -5
- data/lib/rubocop/ext/regexp_node.rb +0 -1
- data/lib/rubocop/feature_loader.rb +0 -6
- data/lib/rubocop/file_patterns.rb +9 -1
- data/lib/rubocop/formatter/base_formatter.rb +22 -0
- data/lib/rubocop/formatter/clang_style_formatter.rb +5 -2
- data/lib/rubocop/formatter/disabled_config_formatter.rb +57 -14
- data/lib/rubocop/formatter/emacs_style_formatter.rb +3 -1
- data/lib/rubocop/formatter/formatter_set.rb +7 -2
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/github_actions_formatter.rb +6 -5
- data/lib/rubocop/formatter/html_formatter.rb +3 -5
- data/lib/rubocop/formatter/json_formatter.rb +82 -7
- data/lib/rubocop/formatter/junit_formatter.rb +27 -10
- data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +5 -4
- data/lib/rubocop/formatter/pacman_formatter.rb +5 -2
- data/lib/rubocop/formatter/sarif_formatter.rb +186 -0
- data/lib/rubocop/formatter/simple_text_formatter.rb +4 -5
- data/lib/rubocop/formatter/tap_formatter.rb +8 -3
- data/lib/rubocop/formatter/worst_offenders_formatter.rb +5 -4
- data/lib/rubocop/formatter.rb +23 -21
- data/lib/rubocop/lockfile.rb +18 -0
- data/lib/rubocop/lsp/diagnostic.rb +22 -41
- data/lib/rubocop/lsp/disable_comment_edits.rb +135 -0
- data/lib/rubocop/lsp/routes.rb +136 -33
- data/lib/rubocop/lsp/runtime.rb +66 -15
- data/lib/rubocop/lsp/server.rb +4 -2
- data/lib/rubocop/lsp/stdin_runner.rb +38 -19
- data/lib/rubocop/lsp.rb +5 -2
- data/lib/rubocop/magic_comment.rb +55 -0
- data/lib/rubocop/mcp/autocorrection_request.rb +52 -0
- data/lib/rubocop/mcp/explain_tool.rb +68 -0
- data/lib/rubocop/mcp/scope.rb +65 -0
- data/lib/rubocop/mcp/server.rb +307 -0
- data/lib/rubocop/mcp/source_files.rb +35 -0
- data/lib/rubocop/offense_limit.rb +30 -0
- data/lib/rubocop/options.rb +166 -23
- data/lib/rubocop/path_util.rb +20 -5
- data/lib/rubocop/pending_cops_reporter.rb +51 -0
- data/lib/rubocop/plugin/configuration_integrator.rb +153 -0
- data/lib/rubocop/plugin/load_error.rb +26 -0
- data/lib/rubocop/plugin/loader.rb +100 -0
- data/lib/rubocop/plugin/not_supported_error.rb +29 -0
- data/lib/rubocop/plugin.rb +46 -0
- data/lib/rubocop/project_index_loader.rb +82 -0
- data/lib/rubocop/rake_task.rb +6 -4
- data/lib/rubocop/remote_config.rb +18 -13
- data/lib/rubocop/result_cache.rb +110 -65
- data/lib/rubocop/rspec/cop_helper.rb +21 -1
- data/lib/rubocop/rspec/expect_offense.rb +11 -7
- data/lib/rubocop/rspec/shared_contexts.rb +85 -3
- data/lib/rubocop/rspec/support.rb +4 -0
- data/lib/rubocop/runner.rb +368 -106
- data/lib/rubocop/server/cache.rb +67 -48
- data/lib/rubocop/server/cli.rb +2 -4
- data/lib/rubocop/server/client_command/base.rb +10 -0
- data/lib/rubocop/server/client_command/exec.rb +2 -1
- data/lib/rubocop/server/client_command/start.rb +11 -1
- data/lib/rubocop/server/core.rb +8 -0
- data/lib/rubocop/server.rb +14 -0
- data/lib/rubocop/target_finder.rb +25 -11
- data/lib/rubocop/target_ruby.rb +31 -14
- data/lib/rubocop/todo_audit.rb +111 -0
- data/lib/rubocop/unified_diff.rb +257 -0
- data/lib/rubocop/util.rb +69 -0
- data/lib/rubocop/version.rb +48 -10
- data/lib/rubocop.rb +35 -682
- data/lib/ruby_lsp/rubocop/addon.rb +28 -17
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
- metadata +129 -21
- data/lib/rubocop/cop/style/double_cop_disable_directive.rb +0 -46
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/ruby_lsp/rubocop/wraps_built_in_lsp_runtime.rb +0 -50
data/config/internal_affairs.yml
CHANGED
|
@@ -6,6 +6,26 @@ InternalAffairs/CopDescription:
|
|
|
6
6
|
Include:
|
|
7
7
|
- 'lib/rubocop/cop/**/*.rb'
|
|
8
8
|
|
|
9
|
+
InternalAffairs/ExampleHeredocDelimiter:
|
|
10
|
+
Include:
|
|
11
|
+
- 'spec/rubocop/cop/**/*.rb'
|
|
12
|
+
|
|
13
|
+
InternalAffairs/ExampleDescription:
|
|
14
|
+
Include:
|
|
15
|
+
- 'spec/rubocop/cop/**/*.rb'
|
|
16
|
+
|
|
17
|
+
InternalAffairs/NodeTypeGroup:
|
|
18
|
+
Include:
|
|
19
|
+
- 'lib/rubocop/cop/**/*.rb'
|
|
20
|
+
|
|
21
|
+
InternalAffairs/OnSendWithoutOnCSend:
|
|
22
|
+
Include:
|
|
23
|
+
- 'lib/rubocop/cop/**/*.rb'
|
|
24
|
+
|
|
25
|
+
InternalAffairs/UndefinedConfig:
|
|
26
|
+
Include:
|
|
27
|
+
- 'lib/rubocop/cop/**/*.rb'
|
|
28
|
+
|
|
9
29
|
InternalAffairs/UselessMessageAssertion:
|
|
10
30
|
Include:
|
|
11
31
|
- '**/*_spec.rb'
|
data/config/obsoletion.yml
CHANGED
|
@@ -31,6 +31,9 @@ renamed:
|
|
|
31
31
|
Lint/UnneededRequireStatement: Lint/RedundantRequireStatement
|
|
32
32
|
Lint/UnneededSplatExpansion: Lint/RedundantSplatExpansion
|
|
33
33
|
Metrics/LineLength: Layout/LineLength
|
|
34
|
+
Naming/PredicateName:
|
|
35
|
+
new_name: Naming/PredicatePrefix
|
|
36
|
+
severity: warning
|
|
34
37
|
Naming/UncommunicativeBlockParamName: Naming/BlockParameterName
|
|
35
38
|
Naming/UncommunicativeMethodParamName: Naming/MethodParameterName
|
|
36
39
|
Style/AccessorMethodName: Naming/AccessorMethodName
|
|
@@ -43,7 +46,9 @@ renamed:
|
|
|
43
46
|
Style/MethodCallParentheses: Style/MethodCallWithoutArgsParentheses
|
|
44
47
|
Style/MethodName: Naming/MethodName
|
|
45
48
|
Style/OpMethod: Naming/BinaryOperatorParameterName
|
|
46
|
-
Style/PredicateName:
|
|
49
|
+
Style/PredicateName:
|
|
50
|
+
new_name: Naming/PredicatePrefix
|
|
51
|
+
severity: warning
|
|
47
52
|
Style/SingleSpaceBeforeFirstArg: Layout/SpaceBeforeFirstArg
|
|
48
53
|
Style/UnneededCapitalW: Style/RedundantCapitalW
|
|
49
54
|
Style/UnneededCondition: Style/RedundantCondition
|
|
@@ -75,6 +80,11 @@ removed:
|
|
|
75
80
|
`Lint/BinaryOperatorWithIdenticalOperands`. Please use
|
|
76
81
|
`Lint/BinaryOperatorWithIdenticalOperands` instead
|
|
77
82
|
Style/BracesAroundHashParameters: true
|
|
83
|
+
Style/DoubleCopDisableDirective:
|
|
84
|
+
severity: warning
|
|
85
|
+
reason: >
|
|
86
|
+
it has been superseded by `Lint/CopDirectiveSyntax`. Please use
|
|
87
|
+
`Lint/CopDirectiveSyntax` instead
|
|
78
88
|
Style/MethodMissingSuper:
|
|
79
89
|
reason: >
|
|
80
90
|
it has been superseded by `Lint/MissingSuper`. Please use
|
|
@@ -140,6 +150,14 @@ changed_parameters:
|
|
|
140
150
|
- cops: Layout/CaseIndentation
|
|
141
151
|
parameters: IndentWhenRelativeTo
|
|
142
152
|
alternative: EnforcedStyle
|
|
153
|
+
- cops: Layout/LineLength
|
|
154
|
+
parameters: IgnoreCopDirectives
|
|
155
|
+
alternative: AllowCopDirectives
|
|
156
|
+
severity: warning
|
|
157
|
+
- cops: Style/DisableCopsWithinSourceCodeDirective
|
|
158
|
+
parameters: AllowTrailingComment
|
|
159
|
+
alternative: AllowWithReason
|
|
160
|
+
severity: warning
|
|
143
161
|
- cops:
|
|
144
162
|
- Lint/BlockAlignment
|
|
145
163
|
- Layout/BlockAlignment
|
|
@@ -162,7 +180,7 @@ changed_parameters:
|
|
|
162
180
|
reason: "`SafeMode` has been removed. Use `SafeAutoCorrect` instead."
|
|
163
181
|
- cops: Bundler/GemComment
|
|
164
182
|
parameters: Whitelist
|
|
165
|
-
alternative:
|
|
183
|
+
alternative: AllowedGems
|
|
166
184
|
- cops:
|
|
167
185
|
- Lint/SafeNavigationChain
|
|
168
186
|
- Lint/SafeNavigationConsistency
|
|
@@ -177,10 +195,10 @@ changed_parameters:
|
|
|
177
195
|
- cops: Naming/HeredocDelimiterNaming
|
|
178
196
|
parameters: Blacklist
|
|
179
197
|
alternative: ForbiddenDelimiters
|
|
180
|
-
- cops: Naming/
|
|
198
|
+
- cops: Naming/PredicatePrefix
|
|
181
199
|
parameters: NamePrefixBlacklist
|
|
182
200
|
alternative: ForbiddenPrefixes
|
|
183
|
-
- cops: Naming/
|
|
201
|
+
- cops: Naming/PredicatePrefix
|
|
184
202
|
parameters: NameWhitelist
|
|
185
203
|
alternative: AllowedMethods
|
|
186
204
|
- cops:
|
|
@@ -229,6 +247,26 @@ changed_parameters:
|
|
|
229
247
|
reason: "`AllowOnlyRestArgument` has no effect with TargetRubyVersion >= 3.2."
|
|
230
248
|
severity: warning
|
|
231
249
|
minimum_ruby_version: 3.2
|
|
250
|
+
- cops: Bundler/GemComment
|
|
251
|
+
parameters: IgnoredGems
|
|
252
|
+
alternative: AllowedGems
|
|
253
|
+
severity: warning
|
|
254
|
+
- cops: Lint/NumberConversion
|
|
255
|
+
parameters: IgnoredClasses
|
|
256
|
+
alternative: AllowedClasses
|
|
257
|
+
severity: warning
|
|
258
|
+
- cops: Lint/MissingCopEnableDirective
|
|
259
|
+
parameters: MaximumRangeSize
|
|
260
|
+
alternative: MaxRangeSize
|
|
261
|
+
severity: warning
|
|
262
|
+
- cops: Metrics/CollectionLiteralLength
|
|
263
|
+
parameters: LengthThreshold
|
|
264
|
+
alternative: Max
|
|
265
|
+
severity: warning
|
|
266
|
+
- cops: Style/FetchEnvVar
|
|
267
|
+
parameters: AllowedVars
|
|
268
|
+
alternative: AllowedVariables
|
|
269
|
+
severity: warning
|
|
232
270
|
|
|
233
271
|
# Enforced styles that have been removed or replaced
|
|
234
272
|
changed_enforced_styles:
|
|
@@ -236,3 +274,8 @@ changed_enforced_styles:
|
|
|
236
274
|
parameters: EnforcedStyle
|
|
237
275
|
value: rails
|
|
238
276
|
alternative: indented_internal_methods
|
|
277
|
+
- cops: Style/EmptyClassDefinition
|
|
278
|
+
parameters: EnforcedStyle
|
|
279
|
+
value: class_definition
|
|
280
|
+
alternative: class_keyword
|
|
281
|
+
severity: warning
|
data/exe/rubocop
CHANGED
|
@@ -8,17 +8,10 @@ server_cli = RuboCop::Server::CLI.new
|
|
|
8
8
|
exit_status = server_cli.run
|
|
9
9
|
exit exit_status if server_cli.exit?
|
|
10
10
|
|
|
11
|
-
if RuboCop::Server.
|
|
11
|
+
if RuboCop::Server.forward_to_server?
|
|
12
12
|
exit_status = RuboCop::Server::ClientCommand::Exec.new.run
|
|
13
13
|
else
|
|
14
14
|
require 'rubocop'
|
|
15
|
-
|
|
16
|
-
cli = RuboCop::CLI.new
|
|
17
|
-
|
|
18
|
-
time_start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
19
|
-
exit_status = cli.run
|
|
20
|
-
elapsed_time = Process.clock_gettime(Process::CLOCK_MONOTONIC) - time_start
|
|
21
|
-
|
|
22
|
-
puts "Finished in #{elapsed_time} seconds" if cli.options[:debug] || cli.options[:display_time]
|
|
15
|
+
exit_status = RuboCop::CLI.new.run
|
|
23
16
|
end
|
|
24
17
|
exit exit_status
|
data/lib/rubocop/cache_config.rb
CHANGED
|
@@ -25,5 +25,34 @@ module RuboCop
|
|
|
25
25
|
|
|
26
26
|
File.join(root, 'rubocop_cache')
|
|
27
27
|
end
|
|
28
|
+
|
|
29
|
+
# Lightweight cache root computation that reads CacheRootDirectory from
|
|
30
|
+
# the toplevel config file and environment variables without going through
|
|
31
|
+
# the full ConfigStore/ConfigLoader. This method can be used, for example,
|
|
32
|
+
# before loading configuration files. Please note that this method doesn't
|
|
33
|
+
# take into account any `inherit_from` dependencies.
|
|
34
|
+
def self.root_dir_from_toplevel_config(cache_root_override = nil)
|
|
35
|
+
root_dir do
|
|
36
|
+
next cache_root_override if cache_root_override
|
|
37
|
+
|
|
38
|
+
config_path = ConfigFinder.find_config_path(PathUtil.pwd)
|
|
39
|
+
file_contents = File.read(config_path)
|
|
40
|
+
|
|
41
|
+
# Returns early if `CacheRootDirectory` is not used before requiring `erb` or `yaml`.
|
|
42
|
+
next unless file_contents.include?('CacheRootDirectory')
|
|
43
|
+
|
|
44
|
+
require 'erb'
|
|
45
|
+
require 'yaml'
|
|
46
|
+
yaml_code = ERB.new(file_contents).result
|
|
47
|
+
config_yaml = YAML.safe_load(yaml_code, permitted_classes: [Regexp, Symbol], aliases: true)
|
|
48
|
+
|
|
49
|
+
# For compatibility with Ruby 3.0 or lower.
|
|
50
|
+
if Gem::Version.new(Psych::VERSION) < Gem::Version.new('4.0.0')
|
|
51
|
+
config_yaml == false ? nil : config_yaml
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
config_yaml&.dig('AllCops', 'CacheRootDirectory')
|
|
55
|
+
end
|
|
56
|
+
end
|
|
28
57
|
end
|
|
29
58
|
end
|
data/lib/rubocop/cached_data.rb
CHANGED
|
@@ -22,7 +22,7 @@ module RuboCop
|
|
|
22
22
|
|
|
23
23
|
def serialize_offense(offense)
|
|
24
24
|
status = :uncorrected if %i[corrected corrected_with_todo].include?(offense.status)
|
|
25
|
-
{
|
|
25
|
+
hash = {
|
|
26
26
|
# Calling #to_s here ensures that the serialization works when using
|
|
27
27
|
# other json serializers such as Oj. Some of these gems do not call
|
|
28
28
|
# #to_s implicitly.
|
|
@@ -35,19 +35,64 @@ module RuboCop
|
|
|
35
35
|
cop_name: offense.cop_name,
|
|
36
36
|
status: status || offense.status
|
|
37
37
|
}
|
|
38
|
+
add_justification(hash, offense)
|
|
39
|
+
add_corrections(hash, offense)
|
|
40
|
+
hash
|
|
38
41
|
end
|
|
39
42
|
|
|
40
43
|
def message(offense)
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
+
encode_to_utf8(offense.message)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def encode_to_utf8(value)
|
|
48
|
+
string = value.to_s
|
|
49
|
+
|
|
50
|
+
if string.encoding == ::Encoding::BINARY
|
|
51
|
+
string.dup.force_encoding(::Encoding::UTF_8).scrub
|
|
52
|
+
else
|
|
53
|
+
string.encode(::Encoding::UTF_8, invalid: :replace, undef: :replace)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Only offenses suppressed by a directive can carry one, so keep the key out of the
|
|
58
|
+
# common case rather than writing a null for every cached offense.
|
|
59
|
+
def add_justification(hash, offense)
|
|
60
|
+
return unless offense.justification
|
|
61
|
+
|
|
62
|
+
hash[:justification] = encode_to_utf8(offense.justification)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# A corrector cannot be serialized, so the edits it would make are cached
|
|
66
|
+
# separately; without this a cache hit would report no corrections.
|
|
67
|
+
def add_corrections(hash, offense)
|
|
68
|
+
return if offense.corrections.empty?
|
|
69
|
+
|
|
70
|
+
hash[:corrections] = offense.corrections.map do |correction|
|
|
71
|
+
{ begin_pos: correction.begin_pos,
|
|
72
|
+
end_pos: correction.end_pos,
|
|
73
|
+
replacement: encode_to_utf8(correction.replacement) }
|
|
74
|
+
end
|
|
75
|
+
hash[:correction_safe] = offense.correction_safe
|
|
44
76
|
end
|
|
45
77
|
|
|
46
78
|
# Restore an offense object loaded from a JSON file.
|
|
47
79
|
def deserialize_offenses(offenses)
|
|
48
80
|
offenses.map! do |o|
|
|
49
81
|
location = location_from_source_buffer(o)
|
|
50
|
-
Cop::Offense.new(o['severity'], location, o['message'], o['cop_name'], o['status'].to_sym
|
|
82
|
+
Cop::Offense.new(o['severity'], location, o['message'], o['cop_name'], o['status'].to_sym,
|
|
83
|
+
justification: o['justification'],
|
|
84
|
+
corrections: corrections_from_cache(o),
|
|
85
|
+
correction_safe: o.fetch('correction_safe', true))
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def corrections_from_cache(offense)
|
|
90
|
+
cached = offense['corrections']
|
|
91
|
+
return [] unless cached
|
|
92
|
+
|
|
93
|
+
cached.map do |correction|
|
|
94
|
+
Cop::Offense::Correction.new(correction['begin_pos'], correction['end_pos'],
|
|
95
|
+
correction['replacement']).freeze
|
|
51
96
|
end
|
|
52
97
|
end
|
|
53
98
|
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'open3'
|
|
4
|
+
|
|
5
|
+
module RuboCop
|
|
6
|
+
# Lists the files that differ from a git revision, for `--changed`.
|
|
7
|
+
#
|
|
8
|
+
# Shelling out to `git` keeps RuboCop free of a version control dependency,
|
|
9
|
+
# and means the answer is exactly what git would give on the command line.
|
|
10
|
+
#
|
|
11
|
+
# @api private
|
|
12
|
+
class ChangedFiles
|
|
13
|
+
DEFAULT_REVISION = 'HEAD'
|
|
14
|
+
FILESYSTEM_ENCODING = Encoding.find('filesystem')
|
|
15
|
+
|
|
16
|
+
# Whether git can resolve `name` to a commit in the current repository.
|
|
17
|
+
def self.revision?(name)
|
|
18
|
+
_stdout, _stderr, status =
|
|
19
|
+
Open3.capture3('git', 'rev-parse', '--verify', '--quiet', "#{name}^{commit}")
|
|
20
|
+
status.success?
|
|
21
|
+
rescue Errno::ENOENT
|
|
22
|
+
false
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def initialize(revision = nil)
|
|
26
|
+
@revision = revision || DEFAULT_REVISION
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Files that were added or modified since the revision, as absolute paths.
|
|
30
|
+
# Deleted files are left out - there is nothing left to inspect - and
|
|
31
|
+
# untracked files are included, since a file that is new to the working
|
|
32
|
+
# tree has changed as surely as one git already knows about.
|
|
33
|
+
#
|
|
34
|
+
# @return [Set<String>]
|
|
35
|
+
def paths
|
|
36
|
+
root = repository_root
|
|
37
|
+
|
|
38
|
+
(modified_paths + untracked_paths).to_set { |path| File.expand_path(path, root) }
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# @return [Array<String>] the files among these that changed
|
|
42
|
+
def filter(files)
|
|
43
|
+
changed = paths
|
|
44
|
+
files.select { |file| changed.include?(file) }
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
private
|
|
48
|
+
|
|
49
|
+
def repository_root
|
|
50
|
+
filesystem_path(git('rev-parse', '--show-toplevel').b.chomp)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def modified_paths(revision = @revision)
|
|
54
|
+
# `diff.relative` would make git report paths relative to the current
|
|
55
|
+
# directory rather than to the repository root.
|
|
56
|
+
split_paths(
|
|
57
|
+
git('-c', 'diff.relative=false', 'diff', '--name-only', '--diff-filter=d', '-z', revision)
|
|
58
|
+
)
|
|
59
|
+
rescue Error
|
|
60
|
+
raise unless revision == DEFAULT_REVISION && unborn_head?
|
|
61
|
+
|
|
62
|
+
# A repository without commits has no `HEAD` to diff against, but files
|
|
63
|
+
# can already be staged in it. Against the empty tree every one of them
|
|
64
|
+
# counts as changed, which is what the caller wants to hear rather than
|
|
65
|
+
# an error about `HEAD` not resolving.
|
|
66
|
+
modified_paths(empty_tree)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def unborn_head?
|
|
70
|
+
!self.class.revision?(DEFAULT_REVISION)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Hashed rather than hardcoded, since its id depends on the repository's
|
|
74
|
+
# object format (SHA-1 or SHA-256).
|
|
75
|
+
def empty_tree
|
|
76
|
+
git('hash-object', '-t', 'tree', '--stdin').chomp
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def untracked_paths
|
|
80
|
+
# Unlike `git diff`, `ls-files` only looks under the current directory, so
|
|
81
|
+
# the `:/` pathspec widens it to the whole repository, and `--full-name`
|
|
82
|
+
# anchors the paths to the repository root the way `git diff` does.
|
|
83
|
+
split_paths(
|
|
84
|
+
git('ls-files', '--others', '--exclude-standard', '--full-name', '-z', '--', ':/')
|
|
85
|
+
)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# The `-z` above is what makes these usable: without it git wraps any path
|
|
89
|
+
# that is not plain ASCII in quotes and octal escapes, and those files drop
|
|
90
|
+
# out of the comparison without a word.
|
|
91
|
+
def split_paths(output)
|
|
92
|
+
output.b.split("\0").reject(&:empty?).map { |path| filesystem_path(path) }
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# git hands back bytes, which Ruby tags with the encoding the process
|
|
96
|
+
# happens to have been started in - splitting those bytes as US-ASCII raises
|
|
97
|
+
# on any path that is not. They have to end up in the encoding `Dir.glob`
|
|
98
|
+
# uses, or a path with a non-ASCII character in it never matches the file
|
|
99
|
+
# list it is compared against.
|
|
100
|
+
#
|
|
101
|
+
# On POSIX those bytes are already the filesystem's own, so the encoding is
|
|
102
|
+
# simply corrected. Windows is the exception: git converts paths to UTF-8 on
|
|
103
|
+
# the way out, while Ruby reports file names in the local code page, so the
|
|
104
|
+
# two have to be reconciled.
|
|
105
|
+
def filesystem_path(path)
|
|
106
|
+
path = path.dup
|
|
107
|
+
|
|
108
|
+
return path.force_encoding(FILESYSTEM_ENCODING) unless Platform.windows?
|
|
109
|
+
|
|
110
|
+
path.force_encoding(Encoding::UTF_8).encode(FILESYSTEM_ENCODING)
|
|
111
|
+
rescue Encoding::UndefinedConversionError, Encoding::InvalidByteSequenceError
|
|
112
|
+
# A name the local code page cannot represent. Nothing good is left to do
|
|
113
|
+
# with it, and dropping it would be worse than reporting it as-is.
|
|
114
|
+
path.force_encoding(FILESYSTEM_ENCODING)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def git(*args)
|
|
118
|
+
stdout, stderr, status = Open3.capture3('git', *args)
|
|
119
|
+
|
|
120
|
+
raise Error, git_error_message(stderr) unless status.success?
|
|
121
|
+
|
|
122
|
+
stdout
|
|
123
|
+
rescue Errno::ENOENT
|
|
124
|
+
raise Error, '--changed requires git to be installed and on your PATH.'
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def git_error_message(stderr)
|
|
128
|
+
message = stderr.strip
|
|
129
|
+
message = 'git failed with no output on standard error.' if message.empty?
|
|
130
|
+
|
|
131
|
+
"--changed could not ask git which files changed: #{message}"
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
@@ -24,13 +24,45 @@ module RuboCop
|
|
|
24
24
|
|
|
25
25
|
def run
|
|
26
26
|
add_formatter
|
|
27
|
+
use_temporary_cache
|
|
28
|
+
reset_auto_gen_tmp_dir
|
|
27
29
|
reset_config_and_auto_gen_file
|
|
28
30
|
line_length_contents = maybe_run_line_length_cop
|
|
29
|
-
run_all_cops(line_length_contents)
|
|
31
|
+
result = run_all_cops(line_length_contents)
|
|
32
|
+
reset_auto_gen_tmp_dir
|
|
33
|
+
result
|
|
34
|
+
ensure
|
|
35
|
+
# `auto_gen_tmp_dir` points `ExcludeLimit.tmp_dir` at this command's
|
|
36
|
+
# tmp directory. Clear that process-global state on the way out so
|
|
37
|
+
# later in-process callers (e.g. other specs in the same test worker)
|
|
38
|
+
# don't read this run's leftover directory.
|
|
39
|
+
RuboCop::ExcludeLimit.tmp_dir = nil
|
|
30
40
|
end
|
|
31
41
|
|
|
32
42
|
private
|
|
33
43
|
|
|
44
|
+
def use_temporary_cache
|
|
45
|
+
# Use a separate cache directory to ensure MinDigits and Max values are calculated.
|
|
46
|
+
# This allows parallel execution (which requires cache) while ensuring MinDigits
|
|
47
|
+
# and Max values are computed, since the cache starts empty.
|
|
48
|
+
@options[:cache_root] = auto_gen_tmp_dir.join('cache').to_s
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def reset_auto_gen_tmp_dir
|
|
52
|
+
auto_gen_tmp_dir.rmtree if auto_gen_tmp_dir.exist?
|
|
53
|
+
auto_gen_tmp_dir.mkpath
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def auto_gen_tmp_dir
|
|
57
|
+
@auto_gen_tmp_dir ||= Pathname.new(
|
|
58
|
+
RuboCop::CacheConfig.root_dir_from_toplevel_config
|
|
59
|
+
).join('auto-gen-tmp').tap do |path|
|
|
60
|
+
path.mkpath
|
|
61
|
+
# Set the temp directory path for ExcludeLimit to use
|
|
62
|
+
RuboCop::ExcludeLimit.tmp_dir = path
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
34
66
|
def maybe_run_line_length_cop
|
|
35
67
|
if only_exclude?
|
|
36
68
|
skip_line_length_cop(PHASE_1_SKIPPED_ONLY_EXCLUDE)
|
|
@@ -83,7 +115,7 @@ module RuboCop
|
|
|
83
115
|
execute_runner
|
|
84
116
|
@options.delete(:only)
|
|
85
117
|
@config_store = ConfigStore.new
|
|
86
|
-
@config_store.
|
|
118
|
+
@config_store.apply_options!(@options)
|
|
87
119
|
# Save the todo configuration of the LineLength cop.
|
|
88
120
|
File.read(AUTO_GENERATED_FILE).lines.drop_while { |line| line.start_with?('#') }.join
|
|
89
121
|
end
|
|
@@ -99,7 +131,7 @@ module RuboCop
|
|
|
99
131
|
|
|
100
132
|
def reset_config_and_auto_gen_file
|
|
101
133
|
@config_store = ConfigStore.new
|
|
102
|
-
@config_store.
|
|
134
|
+
@config_store.apply_options!(@options)
|
|
103
135
|
File.open(AUTO_GENERATED_FILE, 'w') {} # create or truncate if exists
|
|
104
136
|
add_inheritance_from_auto_generated_file(@options[:config])
|
|
105
137
|
end
|
|
@@ -153,7 +185,7 @@ module RuboCop
|
|
|
153
185
|
def relative_path_to_todo_from_options_config
|
|
154
186
|
return AUTO_GENERATED_FILE unless @options[:config]
|
|
155
187
|
|
|
156
|
-
base = Pathname.new(
|
|
188
|
+
base = Pathname.new(PathUtil.pwd)
|
|
157
189
|
config_dir = Pathname.new(@options[:config]).realpath.dirname
|
|
158
190
|
|
|
159
191
|
# Don't have the path start with `/`
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
class CLI
|
|
5
|
+
module Command
|
|
6
|
+
# Shared handling for commands that take a list of cop names.
|
|
7
|
+
#
|
|
8
|
+
# Validation happens here rather than during option parsing because the
|
|
9
|
+
# registry is not complete until the configuration has been loaded, which
|
|
10
|
+
# is also why `--only` and `--except` are validated from the runner.
|
|
11
|
+
# @api private
|
|
12
|
+
module CopNames
|
|
13
|
+
private
|
|
14
|
+
|
|
15
|
+
# The cops among `names` that exist, so a command can report on what it
|
|
16
|
+
# understood before {#validate_cop_names!} objects to the rest.
|
|
17
|
+
def known_cop_classes(names)
|
|
18
|
+
names.filter_map { |name| cop_class_for(name) }
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# @raise [IncorrectCopNameError] if any name is not a cop
|
|
22
|
+
def validate_cop_names!(names)
|
|
23
|
+
unknown = names.reject { |name| cop_class_for(name) }
|
|
24
|
+
return if unknown.empty?
|
|
25
|
+
|
|
26
|
+
raise IncorrectCopNameError, unknown.map { |name| unknown_cop_message(name) }.join("\n")
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Not memoized: the MCP server lives long enough for a plugin to register
|
|
30
|
+
# a cop after a lookup has missed it.
|
|
31
|
+
def cop_class_for(name)
|
|
32
|
+
Cop::Registry.global.find_by_cop_name(name)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def unknown_cop_message(name)
|
|
36
|
+
return department_message(name) if department?(name)
|
|
37
|
+
|
|
38
|
+
message = "Unrecognized cop: #{name}."
|
|
39
|
+
similar = NameSimilarity.find_similar_names(name, Cop::Registry.global.names)
|
|
40
|
+
return message if similar.empty?
|
|
41
|
+
|
|
42
|
+
"#{message}\nDid you mean? #{similar.join(', ')}"
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def department?(name)
|
|
46
|
+
Cop::Registry.global.departments.any? { |department| department.to_s == name }
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def department_message(name)
|
|
50
|
+
example = Cop::Registry.global.names.find { |cop| cop.start_with?("#{name}/") }
|
|
51
|
+
|
|
52
|
+
"#{name} is a department, not a cop. Name one of its cops, such as #{example}."
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -9,7 +9,7 @@ module RuboCop
|
|
|
9
9
|
include Formatter::TextUtil
|
|
10
10
|
|
|
11
11
|
# Combination of short and long formatter names.
|
|
12
|
-
INTEGRATION_FORMATTERS = %w[h html j json ju junit].freeze
|
|
12
|
+
INTEGRATION_FORMATTERS = %w[h html j json ju junit sa sarif].freeze
|
|
13
13
|
|
|
14
14
|
self.command_name = :execute_runner
|
|
15
15
|
|
|
@@ -28,8 +28,21 @@ module RuboCop
|
|
|
28
28
|
all_passed || @options[:auto_gen_config]
|
|
29
29
|
end
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
if @options[:diff]
|
|
32
|
+
print_diffs(runner.diffs)
|
|
33
|
+
else
|
|
34
|
+
maybe_print_corrected_source
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# A diff means autocorrectable offenses are still in the working
|
|
38
|
+
# tree, so the run has not passed even though they were "corrected"
|
|
39
|
+
# in memory.
|
|
40
|
+
all_pass_or_excluded &&= runner.diffs.empty?
|
|
41
|
+
|
|
42
|
+
merge_todo_audit_status(runner_status(runner, all_pass_or_excluded))
|
|
43
|
+
end
|
|
32
44
|
|
|
45
|
+
def runner_status(runner, all_pass_or_excluded)
|
|
33
46
|
if runner.aborting?
|
|
34
47
|
STATUS_INTERRUPTED
|
|
35
48
|
elsif all_pass_or_excluded && runner.errors.empty?
|
|
@@ -39,6 +52,33 @@ module RuboCop
|
|
|
39
52
|
end
|
|
40
53
|
end
|
|
41
54
|
|
|
55
|
+
def merge_todo_audit_status(status)
|
|
56
|
+
return status if status == STATUS_INTERRUPTED || !@options[:report_unused_todo_entries]
|
|
57
|
+
|
|
58
|
+
audit_status = report_unused_todo_entries
|
|
59
|
+
status == STATUS_SUCCESS ? audit_status : status
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def report_unused_todo_entries
|
|
63
|
+
audit = TodoAudit.new(@config_store, @options)
|
|
64
|
+
unused = audit.unused_entries
|
|
65
|
+
|
|
66
|
+
if unused.nil?
|
|
67
|
+
warn Rainbow("No `#{audit.todo_file}` found; nothing to audit.").yellow
|
|
68
|
+
return STATUS_SUCCESS
|
|
69
|
+
end
|
|
70
|
+
return STATUS_SUCCESS if unused.empty?
|
|
71
|
+
|
|
72
|
+
print_unused_todo_entries(audit.todo_file, unused)
|
|
73
|
+
STATUS_OFFENSES
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def print_unused_todo_entries(todo_file, unused)
|
|
77
|
+
noun = unused.size == 1 ? 'entry' : 'entries'
|
|
78
|
+
warn Rainbow("\n#{unused.size} unused todo #{noun} found in `#{todo_file}`:").red
|
|
79
|
+
unused.each { |entry| warn " #{entry.cop_name}: #{entry.path}" }
|
|
80
|
+
end
|
|
81
|
+
|
|
42
82
|
def with_redirect
|
|
43
83
|
if @options[:stderr]
|
|
44
84
|
orig_stdout = $stdout
|
|
@@ -88,9 +128,20 @@ module RuboCop
|
|
|
88
128
|
"#{Gem.loaded_specs['rubocop'].metadata['bug_tracker_uri']}\n"
|
|
89
129
|
end
|
|
90
130
|
|
|
131
|
+
def print_diffs(diffs)
|
|
132
|
+
return if diffs.empty?
|
|
133
|
+
# Integration tools own stdout when they ask for a machine-readable
|
|
134
|
+
# format, so the diff would only corrupt their input.
|
|
135
|
+
return if INTEGRATION_FORMATTERS.include?(@options[:format])
|
|
136
|
+
|
|
137
|
+
output = @options[:stderr] ? $stderr : $stdout
|
|
138
|
+
output.puts
|
|
139
|
+
diffs.each { |diff| output.print(diff) }
|
|
140
|
+
end
|
|
141
|
+
|
|
91
142
|
def maybe_print_corrected_source
|
|
92
143
|
# Integration tools (like RubyMine) expect to have only the JSON result
|
|
93
|
-
# when specifying JSON format. Similar HTML and
|
|
144
|
+
# when specifying JSON format. Similar HTML, JUnit and SARIF are targeted as well.
|
|
94
145
|
# See: https://github.com/rubocop/rubocop/issues/8673
|
|
95
146
|
return if INTEGRATION_FORMATTERS.include?(@options[:format])
|
|
96
147
|
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
class CLI
|
|
5
|
+
module Command
|
|
6
|
+
# Explains what cops do, as described by {Cop::CopExplanation}.
|
|
7
|
+
# @api private
|
|
8
|
+
class Explain < Base
|
|
9
|
+
include CopNames
|
|
10
|
+
|
|
11
|
+
self.command_name = :explain
|
|
12
|
+
|
|
13
|
+
def initialize(env)
|
|
14
|
+
super
|
|
15
|
+
|
|
16
|
+
@config = @config_store.for(PathUtil.pwd)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def run
|
|
20
|
+
names = @options[:explain]
|
|
21
|
+
|
|
22
|
+
known_cop_classes(names).each_with_index do |cop_class, index|
|
|
23
|
+
puts if index.positive?
|
|
24
|
+
puts Cop::CopExplanation.new(cop_class, @config)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Checked after printing, so a typo in a list does not cost you the
|
|
28
|
+
# explanations you asked for alongside it.
|
|
29
|
+
validate_cop_names!(names)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
class CLI
|
|
5
|
+
module Command
|
|
6
|
+
# Lists the cops that will inspect the given file or directory.
|
|
7
|
+
# @api private
|
|
8
|
+
class ListEnabledCopsFor < Base
|
|
9
|
+
self.command_name = :list_enabled_cops_for
|
|
10
|
+
|
|
11
|
+
def initialize(env)
|
|
12
|
+
super
|
|
13
|
+
|
|
14
|
+
# Load the configs so the require()s are done for custom cops
|
|
15
|
+
@config = @config_store.for(@options[:list_enabled_cops_for])
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def run
|
|
19
|
+
print_available_cops
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
private
|
|
23
|
+
|
|
24
|
+
def print_available_cops
|
|
25
|
+
registry = Cop::Registry.global
|
|
26
|
+
|
|
27
|
+
registry.departments.sort.each do |department|
|
|
28
|
+
puts cops_of_department(registry, department).sort
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def cops_of_department(registry, department)
|
|
33
|
+
registry.with_department(department)
|
|
34
|
+
.map(&:cop_name)
|
|
35
|
+
.select { |cop_name| @config.cop_enabled?(cop_name) }
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|