rubocop 1.67.0 → 1.75.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 +4 -4
- data/config/default.yml +266 -47
- data/config/internal_affairs.yml +20 -0
- data/config/obsoletion.yml +3 -1
- data/lib/rubocop/cached_data.rb +12 -4
- data/lib/rubocop/cli/command/execute_runner.rb +4 -4
- data/lib/rubocop/cli/command/show_cops.rb +24 -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 +1 -1
- data/lib/rubocop/comment_config.rb +2 -2
- data/lib/rubocop/config.rb +52 -10
- data/lib/rubocop/config_loader.rb +52 -9
- data/lib/rubocop/config_loader_resolver.rb +36 -10
- 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 +46 -2
- data/lib/rubocop/config_validator.rb +25 -14
- data/lib/rubocop/cop/autocorrect_logic.rb +36 -19
- data/lib/rubocop/cop/base.rb +7 -1
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
- data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
- data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +1 -12
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -0
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +1 -2
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +49 -5
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +0 -2
- data/lib/rubocop/cop/generator.rb +6 -0
- data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
- data/lib/rubocop/cop/internal_affairs/example_description.rb +8 -4
- 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/node_first_or_last_argument.rb +3 -2
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -1
- 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 +230 -0
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +91 -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_source_range.rb +3 -1
- 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 +13 -2
- data/lib/rubocop/cop/internal_affairs.rb +7 -16
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/argument_alignment.rb +2 -9
- data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +0 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +3 -2
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/class_structure.rb +9 -9
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +4 -4
- data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
- 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_line_after_guard_clause.rb +3 -3
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +7 -11
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +30 -4
- 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_exception_handling_keywords.rb +4 -5
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
- data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +3 -8
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -7
- 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_parameter_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/hash_alignment.rb +8 -6
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +8 -7
- data/lib/rubocop/cop/layout/leading_comment_space.rb +57 -2
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +11 -2
- 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 +123 -4
- 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 +3 -4
- data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
- data/lib/rubocop/cop/layout/redundant_line_break.rb +19 -46
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +6 -7
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -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 +2 -1
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +23 -21
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
- data/lib/rubocop/cop/layout/space_before_brackets.rb +8 -34
- 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 +11 -1
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +5 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +7 -0
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +0 -1
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +5 -3
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +118 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +10 -12
- data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +4 -1
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
- data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
- data/lib/rubocop/cop/lint/debugger.rb +3 -3
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +3 -2
- data/lib/rubocop/cop/lint/duplicate_branch.rb +39 -4
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +86 -19
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_set_element.rb +20 -7
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +14 -64
- data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
- 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/ensure_return.rb +1 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +0 -6
- data/lib/rubocop/cop/lint/float_comparison.rb +20 -14
- data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -4
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
- data/lib/rubocop/cop/lint/hash_new_with_keyword_arguments_as_default.rb +55 -0
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
- data/lib/rubocop/cop/lint/interpolation_check.rb +9 -0
- data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +3 -0
- data/lib/rubocop/cop/lint/literal_as_condition.rb +118 -9
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +1 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +24 -6
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +1 -1
- data/lib/rubocop/cop/lint/missing_super.rb +2 -2
- data/lib/rubocop/cop/lint/mixed_case_range.rb +5 -8
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +10 -6
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +2 -2
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +12 -3
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -3
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
- data/lib/rubocop/cop/lint/number_conversion.rb +0 -1
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -2
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +93 -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 +1 -5
- data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +12 -7
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +8 -7
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +3 -0
- data/lib/rubocop/cop/lint/redundant_with_object.rb +3 -0
- 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/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_type.rb +3 -7
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +17 -1
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +5 -1
- data/lib/rubocop/cop/lint/self_assignment.rb +8 -10
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +8 -1
- 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 +1 -1
- data/lib/rubocop/cop/lint/syntax.rb +4 -1
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +1 -1
- data/lib/rubocop/cop/lint/top_level_return_with_argument.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/unmodified_reduce_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +52 -2
- data/lib/rubocop/cop/lint/unreachable_loop.rb +6 -6
- data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +5 -4
- data/lib/rubocop/cop/lint/useless_assignment.rb +3 -1
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
- data/lib/rubocop/cop/lint/useless_defined.rb +55 -0
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +4 -0
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +2 -1
- data/lib/rubocop/cop/lint/useless_rescue.rb +2 -2
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -2
- data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -25
- data/lib/rubocop/cop/lint/void.rb +16 -12
- 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 +1 -0
- data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
- data/lib/rubocop/cop/metrics/class_length.rb +9 -9
- 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 +9 -1
- data/lib/rubocop/cop/metrics/module_length.rb +1 -1
- 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 +3 -4
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/mixin/alignment.rb +2 -2
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
- 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/comments_help.rb +8 -3
- 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/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 +3 -2
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +15 -14
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +22 -22
- 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 +5 -4
- data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -9
- 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/space_before_punctuation.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +8 -3
- data/lib/rubocop/cop/mixin/string_help.rb +2 -2
- data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
- 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 +6 -6
- data/lib/rubocop/cop/naming/block_forwarding.rb +20 -16
- data/lib/rubocop/cop/naming/constant_name.rb +6 -7
- data/lib/rubocop/cop/naming/file_name.rb +0 -2
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +12 -13
- data/lib/rubocop/cop/naming/method_name.rb +64 -8
- data/lib/rubocop/cop/naming/predicate_name.rb +44 -0
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +6 -14
- 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 +2 -3
- data/lib/rubocop/cop/registry.rb +9 -6
- data/lib/rubocop/cop/security/compound_hash.rb +2 -0
- data/lib/rubocop/cop/security/yaml_load.rb +3 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +114 -34
- data/lib/rubocop/cop/style/accessor_grouping.rb +19 -5
- 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 +47 -28
- data/lib/rubocop/cop/style/array_first_last.rb +18 -2
- data/lib/rubocop/cop/style/array_intersect.rb +42 -30
- data/lib/rubocop/cop/style/bitwise_predicate.rb +100 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +43 -25
- data/lib/rubocop/cop/style/case_like_if.rb +8 -11
- data/lib/rubocop/cop/style/class_and_module_children.rb +52 -11
- data/lib/rubocop/cop/style/class_equality_comparison.rb +1 -1
- data/lib/rubocop/cop/style/collection_methods.rb +2 -1
- data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +20 -3
- data/lib/rubocop/cop/style/comparable_between.rb +78 -0
- data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +39 -27
- data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
- data/lib/rubocop/cop/style/data_inheritance.rb +7 -0
- data/lib/rubocop/cop/style/dig_chain.rb +89 -0
- data/lib/rubocop/cop/style/documentation.rb +1 -1
- data/lib/rubocop/cop/style/double_negation.rb +4 -4
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +4 -7
- data/lib/rubocop/cop/style/each_with_object.rb +2 -3
- data/lib/rubocop/cop/style/empty_else.rb +4 -2
- data/lib/rubocop/cop/style/empty_literal.rb +5 -1
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/endless_method.rb +150 -18
- data/lib/rubocop/cop/style/eval_with_location.rb +4 -4
- data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -3
- 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 +3 -3
- data/lib/rubocop/cop/style/fetch_env_var.rb +2 -1
- data/lib/rubocop/cop/style/file_null.rb +89 -0
- data/lib/rubocop/cop/style/file_touch.rb +75 -0
- data/lib/rubocop/cop/style/float_division.rb +8 -4
- data/lib/rubocop/cop/style/for.rb +1 -1
- 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 +3 -0
- data/lib/rubocop/cop/style/global_vars.rb +1 -3
- data/lib/rubocop/cop/style/guard_clause.rb +17 -3
- data/lib/rubocop/cop/style/hash_conversion.rb +1 -2
- data/lib/rubocop/cop/style/hash_each_methods.rb +6 -8
- data/lib/rubocop/cop/style/hash_except.rb +35 -147
- 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 +9 -3
- 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 +25 -6
- data/lib/rubocop/cop/style/if_inside_else.rb +10 -14
- data/lib/rubocop/cop/style/if_unless_modifier.rb +25 -5
- 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 +3 -4
- data/lib/rubocop/cop/style/if_with_semicolon.rb +20 -9
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +15 -12
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +2 -2
- data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
- data/lib/rubocop/cop/style/it_assignment.rb +36 -0
- data/lib/rubocop/cop/style/it_block_parameter.rb +100 -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 +1 -0
- 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/map_into_array.rb +11 -3
- data/lib/rubocop/cop/style/map_to_hash.rb +1 -1
- data/lib/rubocop/cop/style/map_to_set.rb +3 -2
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +27 -17
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -0
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -11
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/missing_else.rb +2 -0
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +33 -3
- 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 +1 -1
- data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -9
- data/lib/rubocop/cop/style/multiple_comparison.rb +52 -51
- 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_parenthesized_calls.rb +1 -1
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +5 -4
- data/lib/rubocop/cop/style/next.rb +44 -0
- data/lib/rubocop/cop/style/not.rb +1 -1
- data/lib/rubocop/cop/style/object_then.rb +15 -15
- data/lib/rubocop/cop/style/one_line_conditional.rb +25 -4
- data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
- data/lib/rubocop/cop/style/operator_method_call.rb +5 -6
- data/lib/rubocop/cop/style/or_assignment.rb +3 -6
- data/lib/rubocop/cop/style/parallel_assignment.rb +9 -18
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
- 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 +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +15 -13
- data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
- data/lib/rubocop/cop/style/redundant_argument.rb +3 -1
- data/lib/rubocop/cop/style/redundant_assignment.rb +1 -1
- data/lib/rubocop/cop/style/redundant_begin.rb +2 -1
- data/lib/rubocop/cop/style/redundant_condition.rb +95 -23
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +16 -5
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
- data/lib/rubocop/cop/style/redundant_each.rb +1 -1
- data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
- data/lib/rubocop/cop/style/redundant_format.rb +257 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +3 -3
- data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +54 -18
- data/lib/rubocop/cop/style/redundant_parentheses.rb +56 -26
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +4 -0
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
- data/lib/rubocop/cop/style/redundant_return.rb +2 -2
- data/lib/rubocop/cop/style/redundant_self.rb +9 -15
- 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 +3 -3
- data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
- data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
- data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
- 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/safe_navigation.rb +32 -5
- data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
- data/lib/rubocop/cop/style/select_by_regexp.rb +5 -2
- data/lib/rubocop/cop/style/self_assignment.rb +11 -17
- data/lib/rubocop/cop/style/semicolon.rb +1 -1
- data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
- data/lib/rubocop/cop/style/signal_exception.rb +2 -3
- data/lib/rubocop/cop/style/single_argument_dig.rb +9 -5
- data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +15 -4
- data/lib/rubocop/cop/style/single_line_methods.rb +6 -7
- data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +42 -106
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
- data/lib/rubocop/cop/style/string_concatenation.rb +15 -15
- 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/struct_inheritance.rb +8 -1
- data/lib/rubocop/cop/style/super_arguments.rb +66 -19
- data/lib/rubocop/cop/style/swap_values.rb +4 -15
- data/lib/rubocop/cop/style/symbol_proc.rb +2 -0
- data/lib/rubocop/cop/style/ternary_parentheses.rb +25 -4
- data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +11 -2
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
- 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 +1 -1
- data/lib/rubocop/cop/style/variable_interpolation.rb +1 -2
- data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
- data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
- data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
- data/lib/rubocop/cop/util.rb +12 -5
- data/lib/rubocop/cop/utils/format_string.rb +10 -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 +5 -11
- data/lib/rubocop/cops_documentation_generator.rb +50 -25
- data/lib/rubocop/directive_comment.rb +45 -11
- data/lib/rubocop/ext/regexp_node.rb +0 -1
- data/lib/rubocop/formatter/disabled_config_formatter.rb +3 -2
- data/lib/rubocop/formatter/formatter_set.rb +1 -1
- data/lib/rubocop/formatter/html_formatter.rb +1 -1
- data/lib/rubocop/formatter/pacman_formatter.rb +1 -1
- data/lib/rubocop/lsp/diagnostic.rb +189 -0
- data/lib/rubocop/lsp/logger.rb +2 -2
- data/lib/rubocop/lsp/routes.rb +7 -23
- data/lib/rubocop/lsp/runtime.rb +18 -50
- data/lib/rubocop/lsp/server.rb +0 -2
- data/lib/rubocop/lsp/stdin_runner.rb +85 -0
- data/lib/rubocop/magic_comment.rb +11 -3
- data/lib/rubocop/options.rb +28 -12
- data/lib/rubocop/path_util.rb +15 -8
- 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 +4 -1
- data/lib/rubocop/result_cache.rb +13 -13
- data/lib/rubocop/rspec/cop_helper.rb +13 -1
- data/lib/rubocop/rspec/expect_offense.rb +6 -2
- data/lib/rubocop/rspec/shared_contexts.rb +38 -1
- data/lib/rubocop/rspec/support.rb +4 -2
- data/lib/rubocop/runner.rb +26 -15
- data/lib/rubocop/server/cache.rb +47 -11
- data/lib/rubocop/server/cli.rb +2 -2
- data/lib/rubocop/target_finder.rb +7 -2
- data/lib/rubocop/target_ruby.rb +17 -2
- data/lib/rubocop/version.rb +53 -12
- data/lib/rubocop.rb +32 -1
- data/lib/ruby_lsp/rubocop/addon.rb +75 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +65 -0
- metadata +79 -20
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -4,7 +4,7 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
6
|
# Checks for loops which iterate a constant number of times,
|
7
|
-
# using a Range literal and `#each`. This can be done more readably using
|
7
|
+
# using a `Range` literal and `#each`. This can be done more readably using
|
8
8
|
# `Integer#times`.
|
9
9
|
#
|
10
10
|
# This check only applies if the block takes no parameters.
|
@@ -53,8 +53,7 @@ module RuboCop
|
|
53
53
|
(block
|
54
54
|
(call
|
55
55
|
(begin
|
56
|
-
($
|
57
|
-
(int $_) (int $_)))
|
56
|
+
($range (int $_) (int $_)))
|
58
57
|
:each)
|
59
58
|
(args ...)
|
60
59
|
...)
|
@@ -65,8 +64,7 @@ module RuboCop
|
|
65
64
|
(block
|
66
65
|
(call
|
67
66
|
(begin
|
68
|
-
(
|
69
|
-
(int 0) (int _)))
|
67
|
+
(range (int 0) (int _)))
|
70
68
|
:each)
|
71
69
|
(args ...)
|
72
70
|
...)
|
@@ -77,8 +75,7 @@ module RuboCop
|
|
77
75
|
(block
|
78
76
|
(call
|
79
77
|
(begin
|
80
|
-
(
|
81
|
-
(int _) (int _)))
|
78
|
+
(range (int _) (int _)))
|
82
79
|
:each)
|
83
80
|
(args)
|
84
81
|
...)
|
@@ -58,7 +58,7 @@ module RuboCop
|
|
58
58
|
|
59
59
|
# @!method each_with_object_block_candidate?(node)
|
60
60
|
def_node_matcher :each_with_object_block_candidate?, <<~PATTERN
|
61
|
-
(block $(call _ {:inject :reduce} _) $_ $_)
|
61
|
+
(block $(call _ {:inject :reduce} _) $(args _ _) $_)
|
62
62
|
PATTERN
|
63
63
|
|
64
64
|
# @!method each_with_object_numblock_candidate?(node)
|
@@ -71,8 +71,7 @@ module RuboCop
|
|
71
71
|
|
72
72
|
first_arg, second_arg = *node.arguments
|
73
73
|
|
74
|
-
corrector.
|
75
|
-
corrector.replace(second_arg, first_arg.source)
|
74
|
+
corrector.swap(first_arg, second_arg)
|
76
75
|
|
77
76
|
if return_value_occupies_whole_line?(return_value)
|
78
77
|
corrector.remove(whole_line_expression(return_value))
|
@@ -131,6 +131,8 @@ module RuboCop
|
|
131
131
|
extend AutoCorrector
|
132
132
|
|
133
133
|
MSG = 'Redundant `else`-clause.'
|
134
|
+
NIL_STYLES = %i[nil both].freeze
|
135
|
+
EMPTY_STYLES = %i[empty both].freeze
|
134
136
|
|
135
137
|
def on_normal_if_unless(node)
|
136
138
|
check(node)
|
@@ -150,11 +152,11 @@ module RuboCop
|
|
150
152
|
end
|
151
153
|
|
152
154
|
def nil_style?
|
153
|
-
style
|
155
|
+
NIL_STYLES.include?(style)
|
154
156
|
end
|
155
157
|
|
156
158
|
def empty_style?
|
157
|
-
style
|
159
|
+
EMPTY_STYLES.include?(style)
|
158
160
|
end
|
159
161
|
|
160
162
|
def empty_check(node)
|
@@ -6,6 +6,10 @@ module RuboCop
|
|
6
6
|
# Checks for the use of a method, the result of which
|
7
7
|
# would be a literal, like an empty array, hash, or string.
|
8
8
|
#
|
9
|
+
# NOTE: When frozen string literals are enabled, `String.new`
|
10
|
+
# isn't corrected to an empty string since the former is
|
11
|
+
# mutable and the latter would be frozen.
|
12
|
+
#
|
9
13
|
# @example
|
10
14
|
# # bad
|
11
15
|
# a = Array.new
|
@@ -136,7 +140,7 @@ module RuboCop
|
|
136
140
|
def frozen_strings?
|
137
141
|
return true if frozen_string_literals_enabled?
|
138
142
|
|
139
|
-
frozen_string_cop_enabled = config.
|
143
|
+
frozen_string_cop_enabled = config.cop_enabled?('Style/FrozenStringLiteralComment')
|
140
144
|
frozen_string_cop_enabled &&
|
141
145
|
!frozen_string_literals_disabled? &&
|
142
146
|
string_literals_frozen_by_default?.nil?
|
@@ -5,8 +5,11 @@ module RuboCop
|
|
5
5
|
module Style
|
6
6
|
# Checks for endless methods.
|
7
7
|
#
|
8
|
-
# It can enforce
|
9
|
-
#
|
8
|
+
# It can enforce endless method definitions whenever possible or with single line methods.
|
9
|
+
# It can also disallow multiline endless method definitions or all endless definitions.
|
10
|
+
#
|
11
|
+
# `require_single_line` style enforces endless method definitions for single line methods.
|
12
|
+
# `require_always` style enforces endless method definitions for single statement methods.
|
10
13
|
#
|
11
14
|
# Other method definition types are not considered by this cop.
|
12
15
|
#
|
@@ -15,39 +18,120 @@ module RuboCop
|
|
15
18
|
# * allow_single_line (default) - only single line endless method definitions are allowed.
|
16
19
|
# * allow_always - all endless method definitions are allowed.
|
17
20
|
# * disallow - all endless method definitions are disallowed.
|
21
|
+
# * require_single_line - endless method definitions are required for single line methods.
|
22
|
+
# * require_always - all endless method definitions are required.
|
18
23
|
#
|
19
24
|
# NOTE: Incorrect endless method definitions will always be
|
20
25
|
# corrected to a multi-line definition.
|
21
26
|
#
|
22
27
|
# @example EnforcedStyle: allow_single_line (default)
|
28
|
+
# # bad, multi-line endless method
|
29
|
+
# def my_method = x.foo
|
30
|
+
# .bar
|
31
|
+
# .baz
|
32
|
+
#
|
23
33
|
# # good
|
24
|
-
# def my_method
|
34
|
+
# def my_method
|
35
|
+
# x
|
36
|
+
# end
|
25
37
|
#
|
26
|
-
# #
|
27
|
-
# def my_method
|
28
|
-
#
|
29
|
-
#
|
38
|
+
# # good
|
39
|
+
# def my_method = x
|
40
|
+
#
|
41
|
+
# # good
|
42
|
+
# def my_method
|
43
|
+
# x.foo
|
44
|
+
# .bar
|
45
|
+
# .baz
|
46
|
+
# end
|
30
47
|
#
|
31
48
|
# @example EnforcedStyle: allow_always
|
32
49
|
# # good
|
33
|
-
# def my_method
|
50
|
+
# def my_method
|
51
|
+
# x
|
52
|
+
# end
|
34
53
|
#
|
35
54
|
# # good
|
36
|
-
# def my_method
|
37
|
-
#
|
38
|
-
#
|
55
|
+
# def my_method = x
|
56
|
+
#
|
57
|
+
# # good
|
58
|
+
# def my_method = x.foo
|
59
|
+
# .bar
|
60
|
+
# .baz
|
61
|
+
#
|
62
|
+
# # good
|
63
|
+
# def my_method
|
64
|
+
# x.foo
|
65
|
+
# .bar
|
66
|
+
# .baz
|
67
|
+
# end
|
39
68
|
#
|
40
69
|
# @example EnforcedStyle: disallow
|
41
70
|
# # bad
|
42
|
-
# def my_method
|
71
|
+
# def my_method = x
|
72
|
+
#
|
73
|
+
# # bad
|
74
|
+
# def my_method = x.foo
|
75
|
+
# .bar
|
76
|
+
# .baz
|
77
|
+
#
|
78
|
+
# # good
|
79
|
+
# def my_method
|
80
|
+
# x
|
81
|
+
# end
|
82
|
+
#
|
83
|
+
# # good
|
84
|
+
# def my_method
|
85
|
+
# x.foo
|
86
|
+
# .bar
|
87
|
+
# .baz
|
88
|
+
# end
|
89
|
+
#
|
90
|
+
# @example EnforcedStyle: require_single_line
|
91
|
+
# # bad
|
92
|
+
# def my_method
|
93
|
+
# x
|
94
|
+
# end
|
95
|
+
#
|
96
|
+
# # bad
|
97
|
+
# def my_method = x.foo
|
98
|
+
# .bar
|
99
|
+
# .baz
|
100
|
+
#
|
101
|
+
# # good
|
102
|
+
# def my_method = x
|
103
|
+
#
|
104
|
+
# # good
|
105
|
+
# def my_method
|
106
|
+
# x.foo
|
107
|
+
# .bar
|
108
|
+
# .baz
|
109
|
+
# end
|
110
|
+
#
|
111
|
+
# @example EnforcedStyle: require_always
|
112
|
+
# # bad
|
113
|
+
# def my_method
|
114
|
+
# x
|
115
|
+
# end
|
43
116
|
#
|
44
117
|
# # bad
|
45
|
-
# def my_method
|
46
|
-
#
|
47
|
-
#
|
118
|
+
# def my_method
|
119
|
+
# x.foo
|
120
|
+
# .bar
|
121
|
+
# .baz
|
122
|
+
# end
|
123
|
+
#
|
124
|
+
# # good
|
125
|
+
# def my_method = x
|
126
|
+
#
|
127
|
+
# # good
|
128
|
+
# def my_method = x.foo
|
129
|
+
# .bar
|
130
|
+
# .baz
|
48
131
|
#
|
49
132
|
class EndlessMethod < Base
|
50
133
|
include ConfigurableEnforcedStyle
|
134
|
+
include EndlessMethodRewriter
|
51
135
|
extend TargetRubyVersion
|
52
136
|
extend AutoCorrector
|
53
137
|
|
@@ -56,12 +140,21 @@ module RuboCop
|
|
56
140
|
CORRECTION_STYLES = %w[multiline single_line].freeze
|
57
141
|
MSG = 'Avoid endless method definitions.'
|
58
142
|
MSG_MULTI_LINE = 'Avoid endless method definitions with multiple lines.'
|
143
|
+
MSG_REQUIRE_SINGLE = 'Use endless method definitions for single line methods.'
|
144
|
+
MSG_REQUIRE_ALWAYS = 'Use endless method definitions.'
|
59
145
|
|
60
146
|
def on_def(node)
|
61
|
-
if
|
62
|
-
|
63
|
-
|
147
|
+
return if node.assignment_method?
|
148
|
+
|
149
|
+
case style
|
150
|
+
when :allow_single_line, :allow_always
|
64
151
|
handle_allow_style(node)
|
152
|
+
when :disallow
|
153
|
+
handle_disallow_style(node)
|
154
|
+
when :require_single_line
|
155
|
+
handle_require_single_line_style(node)
|
156
|
+
when :require_always
|
157
|
+
handle_require_always_style(node)
|
65
158
|
end
|
66
159
|
end
|
67
160
|
|
@@ -76,6 +169,29 @@ module RuboCop
|
|
76
169
|
end
|
77
170
|
end
|
78
171
|
|
172
|
+
def handle_require_single_line_style(node)
|
173
|
+
if node.endless? && !node.single_line?
|
174
|
+
add_offense(node, message: MSG_MULTI_LINE) do |corrector|
|
175
|
+
correct_to_multiline(corrector, node)
|
176
|
+
end
|
177
|
+
elsif !node.endless? && can_be_made_endless?(node) && node.body.single_line?
|
178
|
+
return if too_long_when_made_endless?(node)
|
179
|
+
|
180
|
+
add_offense(node, message: MSG_REQUIRE_SINGLE) do |corrector|
|
181
|
+
corrector.replace(node, endless_replacement(node))
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
def handle_require_always_style(node)
|
187
|
+
return if node.endless? || !can_be_made_endless?(node)
|
188
|
+
return if too_long_when_made_endless?(node)
|
189
|
+
|
190
|
+
add_offense(node, message: MSG_REQUIRE_ALWAYS) do |corrector|
|
191
|
+
corrector.replace(node, endless_replacement(node))
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
79
195
|
def handle_disallow_style(node)
|
80
196
|
return unless node.endless?
|
81
197
|
|
@@ -92,9 +208,25 @@ module RuboCop
|
|
92
208
|
corrector.replace(node, replacement)
|
93
209
|
end
|
94
210
|
|
211
|
+
def endless_replacement(node)
|
212
|
+
<<~RUBY.strip
|
213
|
+
def #{node.method_name}#{arguments(node)} = #{node.body.source}
|
214
|
+
RUBY
|
215
|
+
end
|
216
|
+
|
95
217
|
def arguments(node, missing = '')
|
96
218
|
node.arguments.any? ? node.arguments.source : missing
|
97
219
|
end
|
220
|
+
|
221
|
+
def can_be_made_endless?(node)
|
222
|
+
node.body && !node.body.begin_type? && !node.body.kwbegin_type?
|
223
|
+
end
|
224
|
+
|
225
|
+
def too_long_when_made_endless?(node)
|
226
|
+
return false unless config.cop_enabled?('Layout/LineLength')
|
227
|
+
|
228
|
+
endless_replacement(node).length > config.for_cop('Layout/LineLength')['Max']
|
229
|
+
end
|
98
230
|
end
|
99
231
|
end
|
100
232
|
end
|
@@ -4,12 +4,12 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
6
|
# Ensures that eval methods (`eval`, `instance_eval`, `class_eval`
|
7
|
-
# and `module_eval`) are given filename and line number values (
|
8
|
-
# and
|
7
|
+
# and `module_eval`) are given filename and line number values (`+__FILE__+`
|
8
|
+
# and `+__LINE__+`). This data is used to ensure that any errors raised
|
9
9
|
# within the evaluated code will be given the correct identification
|
10
10
|
# in a backtrace.
|
11
11
|
#
|
12
|
-
# The cop also checks that the line number given relative to
|
12
|
+
# The cop also checks that the line number given relative to `+__LINE__+` is
|
13
13
|
# correct.
|
14
14
|
#
|
15
15
|
# This cop will autocorrect incorrect or missing filename and line number
|
@@ -86,7 +86,7 @@ module RuboCop
|
|
86
86
|
return if node.method?(:eval) && !valid_eval_receiver?(node.receiver)
|
87
87
|
|
88
88
|
code = node.first_argument
|
89
|
-
return unless code
|
89
|
+
return unless code&.type?(:str, :dstr)
|
90
90
|
|
91
91
|
check_location(node, code)
|
92
92
|
end
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
# Checks for exact regexp match inside Regexp literals.
|
6
|
+
# Checks for exact regexp match inside `Regexp` literals.
|
7
7
|
#
|
8
8
|
# @example
|
9
9
|
#
|
@@ -40,8 +40,7 @@ module RuboCop
|
|
40
40
|
def on_send(node)
|
41
41
|
return unless (receiver = node.receiver)
|
42
42
|
return unless (regexp = exact_regexp_match(node))
|
43
|
-
|
44
|
-
parsed_regexp = Regexp::Parser.parse(regexp)
|
43
|
+
return unless (parsed_regexp = parse_regexp(regexp))
|
45
44
|
return unless exact_match_pattern?(parsed_regexp)
|
46
45
|
|
47
46
|
prefer = "#{receiver.source} #{new_method(node)} '#{parsed_regexp[1].text}'"
|
@@ -137,11 +137,11 @@ module RuboCop
|
|
137
137
|
|
138
138
|
case depth(stripped_current_path)
|
139
139
|
when 0
|
140
|
-
range = arguments_range(current_path)
|
140
|
+
range = arguments_range(current_path.parent)
|
141
141
|
|
142
142
|
corrector.replace(range, '__FILE__')
|
143
143
|
when 1
|
144
|
-
range = arguments_range(current_path)
|
144
|
+
range = arguments_range(current_path.parent)
|
145
145
|
|
146
146
|
corrector.replace(range, '__dir__')
|
147
147
|
else
|
@@ -185,11 +185,6 @@ module RuboCop
|
|
185
185
|
corrector.remove(node.loc.dot)
|
186
186
|
corrector.remove(node.loc.selector)
|
187
187
|
end
|
188
|
-
|
189
|
-
def arguments_range(node)
|
190
|
-
range_between(node.parent.first_argument.source_range.begin_pos,
|
191
|
-
node.parent.last_argument.source_range.end_pos)
|
192
|
-
end
|
193
188
|
end
|
194
189
|
end
|
195
190
|
end
|
@@ -65,7 +65,7 @@ module RuboCop
|
|
65
65
|
yielding_block?(block_node) do |send_node, block_args, yield_args|
|
66
66
|
return unless yielding_arguments?(block_args, yield_args)
|
67
67
|
|
68
|
-
def_node = block_node.each_ancestor(:
|
68
|
+
def_node = block_node.each_ancestor(:any_def).first
|
69
69
|
# if `yield` is being called outside of a method context, ignore
|
70
70
|
# this is not a valid ruby pattern, but can happen in haml or erb,
|
71
71
|
# so this can cause crashes in haml_lint
|
@@ -123,7 +123,7 @@ module RuboCop
|
|
123
123
|
end
|
124
124
|
|
125
125
|
def call_like?(node)
|
126
|
-
node.
|
126
|
+
node.type?(:call, :zsuper, :super)
|
127
127
|
end
|
128
128
|
|
129
129
|
def insert_argument(node, corrector, block_name)
|
@@ -135,7 +135,13 @@ module RuboCop
|
|
135
135
|
end
|
136
136
|
|
137
137
|
def correct_call_node(node, corrector, block_name)
|
138
|
-
|
138
|
+
new_arguments = if node.zsuper_type?
|
139
|
+
args = build_new_arguments_for_zsuper(node) << "&#{block_name}"
|
140
|
+
args.join(', ')
|
141
|
+
else
|
142
|
+
"&#{block_name}"
|
143
|
+
end
|
144
|
+
corrector.insert_after(node, "(#{new_arguments})")
|
139
145
|
return unless node.parenthesized?
|
140
146
|
|
141
147
|
args_begin = Util.args_begin(node)
|
@@ -144,6 +150,13 @@ module RuboCop
|
|
144
150
|
corrector.remove(range)
|
145
151
|
end
|
146
152
|
|
153
|
+
def build_new_arguments_for_zsuper(node)
|
154
|
+
def_node = node.each_ancestor(:any_def).first
|
155
|
+
def_node.arguments.map do |arg|
|
156
|
+
arg.optarg_type? ? arg.node_parts[0] : arg.source
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
147
160
|
def block_body_range(block_node, send_node)
|
148
161
|
range_between(send_node.source_range.end_pos, block_node.loc.end.end_pos)
|
149
162
|
end
|
@@ -8,7 +8,7 @@ module RuboCop
|
|
8
8
|
#
|
9
9
|
# * `scientific` which enforces a mantissa between 1 (inclusive) and 10 (exclusive).
|
10
10
|
# * `engineering` which enforces the exponent to be a multiple of 3 and the mantissa
|
11
|
-
# to be between 0.1 (inclusive) and
|
11
|
+
# to be between 0.1 (inclusive) and 1000 (exclusive).
|
12
12
|
# * `integral` which enforces the mantissa to always be a whole number without
|
13
13
|
# trailing zeroes.
|
14
14
|
#
|
@@ -60,8 +60,8 @@ module RuboCop
|
|
60
60
|
class ExponentialNotation < Base
|
61
61
|
include ConfigurableEnforcedStyle
|
62
62
|
MESSAGES = {
|
63
|
-
scientific: 'Use a mantissa
|
64
|
-
engineering: 'Use an exponent divisible by 3 and a mantissa
|
63
|
+
scientific: 'Use a mantissa >= 1 and < 10.',
|
64
|
+
engineering: 'Use an exponent divisible by 3 and a mantissa >= 0.1 and < 1000.',
|
65
65
|
integral: 'Use an integer as mantissa, without trailing zero.'
|
66
66
|
}.freeze
|
67
67
|
|
@@ -6,7 +6,7 @@ module RuboCop
|
|
6
6
|
# Suggests `ENV.fetch` for the replacement of `ENV[]`.
|
7
7
|
# `ENV[]` silently fails and returns `nil` when the environment variable is unset,
|
8
8
|
# which may cause unexpected behaviors when the developer forgets to set it.
|
9
|
-
# On the other hand, `ENV.fetch` raises KeyError or returns the explicitly
|
9
|
+
# On the other hand, `ENV.fetch` raises `KeyError` or returns the explicitly
|
10
10
|
# specified default value.
|
11
11
|
#
|
12
12
|
# @example
|
@@ -26,6 +26,7 @@ module RuboCop
|
|
26
26
|
extend AutoCorrector
|
27
27
|
|
28
28
|
MSG = 'Use `ENV.fetch(%<key>s)` or `ENV.fetch(%<key>s, nil)` instead of `ENV[%<key>s]`.'
|
29
|
+
RESTRICT_ON_SEND = [:[]].freeze
|
29
30
|
|
30
31
|
# @!method env_with_bracket?(node)
|
31
32
|
def_node_matcher :env_with_bracket?, <<~PATTERN
|
@@ -0,0 +1,89 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# Use `File::NULL` instead of hardcoding the null device (`/dev/null` on Unix-like
|
7
|
+
# OSes, `NUL` or `NUL:` on Windows), so that code is platform independent.
|
8
|
+
# Only looks for full string matches, substrings within a longer string are not
|
9
|
+
# considered.
|
10
|
+
#
|
11
|
+
# However, only files that use the string `'/dev/null'` are targeted for detection.
|
12
|
+
# This is because the string `'NUL'` is not limited to the null device.
|
13
|
+
# This behavior results in false negatives when the `'/dev/null'` string is not used,
|
14
|
+
# but it is a trade-off to avoid false positives. `NULL:`
|
15
|
+
# Unlike `'NUL'`, `'NUL:'` is regarded as something like `C:` and is always detected.
|
16
|
+
#
|
17
|
+
# NOTE: Uses inside arrays and hashes are ignored.
|
18
|
+
#
|
19
|
+
# @safety
|
20
|
+
# It is possible for a string value to be changed if code is being run
|
21
|
+
# on multiple platforms and was previously hardcoded to a specific null device.
|
22
|
+
#
|
23
|
+
# For example, the following string will change on Windows when changed to
|
24
|
+
# `File::NULL`:
|
25
|
+
#
|
26
|
+
# [source,ruby]
|
27
|
+
# ----
|
28
|
+
# path = "/dev/null"
|
29
|
+
# ----
|
30
|
+
#
|
31
|
+
# @example
|
32
|
+
# # bad
|
33
|
+
# '/dev/null'
|
34
|
+
# 'NUL'
|
35
|
+
# 'NUL:'
|
36
|
+
#
|
37
|
+
# # good
|
38
|
+
# File::NULL
|
39
|
+
#
|
40
|
+
# # ok - inside an array
|
41
|
+
# null_devices = %w[/dev/null nul]
|
42
|
+
#
|
43
|
+
# # ok - inside a hash
|
44
|
+
# { unix: "/dev/null", windows: "nul" }
|
45
|
+
class FileNull < Base
|
46
|
+
extend AutoCorrector
|
47
|
+
|
48
|
+
REGEXP = %r{\A(/dev/null|NUL:?)\z}i.freeze
|
49
|
+
MSG = 'Use `File::NULL` instead of `%<source>s`.'
|
50
|
+
|
51
|
+
def on_new_investigation
|
52
|
+
return unless (ast = processed_source.ast)
|
53
|
+
|
54
|
+
@contain_dev_null_string_in_file = ast.each_descendant(:str).any? do |str|
|
55
|
+
content = str.str_content
|
56
|
+
|
57
|
+
valid_string?(content) && content.downcase == '/dev/null' # rubocop:disable Style/FileNull
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def on_str(node)
|
62
|
+
value = node.value
|
63
|
+
return unless valid_string?(value)
|
64
|
+
return if acceptable?(node)
|
65
|
+
return if value.downcase == 'nul' && !@contain_dev_null_string_in_file # rubocop:disable Style/FileNull
|
66
|
+
return unless REGEXP.match?(value)
|
67
|
+
|
68
|
+
add_offense(node, message: format(MSG, source: value)) do |corrector|
|
69
|
+
corrector.replace(node, 'File::NULL')
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
|
75
|
+
def valid_string?(value)
|
76
|
+
!value.empty? && value.valid_encoding?
|
77
|
+
end
|
78
|
+
|
79
|
+
def acceptable?(node)
|
80
|
+
# Using a hardcoded null device is acceptable when inside an array or
|
81
|
+
# inside a hash to ensure behavior doesn't change.
|
82
|
+
return false unless node.parent
|
83
|
+
|
84
|
+
node.parent.type?(:array, :pair)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# Checks for usage of `File.open` in append mode with empty block.
|
7
|
+
#
|
8
|
+
# Such a usage only creates a new file, but it doesn't update
|
9
|
+
# timestamps for an existing file, which might have been the intention.
|
10
|
+
#
|
11
|
+
# For example, for an existing file `foo.txt`:
|
12
|
+
#
|
13
|
+
# ruby -e "puts File.mtime('foo.txt')"
|
14
|
+
# # 2024-11-26 12:17:23 +0100
|
15
|
+
#
|
16
|
+
# ruby -e "File.open('foo.txt', 'a') {}"
|
17
|
+
#
|
18
|
+
# ruby -e "puts File.mtime('foo.txt')"
|
19
|
+
# # 2024-11-26 12:17:23 +0100 -> unchanged
|
20
|
+
#
|
21
|
+
# If the intention was to update timestamps, `FileUtils.touch('foo.txt')`
|
22
|
+
# should be used instead.
|
23
|
+
#
|
24
|
+
# @safety
|
25
|
+
# Autocorrection is unsafe for this cop because unlike `File.open`,
|
26
|
+
# `FileUtils.touch` updates an existing file's timestamps.
|
27
|
+
#
|
28
|
+
# @example
|
29
|
+
# # bad
|
30
|
+
# File.open(filename, 'a') {}
|
31
|
+
# File.open(filename, 'a+') {}
|
32
|
+
#
|
33
|
+
# # good
|
34
|
+
# FileUtils.touch(filename)
|
35
|
+
#
|
36
|
+
class FileTouch < Base
|
37
|
+
extend AutoCorrector
|
38
|
+
|
39
|
+
MSG = 'Use `FileUtils.touch(%<argument>s)` instead of `File.open` in ' \
|
40
|
+
'append mode with empty block.'
|
41
|
+
|
42
|
+
RESTRICT_ON_SEND = %i[open].freeze
|
43
|
+
|
44
|
+
APPEND_FILE_MODES = %w[a a+ ab a+b at a+t].to_set.freeze
|
45
|
+
|
46
|
+
# @!method file_open?(node)
|
47
|
+
def_node_matcher :file_open?, <<~PATTERN
|
48
|
+
(send
|
49
|
+
(const {nil? cbase} :File) :open
|
50
|
+
$(...)
|
51
|
+
(str %APPEND_FILE_MODES))
|
52
|
+
PATTERN
|
53
|
+
|
54
|
+
def on_send(node)
|
55
|
+
filename = file_open?(node)
|
56
|
+
parent = node.parent
|
57
|
+
|
58
|
+
return unless filename
|
59
|
+
return unless parent && empty_block?(parent)
|
60
|
+
|
61
|
+
message = format(MSG, argument: filename.source)
|
62
|
+
add_offense(parent, message: message) do |corrector|
|
63
|
+
corrector.replace(parent, "FileUtils.touch(#{filename.source})")
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
|
69
|
+
def empty_block?(node)
|
70
|
+
node.block_type? && !node.body
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|