rubocop 1.67.0 → 1.73.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +4 -4
- data/config/default.yml +168 -19
- data/config/internal_affairs.yml +16 -0
- 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/comment_config.rb +2 -2
- data/lib/rubocop/config.rb +17 -4
- data/lib/rubocop/config_loader.rb +48 -8
- data/lib/rubocop/config_loader_resolver.rb +35 -10
- data/lib/rubocop/config_validator.rb +19 -9
- 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/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 +4 -2
- 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 +229 -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_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 +7 -1
- data/lib/rubocop/cop/internal_affairs.rb +6 -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/class_structure.rb +9 -9
- 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 +2 -2
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +7 -11
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +29 -4
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
- 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 +6 -4
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +7 -7
- data/lib/rubocop/cop/layout/leading_comment_space.rb +44 -1
- 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 +119 -4
- 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_operation_indentation.rb +2 -3
- data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
- data/lib/rubocop/cop/layout/redundant_line_break.rb +10 -41
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +4 -3
- 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 +1 -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 +19 -20
- data/lib/rubocop/cop/layout/space_before_brackets.rb +5 -5
- 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 +6 -0
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +4 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +4 -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 +119 -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/circular_argument_reference.rb +6 -0
- 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 +1 -1
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +2 -1
- 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 +0 -14
- 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_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/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 +105 -7
- 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_super.rb +2 -2
- data/lib/rubocop/cop/lint/mixed_case_range.rb +4 -7
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +9 -5
- 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 +1 -1
- 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 +1 -2
- 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/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 +252 -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/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/shared_mutable_default.rb +65 -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/unescaped_bracket_in_regexp.rb +88 -0
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +1 -1
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +51 -2
- data/lib/rubocop/cop/lint/unreachable_loop.rb +1 -1
- data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +4 -4
- data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +80 -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 +1 -1
- 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 +14 -11
- 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 +8 -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 +2 -3
- 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 +20 -10
- 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/dig_help.rb +27 -0
- data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +24 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +4 -2
- 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 +1 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +5 -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 +3 -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 +15 -3
- 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 +11 -12
- 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 +63 -6
- data/lib/rubocop/cop/naming/variable_number.rb +2 -3
- data/lib/rubocop/cop/offense.rb +2 -3
- 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 +86 -28
- 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 +39 -23
- data/lib/rubocop/cop/style/array_first_last.rb +18 -2
- data/lib/rubocop/cop/style/array_intersect.rb +5 -4
- data/lib/rubocop/cop/style/bitwise_predicate.rb +100 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +41 -24
- data/lib/rubocop/cop/style/case_like_if.rb +8 -11
- data/lib/rubocop/cop/style/class_and_module_children.rb +6 -3
- data/lib/rubocop/cop/style/collection_methods.rb +1 -1
- data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +2 -2
- data/lib/rubocop/cop/style/commented_keyword.rb +11 -1
- data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +25 -25
- data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
- 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 +3 -3
- 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 +1 -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 +1 -1
- data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -3
- data/lib/rubocop/cop/style/explicit_block_argument.rb +15 -2
- data/lib/rubocop/cop/style/exponential_notation.rb +1 -1
- 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 +0 -1
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
- data/lib/rubocop/cop/style/global_vars.rb +1 -3
- data/lib/rubocop/cop/style/guard_clause.rb +15 -2
- data/lib/rubocop/cop/style/hash_conversion.rb +1 -2
- data/lib/rubocop/cop/style/hash_each_methods.rb +3 -6
- data/lib/rubocop/cop/style/hash_except.rb +35 -147
- data/lib/rubocop/cop/style/hash_slice.rb +80 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +6 -3
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +22 -3
- data/lib/rubocop/cop/style/if_inside_else.rb +0 -1
- data/lib/rubocop/cop/style/if_unless_modifier.rb +3 -3
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +2 -3
- 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 +6 -7
- data/lib/rubocop/cop/style/it_assignment.rb +36 -0
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +67 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +1 -1
- data/lib/rubocop/cop/style/lambda_call.rb +3 -2
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/map_into_array.rb +7 -2
- 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 +20 -13
- 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 +2 -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 +1 -1
- data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
- 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/not.rb +1 -1
- data/lib/rubocop/cop/style/object_then.rb +14 -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/proc.rb +1 -2
- data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +7 -5
- 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 +1 -1
- data/lib/rubocop/cop/style/redundant_condition.rb +72 -23
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +2 -1
- 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 +250 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +2 -2
- data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +54 -15
- data/lib/rubocop/cop/style/redundant_parentheses.rb +36 -24
- 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 +8 -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_string_escape.rb +2 -2
- data/lib/rubocop/cop/style/rescue_modifier.rb +2 -3
- data/lib/rubocop/cop/style/return_nil.rb +1 -1
- data/lib/rubocop/cop/style/safe_navigation.rb +14 -2
- data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
- data/lib/rubocop/cop/style/select_by_regexp.rb +1 -1
- 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 +12 -3
- 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 +4 -5
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
- data/lib/rubocop/cop/style/string_concatenation.rb +15 -14
- 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/super_arguments.rb +65 -17
- data/lib/rubocop/cop/style/swap_values.rb +4 -15
- data/lib/rubocop/cop/style/ternary_parentheses.rb +25 -4
- data/lib/rubocop/cop/style/top_level_method_definition.rb +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -1
- 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 +7 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +18 -3
- data/lib/rubocop/cop/variable_force/branch.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +18 -2
- data/lib/rubocop/cop/variable_force/variable_table.rb +5 -5
- data/lib/rubocop/cop/variable_force.rb +4 -10
- data/lib/rubocop/cops_documentation_generator.rb +44 -23
- data/lib/rubocop/directive_comment.rb +44 -10
- data/lib/rubocop/formatter/disabled_config_formatter.rb +1 -1
- data/lib/rubocop/formatter/formatter_set.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 +17 -49
- data/lib/rubocop/lsp/server.rb +0 -2
- data/lib/rubocop/lsp/stdin_runner.rb +83 -0
- data/lib/rubocop/magic_comment.rb +3 -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 +9 -0
- data/lib/rubocop/rspec/expect_offense.rb +6 -2
- data/lib/rubocop/rspec/shared_contexts.rb +19 -1
- data/lib/rubocop/rspec/support.rb +2 -2
- data/lib/rubocop/runner.rb +21 -14
- data/lib/rubocop/server/cache.rb +35 -2
- data/lib/rubocop/server/cli.rb +2 -2
- data/lib/rubocop/target_finder.rb +1 -0
- data/lib/rubocop/target_ruby.rb +16 -1
- data/lib/rubocop/version.rb +41 -7
- data/lib/rubocop.rb +27 -1
- data/lib/ruby_lsp/rubocop/addon.rb +75 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +47 -0
- metadata +73 -20
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -0,0 +1,89 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# Check for chained `dig` calls that can be collapsed into a single `dig`.
|
7
|
+
#
|
8
|
+
# @safety
|
9
|
+
# This cop is unsafe because it cannot be guaranteed that the receiver
|
10
|
+
# is an `Enumerable` or does not have a nonstandard implementation
|
11
|
+
# of `dig`.
|
12
|
+
#
|
13
|
+
# @example
|
14
|
+
# # bad
|
15
|
+
# x.dig(:foo).dig(:bar).dig(:baz)
|
16
|
+
# x.dig(:foo, :bar).dig(:baz)
|
17
|
+
# x.dig(:foo, :bar)&.dig(:baz)
|
18
|
+
#
|
19
|
+
# # good
|
20
|
+
# x.dig(:foo, :bar, :baz)
|
21
|
+
#
|
22
|
+
# # good - `dig`s cannot be combined
|
23
|
+
# x.dig(:foo).bar.dig(:baz)
|
24
|
+
#
|
25
|
+
class DigChain < Base
|
26
|
+
extend AutoCorrector
|
27
|
+
include CommentsHelp
|
28
|
+
include DigHelp
|
29
|
+
|
30
|
+
MSG = 'Use `%<replacement>s` instead of chaining.'
|
31
|
+
RESTRICT_ON_SEND = %i[dig].freeze
|
32
|
+
|
33
|
+
def on_send(node)
|
34
|
+
return if ignored_node?(node)
|
35
|
+
return unless node.loc.dot
|
36
|
+
return unless dig?(node)
|
37
|
+
|
38
|
+
range, arguments = inspect_chain(node)
|
39
|
+
return if invalid_arguments?(arguments)
|
40
|
+
return unless range
|
41
|
+
|
42
|
+
register_offense(node, range, arguments)
|
43
|
+
end
|
44
|
+
alias on_csend on_send
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
# Walk up the method chain while the receiver is `dig` with arguments.
|
49
|
+
def inspect_chain(node)
|
50
|
+
arguments = node.arguments.dup
|
51
|
+
end_range = node.source_range.end
|
52
|
+
|
53
|
+
while dig?(node = node.receiver)
|
54
|
+
begin_range = node.loc.selector
|
55
|
+
arguments.unshift(*node.arguments)
|
56
|
+
ignore_node(node)
|
57
|
+
end
|
58
|
+
|
59
|
+
return unless begin_range
|
60
|
+
|
61
|
+
[begin_range.join(end_range), arguments]
|
62
|
+
end
|
63
|
+
|
64
|
+
def invalid_arguments?(arguments)
|
65
|
+
# If any of the arguments are arguments forwarding (`...`), it can only be the
|
66
|
+
# first argument, or else the resulting code will have a syntax error.
|
67
|
+
|
68
|
+
return false unless arguments&.any?
|
69
|
+
|
70
|
+
forwarded_args_index = arguments.index(&:forwarded_args_type?)
|
71
|
+
forwarded_args_index && forwarded_args_index < (arguments.size - 1)
|
72
|
+
end
|
73
|
+
|
74
|
+
def register_offense(node, range, arguments)
|
75
|
+
arguments = arguments.map(&:source).join(', ')
|
76
|
+
replacement = "dig(#{arguments})"
|
77
|
+
|
78
|
+
add_offense(range, message: format(MSG, replacement: replacement)) do |corrector|
|
79
|
+
corrector.replace(range, replacement)
|
80
|
+
|
81
|
+
comments_in_range(node).reverse_each do |comment|
|
82
|
+
corrector.insert_before(node, "#{comment.source}\n")
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -186,7 +186,7 @@ module RuboCop
|
|
186
186
|
def qualify_const(node)
|
187
187
|
return if node.nil?
|
188
188
|
|
189
|
-
if node.
|
189
|
+
if node.type?(:cbase, :self, :call) || node.variable?
|
190
190
|
node.source
|
191
191
|
else
|
192
192
|
[qualify_const(node.namespace), node.short_name].compact
|
@@ -93,7 +93,7 @@ module RuboCop
|
|
93
93
|
|
94
94
|
if conditional_node
|
95
95
|
double_negative_condition_return_value?(node, last_child, conditional_node)
|
96
|
-
elsif last_child.
|
96
|
+
elsif last_child.type?(:pair, :hash) || last_child.parent.array_type?
|
97
97
|
false
|
98
98
|
else
|
99
99
|
last_child.last_line <= node.last_line
|
@@ -102,7 +102,7 @@ module RuboCop
|
|
102
102
|
|
103
103
|
def find_def_node_from_ascendant(node)
|
104
104
|
return unless (parent = node.parent)
|
105
|
-
return parent if parent.
|
105
|
+
return parent if parent.type?(:def, :defs)
|
106
106
|
return node.parent.child_nodes.first if define_method?(parent)
|
107
107
|
|
108
108
|
find_def_node_from_ascendant(node.parent)
|
@@ -147,7 +147,7 @@ module RuboCop
|
|
147
147
|
def find_parent_not_enumerable(node)
|
148
148
|
return unless (parent = node.parent)
|
149
149
|
|
150
|
-
if parent.
|
150
|
+
if parent.type?(:pair, :hash, :array)
|
151
151
|
find_parent_not_enumerable(parent)
|
152
152
|
else
|
153
153
|
parent
|
@@ -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)
|
@@ -136,7 +136,7 @@ module RuboCop
|
|
136
136
|
def frozen_strings?
|
137
137
|
return true if frozen_string_literals_enabled?
|
138
138
|
|
139
|
-
frozen_string_cop_enabled = config.
|
139
|
+
frozen_string_cop_enabled = config.cop_enabled?('Style/FrozenStringLiteralComment')
|
140
140
|
frozen_string_cop_enabled &&
|
141
141
|
!frozen_string_literals_disabled? &&
|
142
142
|
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
|
@@ -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}'"
|
@@ -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(:def, :defs).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
|
#
|
@@ -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
|