rubocop 1.57.1 → 1.81.7
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 +92 -89
- data/assets/output.css.erb +159 -0
- data/assets/output.html.erb +1 -160
- data/config/default.yml +540 -86
- data/config/internal_affairs.yml +31 -0
- data/config/obsoletion.yml +8 -3
- data/exe/rubocop +1 -7
- data/lib/rubocop/cached_data.rb +21 -5
- data/lib/rubocop/cli/command/auto_generate_config.rb +30 -17
- data/lib/rubocop/cli/command/execute_runner.rb +4 -4
- data/lib/rubocop/cli/command/lsp.rb +4 -4
- data/lib/rubocop/cli/command/show_cops.rb +24 -2
- data/lib/rubocop/cli/command/show_docs_url.rb +2 -2
- data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
- data/lib/rubocop/cli/command/version.rb +2 -2
- data/lib/rubocop/cli.rb +28 -4
- data/lib/rubocop/comment_config.rb +3 -3
- data/lib/rubocop/config.rb +92 -22
- data/lib/rubocop/config_finder.rb +12 -2
- data/lib/rubocop/config_loader.rb +71 -58
- data/lib/rubocop/config_loader_resolver.rb +49 -17
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
- data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
- data/lib/rubocop/config_obsoletion.rb +56 -9
- data/lib/rubocop/config_store.rb +5 -0
- data/lib/rubocop/config_validator.rb +39 -20
- data/lib/rubocop/cop/autocorrect_logic.rb +57 -27
- data/lib/rubocop/cop/base.rb +79 -18
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
- data/lib/rubocop/cop/bundler/gem_comment.rb +2 -2
- data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
- data/lib/rubocop/cop/bundler/gem_version.rb +4 -5
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
- data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
- data/lib/rubocop/cop/cop.rb +30 -4
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +8 -16
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +4 -8
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +13 -16
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -0
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +6 -3
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -0
- data/lib/rubocop/cop/documentation.rb +32 -5
- data/lib/rubocop/cop/exclude_limit.rb +1 -1
- data/lib/rubocop/cop/force.rb +12 -0
- data/lib/rubocop/cop/gemspec/add_runtime_dependency.rb +38 -0
- data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
- data/lib/rubocop/cop/gemspec/dependency_version.rb +3 -5
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +3 -4
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +39 -17
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/require_mfa.rb +15 -1
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +5 -3
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +3 -3
- data/lib/rubocop/cop/generator.rb +6 -0
- data/lib/rubocop/cop/internal_affairs/cop_description.rb +0 -4
- data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
- data/lib/rubocop/cop/internal_affairs/empty_line_between_expect_offense_and_correction.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/example_description.rb +13 -8
- data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
- data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +3 -4
- data/lib/rubocop/cop/internal_affairs/method_name_end_with.rb +8 -6
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +19 -20
- data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +54 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +124 -30
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +233 -0
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +92 -0
- data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
- data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
- data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +48 -0
- 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_expect_offense_arguments.rb +34 -0
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +6 -21
- data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +11 -2
- data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
- data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +0 -2
- data/lib/rubocop/cop/internal_affairs/undefined_config.rb +23 -2
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +0 -5
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
- data/lib/rubocop/cop/internal_affairs.rb +9 -0
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +6 -2
- data/lib/rubocop/cop/layout/argument_alignment.rb +3 -10
- data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/assignment_indentation.rb +3 -2
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +0 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +32 -13
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/case_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/class_structure.rb +45 -10
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/condition_position.rb +0 -4
- data/lib/rubocop/cop/layout/def_end_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/dot_position.rb +1 -1
- data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/empty_comment.rb +3 -1
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +4 -4
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +14 -7
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +36 -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 +37 -7
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +8 -29
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +12 -8
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
- data/lib/rubocop/cop/layout/end_alignment.rb +16 -4
- data/lib/rubocop/cop/layout/extra_spacing.rb +5 -11
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +6 -11
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +19 -10
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +8 -0
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +3 -3
- data/lib/rubocop/cop/layout/hash_alignment.rb +10 -11
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +4 -3
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/indentation_width.rb +13 -13
- data/lib/rubocop/cop/layout/leading_comment_space.rb +83 -1
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +12 -3
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/line_length.rb +177 -29
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +11 -8
- data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
- data/lib/rubocop/cop/layout/redundant_line_break.rb +32 -46
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +16 -9
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +6 -1
- data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
- data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +8 -2
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +80 -37
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +20 -10
- data/lib/rubocop/cop/layout/space_before_brackets.rb +7 -40
- data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +18 -3
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +5 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +8 -1
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +3 -5
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +6 -4
- data/lib/rubocop/cop/legacy/corrector.rb +12 -2
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -3
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +0 -2
- data/lib/rubocop/cop/lint/ambiguous_range.rb +9 -1
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +0 -2
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +118 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +7 -9
- data/lib/rubocop/cop/lint/big_decimal_new.rb +4 -7
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +11 -13
- data/lib/rubocop/cop/lint/boolean_symbol.rb +2 -4
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +4 -14
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +4 -3
- data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +90 -0
- data/lib/rubocop/cop/lint/debugger.rb +30 -10
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +2 -2
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +7 -13
- data/lib/rubocop/cop/lint/duplicate_branch.rb +39 -4
- data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -5
- data/lib/rubocop/cop/lint/duplicate_hash_key.rb +0 -4
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +110 -32
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +6 -43
- data/lib/rubocop/cop/lint/duplicate_set_element.rb +87 -0
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +0 -4
- data/lib/rubocop/cop/lint/else_layout.rb +0 -2
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +29 -58
- data/lib/rubocop/cop/lint/empty_ensure.rb +2 -12
- data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
- data/lib/rubocop/cop/lint/empty_file.rb +0 -2
- data/lib/rubocop/cop/lint/empty_interpolation.rb +14 -5
- data/lib/rubocop/cop/lint/empty_when.rb +1 -3
- data/lib/rubocop/cop/lint/ensure_return.rb +2 -10
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +24 -23
- data/lib/rubocop/cop/lint/float_comparison.rb +58 -15
- data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -8
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -12
- data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +2 -1
- data/lib/rubocop/cop/lint/hash_new_with_keyword_arguments_as_default.rb +55 -0
- data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +23 -12
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +0 -7
- data/lib/rubocop/cop/lint/interpolation_check.rb +9 -4
- data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +50 -0
- data/lib/rubocop/cop/lint/literal_as_condition.rb +126 -11
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +85 -0
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +49 -12
- data/lib/rubocop/cop/lint/loop.rb +6 -12
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +17 -8
- data/lib/rubocop/cop/lint/missing_super.rb +2 -2
- data/lib/rubocop/cop/lint/mixed_case_range.rb +14 -12
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +10 -12
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +6 -25
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +2 -7
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +12 -3
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +6 -8
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
- data/lib/rubocop/cop/lint/number_conversion.rb +9 -5
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -2
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +94 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -3
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +3 -2
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +6 -11
- data/lib/rubocop/cop/lint/percent_string_array.rb +0 -4
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +0 -4
- data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
- data/lib/rubocop/cop/lint/rand_one.rb +0 -4
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +4 -2
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +164 -12
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +9 -8
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -6
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +9 -2
- data/lib/rubocop/cop/lint/redundant_with_object.rb +5 -2
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +1 -1
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +0 -1
- data/lib/rubocop/cop/lint/require_parentheses.rb +0 -4
- data/lib/rubocop/cop/lint/require_range_parentheses.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_exception.rb +2 -9
- data/lib/rubocop/cop/lint/rescue_type.rb +5 -11
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -13
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +20 -9
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +109 -41
- data/lib/rubocop/cop/lint/script_permission.rb +3 -3
- data/lib/rubocop/cop/lint/self_assignment.rb +72 -10
- data/lib/rubocop/cop/lint/shadowed_argument.rb +8 -7
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +19 -11
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +8 -3
- data/lib/rubocop/cop/lint/syntax.rb +10 -4
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +2 -4
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -1
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +88 -0
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +3 -1
- data/lib/rubocop/cop/lint/unified_integer.rb +0 -4
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +4 -3
- data/lib/rubocop/cop/lint/unreachable_code.rb +56 -9
- data/lib/rubocop/cop/lint/unreachable_loop.rb +14 -8
- data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -0
- data/lib/rubocop/cop/lint/uri_regexp.rb +25 -7
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +36 -10
- data/lib/rubocop/cop/lint/useless_assignment.rb +21 -16
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
- data/lib/rubocop/cop/lint/useless_default_value_argument.rb +90 -0
- data/lib/rubocop/cop/lint/useless_defined.rb +55 -0
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +4 -4
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +79 -0
- data/lib/rubocop/cop/lint/useless_or.rb +98 -0
- data/lib/rubocop/cop/lint/useless_rescue.rb +2 -2
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +5 -5
- data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -29
- data/lib/rubocop/cop/lint/useless_times.rb +2 -2
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +121 -0
- data/lib/rubocop/cop/lint/void.rb +92 -18
- data/lib/rubocop/cop/message_annotator.rb +7 -3
- data/lib/rubocop/cop/metrics/abc_size.rb +4 -4
- data/lib/rubocop/cop/metrics/block_length.rb +7 -5
- data/lib/rubocop/cop/metrics/block_nesting.rb +20 -8
- data/lib/rubocop/cop/metrics/class_length.rb +21 -15
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +5 -2
- data/lib/rubocop/cop/metrics/method_length.rb +15 -6
- data/lib/rubocop/cop/metrics/module_length.rb +7 -6
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +8 -9
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/mixin/alignment.rb +8 -4
- data/lib/rubocop/cop/mixin/allowed_methods.rb +7 -1
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +15 -3
- data/lib/rubocop/cop/mixin/annotation_comment.rb +0 -2
- data/lib/rubocop/cop/mixin/check_assignment.rb +4 -12
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +22 -12
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +49 -0
- data/lib/rubocop/cop/mixin/code_length.rb +12 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +23 -14
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -0
- data/lib/rubocop/cop/mixin/configurable_max.rb +5 -1
- data/lib/rubocop/cop/mixin/def_node.rb +1 -1
- data/lib/rubocop/cop/mixin/dig_help.rb +27 -0
- 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 +24 -0
- data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
- data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +23 -12
- data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +15 -14
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +45 -35
- data/lib/rubocop/cop/mixin/hash_subset.rb +203 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
- data/lib/rubocop/cop/mixin/line_length_help.rb +34 -12
- data/lib/rubocop/cop/mixin/method_complexity.rb +17 -7
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -9
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_array.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +68 -30
- data/lib/rubocop/cop/mixin/range_help.rb +15 -4
- data/lib/rubocop/cop/mixin/rescue_node.rb +4 -0
- data/lib/rubocop/cop/mixin/safe_assignment.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +11 -5
- data/lib/rubocop/cop/mixin/string_help.rb +2 -2
- data/lib/rubocop/cop/mixin/string_literals_help.rb +12 -0
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +21 -5
- data/lib/rubocop/cop/naming/accessor_method_name.rb +11 -6
- data/lib/rubocop/cop/naming/block_forwarding.rb +39 -8
- data/lib/rubocop/cop/naming/constant_name.rb +7 -9
- data/lib/rubocop/cop/naming/file_name.rb +4 -6
- data/lib/rubocop/cop/naming/inclusive_language.rb +13 -5
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +13 -14
- data/lib/rubocop/cop/naming/method_name.rb +187 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +319 -0
- data/lib/rubocop/cop/naming/predicate_prefix.rb +204 -0
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +14 -13
- data/lib/rubocop/cop/naming/variable_name.rb +50 -6
- data/lib/rubocop/cop/naming/variable_number.rb +2 -3
- data/lib/rubocop/cop/offense.rb +4 -5
- data/lib/rubocop/cop/registry.rb +9 -6
- data/lib/rubocop/cop/security/compound_hash.rb +4 -2
- data/lib/rubocop/cop/security/eval.rb +2 -1
- data/lib/rubocop/cop/security/json_load.rb +33 -11
- data/lib/rubocop/cop/security/open.rb +3 -2
- data/lib/rubocop/cop/security/yaml_load.rb +3 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +172 -32
- data/lib/rubocop/cop/style/accessor_grouping.rb +43 -9
- data/lib/rubocop/cop/style/alias.rb +2 -1
- data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +79 -0
- data/lib/rubocop/cop/style/and_or.rb +1 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +228 -36
- data/lib/rubocop/cop/style/array_first_last.rb +80 -0
- data/lib/rubocop/cop/style/array_intersect.rb +115 -39
- data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +47 -0
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +21 -14
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +2 -2
- data/lib/rubocop/cop/style/bitwise_predicate.rb +107 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +52 -21
- data/lib/rubocop/cop/style/case_like_if.rb +14 -17
- data/lib/rubocop/cop/style/class_and_module_children.rb +52 -11
- data/lib/rubocop/cop/style/class_check.rb +1 -0
- data/lib/rubocop/cop/style/class_equality_comparison.rb +1 -1
- data/lib/rubocop/cop/style/class_vars.rb +3 -3
- data/lib/rubocop/cop/style/collection_compact.rb +25 -15
- data/lib/rubocop/cop/style/collection_methods.rb +2 -1
- data/lib/rubocop/cop/style/collection_querying.rb +167 -0
- data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +22 -8
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +30 -4
- data/lib/rubocop/cop/style/comparable_between.rb +78 -0
- data/lib/rubocop/cop/style/concat_array_literals.rb +2 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +57 -40
- data/lib/rubocop/cop/style/constant_visibility.rb +16 -20
- data/lib/rubocop/cop/style/copyright.rb +31 -21
- data/lib/rubocop/cop/style/data_inheritance.rb +8 -1
- data/lib/rubocop/cop/style/date_time.rb +5 -4
- data/lib/rubocop/cop/style/def_with_parentheses.rb +18 -7
- data/lib/rubocop/cop/style/dig_chain.rb +89 -0
- data/lib/rubocop/cop/style/documentation.rb +25 -25
- data/lib/rubocop/cop/style/documentation_method.rb +20 -0
- data/lib/rubocop/cop/style/double_negation.rb +5 -5
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +11 -15
- data/lib/rubocop/cop/style/each_with_object.rb +3 -4
- data/lib/rubocop/cop/style/empty_else.rb +10 -7
- data/lib/rubocop/cop/style/empty_heredoc.rb +1 -14
- data/lib/rubocop/cop/style/empty_literal.rb +36 -23
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +100 -0
- data/lib/rubocop/cop/style/endless_method.rb +163 -18
- data/lib/rubocop/cop/style/eval_with_location.rb +23 -31
- data/lib/rubocop/cop/style/exact_regexp_match.rb +6 -5
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +19 -6
- data/lib/rubocop/cop/style/exponential_notation.rb +6 -5
- data/lib/rubocop/cop/style/fetch_env_var.rb +34 -7
- data/lib/rubocop/cop/style/file_null.rb +89 -0
- data/lib/rubocop/cop/style/file_read.rb +2 -5
- data/lib/rubocop/cop/style/file_touch.rb +75 -0
- data/lib/rubocop/cop/style/file_write.rb +2 -5
- data/lib/rubocop/cop/style/float_division.rb +23 -5
- data/lib/rubocop/cop/style/for.rb +3 -1
- data/lib/rubocop/cop/style/format_string.rb +9 -9
- data/lib/rubocop/cop/style/format_string_token.rb +38 -11
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
- data/lib/rubocop/cop/style/global_std_stream.rb +10 -1
- data/lib/rubocop/cop/style/global_vars.rb +1 -3
- data/lib/rubocop/cop/style/guard_clause.rb +20 -4
- data/lib/rubocop/cop/style/hash_conversion.rb +16 -9
- data/lib/rubocop/cop/style/hash_each_methods.rb +110 -12
- data/lib/rubocop/cop/style/hash_except.rb +38 -146
- data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
- data/lib/rubocop/cop/style/hash_slice.rb +80 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +35 -7
- data/lib/rubocop/cop/style/hash_transform_keys.rb +2 -2
- data/lib/rubocop/cop/style/hash_transform_values.rb +2 -2
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +37 -7
- data/lib/rubocop/cop/style/if_inside_else.rb +11 -15
- data/lib/rubocop/cop/style/if_unless_modifier.rb +36 -9
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +4 -7
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +8 -8
- data/lib/rubocop/cop/style/if_with_semicolon.rb +60 -6
- data/lib/rubocop/cop/style/in_pattern_then.rb +6 -2
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +22 -18
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +48 -6
- data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
- data/lib/rubocop/cop/style/it_assignment.rb +93 -0
- data/lib/rubocop/cop/style/it_block_parameter.rb +121 -0
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +67 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
- data/lib/rubocop/cop/style/lambda.rb +2 -1
- data/lib/rubocop/cop/style/lambda_call.rb +10 -4
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/magic_comment_format.rb +1 -1
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +82 -50
- data/lib/rubocop/cop/style/map_into_array.rb +236 -0
- data/lib/rubocop/cop/style/map_to_hash.rb +29 -10
- data/lib/rubocop/cop/style/map_to_set.rb +4 -5
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +52 -25
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +21 -5
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +30 -13
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +2 -2
- data/lib/rubocop/cop/style/min_max_comparison.rb +13 -5
- data/lib/rubocop/cop/style/missing_else.rb +2 -4
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +35 -5
- data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -2
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -0
- data/lib/rubocop/cop/style/multiline_memoization.rb +2 -2
- data/lib/rubocop/cop/style/multiline_method_signature.rb +10 -9
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +5 -3
- data/lib/rubocop/cop/style/multiline_when_then.rb +0 -4
- data/lib/rubocop/cop/style/multiple_comparison.rb +53 -60
- data/lib/rubocop/cop/style/mutable_constant.rb +7 -8
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +7 -5
- data/lib/rubocop/cop/style/nested_modifier.rb +1 -1
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -2
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +5 -4
- data/lib/rubocop/cop/style/next.rb +45 -1
- data/lib/rubocop/cop/style/nil_comparison.rb +11 -7
- data/lib/rubocop/cop/style/not.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
- data/lib/rubocop/cop/style/numeric_predicate.rb +12 -4
- data/lib/rubocop/cop/style/object_then.rb +16 -14
- data/lib/rubocop/cop/style/one_line_conditional.rb +48 -15
- data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
- data/lib/rubocop/cop/style/operator_method_call.rb +27 -9
- data/lib/rubocop/cop/style/or_assignment.rb +3 -6
- data/lib/rubocop/cop/style/parallel_assignment.rb +47 -45
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +8 -0
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/proc.rb +2 -2
- data/lib/rubocop/cop/style/quoted_symbols.rb +2 -4
- data/lib/rubocop/cop/style/raise_args.rb +19 -14
- data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
- data/lib/rubocop/cop/style/redundant_argument.rb +29 -3
- data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
- data/lib/rubocop/cop/style/redundant_assignment.rb +11 -3
- data/lib/rubocop/cop/style/redundant_begin.rb +41 -2
- data/lib/rubocop/cop/style/redundant_condition.rb +97 -25
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +19 -7
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +17 -14
- data/lib/rubocop/cop/style/redundant_each.rb +7 -4
- data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +4 -12
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +5 -4
- data/lib/rubocop/cop/style/redundant_format.rb +283 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +4 -4
- data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +46 -0
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +72 -19
- data/lib/rubocop/cop/style/redundant_parentheses.rb +149 -49
- data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +12 -1
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +16 -24
- data/lib/rubocop/cop/style/redundant_return.rb +9 -3
- data/lib/rubocop/cop/style/redundant_self.rb +32 -20
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +20 -32
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +4 -4
- data/lib/rubocop/cop/style/redundant_sort.rb +10 -9
- data/lib/rubocop/cop/style/redundant_sort_by.rb +19 -3
- data/lib/rubocop/cop/style/redundant_string_escape.rb +3 -3
- data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
- data/lib/rubocop/cop/style/require_order.rb +2 -2
- data/lib/rubocop/cop/style/rescue_modifier.rb +18 -4
- data/lib/rubocop/cop/style/return_nil.rb +2 -2
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +54 -12
- data/lib/rubocop/cop/style/safe_navigation.rb +163 -62
- data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
- data/lib/rubocop/cop/style/sample.rb +3 -4
- data/lib/rubocop/cop/style/select_by_regexp.rb +20 -13
- data/lib/rubocop/cop/style/self_assignment.rb +12 -18
- data/lib/rubocop/cop/style/semicolon.rb +33 -9
- data/lib/rubocop/cop/style/send.rb +4 -4
- data/lib/rubocop/cop/style/send_with_literal_method_name.rb +105 -0
- data/lib/rubocop/cop/style/signal_exception.rb +2 -3
- data/lib/rubocop/cop/style/single_argument_dig.rb +16 -8
- data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +18 -5
- data/lib/rubocop/cop/style/single_line_methods.rb +13 -11
- data/lib/rubocop/cop/style/slicing_with_range.rb +105 -10
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +79 -87
- data/lib/rubocop/cop/style/special_global_vars.rb +2 -3
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/string_chars.rb +1 -0
- data/lib/rubocop/cop/style/string_concatenation.rb +21 -17
- data/lib/rubocop/cop/style/string_literals.rb +1 -1
- data/lib/rubocop/cop/style/string_methods.rb +1 -1
- data/lib/rubocop/cop/style/strip.rb +7 -4
- data/lib/rubocop/cop/style/struct_inheritance.rb +9 -2
- data/lib/rubocop/cop/style/super_arguments.rb +221 -0
- data/lib/rubocop/cop/style/super_with_args_parentheses.rb +35 -0
- data/lib/rubocop/cop/style/swap_values.rb +4 -15
- data/lib/rubocop/cop/style/symbol_array.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +78 -6
- data/lib/rubocop/cop/style/ternary_parentheses.rb +26 -5
- data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +56 -2
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -4
- 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/unpack_first.rb +11 -14
- data/lib/rubocop/cop/style/variable_interpolation.rb +1 -2
- data/lib/rubocop/cop/style/while_until_do.rb +0 -2
- data/lib/rubocop/cop/style/while_until_modifier.rb +0 -2
- data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
- data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +32 -24
- data/lib/rubocop/cop/team.rb +28 -4
- data/lib/rubocop/cop/util.rb +19 -6
- data/lib/rubocop/cop/utils/format_string.rb +20 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +24 -5
- data/lib/rubocop/cop/variable_force/branch.rb +1 -1
- data/lib/rubocop/cop/variable_force/scope.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +14 -3
- data/lib/rubocop/cop/variable_force/variable_table.rb +5 -5
- data/lib/rubocop/cop/variable_force.rb +43 -20
- data/lib/rubocop/cops_documentation_generator.rb +135 -58
- data/lib/rubocop/core_ext/string.rb +2 -6
- data/lib/rubocop/directive_comment.rb +54 -18
- data/lib/rubocop/ext/regexp_node.rb +17 -35
- data/lib/rubocop/ext/regexp_parser.rb +4 -21
- data/lib/rubocop/file_finder.rb +9 -4
- data/lib/rubocop/formatter/clang_style_formatter.rb +3 -7
- data/lib/rubocop/formatter/disabled_config_formatter.rb +43 -14
- data/lib/rubocop/formatter/formatter_set.rb +8 -2
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/html_formatter.rb +38 -15
- data/lib/rubocop/formatter/json_formatter.rb +0 -1
- data/lib/rubocop/formatter/junit_formatter.rb +70 -23
- data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +13 -3
- data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
- data/lib/rubocop/formatter/tap_formatter.rb +3 -7
- data/lib/rubocop/formatter.rb +1 -1
- data/lib/rubocop/lockfile.rb +58 -7
- data/lib/rubocop/lsp/diagnostic.rb +190 -0
- data/lib/rubocop/lsp/logger.rb +3 -3
- data/lib/rubocop/lsp/routes.rb +77 -40
- data/lib/rubocop/lsp/runtime.rb +20 -50
- data/lib/rubocop/lsp/server.rb +6 -4
- data/lib/rubocop/lsp/severity.rb +1 -1
- data/lib/rubocop/lsp/stdin_runner.rb +69 -0
- data/lib/rubocop/lsp.rb +36 -0
- data/lib/rubocop/magic_comment.rb +12 -4
- data/lib/rubocop/options.rb +43 -22
- data/lib/rubocop/path_util.rb +21 -10
- data/lib/rubocop/pending_cops_reporter.rb +56 -0
- data/lib/rubocop/plugin/configuration_integrator.rb +143 -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/rake_task.rb +5 -2
- data/lib/rubocop/remote_config.rb +5 -1
- data/lib/rubocop/result_cache.rb +29 -34
- data/lib/rubocop/rspec/cop_helper.rb +20 -2
- data/lib/rubocop/rspec/expect_offense.rb +31 -12
- data/lib/rubocop/rspec/shared_contexts.rb +112 -18
- data/lib/rubocop/rspec/support.rb +7 -2
- data/lib/rubocop/runner.rb +40 -13
- data/lib/rubocop/server/cache.rb +63 -11
- data/lib/rubocop/server/cli.rb +2 -2
- data/lib/rubocop/server/client_command/base.rb +10 -0
- data/lib/rubocop/server/client_command/exec.rb +3 -3
- data/lib/rubocop/server/client_command/start.rb +11 -1
- data/lib/rubocop/server/core.rb +5 -0
- data/lib/rubocop/server/server_command/exec.rb +0 -1
- data/lib/rubocop/target_finder.rb +93 -82
- data/lib/rubocop/target_ruby.rb +111 -81
- data/lib/rubocop/version.rb +67 -9
- data/lib/rubocop/yaml_duplication_checker.rb +20 -26
- data/lib/rubocop.rb +61 -3
- data/lib/ruby_lsp/rubocop/addon.rb +90 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
- metadata +103 -51
- data/lib/rubocop/cop/naming/predicate_name.rb +0 -134
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
- /data/lib/rubocop/formatter/{git_hub_actions_formatter.rb → github_actions_formatter.rb} +0 -0
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
module RuboCop
|
|
4
|
-
# This class finds target files to inspect by scanning the directory tree
|
|
5
|
-
# and picking ruby files.
|
|
4
|
+
# This class finds target files to inspect by scanning the directory tree and picking ruby files.
|
|
6
5
|
# @api private
|
|
7
6
|
class TargetFinder
|
|
8
7
|
HIDDEN_PATH_SUBSTRING = "#{File::SEPARATOR}."
|
|
@@ -12,21 +11,8 @@ module RuboCop
|
|
|
12
11
|
@options = options
|
|
13
12
|
end
|
|
14
13
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def debug?
|
|
20
|
-
@options[:debug]
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def fail_fast?
|
|
24
|
-
@options[:fail_fast]
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
# Generate a list of target files by expanding globbing patterns
|
|
28
|
-
# (if any). If args is empty, recursively find all Ruby source
|
|
29
|
-
# files under the current directory
|
|
14
|
+
# Generate a list of target files by expanding globbing patterns (if any). If args is empty,
|
|
15
|
+
# recursively find all Ruby source files under the current directory
|
|
30
16
|
# @return [Array] array of file paths
|
|
31
17
|
def find(args, mode)
|
|
32
18
|
return target_files_in_dir if args.empty?
|
|
@@ -44,12 +30,11 @@ module RuboCop
|
|
|
44
30
|
files.map { |f| File.expand_path(f) }.uniq
|
|
45
31
|
end
|
|
46
32
|
|
|
47
|
-
# Finds all Ruby source files under the current or other supplied
|
|
48
|
-
#
|
|
49
|
-
#
|
|
50
|
-
#
|
|
51
|
-
#
|
|
52
|
-
# so you can include other Ruby files like Rakefiles and gemspecs.
|
|
33
|
+
# Finds all Ruby source files under the current or other supplied directory. A Ruby source file
|
|
34
|
+
# is defined as a file with the `.rb` extension or a file with no extension that has a ruby
|
|
35
|
+
# shebang line as its first line.
|
|
36
|
+
# It is possible to specify includes and excludes using the config file, so you can include
|
|
37
|
+
# other Ruby files like Rakefiles and gemspecs.
|
|
53
38
|
# @param base_dir Root directory under which to search for
|
|
54
39
|
# ruby source files
|
|
55
40
|
# @return [Array] Array of filenames
|
|
@@ -57,29 +42,21 @@ module RuboCop
|
|
|
57
42
|
# Support Windows: Backslashes from command-line -> forward slashes
|
|
58
43
|
base_dir = base_dir.gsub(File::ALT_SEPARATOR, File::SEPARATOR) if File::ALT_SEPARATOR
|
|
59
44
|
all_files = find_files(base_dir, File::FNM_DOTMATCH)
|
|
60
|
-
# use file.include? for performance optimization
|
|
61
|
-
hidden_files = all_files.select { |file| file.include?(HIDDEN_PATH_SUBSTRING) }.sort
|
|
62
45
|
base_dir_config = @config_store.for(base_dir)
|
|
63
46
|
|
|
64
|
-
target_files =
|
|
47
|
+
target_files = if hidden_path?(base_dir)
|
|
48
|
+
all_files.select { |file| ruby_file?(file) }
|
|
49
|
+
else
|
|
50
|
+
all_files.select { |file| to_inspect?(file, base_dir_config) }
|
|
51
|
+
end
|
|
65
52
|
|
|
66
53
|
target_files.sort_by!(&order)
|
|
67
54
|
end
|
|
68
55
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
end && ruby_file?(file)
|
|
74
|
-
|
|
75
|
-
base_dir_config.file_to_include?(file)
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
# Search for files recursively starting at the given base directory using
|
|
79
|
-
# the given flags that determine how the match is made. Excluded files will
|
|
80
|
-
# be removed later by the caller, but as an optimization find_files removes
|
|
81
|
-
# the top level directories that are excluded in configuration in the
|
|
82
|
-
# normal way (dir/**/*).
|
|
56
|
+
# Search for files recursively starting at the given base directory using the given flags that
|
|
57
|
+
# determine how the match is made. Excluded files will be removed later by the caller, but as an
|
|
58
|
+
# optimization find_files removes the top level directories that are excluded in configuration
|
|
59
|
+
# in the normal way (dir/**/*).
|
|
83
60
|
def find_files(base_dir, flags)
|
|
84
61
|
# get all wanted directories first to improve speed of finding all files
|
|
85
62
|
exclude_pattern = combined_exclude_glob_patterns(base_dir)
|
|
@@ -93,9 +70,22 @@ module RuboCop
|
|
|
93
70
|
Dir.glob(patterns, flags).select { |path| FileTest.file?(path) }
|
|
94
71
|
end
|
|
95
72
|
|
|
73
|
+
private
|
|
74
|
+
|
|
75
|
+
def to_inspect?(file, base_dir_config)
|
|
76
|
+
return false if base_dir_config.file_to_exclude?(file)
|
|
77
|
+
return true if !hidden_path?(file) && ruby_file?(file)
|
|
78
|
+
|
|
79
|
+
base_dir_config.file_to_include?(file)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def hidden_path?(path)
|
|
83
|
+
path.include?(HIDDEN_PATH_SUBSTRING)
|
|
84
|
+
end
|
|
85
|
+
|
|
96
86
|
def wanted_dir_patterns(base_dir, exclude_pattern, flags)
|
|
97
87
|
# Escape glob characters in base_dir to avoid unwanted behavior.
|
|
98
|
-
base_dir = base_dir.gsub(/[
|
|
88
|
+
base_dir = base_dir.gsub(/[\\{}\[\]*?]/) do |reserved_glob_character|
|
|
99
89
|
"\\#{reserved_glob_character}"
|
|
100
90
|
end
|
|
101
91
|
|
|
@@ -124,21 +114,6 @@ module RuboCop
|
|
|
124
114
|
"#{base_dir}/{#{patterns.join(',')}}"
|
|
125
115
|
end
|
|
126
116
|
|
|
127
|
-
def ruby_extension?(file)
|
|
128
|
-
ruby_extensions.include?(File.extname(file))
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
def ruby_extensions
|
|
132
|
-
@ruby_extensions ||= begin
|
|
133
|
-
ext_patterns = all_cops_include.select { |pattern| pattern.start_with?('**/*.') }
|
|
134
|
-
ext_patterns.map { |pattern| pattern.sub('**/*', '') }
|
|
135
|
-
end
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
def ruby_filename?(file)
|
|
139
|
-
ruby_filenames.include?(File.basename(file))
|
|
140
|
-
end
|
|
141
|
-
|
|
142
117
|
def ruby_filenames
|
|
143
118
|
@ruby_filenames ||= begin
|
|
144
119
|
file_patterns = all_cops_include.reject { |pattern| pattern.start_with?('**/*.') }
|
|
@@ -150,53 +125,73 @@ module RuboCop
|
|
|
150
125
|
@all_cops_include ||= @config_store.for_pwd.for_all_cops['Include'].map(&:to_s)
|
|
151
126
|
end
|
|
152
127
|
|
|
153
|
-
def
|
|
154
|
-
|
|
128
|
+
def process_explicit_path(path, mode)
|
|
129
|
+
files = path.include?('*') ? Dir[path] : [path]
|
|
155
130
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
131
|
+
if mode == :only_recognized_file_types || force_exclusion?
|
|
132
|
+
files.select! { |file| included_file?(file) }
|
|
133
|
+
end
|
|
134
|
+
files.reject! { |file| FileTest.directory?(file) }
|
|
160
135
|
|
|
161
|
-
|
|
136
|
+
force_exclusion? ? without_excluded(files) : files
|
|
162
137
|
end
|
|
163
138
|
|
|
164
|
-
def
|
|
165
|
-
|
|
139
|
+
def without_excluded(files)
|
|
140
|
+
files.reject do |file|
|
|
141
|
+
# When --ignore-parent-exclusion is given, we must look at the configuration associated with
|
|
142
|
+
# the file, but in the default case when --ignore-parent-exclusion is not given, can safely
|
|
143
|
+
# look only at the configuration for the current directory, since it's only the Exclude
|
|
144
|
+
# parameters we're going to check.
|
|
145
|
+
config = @config_store.for(ignore_parent_exclusion? ? file : '.')
|
|
146
|
+
config.file_to_exclude?(file)
|
|
147
|
+
end
|
|
166
148
|
end
|
|
167
149
|
|
|
168
|
-
def
|
|
169
|
-
|
|
150
|
+
def included_file?(file)
|
|
151
|
+
ruby_file?(file) || configured_include?(file)
|
|
170
152
|
end
|
|
171
153
|
|
|
172
154
|
def ruby_file?(file)
|
|
173
155
|
stdin? || ruby_extension?(file) || ruby_filename?(file) || ruby_executable?(file)
|
|
174
156
|
end
|
|
175
157
|
|
|
176
|
-
def
|
|
177
|
-
@
|
|
158
|
+
def stdin?
|
|
159
|
+
@options.key?(:stdin)
|
|
178
160
|
end
|
|
179
161
|
|
|
180
|
-
def
|
|
181
|
-
|
|
162
|
+
def ruby_extension?(file)
|
|
163
|
+
ruby_extensions.include?(File.extname(file))
|
|
182
164
|
end
|
|
183
165
|
|
|
184
|
-
def
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
files.select! { |file| included_file?(file) }
|
|
166
|
+
def ruby_extensions
|
|
167
|
+
@ruby_extensions ||= begin
|
|
168
|
+
ext_patterns = all_cops_include.select { |pattern| pattern.start_with?('**/*.') }
|
|
169
|
+
ext_patterns.map { |pattern| pattern.sub('**/*', '') }
|
|
189
170
|
end
|
|
171
|
+
end
|
|
190
172
|
|
|
191
|
-
|
|
173
|
+
def ruby_filename?(file)
|
|
174
|
+
ruby_filenames.include?(File.basename(file))
|
|
175
|
+
end
|
|
192
176
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
config.file_to_exclude?(file)
|
|
196
|
-
end
|
|
177
|
+
def configured_include?(file)
|
|
178
|
+
@config_store.for_pwd.file_to_include?(file)
|
|
197
179
|
end
|
|
198
180
|
|
|
199
|
-
|
|
181
|
+
def ruby_executable?(file)
|
|
182
|
+
return false if !File.extname(file).empty? || !File.exist?(file) || File.empty?(file)
|
|
183
|
+
|
|
184
|
+
first_line = File.open(file, &:readline)
|
|
185
|
+
/#!.*(#{ruby_interpreters(file).join('|')})/.match?(first_line)
|
|
186
|
+
rescue EOFError, ArgumentError => e
|
|
187
|
+
warn("Unprocessable file #{file}: #{e.class}, #{e.message}") if debug?
|
|
188
|
+
|
|
189
|
+
false
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
def ruby_interpreters(file)
|
|
193
|
+
@config_store.for(file).for_all_cops['RubyInterpreters']
|
|
194
|
+
end
|
|
200
195
|
|
|
201
196
|
def order
|
|
202
197
|
if fail_fast?
|
|
@@ -206,5 +201,21 @@ module RuboCop
|
|
|
206
201
|
:itself
|
|
207
202
|
end
|
|
208
203
|
end
|
|
204
|
+
|
|
205
|
+
def force_exclusion?
|
|
206
|
+
@options[:force_exclusion]
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
def ignore_parent_exclusion?
|
|
210
|
+
@options[:ignore_parent_exclusion]
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
def debug?
|
|
214
|
+
@options[:debug]
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
def fail_fast?
|
|
218
|
+
@options[:fail_fast]
|
|
219
|
+
end
|
|
209
220
|
end
|
|
210
221
|
end
|
data/lib/rubocop/target_ruby.rb
CHANGED
|
@@ -4,7 +4,7 @@ module RuboCop
|
|
|
4
4
|
# The kind of Ruby that code inspected by RuboCop is written in.
|
|
5
5
|
# @api private
|
|
6
6
|
class TargetRuby
|
|
7
|
-
KNOWN_RUBIES = [2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 3.0, 3.1, 3.2, 3.3].freeze
|
|
7
|
+
KNOWN_RUBIES = [2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5].freeze
|
|
8
8
|
DEFAULT_VERSION = 2.7
|
|
9
9
|
|
|
10
10
|
OBSOLETE_RUBIES = {
|
|
@@ -34,6 +34,20 @@ module RuboCop
|
|
|
34
34
|
end
|
|
35
35
|
end
|
|
36
36
|
|
|
37
|
+
# The target ruby version may be configured by setting the
|
|
38
|
+
# `RUBOCOP_TARGET_RUBY_VERSION` environment variable.
|
|
39
|
+
class RuboCopEnvVar < Source
|
|
40
|
+
def name
|
|
41
|
+
'`RUBOCOP_TARGET_RUBY_VERSION` environment variable'
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
private
|
|
45
|
+
|
|
46
|
+
def find_version
|
|
47
|
+
ENV.fetch('RUBOCOP_TARGET_RUBY_VERSION', nil)&.to_f
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
37
51
|
# The target ruby version may be configured in RuboCop's config.
|
|
38
52
|
# @api private
|
|
39
53
|
class RuboCopConfig < Source
|
|
@@ -48,6 +62,99 @@ module RuboCop
|
|
|
48
62
|
end
|
|
49
63
|
end
|
|
50
64
|
|
|
65
|
+
# The target ruby version may be found in a .gemspec file.
|
|
66
|
+
# @api private
|
|
67
|
+
class GemspecFile < Source
|
|
68
|
+
extend NodePattern::Macros
|
|
69
|
+
|
|
70
|
+
# @!method required_ruby_version(node)
|
|
71
|
+
def_node_search :required_ruby_version, <<~PATTERN
|
|
72
|
+
(send _ :required_ruby_version= $_)
|
|
73
|
+
PATTERN
|
|
74
|
+
|
|
75
|
+
# @!method gem_requirement_versions(node)
|
|
76
|
+
def_node_matcher :gem_requirement_versions, <<~PATTERN
|
|
77
|
+
(send (const(const _ :Gem):Requirement) :new
|
|
78
|
+
{$str+ | (send $str :freeze)+ | (array $str+) | (array (send $str :freeze)+)}
|
|
79
|
+
)
|
|
80
|
+
PATTERN
|
|
81
|
+
|
|
82
|
+
def name
|
|
83
|
+
"`required_ruby_version` parameter (in #{gemspec_filepath})"
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
private
|
|
87
|
+
|
|
88
|
+
def find_version
|
|
89
|
+
file = gemspec_filepath
|
|
90
|
+
return unless file && File.file?(file)
|
|
91
|
+
|
|
92
|
+
right_hand_side = version_from_gemspec_file(file)
|
|
93
|
+
return if right_hand_side.nil?
|
|
94
|
+
|
|
95
|
+
find_minimal_known_ruby(right_hand_side)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def gemspec_filepath
|
|
99
|
+
return @gemspec_filepath if defined?(@gemspec_filepath)
|
|
100
|
+
|
|
101
|
+
@gemspec_filepath =
|
|
102
|
+
@config.traverse_directories_upwards(@config.base_dir_for_path_parameters) do |dir|
|
|
103
|
+
# NOTE: Can't use `dir.glob` because of JRuby 9.4.8.0 incompatibility:
|
|
104
|
+
# https://github.com/jruby/jruby/issues/8358
|
|
105
|
+
candidates = Pathname.glob("#{dir}/*.gemspec")
|
|
106
|
+
# Bundler will use a gemspec whatever the filename is, as long as its the only one in
|
|
107
|
+
# the folder.
|
|
108
|
+
break candidates.first if candidates.one?
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def version_from_gemspec_file(file)
|
|
113
|
+
# When using parser_prism, we need to use a Ruby version that Prism supports (3.3+)
|
|
114
|
+
# for parsing the gemspec file. This doesn't affect the detected Ruby version,
|
|
115
|
+
# it's just for the parsing step.
|
|
116
|
+
ruby_version_for_parsing = if @config.parser_engine == :parser_prism
|
|
117
|
+
3.3
|
|
118
|
+
else
|
|
119
|
+
DEFAULT_VERSION
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
processed_source = ProcessedSource.from_file(
|
|
123
|
+
file, ruby_version_for_parsing, parser_engine: @config.parser_engine
|
|
124
|
+
)
|
|
125
|
+
return unless processed_source.valid_syntax?
|
|
126
|
+
|
|
127
|
+
required_ruby_version(processed_source.ast).first
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def version_from_right_hand_side(right_hand_side)
|
|
131
|
+
gem_requirement_versions = gem_requirement_versions(right_hand_side)
|
|
132
|
+
|
|
133
|
+
if right_hand_side.array_type? && right_hand_side.children.all?(&:str_type?)
|
|
134
|
+
version_from_array(right_hand_side)
|
|
135
|
+
elsif gem_requirement_versions
|
|
136
|
+
gem_requirement_versions.map(&:value)
|
|
137
|
+
elsif right_hand_side.str_type?
|
|
138
|
+
right_hand_side.value
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def version_from_array(array)
|
|
143
|
+
array.children.map(&:value)
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def find_minimal_known_ruby(right_hand_side)
|
|
147
|
+
version = version_from_right_hand_side(right_hand_side)
|
|
148
|
+
return unless version
|
|
149
|
+
|
|
150
|
+
requirement = Gem::Requirement.new(version)
|
|
151
|
+
|
|
152
|
+
KNOWN_RUBIES.detect do |v|
|
|
153
|
+
requirement.satisfied_by?(Gem::Version.new("#{v}.99"))
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
|
|
51
158
|
# The target ruby version may be found in a .ruby-version file.
|
|
52
159
|
# @api private
|
|
53
160
|
class RubyVersionFile < Source
|
|
@@ -143,84 +250,6 @@ module RuboCop
|
|
|
143
250
|
end
|
|
144
251
|
end
|
|
145
252
|
|
|
146
|
-
# The target ruby version may be found in a .gemspec file.
|
|
147
|
-
# @api private
|
|
148
|
-
class GemspecFile < Source
|
|
149
|
-
extend NodePattern::Macros
|
|
150
|
-
|
|
151
|
-
GEMSPEC_EXTENSION = '.gemspec'
|
|
152
|
-
|
|
153
|
-
# @!method required_ruby_version(node)
|
|
154
|
-
def_node_search :required_ruby_version, <<~PATTERN
|
|
155
|
-
(send _ :required_ruby_version= $_)
|
|
156
|
-
PATTERN
|
|
157
|
-
|
|
158
|
-
# @!method gem_requirement_versions(node)
|
|
159
|
-
def_node_matcher :gem_requirement_versions, <<~PATTERN
|
|
160
|
-
(send (const(const _ :Gem):Requirement) :new
|
|
161
|
-
{$str+ | (send $str :freeze)+ | (array $str+) | (array (send $str :freeze)+)}
|
|
162
|
-
)
|
|
163
|
-
PATTERN
|
|
164
|
-
|
|
165
|
-
def name
|
|
166
|
-
"`required_ruby_version` parameter (in #{gemspec_filename})"
|
|
167
|
-
end
|
|
168
|
-
|
|
169
|
-
private
|
|
170
|
-
|
|
171
|
-
def find_version
|
|
172
|
-
file = gemspec_filepath
|
|
173
|
-
return unless file && File.file?(file)
|
|
174
|
-
|
|
175
|
-
right_hand_side = version_from_gemspec_file(file)
|
|
176
|
-
return if right_hand_side.nil?
|
|
177
|
-
|
|
178
|
-
find_default_minimal_known_ruby(right_hand_side)
|
|
179
|
-
end
|
|
180
|
-
|
|
181
|
-
def gemspec_filename
|
|
182
|
-
@gemspec_filename ||= begin
|
|
183
|
-
basename = Pathname.new(@config.base_dir_for_path_parameters).basename.to_s
|
|
184
|
-
"#{basename}#{GEMSPEC_EXTENSION}"
|
|
185
|
-
end
|
|
186
|
-
end
|
|
187
|
-
|
|
188
|
-
def gemspec_filepath
|
|
189
|
-
@gemspec_filepath ||=
|
|
190
|
-
@config.find_file_upwards(gemspec_filename, @config.base_dir_for_path_parameters)
|
|
191
|
-
end
|
|
192
|
-
|
|
193
|
-
def version_from_gemspec_file(file)
|
|
194
|
-
processed_source = ProcessedSource.from_file(file, DEFAULT_VERSION)
|
|
195
|
-
required_ruby_version(processed_source.ast).first
|
|
196
|
-
end
|
|
197
|
-
|
|
198
|
-
def version_from_right_hand_side(right_hand_side)
|
|
199
|
-
gem_requirement_versions = gem_requirement_versions(right_hand_side)
|
|
200
|
-
|
|
201
|
-
if right_hand_side.array_type?
|
|
202
|
-
version_from_array(right_hand_side)
|
|
203
|
-
elsif gem_requirement_versions
|
|
204
|
-
gem_requirement_versions.map(&:value)
|
|
205
|
-
else
|
|
206
|
-
right_hand_side.value
|
|
207
|
-
end
|
|
208
|
-
end
|
|
209
|
-
|
|
210
|
-
def version_from_array(array)
|
|
211
|
-
array.children.map(&:value)
|
|
212
|
-
end
|
|
213
|
-
|
|
214
|
-
def find_default_minimal_known_ruby(right_hand_side)
|
|
215
|
-
version = version_from_right_hand_side(right_hand_side)
|
|
216
|
-
requirement = Gem::Requirement.new(version)
|
|
217
|
-
|
|
218
|
-
KNOWN_RUBIES.detect do |v|
|
|
219
|
-
v >= DEFAULT_VERSION && requirement.satisfied_by?(Gem::Version.new("#{v}.99"))
|
|
220
|
-
end
|
|
221
|
-
end
|
|
222
|
-
end
|
|
223
|
-
|
|
224
253
|
# If all else fails, a default version will be picked.
|
|
225
254
|
# @api private
|
|
226
255
|
class Default < Source
|
|
@@ -240,11 +269,12 @@ module RuboCop
|
|
|
240
269
|
end
|
|
241
270
|
|
|
242
271
|
SOURCES = [
|
|
272
|
+
RuboCopEnvVar,
|
|
243
273
|
RuboCopConfig,
|
|
274
|
+
GemspecFile,
|
|
244
275
|
RubyVersionFile,
|
|
245
276
|
ToolVersionsFile,
|
|
246
277
|
BundlerLockFile,
|
|
247
|
-
GemspecFile,
|
|
248
278
|
Default
|
|
249
279
|
].freeze
|
|
250
280
|
|
|
@@ -267,7 +297,7 @@ module RuboCop
|
|
|
267
297
|
|
|
268
298
|
def rubocop_version_with_support
|
|
269
299
|
if supported?
|
|
270
|
-
RuboCop::Version
|
|
300
|
+
RuboCop::Version::STRING
|
|
271
301
|
else
|
|
272
302
|
OBSOLETE_RUBIES[version]
|
|
273
303
|
end
|
data/lib/rubocop/version.rb
CHANGED
|
@@ -3,25 +3,33 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
# This module holds the RuboCop version information.
|
|
5
5
|
module Version
|
|
6
|
-
STRING = '1.
|
|
6
|
+
STRING = '1.81.7'
|
|
7
7
|
|
|
8
|
-
MSG = '%<version>s (using
|
|
8
|
+
MSG = '%<version>s (using %<parser_version>s, ' \
|
|
9
9
|
'rubocop-ast %<rubocop_ast_version>s, ' \
|
|
10
|
+
'analyzing as Ruby %<target_ruby_version>s, ' \
|
|
10
11
|
'running on %<ruby_engine>s %<ruby_version>s)%<server_mode>s [%<ruby_platform>s]'
|
|
11
12
|
|
|
13
|
+
MINIMUM_PARSABLE_PRISM_VERSION = 3.3
|
|
14
|
+
|
|
12
15
|
CANONICAL_FEATURE_NAMES = {
|
|
13
16
|
'Rspec' => 'RSpec', 'Graphql' => 'GraphQL', 'Md' => 'Markdown', 'Factory_bot' => 'FactoryBot',
|
|
14
|
-
'Thread_safety' => 'ThreadSafety'
|
|
17
|
+
'Thread_safety' => 'ThreadSafety', 'Rspec_rails' => 'RSpecRails'
|
|
15
18
|
}.freeze
|
|
16
19
|
EXTENSION_PATH_NAMES = {
|
|
17
20
|
'rubocop-md' => 'markdown', 'rubocop-factory_bot' => 'factory_bot'
|
|
18
21
|
}.freeze
|
|
19
22
|
|
|
23
|
+
# NOTE: Marked as private but used by gems like standard.
|
|
20
24
|
# @api private
|
|
25
|
+
# rubocop:disable Metrics/MethodLength
|
|
21
26
|
def self.version(debug: false, env: nil)
|
|
22
27
|
if debug
|
|
23
|
-
|
|
28
|
+
target_ruby_version = target_ruby_version(env)
|
|
29
|
+
verbose_version = format(MSG, version: STRING,
|
|
30
|
+
parser_version: parser_version(target_ruby_version),
|
|
24
31
|
rubocop_ast_version: RuboCop::AST::Version::STRING,
|
|
32
|
+
target_ruby_version: target_ruby_version,
|
|
25
33
|
ruby_engine: RUBY_ENGINE, ruby_version: RUBY_VERSION,
|
|
26
34
|
server_mode: server_mode,
|
|
27
35
|
ruby_platform: RUBY_PLATFORM)
|
|
@@ -38,16 +46,45 @@ module RuboCop
|
|
|
38
46
|
STRING
|
|
39
47
|
end
|
|
40
48
|
end
|
|
49
|
+
# rubocop:enable Metrics/MethodLength
|
|
50
|
+
|
|
51
|
+
# @api private
|
|
52
|
+
def self.verbose(env: nil)
|
|
53
|
+
version(debug: true, env: env)
|
|
54
|
+
end
|
|
41
55
|
|
|
42
56
|
# @api private
|
|
57
|
+
def self.parser_version(target_ruby_version)
|
|
58
|
+
config_path = ConfigFinder.find_config_path(Dir.pwd)
|
|
59
|
+
yaml = Util.silence_warnings do
|
|
60
|
+
ConfigLoader.load_yaml_configuration(config_path)
|
|
61
|
+
end
|
|
62
|
+
parser_engine = yaml.dig('AllCops', 'ParserEngine')
|
|
63
|
+
parser_engine_text = ", #{parser_engine}" if parser_engine
|
|
64
|
+
|
|
65
|
+
if target_ruby_version >= MINIMUM_PARSABLE_PRISM_VERSION
|
|
66
|
+
"Parser #{Parser::VERSION}, Prism #{Prism::VERSION}#{parser_engine_text}"
|
|
67
|
+
else
|
|
68
|
+
"Parser #{Parser::VERSION}"
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# @api private
|
|
73
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
|
43
74
|
def self.extension_versions(env)
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
75
|
+
plugins = config_for_pwd(env).loaded_plugins
|
|
76
|
+
plugin_versions = plugins.filter_map do |plugin|
|
|
77
|
+
next if Plugin::BUILTIN_INTERNAL_PLUGINS.key?(plugin.about.name)
|
|
78
|
+
next unless (plugin_name = plugin.about.name)
|
|
79
|
+
|
|
80
|
+
" - #{plugin_name} #{plugin.about.version}"
|
|
48
81
|
end
|
|
49
82
|
|
|
50
|
-
|
|
83
|
+
# TODO: It needs to be maintained for a while to ensure compatibility with extensions that
|
|
84
|
+
# don't support plugins. It should be removed in future once the old style becomes obsolete.
|
|
85
|
+
features = config_for_pwd(env).loaded_features.sort
|
|
86
|
+
features -= plugins.map { |plugin| plugin.about.name }
|
|
87
|
+
feature_versions = features.filter_map do |loaded_feature|
|
|
51
88
|
next unless (match = loaded_feature.match(/rubocop-(?<feature>.*)/))
|
|
52
89
|
|
|
53
90
|
# Get the expected name of the folder containing the extension code.
|
|
@@ -66,6 +103,27 @@ module RuboCop
|
|
|
66
103
|
|
|
67
104
|
" - #{loaded_feature} #{feature_version}"
|
|
68
105
|
end
|
|
106
|
+
|
|
107
|
+
plugin_versions + feature_versions
|
|
108
|
+
end
|
|
109
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
|
110
|
+
|
|
111
|
+
# @api private
|
|
112
|
+
def self.target_ruby_version(env)
|
|
113
|
+
if env
|
|
114
|
+
config_for_pwd(env).target_ruby_version
|
|
115
|
+
else
|
|
116
|
+
TargetRuby.new(Config.new).version
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# @api private
|
|
121
|
+
def self.config_for_pwd(env)
|
|
122
|
+
Util.silence_warnings do
|
|
123
|
+
# Suppress any config issues when loading the config (ie. deprecations,
|
|
124
|
+
# pending cops, etc.).
|
|
125
|
+
env.config_store.unvalidated.for_pwd
|
|
126
|
+
end
|
|
69
127
|
end
|
|
70
128
|
|
|
71
129
|
# Returns feature version in one of two ways:
|
|
@@ -5,36 +5,30 @@ module RuboCop
|
|
|
5
5
|
# @api private
|
|
6
6
|
module YAMLDuplicationChecker
|
|
7
7
|
def self.check(yaml_string, filename, &on_duplicated)
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
YAML.parse(yaml_string, filename: filename)
|
|
13
|
-
else
|
|
14
|
-
YAML.parse(yaml_string, filename)
|
|
15
|
-
end
|
|
16
|
-
return unless tree
|
|
17
|
-
|
|
18
|
-
traverse(tree, &on_duplicated)
|
|
8
|
+
handler = DuplicationCheckHandler.new(&on_duplicated)
|
|
9
|
+
parser = Psych::Parser.new(handler)
|
|
10
|
+
parser.parse(yaml_string, filename)
|
|
11
|
+
parser.handler.root.children[0]
|
|
19
12
|
end
|
|
20
13
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
yield(exist, key) if exist
|
|
27
|
-
keys << key
|
|
28
|
-
traverse(value, &on_duplicated)
|
|
29
|
-
end
|
|
30
|
-
else
|
|
31
|
-
children = tree.children
|
|
32
|
-
return unless children
|
|
14
|
+
class DuplicationCheckHandler < Psych::TreeBuilder # :nodoc:
|
|
15
|
+
def initialize(&block)
|
|
16
|
+
super()
|
|
17
|
+
@block = block
|
|
18
|
+
end
|
|
33
19
|
|
|
34
|
-
|
|
20
|
+
def end_mapping
|
|
21
|
+
mapping_node = super
|
|
22
|
+
# OPTIMIZE: Use a hash for faster lookup since there can
|
|
23
|
+
# be quite a few keys at the top-level.
|
|
24
|
+
keys = {}
|
|
25
|
+
mapping_node.children.each_slice(2) do |key, _value|
|
|
26
|
+
duplicate = keys[key.value]
|
|
27
|
+
@block.call(duplicate, key) if duplicate
|
|
28
|
+
keys[key.value] = key
|
|
29
|
+
end
|
|
30
|
+
mapping_node
|
|
35
31
|
end
|
|
36
32
|
end
|
|
37
|
-
|
|
38
|
-
private_class_method :traverse
|
|
39
33
|
end
|
|
40
34
|
end
|