rubocop 1.71.1 → 1.91.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 +883 -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 +7 -2
- data/lib/rubocop/changed_files.rb +112 -0
- data/lib/rubocop/cli/command/auto_generate_config.rb +36 -4
- data/lib/rubocop/cli/command/execute_runner.rb +52 -1
- 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 +2 -2
- data/lib/rubocop/cli/command/show_docs_url.rb +4 -8
- data/lib/rubocop/cli/command/suggest_extensions.rb +8 -2
- data/lib/rubocop/cli.rb +58 -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 +92 -48
- data/lib/rubocop/config.rb +137 -19
- data/lib/rubocop/config_finder.rb +1 -1
- data/lib/rubocop/config_loader.rb +72 -49
- data/lib/rubocop/config_loader_resolver.rb +94 -28
- 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 +8 -0
- 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 +64 -12
- data/lib/rubocop/cop/autocorrect_logic.rb +35 -14
- data/lib/rubocop/cop/badge.rb +9 -1
- data/lib/rubocop/cop/base.rb +93 -21
- data/lib/rubocop/cop/bundler/gem_comment.rb +5 -3
- data/lib/rubocop/cop/bundler/gem_version.rb +28 -28
- data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -3
- data/lib/rubocop/cop/bundler.rb +19 -0
- data/lib/rubocop/cop/commissioner.rb +13 -11
- data/lib/rubocop/cop/corrector.rb +4 -4
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +79 -10
- data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/each_to_for_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 +7 -1
- 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 +36 -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 +2 -3
- data/lib/rubocop/cop/exclude_limit.rb +31 -5
- data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
- 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 -3
- 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 +14 -15
- 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 +92 -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_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/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 +59 -4
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/case_indentation.rb +3 -1
- data/lib/rubocop/cop/layout/class_structure.rb +163 -35
- 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 +1 -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_between_defs.rb +46 -21
- 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 +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +13 -2
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +17 -3
- 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 +9 -3
- data/lib/rubocop/cop/layout/extra_spacing.rb +105 -3
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +56 -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 +20 -15
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +25 -25
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +11 -0
- data/lib/rubocop/cop/layout/hash_alignment.rb +11 -13
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +3 -3
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +33 -3
- data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +157 -10
- data/lib/rubocop/cop/layout/leading_comment_space.rb +40 -1
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +2 -3
- data/lib/rubocop/cop/layout/line_length.rb +160 -23
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +57 -57
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +8 -2
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +3 -0
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +56 -56
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +245 -40
- 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 +89 -6
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +14 -7
- data/lib/rubocop/cop/layout/space_after_comma.rb +2 -10
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +14 -3
- data/lib/rubocop/cop/layout/space_around_keyword.rb +10 -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 +1 -0
- 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 +42 -36
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -0
- 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_precedence.rb +1 -10
- 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 +20 -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 +137 -11
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +11 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +13 -19
- data/lib/rubocop/cop/lint/misplaced_magic_comment.rb +185 -0
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +44 -22
- 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 +19 -10
- 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 +149 -39
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +53 -19
- data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +15 -4
- 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 +36 -10
- 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 +56 -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 +60 -21
- 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/collection_literal_length.rb +1 -1
- data/lib/rubocop/cop/metrics/method_length.rb +3 -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 +3 -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 +27 -9
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +5 -7
- data/lib/rubocop/cop/mixin/code_length.rb +1 -1
- 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 +1 -1
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -7
- 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 +44 -16
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +29 -26
- 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/multiline_expression_indentation.rb +3 -1
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -1
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +62 -6
- data/lib/rubocop/cop/mixin/project_index_help.rb +188 -0
- data/lib/rubocop/cop/mixin/range_help.rb +16 -5
- data/lib/rubocop/cop/mixin/reparsed_equivalence.rb +171 -0
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +5 -4
- data/lib/rubocop/cop/mixin/statement_modifier.rb +47 -11
- 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 +91 -0
- data/lib/rubocop/cop/naming/accessor_method_name.rb +24 -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/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} +80 -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 +52 -9
- data/lib/rubocop/cop/registry.rb +233 -64
- 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 +33 -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 +47 -13
- data/lib/rubocop/cop/style/accessor_grouping.rb +47 -10
- data/lib/rubocop/cop/style/alias.rb +15 -3
- data/lib/rubocop/cop/style/and_or.rb +2 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +49 -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 +5 -2
- 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 +7 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +43 -38
- data/lib/rubocop/cop/style/case_equality.rb +29 -15
- data/lib/rubocop/cop/style/case_like_if.rb +6 -8
- data/lib/rubocop/cop/style/character_literal.rb +2 -2
- data/lib/rubocop/cop/style/class_and_module_children.rb +135 -21
- data/lib/rubocop/cop/style/class_equality_comparison.rb +22 -14
- data/lib/rubocop/cop/style/class_methods_definitions.rb +11 -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 +7 -2
- 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 +8 -3
- data/lib/rubocop/cop/style/conditional_assignment.rb +54 -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 +122 -14
- 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 +3 -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 +11 -2
- data/lib/rubocop/cop/style/empty_method.rb +12 -8
- 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 +191 -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 +8 -1
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +16 -3
- 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 +25 -17
- data/lib/rubocop/cop/style/for.rb +9 -0
- data/lib/rubocop/cop/style/format_string.rb +17 -4
- data/lib/rubocop/cop/style/format_string_token.rb +86 -16
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
- 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 +32 -23
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +27 -9
- data/lib/rubocop/cop/style/hash_conversion.rb +28 -12
- 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 +105 -0
- data/lib/rubocop/cop/style/hash_slice.rb +16 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +7 -3
- 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 +18 -9
- data/lib/rubocop/cop/style/if_inside_else.rb +25 -20
- data/lib/rubocop/cop/style/if_unless_modifier.rb +71 -46
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +15 -19
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +5 -2
- data/lib/rubocop/cop/style/if_with_semicolon.rb +16 -6
- 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 +10 -6
- 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 +121 -0
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +4 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +20 -10
- data/lib/rubocop/cop/style/lambda.rb +12 -1
- data/lib/rubocop/cop/style/lambda_call.rb +26 -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 +5 -2
- 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 +31 -15
- 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 +34 -5
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +12 -7
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -1
- data/lib/rubocop/cop/style/method_def_parentheses.rb +7 -5
- data/lib/rubocop/cop/style/min_max_comparison.rb +17 -6
- 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 +2 -0
- data/lib/rubocop/cop/style/multiline_if_then.rb +10 -4
- data/lib/rubocop/cop/style/multiline_memoization.rb +7 -1
- data/lib/rubocop/cop/style/multiline_method_signature.rb +14 -18
- data/lib/rubocop/cop/style/multiple_comparison.rb +33 -22
- data/lib/rubocop/cop/style/mutable_constant.rb +111 -12
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +1 -2
- data/lib/rubocop/cop/style/negative_array_index.rb +220 -0
- data/lib/rubocop/cop/style/nested_modifier.rb +9 -4
- data/lib/rubocop/cop/style/next.rb +44 -0
- data/lib/rubocop/cop/style/nil_comparison.rb +41 -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 +5 -1
- 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 +1 -1
- 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 +22 -13
- 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 +4 -0
- 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 +200 -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 +38 -3
- data/lib/rubocop/cop/style/redundant_condition.rb +63 -5
- 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 +11 -3
- data/lib/rubocop/cop/style/redundant_each.rb +4 -5
- data/lib/rubocop/cop/style/redundant_exception.rb +7 -1
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +2 -10
- 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 +2 -2
- 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 +164 -82
- data/lib/rubocop/cop/style/redundant_percent_q.rb +5 -3
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +8 -0
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -5
- data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +8 -8
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +12 -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 +32 -3
- data/lib/rubocop/cop/style/rescue_modifier.rb +5 -3
- data/lib/rubocop/cop/style/return_nil.rb +2 -2
- 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 +11 -6
- 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 +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +45 -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 +13 -8
- 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 +3 -1
- data/lib/rubocop/cop/style/static_class.rb +21 -0
- data/lib/rubocop/cop/style/string_concatenation.rb +31 -15
- 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 +4 -6
- data/lib/rubocop/cop/style/symbol_array.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +11 -9
- data/lib/rubocop/cop/style/tally_method.rb +181 -0
- data/lib/rubocop/cop/style/ternary_parentheses.rb +11 -0
- 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 +18 -19
- 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 +2 -3
- data/lib/rubocop/cop/style/yoda_expression.rb +1 -1
- 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 +163 -45
- 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 +7 -3
- 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 +28 -10
- 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/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 +3 -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 +11 -6
- 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 +2 -3
- data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
- data/lib/rubocop/formatter/sarif_formatter.rb +181 -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 +2 -3
- 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 +23 -8
- data/lib/rubocop/lsp/server.rb +4 -2
- data/lib/rubocop/lsp/stdin_runner.rb +31 -18
- data/lib/rubocop/magic_comment.rb +55 -0
- data/lib/rubocop/mcp/server.rb +199 -0
- data/lib/rubocop/options.rb +129 -21
- data/lib/rubocop/path_util.rb +20 -5
- data/lib/rubocop/pending_cops_reporter.rb +51 -0
- data/lib/rubocop/plugin/configuration_integrator.rb +146 -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 +14 -12
- data/lib/rubocop/result_cache.rb +90 -52
- 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 +294 -100
- 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/version.rb +48 -10
- data/lib/rubocop.rb +30 -682
- data/lib/ruby_lsp/rubocop/addon.rb +28 -17
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
- metadata +116 -19
- 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
|
@@ -12,6 +12,14 @@ module RuboCop
|
|
|
12
12
|
autocorrect_requested? && disable_uncorrectable? && autocorrect_enabled?
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
+
# Whether a correction exists but is skipped because it is unsafe in a
|
|
16
|
+
# safe autocorrect run, while `--disable-uncorrectable` asks for a todo
|
|
17
|
+
# comment on everything this run cannot correct.
|
|
18
|
+
def skipped_unsafe_correction_with_disable_uncorrectable?
|
|
19
|
+
autocorrect_requested? && disable_uncorrectable? &&
|
|
20
|
+
@options.fetch(:safe_autocorrect, false) && !safe_autocorrect?
|
|
21
|
+
end
|
|
22
|
+
|
|
15
23
|
def autocorrect_requested?
|
|
16
24
|
@options.fetch(:autocorrect, false)
|
|
17
25
|
end
|
|
@@ -35,8 +43,8 @@ module RuboCop
|
|
|
35
43
|
# `false` is the same as `disabled` for backward compatibility.
|
|
36
44
|
return false if ['disabled', false].include?(cop_config['AutoCorrect'])
|
|
37
45
|
|
|
38
|
-
# When LSP is enabled, it is considered as editing
|
|
39
|
-
# and autocorrection with `AutoCorrect: contextual` will not be performed.
|
|
46
|
+
# When LSP is enabled or the `--editor-mode` option is on, it is considered as editing
|
|
47
|
+
# source code, and autocorrection with `AutoCorrect: contextual` will not be performed.
|
|
40
48
|
return false if contextual_autocorrect? && LSP.enabled?
|
|
41
49
|
|
|
42
50
|
# :safe_autocorrect is a derived option based on several command-line
|
|
@@ -50,7 +58,8 @@ module RuboCop
|
|
|
50
58
|
|
|
51
59
|
def disable_offense(offense_range)
|
|
52
60
|
unbreakable_range = multiline_ranges(offense_range)&.find do |range|
|
|
53
|
-
|
|
61
|
+
offense_range.overlaps?(range) &&
|
|
62
|
+
eol_comment_would_be_inside_literal?(offense_range, range)
|
|
54
63
|
end
|
|
55
64
|
|
|
56
65
|
if unbreakable_range
|
|
@@ -75,22 +84,28 @@ module RuboCop
|
|
|
75
84
|
end
|
|
76
85
|
|
|
77
86
|
def disable_offense_with_eol_or_surround_comment(range)
|
|
78
|
-
|
|
79
|
-
needed_line_length = (range.source_line + eol_comment).length
|
|
80
|
-
|
|
81
|
-
if needed_line_length <= max_line_length
|
|
82
|
-
disable_offense_at_end_of_line(range_of_first_line(range), eol_comment)
|
|
83
|
-
else
|
|
87
|
+
if line_with_eol_comment_too_long?(range)
|
|
84
88
|
disable_offense_before_and_after(range_by_lines(range))
|
|
89
|
+
else
|
|
90
|
+
disable_offense_at_end_of_line(range_of_first_line(range))
|
|
85
91
|
end
|
|
86
92
|
end
|
|
87
93
|
|
|
88
|
-
def
|
|
89
|
-
|
|
94
|
+
def eol_comment_would_be_inside_literal?(offense_range, literal_range)
|
|
95
|
+
return true if line_with_eol_comment_too_long?(offense_range)
|
|
96
|
+
|
|
97
|
+
offense_line = offense_range.line
|
|
98
|
+
offense_line >= literal_range.first_line && offense_line < literal_range.last_line
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def line_with_eol_comment_too_long?(range)
|
|
102
|
+
return false unless max_line_length
|
|
103
|
+
|
|
104
|
+
(range.source_line + eol_comment).length > max_line_length
|
|
90
105
|
end
|
|
91
106
|
|
|
92
107
|
def surrounding_heredoc?(node)
|
|
93
|
-
node.
|
|
108
|
+
node.any_str_type? && node.heredoc?
|
|
94
109
|
end
|
|
95
110
|
|
|
96
111
|
def heredoc_range(node)
|
|
@@ -102,7 +117,7 @@ module RuboCop
|
|
|
102
117
|
end
|
|
103
118
|
|
|
104
119
|
def string_continuation?(node)
|
|
105
|
-
node.
|
|
120
|
+
node.any_str_type? && node.source.match?(/\\\s*$/)
|
|
106
121
|
end
|
|
107
122
|
|
|
108
123
|
def multiline_string?(node)
|
|
@@ -129,13 +144,19 @@ module RuboCop
|
|
|
129
144
|
end
|
|
130
145
|
|
|
131
146
|
def max_line_length
|
|
147
|
+
return unless config.cop_enabled?('Layout/LineLength')
|
|
148
|
+
|
|
132
149
|
config.for_cop('Layout/LineLength')['Max'] || 120
|
|
133
150
|
end
|
|
134
151
|
|
|
135
|
-
def disable_offense_at_end_of_line(range
|
|
152
|
+
def disable_offense_at_end_of_line(range)
|
|
136
153
|
Corrector.new(range).insert_after(range, eol_comment)
|
|
137
154
|
end
|
|
138
155
|
|
|
156
|
+
def eol_comment
|
|
157
|
+
" # rubocop:todo #{cop_name}"
|
|
158
|
+
end
|
|
159
|
+
|
|
139
160
|
def disable_offense_before_and_after(range_by_lines)
|
|
140
161
|
range_with_newline = range_by_lines.resize(range_by_lines.size + 1)
|
|
141
162
|
leading_whitespace = range_by_lines.source_line[/^\s*/]
|
data/lib/rubocop/cop/badge.rb
CHANGED
|
@@ -45,13 +45,21 @@ module RuboCop
|
|
|
45
45
|
|
|
46
46
|
def hash
|
|
47
47
|
# Do hashing manually to reduce Array allocations.
|
|
48
|
-
department.hash ^ cop_name.hash # rubocop:disable Security/CompoundHash
|
|
48
|
+
department.hash ^ cop_name.hash # rubocop:disable Security/CompoundHash -- hashing manually avoids the Array allocation
|
|
49
49
|
end
|
|
50
50
|
|
|
51
51
|
def match?(other)
|
|
52
52
|
cop_name == other.cop_name && (!qualified? || department == other.department)
|
|
53
53
|
end
|
|
54
54
|
|
|
55
|
+
# Returns true if the badge's qualified name or the badge's department
|
|
56
|
+
# matches any of the given names.
|
|
57
|
+
def match_name?(given_names)
|
|
58
|
+
return false unless given_names
|
|
59
|
+
|
|
60
|
+
given_names.include?(to_s) || given_names.include?(department_name)
|
|
61
|
+
end
|
|
62
|
+
|
|
55
63
|
def to_s
|
|
56
64
|
@to_s ||= qualified? ? "#{department}/#{cop_name}" : cop_name
|
|
57
65
|
end
|
data/lib/rubocop/cop/base.rb
CHANGED
|
@@ -41,6 +41,7 @@ module RuboCop
|
|
|
41
41
|
include AutocorrectLogic
|
|
42
42
|
|
|
43
43
|
attr_reader :config, :processed_source
|
|
44
|
+
attr_accessor :project_index
|
|
44
45
|
|
|
45
46
|
# Reports of an investigation.
|
|
46
47
|
# Immutable
|
|
@@ -48,7 +49,12 @@ module RuboCop
|
|
|
48
49
|
InvestigationReport = Struct.new(:cop, :processed_source, :offenses, :corrector)
|
|
49
50
|
|
|
50
51
|
# List of methods names to restrict calls for `on_send` / `on_csend`
|
|
51
|
-
RESTRICT_ON_SEND = Set[].freeze # rubocop:disable InternalAffairs/UselessRestrictOnSend
|
|
52
|
+
RESTRICT_ON_SEND = Set[].freeze # rubocop:disable InternalAffairs/UselessRestrictOnSend -- the base class default, which cops override
|
|
53
|
+
|
|
54
|
+
# Departments whose cops report above `convention` unless a cop says
|
|
55
|
+
# otherwise. The exceptions live in `config/default.yml` as an explicit
|
|
56
|
+
# `Severity`, such as the lint-like cops in `Bundler` and `Gemspec`.
|
|
57
|
+
DEPARTMENT_SEVERITIES = { Lint: :warning, Security: :warning, Metrics: :refactor }.freeze
|
|
52
58
|
|
|
53
59
|
# List of cops that should not try to autocorrect at the same
|
|
54
60
|
# time as this cop
|
|
@@ -126,6 +132,8 @@ module RuboCop
|
|
|
126
132
|
# in the `on_new_investigation` callback.
|
|
127
133
|
# If your cop does autocorrections, be aware that your instance may be called
|
|
128
134
|
# multiple times with the same `processed_source.path` but different content.
|
|
135
|
+
# Note that under `--parallel` each worker process has its own cop
|
|
136
|
+
# instances, so state persists only within a worker's share of the files.
|
|
129
137
|
def self.support_multiple_source?
|
|
130
138
|
false
|
|
131
139
|
end
|
|
@@ -207,13 +215,15 @@ module RuboCop
|
|
|
207
215
|
severity = find_severity(range_to_pass, severity)
|
|
208
216
|
message = find_message(range_to_pass, message)
|
|
209
217
|
|
|
210
|
-
status, corrector =
|
|
218
|
+
status, corrector = enabled_lines?(range) ? correct(range, &block) : :disabled
|
|
219
|
+
justification = suppression_reason(range) if status == :disabled
|
|
211
220
|
|
|
212
221
|
# Since this range may be generated from Ruby code embedded in some
|
|
213
222
|
# template file, we convert it to location info in the original file.
|
|
214
223
|
range = range_for_original(range)
|
|
215
224
|
|
|
216
|
-
current_offenses << Offense.new(severity, range, message, name, status, corrector
|
|
225
|
+
current_offenses << Offense.new(severity, range, message, name, status, corrector,
|
|
226
|
+
justification: justification)
|
|
217
227
|
end
|
|
218
228
|
|
|
219
229
|
# This method should be overridden when a cop's behavior depends
|
|
@@ -283,6 +293,13 @@ module RuboCop
|
|
|
283
293
|
@config.string_literals_frozen_by_default?
|
|
284
294
|
end
|
|
285
295
|
|
|
296
|
+
# Whether the user opted in to unstable behavior, with `--preview` or
|
|
297
|
+
# `AllCops: Preview`. Cops branch on this to ship a change that is not
|
|
298
|
+
# ready to be the default yet.
|
|
299
|
+
def preview?
|
|
300
|
+
@config.preview?(@options)
|
|
301
|
+
end
|
|
302
|
+
|
|
286
303
|
def relevant_file?(file)
|
|
287
304
|
return false unless target_satisfies_all_gem_version_requirements?
|
|
288
305
|
return true unless @config.clusivity_config_for_badge?(self.class.badge)
|
|
@@ -306,7 +323,9 @@ module RuboCop
|
|
|
306
323
|
def ready
|
|
307
324
|
return self if self.class.support_multiple_source?
|
|
308
325
|
|
|
309
|
-
self.class.new(@config, @options)
|
|
326
|
+
self.class.new(@config, @options).tap do |fresh|
|
|
327
|
+
fresh.project_index = @project_index
|
|
328
|
+
end
|
|
310
329
|
end
|
|
311
330
|
|
|
312
331
|
### Reserved for Cop::Cop
|
|
@@ -319,7 +338,7 @@ module RuboCop
|
|
|
319
338
|
|
|
320
339
|
### Reserved for Commissioner
|
|
321
340
|
|
|
322
|
-
# rubocop:disable Layout/ClassStructure
|
|
341
|
+
# rubocop:disable Layout/ClassStructure -- grouped under the Commissioner heading above
|
|
323
342
|
# @api private
|
|
324
343
|
def callbacks_needed
|
|
325
344
|
self.class.callbacks_needed
|
|
@@ -328,12 +347,11 @@ module RuboCop
|
|
|
328
347
|
# @api private
|
|
329
348
|
def self.callbacks_needed
|
|
330
349
|
@callbacks_needed ||= public_instance_methods.select do |m|
|
|
331
|
-
# OPTIMIZE:
|
|
332
|
-
#
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
m.start_with?('on_', 'after_')
|
|
350
|
+
# OPTIMIZE: `start_with?` with two string arguments instead of a regex
|
|
351
|
+
# is faster in this specific case.
|
|
352
|
+
m.start_with?('on_', 'after_') &&
|
|
353
|
+
# exclude standard "callbacks" like 'on_new_investigation' unless refined
|
|
354
|
+
instance_method(m).owner != Base
|
|
337
355
|
end
|
|
338
356
|
end
|
|
339
357
|
# rubocop:enable Layout/ClassStructure
|
|
@@ -370,6 +388,12 @@ module RuboCop
|
|
|
370
388
|
|
|
371
389
|
private
|
|
372
390
|
|
|
391
|
+
### Reserved for Commissioner
|
|
392
|
+
|
|
393
|
+
private_class_method def self.restrict_on_send
|
|
394
|
+
@restrict_on_send ||= self::RESTRICT_ON_SEND.to_a.freeze
|
|
395
|
+
end
|
|
396
|
+
|
|
373
397
|
### Reserved for Cop::Cop
|
|
374
398
|
|
|
375
399
|
def callback_argument(range)
|
|
@@ -398,10 +422,6 @@ module RuboCop
|
|
|
398
422
|
@current_offenses ||= []
|
|
399
423
|
end
|
|
400
424
|
|
|
401
|
-
private_class_method def self.restrict_on_send
|
|
402
|
-
@restrict_on_send ||= self::RESTRICT_ON_SEND.to_a.freeze
|
|
403
|
-
end
|
|
404
|
-
|
|
405
425
|
EMPTY_OFFENSES = [].freeze
|
|
406
426
|
private_constant :EMPTY_OFFENSES
|
|
407
427
|
# Called to complete an investigation
|
|
@@ -416,7 +436,10 @@ module RuboCop
|
|
|
416
436
|
### Actually private methods
|
|
417
437
|
|
|
418
438
|
def reset_investigation
|
|
419
|
-
@currently_disabled_lines =
|
|
439
|
+
@currently_disabled_lines = nil
|
|
440
|
+
@current_offenses = nil
|
|
441
|
+
@processed_source = nil
|
|
442
|
+
@current_corrector = nil
|
|
420
443
|
end
|
|
421
444
|
|
|
422
445
|
# @return [Symbol, Corrector] offense status
|
|
@@ -438,6 +461,10 @@ module RuboCop
|
|
|
438
461
|
def use_corrector(range, corrector)
|
|
439
462
|
if autocorrect?
|
|
440
463
|
attempt_correction(range, corrector)
|
|
464
|
+
elsif skipped_unsafe_correction_with_disable_uncorrectable?
|
|
465
|
+
# The unsafe correction will not run, so the offense is
|
|
466
|
+
# uncorrectable for this run and gets a todo comment.
|
|
467
|
+
attempt_correction(range, nil)
|
|
441
468
|
elsif corrector && (always_autocorrect? || (contextual_autocorrect? && !LSP.enabled?))
|
|
442
469
|
:uncorrected
|
|
443
470
|
else
|
|
@@ -492,8 +519,23 @@ module RuboCop
|
|
|
492
519
|
patterns = cop_config[parameter]
|
|
493
520
|
return default_result unless patterns
|
|
494
521
|
|
|
495
|
-
|
|
496
|
-
|
|
522
|
+
file_patterns = FilePatterns.from(patterns)
|
|
523
|
+
relative_file_path = config.path_relative_to_config(file)
|
|
524
|
+
return true if file_patterns.match?(relative_file_path)
|
|
525
|
+
|
|
526
|
+
if parameter == 'Include' && !relative_file_path.start_with?('..')
|
|
527
|
+
matches_absolute_include_pattern?(patterns, file)
|
|
528
|
+
else
|
|
529
|
+
file_patterns.match?(file)
|
|
530
|
+
end
|
|
531
|
+
end
|
|
532
|
+
|
|
533
|
+
def matches_absolute_include_pattern?(patterns, file)
|
|
534
|
+
absolute_file_path = absolute?(file) ? file : File.expand_path(file)
|
|
535
|
+
patterns.any? do |pattern|
|
|
536
|
+
(absolute?(pattern.to_s) || pattern.to_s.start_with?('..')) &&
|
|
537
|
+
match_path?(pattern, absolute_file_path)
|
|
538
|
+
end
|
|
497
539
|
end
|
|
498
540
|
|
|
499
541
|
def enabled_line?(line_number)
|
|
@@ -502,12 +544,36 @@ module RuboCop
|
|
|
502
544
|
@processed_source.comment_config.cop_enabled_at_line?(self, line_number)
|
|
503
545
|
end
|
|
504
546
|
|
|
547
|
+
# A multi-line offense is suppressed by a directive on any line of its
|
|
548
|
+
# range, not only its first line, matching the intuition that the
|
|
549
|
+
# directive is attached to the offending code.
|
|
550
|
+
def enabled_lines?(range)
|
|
551
|
+
return true if @options[:ignore_disable_comments] || !@processed_source
|
|
552
|
+
|
|
553
|
+
comment_config = @processed_source.comment_config
|
|
554
|
+
comment_config.cop_enabled_at_lines?(self, range.first_line, range.last_line)
|
|
555
|
+
end
|
|
556
|
+
|
|
557
|
+
# The `--` reason on the directive that suppresses offenses on this
|
|
558
|
+
# range, or `nil` when the directive carries none.
|
|
559
|
+
def suppression_reason(range)
|
|
560
|
+
covering = covering_disabled_range(range)
|
|
561
|
+
covering.directive.reason if covering.respond_to?(:directive)
|
|
562
|
+
end
|
|
563
|
+
|
|
564
|
+
def covering_disabled_range(range)
|
|
565
|
+
disabled_ranges = @processed_source.comment_config.cop_disabled_line_ranges[cop_name]
|
|
566
|
+
disabled_ranges&.find do |disabled_range|
|
|
567
|
+
disabled_range.end >= range.first_line && disabled_range.begin <= range.last_line
|
|
568
|
+
end
|
|
569
|
+
end
|
|
570
|
+
|
|
505
571
|
def find_severity(_range, severity)
|
|
506
572
|
custom_severity || severity || default_severity
|
|
507
573
|
end
|
|
508
574
|
|
|
509
575
|
def default_severity
|
|
510
|
-
self.class.
|
|
576
|
+
DEPARTMENT_SEVERITIES.fetch(self.class.department, :convention)
|
|
511
577
|
end
|
|
512
578
|
|
|
513
579
|
def custom_severity
|
|
@@ -524,15 +590,21 @@ module RuboCop
|
|
|
524
590
|
end
|
|
525
591
|
|
|
526
592
|
def range_for_original(range)
|
|
593
|
+
buffer = @current_original.buffer
|
|
594
|
+
return range if @current_offset.zero? && range.source_buffer.equal?(buffer)
|
|
595
|
+
|
|
527
596
|
::Parser::Source::Range.new(
|
|
528
|
-
|
|
597
|
+
buffer,
|
|
529
598
|
range.begin_pos + @current_offset,
|
|
530
599
|
range.end_pos + @current_offset
|
|
531
600
|
)
|
|
532
601
|
end
|
|
533
602
|
|
|
534
603
|
def target_satisfies_all_gem_version_requirements?
|
|
535
|
-
self.class.gem_requirements
|
|
604
|
+
gem_requirements = self.class.gem_requirements
|
|
605
|
+
return true if gem_requirements.empty?
|
|
606
|
+
|
|
607
|
+
gem_requirements.all? do |gem_name, version_req|
|
|
536
608
|
all_gem_versions_in_target = @config.gem_versions_in_target
|
|
537
609
|
next false unless all_gem_versions_in_target
|
|
538
610
|
|
|
@@ -128,8 +128,8 @@ module RuboCop
|
|
|
128
128
|
end
|
|
129
129
|
|
|
130
130
|
def ignored_gem?(node)
|
|
131
|
-
|
|
132
|
-
|
|
131
|
+
allowed_gems = Array(cop_config['AllowedGems'])
|
|
132
|
+
allowed_gems.include?(node.first_argument.value)
|
|
133
133
|
end
|
|
134
134
|
|
|
135
135
|
def checked_options_present?(node)
|
|
@@ -163,7 +163,9 @@ module RuboCop
|
|
|
163
163
|
def gem_options(node)
|
|
164
164
|
return [] unless node.last_argument&.hash_type?
|
|
165
165
|
|
|
166
|
-
|
|
166
|
+
# Only literal keys carry an option name to check; a non-literal key
|
|
167
|
+
# (e.g. a variable or method call) has no `value` and must be skipped.
|
|
168
|
+
node.last_argument.keys.filter_map { |key| key.value if key.type?(:sym, :str) }
|
|
167
169
|
end
|
|
168
170
|
end
|
|
169
171
|
end
|
|
@@ -7,48 +7,48 @@ module RuboCop
|
|
|
7
7
|
# ref, or tag) are either required or forbidden.
|
|
8
8
|
#
|
|
9
9
|
# @example EnforcedStyle: required (default)
|
|
10
|
-
#
|
|
11
|
-
#
|
|
10
|
+
# # bad
|
|
11
|
+
# gem 'rubocop'
|
|
12
12
|
#
|
|
13
|
-
#
|
|
14
|
-
#
|
|
13
|
+
# # good
|
|
14
|
+
# gem 'rubocop', '~> 1.12'
|
|
15
15
|
#
|
|
16
|
-
#
|
|
17
|
-
#
|
|
16
|
+
# # good
|
|
17
|
+
# gem 'rubocop', '>= 1.10.0'
|
|
18
18
|
#
|
|
19
|
-
#
|
|
20
|
-
#
|
|
19
|
+
# # good
|
|
20
|
+
# gem 'rubocop', '>= 1.5.0', '< 1.10.0'
|
|
21
21
|
#
|
|
22
|
-
#
|
|
23
|
-
#
|
|
22
|
+
# # good
|
|
23
|
+
# gem 'rubocop', branch: 'feature-branch'
|
|
24
24
|
#
|
|
25
|
-
#
|
|
26
|
-
#
|
|
25
|
+
# # good
|
|
26
|
+
# gem 'rubocop', ref: '74b5bfbb2c4b6fd6cdbbc7254bd7084b36e0c85b'
|
|
27
27
|
#
|
|
28
|
-
#
|
|
29
|
-
#
|
|
28
|
+
# # good
|
|
29
|
+
# gem 'rubocop', tag: 'v1.17.0'
|
|
30
30
|
#
|
|
31
31
|
# @example EnforcedStyle: forbidden
|
|
32
|
-
#
|
|
33
|
-
#
|
|
32
|
+
# # good
|
|
33
|
+
# gem 'rubocop'
|
|
34
34
|
#
|
|
35
|
-
#
|
|
36
|
-
#
|
|
35
|
+
# # bad
|
|
36
|
+
# gem 'rubocop', '~> 1.12'
|
|
37
37
|
#
|
|
38
|
-
#
|
|
39
|
-
#
|
|
38
|
+
# # bad
|
|
39
|
+
# gem 'rubocop', '>= 1.10.0'
|
|
40
40
|
#
|
|
41
|
-
#
|
|
42
|
-
#
|
|
41
|
+
# # bad
|
|
42
|
+
# gem 'rubocop', '>= 1.5.0', '< 1.10.0'
|
|
43
43
|
#
|
|
44
|
-
#
|
|
45
|
-
#
|
|
44
|
+
# # bad
|
|
45
|
+
# gem 'rubocop', branch: 'feature-branch'
|
|
46
46
|
#
|
|
47
|
-
#
|
|
48
|
-
#
|
|
47
|
+
# # bad
|
|
48
|
+
# gem 'rubocop', ref: '74b5bfbb2c4b6fd6cdbbc7254bd7084b36e0c85b'
|
|
49
49
|
#
|
|
50
|
-
#
|
|
51
|
-
#
|
|
50
|
+
# # bad
|
|
51
|
+
# gem 'rubocop', tag: 'v1.17.0'
|
|
52
52
|
#
|
|
53
53
|
class GemVersion < Base
|
|
54
54
|
include ConfigurableEnforcedStyle
|
|
@@ -43,9 +43,8 @@ module RuboCop
|
|
|
43
43
|
def on_new_investigation
|
|
44
44
|
return if processed_source.blank?
|
|
45
45
|
|
|
46
|
-
gem_declarations(processed_source.ast)
|
|
47
|
-
|
|
48
|
-
next unless consecutive_lines(previous, current)
|
|
46
|
+
gem_declarations(processed_source.ast).each_cons(2) do |previous, current|
|
|
47
|
+
next unless consecutive_lines?(previous, current)
|
|
49
48
|
next unless case_insensitive_out_of_order?(gem_name(current), gem_name(previous))
|
|
50
49
|
|
|
51
50
|
register_offense(previous, current)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
# Cops for the `Bundler` department. The department's cops are registered for lazy loading
|
|
6
|
+
# and their files are loaded on demand.
|
|
7
|
+
module Bundler
|
|
8
|
+
extend LazyLoader
|
|
9
|
+
|
|
10
|
+
register_cop :DuplicatedGem, "#{__dir__}/bundler/duplicated_gem"
|
|
11
|
+
register_cop :DuplicatedGroup, "#{__dir__}/bundler/duplicated_group"
|
|
12
|
+
register_cop :GemComment, "#{__dir__}/bundler/gem_comment"
|
|
13
|
+
register_cop :GemFilename, "#{__dir__}/bundler/gem_filename"
|
|
14
|
+
register_cop :GemVersion, "#{__dir__}/bundler/gem_version"
|
|
15
|
+
register_cop :InsecureProtocolSource, "#{__dir__}/bundler/insecure_protocol_source"
|
|
16
|
+
register_cop :OrderedGems, "#{__dir__}/bundler/ordered_gems"
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -64,14 +64,16 @@ module RuboCop
|
|
|
64
64
|
r = '#' unless RESTRICTED_CALLBACKS.include?(method_name) # has Restricted?
|
|
65
65
|
c = '#' if NO_CHILD_NODES.include?(node_type) # has Children?
|
|
66
66
|
|
|
67
|
+
# The `after_` calls are guarded because barely any cop defines an `after_`
|
|
68
|
+
# callback, and the guard is cheaper than the method call it avoids.
|
|
67
69
|
class_eval(<<~RUBY, __FILE__, __LINE__ + 1)
|
|
68
|
-
def on_#{node_type}(node)
|
|
69
|
-
trigger_responding_cops(:on_#{node_type}, node)
|
|
70
|
-
#{r} trigger_restricted_cops(:on_#{node_type}, node)
|
|
71
|
-
#{c} super(node)
|
|
72
|
-
#{c} trigger_responding_cops(:after_#{node_type}, node)
|
|
73
|
-
#{c}#{r} trigger_restricted_cops(:after_#{node_type}, node)
|
|
74
|
-
end
|
|
70
|
+
def on_#{node_type}(node) # def on_send(node)
|
|
71
|
+
trigger_responding_cops(:on_#{node_type}, node) # trigger_responding_cops(:on_send, node)
|
|
72
|
+
#{r} trigger_restricted_cops(:on_#{node_type}, node) # trigger_restricted_cops(:on_send, node)
|
|
73
|
+
#{c} super(node) # super(node)
|
|
74
|
+
#{c} trigger_responding_cops(:after_#{node_type}, node) if @callbacks[:after_#{node_type}] # trigger_responding_cops(:after_send, node) if @callbacks[:after_send]
|
|
75
|
+
#{c}#{r} trigger_restricted_cops(:after_#{node_type}, node) unless @restricted_map[:after_#{node_type}].empty? # trigger_restricted_cops(:after_send, node) unless @restricted_map[:after_send].empty?
|
|
76
|
+
end # end
|
|
75
77
|
RUBY
|
|
76
78
|
end
|
|
77
79
|
|
|
@@ -81,13 +83,13 @@ module RuboCop
|
|
|
81
83
|
|
|
82
84
|
begin_investigation(processed_source, offset: offset, original: original)
|
|
83
85
|
if processed_source.valid_syntax?
|
|
84
|
-
invoke(:on_new_investigation, @
|
|
86
|
+
invoke(:on_new_investigation, @callbacks[:on_new_investigation])
|
|
85
87
|
invoke_with_argument(:investigate, @forces, processed_source)
|
|
86
88
|
|
|
87
89
|
walk(processed_source.ast) unless @cops.empty?
|
|
88
|
-
invoke(:on_investigation_end, @
|
|
90
|
+
invoke(:on_investigation_end, @callbacks[:on_investigation_end])
|
|
89
91
|
else
|
|
90
|
-
invoke(:on_other_file, @
|
|
92
|
+
invoke(:on_other_file, @callbacks[:on_other_file])
|
|
91
93
|
end
|
|
92
94
|
reports = @cops.map { |cop| cop.send(:complete_investigation) }
|
|
93
95
|
InvestigationReport.new(processed_source, reports, @errors)
|
|
@@ -157,7 +159,7 @@ module RuboCop
|
|
|
157
159
|
end
|
|
158
160
|
|
|
159
161
|
def invoke(callback, cops)
|
|
160
|
-
cops
|
|
162
|
+
cops&.each { |cop| with_cop_error_handling(cop) { cop.send(callback) } }
|
|
161
163
|
end
|
|
162
164
|
|
|
163
165
|
def invoke_with_argument(callback, cops, arg)
|
|
@@ -46,7 +46,7 @@ module RuboCop
|
|
|
46
46
|
|
|
47
47
|
# Removes `size` characters prior to the source range.
|
|
48
48
|
#
|
|
49
|
-
# @param [Parser::Source::Range, RuboCop::AST::Node]
|
|
49
|
+
# @param [Parser::Source::Range, RuboCop::AST::Node] node_or_range
|
|
50
50
|
# @param [Integer] size
|
|
51
51
|
def remove_preceding(node_or_range, size)
|
|
52
52
|
range = to_range(node_or_range)
|
|
@@ -58,7 +58,7 @@ module RuboCop
|
|
|
58
58
|
# If `size` is greater than the size of `range`, the removed region can
|
|
59
59
|
# overrun the end of `range`.
|
|
60
60
|
#
|
|
61
|
-
# @param [Parser::Source::Range, RuboCop::AST::Node]
|
|
61
|
+
# @param [Parser::Source::Range, RuboCop::AST::Node] node_or_range
|
|
62
62
|
# @param [Integer] size
|
|
63
63
|
def remove_leading(node_or_range, size)
|
|
64
64
|
range = to_range(node_or_range)
|
|
@@ -70,7 +70,7 @@ module RuboCop
|
|
|
70
70
|
# If `size` is greater than the size of `range`, the removed region can
|
|
71
71
|
# overrun the beginning of `range`.
|
|
72
72
|
#
|
|
73
|
-
# @param [Parser::Source::Range, RuboCop::AST::Node]
|
|
73
|
+
# @param [Parser::Source::Range, RuboCop::AST::Node] node_or_range
|
|
74
74
|
# @param [Integer] size
|
|
75
75
|
def remove_trailing(node_or_range, size)
|
|
76
76
|
range = to_range(node_or_range)
|
|
@@ -103,7 +103,7 @@ module RuboCop
|
|
|
103
103
|
# :nodoc:
|
|
104
104
|
def to_range(node_or_range)
|
|
105
105
|
range = case node_or_range
|
|
106
|
-
when
|
|
106
|
+
when RuboCop::AST::Node, ::Parser::Source::Comment
|
|
107
107
|
node_or_range.source_range
|
|
108
108
|
when ::Parser::Source::Range
|
|
109
109
|
node_or_range
|