rubocop 1.29.1 → 1.36.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/README.md +5 -3
- data/config/default.yml +164 -26
- data/config/obsoletion.yml +25 -1
- data/exe/rubocop +15 -7
- data/lib/rubocop/cache_config.rb +29 -0
- data/lib/rubocop/cli/command/{auto_genenerate_config.rb → auto_generate_config.rb} +20 -5
- data/lib/rubocop/cli/command/execute_runner.rb +1 -1
- data/lib/rubocop/cli/command/init_dotfile.rb +1 -1
- data/lib/rubocop/cli/command/show_cops.rb +1 -1
- data/lib/rubocop/cli/command/suggest_extensions.rb +53 -15
- data/lib/rubocop/cli.rb +2 -0
- data/lib/rubocop/config.rb +6 -2
- data/lib/rubocop/config_finder.rb +68 -0
- data/lib/rubocop/config_loader.rb +15 -41
- data/lib/rubocop/config_loader_resolver.rb +2 -6
- data/lib/rubocop/config_obsoletion/changed_parameter.rb +5 -0
- data/lib/rubocop/config_obsoletion/parameter_rule.rb +4 -0
- data/lib/rubocop/config_obsoletion.rb +7 -2
- data/lib/rubocop/config_validator.rb +21 -4
- data/lib/rubocop/cop/autocorrect_logic.rb +4 -2
- data/lib/rubocop/cop/base.rb +6 -2
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -1
- data/lib/rubocop/cop/bundler/gem_filename.rb +5 -5
- data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -2
- data/lib/rubocop/cop/cop.rb +1 -1
- data/lib/rubocop/cop/corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/empty_line_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +4 -2
- data/lib/rubocop/cop/correctors/if_then_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +7 -1
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +3 -3
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +59 -1
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/punctuation_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/space_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/string_literal_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +2 -2
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +92 -0
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +1 -1
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/require_mfa.rb +21 -21
- data/lib/rubocop/cop/generator/require_file_injector.rb +2 -2
- data/lib/rubocop/cop/generator.rb +5 -1
- data/lib/rubocop/cop/internal_affairs/cop_description.rb +96 -0
- data/lib/rubocop/cop/internal_affairs/empty_line_between_expect_offense_and_correction.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/method_name_end_with.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -5
- data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +69 -0
- data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +62 -0
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +60 -0
- data/lib/rubocop/cop/internal_affairs.rb +4 -0
- data/lib/rubocop/cop/layout/argument_alignment.rb +22 -1
- data/lib/rubocop/cop/layout/assignment_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +17 -13
- data/lib/rubocop/cop/layout/block_end_newline.rb +36 -6
- data/lib/rubocop/cop/layout/case_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/condition_position.rb +1 -1
- 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 +1 -1
- data/lib/rubocop/cop/layout/empty_comment.rb +2 -2
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +5 -2
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +25 -4
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +7 -5
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +10 -10
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +10 -10
- data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/end_of_line.rb +5 -5
- data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +34 -29
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +21 -14
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +52 -13
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/hash_alignment.rb +2 -0
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +1 -1
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_consistency.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +13 -6
- data/lib/rubocop/cop/layout/initial_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
- data/lib/rubocop/cop/layout/leading_empty_lines.rb +1 -1
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +112 -0
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +130 -0
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/line_length.rb +7 -2
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +2 -2
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +4 -2
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +5 -2
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +3 -3
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +45 -0
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +3 -3
- data/lib/rubocop/cop/layout/redundant_line_break.rb +2 -2
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +2 -2
- data/lib/rubocop/cop/layout/space_around_keyword.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +5 -3
- data/lib/rubocop/cop/layout/space_before_comment.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_first_arg.rb +1 -1
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +10 -10
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +33 -15
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +1 -1
- data/lib/rubocop/cop/layout/trailing_empty_lines.rb +8 -8
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +2 -2
- data/lib/rubocop/cop/legacy/corrections_proxy.rb +1 -1
- data/lib/rubocop/cop/legacy/corrector.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +27 -7
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_range.rb +3 -3
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +1 -1
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -1
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +1 -1
- data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +51 -0
- data/lib/rubocop/cop/lint/debugger.rb +27 -17
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +15 -9
- data/lib/rubocop/cop/lint/deprecated_constants.rb +1 -1
- data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_branch.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_require.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
- data/lib/rubocop/cop/lint/else_layout.rb +3 -3
- data/lib/rubocop/cop/lint/empty_block.rb +2 -2
- data/lib/rubocop/cop/lint/empty_class.rb +1 -1
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +96 -2
- data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
- data/lib/rubocop/cop/lint/empty_expression.rb +1 -1
- data/lib/rubocop/cop/lint/empty_file.rb +1 -1
- data/lib/rubocop/cop/lint/empty_in_pattern.rb +1 -1
- data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -1
- data/lib/rubocop/cop/lint/empty_when.rb +1 -1
- data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +9 -9
- data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
- data/lib/rubocop/cop/lint/float_comparison.rb +1 -1
- data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
- data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +1 -1
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +1 -1
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
- data/lib/rubocop/cop/lint/inherit_exception.rb +1 -1
- data/lib/rubocop/cop/lint/interpolation_check.rb +2 -2
- data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +2 -2
- data/lib/rubocop/cop/lint/literal_as_condition.rb +6 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +5 -1
- data/lib/rubocop/cop/lint/loop.rb +1 -1
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +1 -1
- data/lib/rubocop/cop/lint/missing_super.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +25 -6
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +157 -0
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +12 -0
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
- data/lib/rubocop/cop/lint/number_conversion.rb +32 -10
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -3
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -1
- data/lib/rubocop/cop/lint/percent_string_array.rb +1 -1
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -1
- data/lib/rubocop/cop/lint/raise_exception.rb +1 -1
- data/lib/rubocop/cop/lint/rand_one.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +6 -6
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -1
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +16 -3
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_with_index.rb +14 -11
- data/lib/rubocop/cop/lint/redundant_with_object.rb +13 -12
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +1 -1
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +3 -3
- data/lib/rubocop/cop/lint/require_parentheses.rb +1 -1
- data/lib/rubocop/cop/lint/require_range_parentheses.rb +57 -0
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/return_in_void_context.rb +1 -1
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +38 -1
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +1 -1
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
- data/lib/rubocop/cop/lint/script_permission.rb +1 -1
- data/lib/rubocop/cop/lint/self_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/shadowed_argument.rb +1 -1
- data/lib/rubocop/cop/lint/shadowed_exception.rb +16 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +25 -4
- data/lib/rubocop/cop/lint/struct_new_override.rb +3 -3
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
- data/lib/rubocop/cop/lint/syntax.rb +1 -1
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +1 -1
- data/lib/rubocop/cop/lint/to_json.rb +1 -1
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +2 -2
- data/lib/rubocop/cop/lint/triple_quotes.rb +1 -1
- data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +1 -1
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +1 -1
- data/lib/rubocop/cop/lint/unified_integer.rb +3 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_loop.rb +9 -3
- data/lib/rubocop/cop/lint/unused_block_argument.rb +1 -1
- data/lib/rubocop/cop/lint/unused_method_argument.rb +1 -1
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
- data/lib/rubocop/cop/lint/uri_regexp.rb +1 -1
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +9 -7
- data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +44 -0
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -2
- data/lib/rubocop/cop/lint/useless_setter_call.rb +2 -2
- data/lib/rubocop/cop/lint/useless_times.rb +1 -1
- data/lib/rubocop/cop/lint/void.rb +3 -1
- data/lib/rubocop/cop/metrics/abc_size.rb +4 -2
- data/lib/rubocop/cop/metrics/block_length.rb +7 -7
- data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
- data/lib/rubocop/cop/metrics/class_length.rb +1 -1
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/method_length.rb +9 -8
- data/lib/rubocop/cop/metrics/module_length.rb +1 -1
- data/lib/rubocop/cop/metrics/parameter_lists.rb +1 -1
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -1
- data/lib/rubocop/cop/mixin/allowed_methods.rb +20 -1
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +17 -1
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +5 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +5 -1
- data/lib/rubocop/cop/mixin/def_node.rb +2 -7
- data/lib/rubocop/cop/mixin/enforce_superclass.rb +2 -1
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +82 -2
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +10 -6
- data/lib/rubocop/cop/mixin/method_complexity.rb +8 -13
- data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +34 -12
- data/lib/rubocop/cop/mixin/percent_array.rb +60 -1
- data/lib/rubocop/cop/mixin/range_help.rb +10 -7
- data/lib/rubocop/cop/mixin/string_help.rb +1 -1
- data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +1 -1
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/block_forwarding.rb +2 -2
- data/lib/rubocop/cop/naming/block_parameter_name.rb +2 -2
- data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +1 -1
- data/lib/rubocop/cop/naming/constant_name.rb +3 -3
- data/lib/rubocop/cop/naming/file_name.rb +1 -1
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +1 -1
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +1 -1
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
- data/lib/rubocop/cop/naming/method_name.rb +1 -1
- data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/predicate_name.rb +30 -1
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +1 -1
- data/lib/rubocop/cop/naming/variable_name.rb +1 -1
- data/lib/rubocop/cop/naming/variable_number.rb +18 -18
- data/lib/rubocop/cop/security/compound_hash.rb +1 -1
- data/lib/rubocop/cop/security/eval.rb +1 -1
- data/lib/rubocop/cop/security/json_load.rb +1 -1
- data/lib/rubocop/cop/security/marshal_load.rb +1 -1
- data/lib/rubocop/cop/security/open.rb +1 -1
- data/lib/rubocop/cop/security/yaml_load.rb +1 -1
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +77 -1
- data/lib/rubocop/cop/style/accessor_grouping.rb +4 -4
- data/lib/rubocop/cop/style/alias.rb +1 -1
- data/lib/rubocop/cop/style/and_or.rb +11 -11
- data/lib/rubocop/cop/style/arguments_forwarding.rb +3 -3
- data/lib/rubocop/cop/style/array_coercion.rb +1 -1
- data/lib/rubocop/cop/style/array_join.rb +1 -1
- data/lib/rubocop/cop/style/ascii_comments.rb +1 -1
- data/lib/rubocop/cop/style/attr.rb +1 -1
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +1 -1
- data/lib/rubocop/cop/style/bare_percent_literals.rb +1 -1
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +1 -1
- data/lib/rubocop/cop/style/block_comments.rb +1 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +30 -9
- data/lib/rubocop/cop/style/case_equality.rb +41 -11
- data/lib/rubocop/cop/style/case_like_if.rb +1 -1
- data/lib/rubocop/cop/style/class_and_module_children.rb +5 -5
- data/lib/rubocop/cop/style/class_check.rb +1 -1
- data/lib/rubocop/cop/style/class_equality_comparison.rb +51 -4
- data/lib/rubocop/cop/style/class_methods.rb +1 -1
- data/lib/rubocop/cop/style/class_methods_definitions.rb +3 -2
- data/lib/rubocop/cop/style/class_vars.rb +1 -1
- data/lib/rubocop/cop/style/collection_compact.rb +1 -1
- data/lib/rubocop/cop/style/collection_methods.rb +3 -1
- data/lib/rubocop/cop/style/colon_method_call.rb +1 -1
- data/lib/rubocop/cop/style/colon_method_definition.rb +1 -1
- data/lib/rubocop/cop/style/combinable_loops.rb +4 -2
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/comment_annotation.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +4 -4
- data/lib/rubocop/cop/style/conditional_assignment.rb +2 -1
- data/lib/rubocop/cop/style/constant_visibility.rb +1 -1
- data/lib/rubocop/cop/style/date_time.rb +1 -1
- data/lib/rubocop/cop/style/def_with_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/dir.rb +4 -1
- data/lib/rubocop/cop/style/documentation.rb +1 -1
- data/lib/rubocop/cop/style/documentation_method.rb +1 -1
- data/lib/rubocop/cop/style/double_negation.rb +3 -1
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +42 -7
- data/lib/rubocop/cop/style/each_with_object.rb +40 -9
- data/lib/rubocop/cop/style/empty_block_parameter.rb +2 -2
- data/lib/rubocop/cop/style/empty_case_condition.rb +1 -1
- data/lib/rubocop/cop/style/empty_else.rb +40 -3
- data/lib/rubocop/cop/style/empty_heredoc.rb +73 -0
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +2 -2
- data/lib/rubocop/cop/style/empty_literal.rb +1 -1
- data/lib/rubocop/cop/style/empty_method.rb +17 -2
- data/lib/rubocop/cop/style/encoding.rb +2 -2
- data/lib/rubocop/cop/style/end_block.rb +1 -1
- data/lib/rubocop/cop/style/endless_method.rb +1 -1
- data/lib/rubocop/cop/style/env_home.rb +1 -1
- data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
- data/lib/rubocop/cop/style/even_odd.rb +1 -1
- data/lib/rubocop/cop/style/expand_path_arguments.rb +1 -1
- data/lib/rubocop/cop/style/explicit_block_argument.rb +2 -2
- data/lib/rubocop/cop/style/exponential_notation.rb +1 -1
- data/lib/rubocop/cop/style/fetch_env_var.rb +37 -224
- data/lib/rubocop/cop/style/float_division.rb +1 -1
- data/lib/rubocop/cop/style/for.rb +3 -1
- data/lib/rubocop/cop/style/format_string.rb +1 -1
- data/lib/rubocop/cop/style/format_string_token.rb +73 -23
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +6 -3
- data/lib/rubocop/cop/style/global_std_stream.rb +1 -1
- data/lib/rubocop/cop/style/global_vars.rb +1 -1
- data/lib/rubocop/cop/style/guard_clause.rb +35 -22
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +1 -1
- data/lib/rubocop/cop/style/hash_conversion.rb +1 -1
- data/lib/rubocop/cop/style/hash_each_methods.rb +4 -2
- data/lib/rubocop/cop/style/hash_except.rb +85 -9
- data/lib/rubocop/cop/style/hash_like_case.rb +1 -1
- data/lib/rubocop/cop/style/hash_syntax.rb +20 -3
- data/lib/rubocop/cop/style/hash_transform_keys.rb +6 -1
- data/lib/rubocop/cop/style/hash_transform_values.rb +4 -1
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +2 -2
- data/lib/rubocop/cop/style/if_unless_modifier.rb +1 -1
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +4 -2
- data/lib/rubocop/cop/style/implicit_runtime_error.rb +3 -3
- data/lib/rubocop/cop/style/in_pattern_then.rb +1 -1
- data/lib/rubocop/cop/style/inline_comment.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +10 -8
- data/lib/rubocop/cop/style/ip_addresses.rb +1 -1
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +2 -2
- data/lib/rubocop/cop/style/lambda.rb +1 -1
- data/lib/rubocop/cop/style/lambda_call.rb +1 -1
- data/lib/rubocop/cop/style/line_end_concatenation.rb +2 -2
- data/lib/rubocop/cop/style/magic_comment_format.rb +307 -0
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +136 -0
- data/lib/rubocop/cop/style/map_to_hash.rb +3 -3
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +4 -4
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +5 -1
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +8 -8
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +20 -3
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +5 -2
- data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/min_max.rb +1 -1
- data/lib/rubocop/cop/style/missing_else.rb +24 -24
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +1 -1
- data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
- data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
- data/lib/rubocop/cop/style/module_function.rb +3 -3
- data/lib/rubocop/cop/style/multiline_block_chain.rb +4 -2
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -2
- data/lib/rubocop/cop/style/multiline_if_then.rb +1 -1
- data/lib/rubocop/cop/style/multiline_in_pattern_then.rb +3 -5
- data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
- data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +3 -3
- data/lib/rubocop/cop/style/multiline_when_then.rb +2 -4
- data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
- data/lib/rubocop/cop/style/mutable_constant.rb +1 -1
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +1 -1
- data/lib/rubocop/cop/style/nested_file_dirname.rb +1 -1
- data/lib/rubocop/cop/style/nested_modifier.rb +1 -1
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +11 -2
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +20 -8
- data/lib/rubocop/cop/style/next.rb +3 -5
- data/lib/rubocop/cop/style/nil_comparison.rb +1 -1
- data/lib/rubocop/cop/style/nil_lambda.rb +3 -3
- data/lib/rubocop/cop/style/non_nil_check.rb +1 -1
- data/lib/rubocop/cop/style/not.rb +2 -2
- data/lib/rubocop/cop/style/numbered_parameters.rb +1 -1
- data/lib/rubocop/cop/style/numbered_parameters_limit.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literals.rb +16 -1
- data/lib/rubocop/cop/style/numeric_predicate.rb +53 -11
- data/lib/rubocop/cop/style/object_then.rb +3 -1
- data/lib/rubocop/cop/style/one_line_conditional.rb +1 -1
- data/lib/rubocop/cop/style/open_struct_use.rb +1 -1
- data/lib/rubocop/cop/style/option_hash.rb +1 -1
- data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
- data/lib/rubocop/cop/style/optional_boolean_parameter.rb +1 -1
- data/lib/rubocop/cop/style/or_assignment.rb +1 -1
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +1 -1
- 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/perl_backrefs.rb +23 -2
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -1
- data/lib/rubocop/cop/style/proc.rb +5 -2
- data/lib/rubocop/cop/style/raise_args.rb +1 -1
- data/lib/rubocop/cop/style/random_with_offset.rb +1 -1
- data/lib/rubocop/cop/style/redundant_argument.rb +2 -2
- data/lib/rubocop/cop/style/redundant_assignment.rb +1 -1
- data/lib/rubocop/cop/style/redundant_begin.rb +19 -6
- data/lib/rubocop/cop/style/redundant_capital_w.rb +1 -1
- data/lib/rubocop/cop/style/redundant_condition.rb +28 -9
- data/lib/rubocop/cop/style/redundant_conditional.rb +1 -1
- data/lib/rubocop/cop/style/redundant_exception.rb +1 -1
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +2 -2
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
- data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
- data/lib/rubocop/cop/style/redundant_interpolation.rb +22 -1
- data/lib/rubocop/cop/style/redundant_parentheses.rb +22 -24
- data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +2 -2
- 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 +3 -1
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +2 -2
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +1 -1
- data/lib/rubocop/cop/style/redundant_sort.rb +22 -7
- data/lib/rubocop/cop/style/redundant_sort_by.rb +25 -9
- data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
- data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
- data/lib/rubocop/cop/style/rescue_standard_error.rb +13 -13
- data/lib/rubocop/cop/style/return_nil.rb +1 -1
- data/lib/rubocop/cop/style/safe_navigation.rb +8 -3
- data/lib/rubocop/cop/style/sample.rb +1 -1
- data/lib/rubocop/cop/style/select_by_regexp.rb +1 -1
- data/lib/rubocop/cop/style/self_assignment.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +28 -4
- data/lib/rubocop/cop/style/send.rb +1 -1
- data/lib/rubocop/cop/style/signal_exception.rb +1 -1
- data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
- data/lib/rubocop/cop/style/single_line_methods.rb +2 -2
- data/lib/rubocop/cop/style/slicing_with_range.rb +1 -1
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +42 -14
- data/lib/rubocop/cop/style/static_class.rb +1 -1
- data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
- data/lib/rubocop/cop/style/string_concatenation.rb +6 -7
- data/lib/rubocop/cop/style/string_hash_keys.rb +1 -1
- data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +1 -1
- data/lib/rubocop/cop/style/string_methods.rb +1 -1
- data/lib/rubocop/cop/style/strip.rb +1 -1
- data/lib/rubocop/cop/style/struct_inheritance.rb +4 -4
- data/lib/rubocop/cop/style/swap_values.rb +2 -2
- data/lib/rubocop/cop/style/symbol_array.rb +9 -6
- data/lib/rubocop/cop/style/symbol_literal.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +48 -14
- data/lib/rubocop/cop/style/ternary_parentheses.rb +2 -14
- data/lib/rubocop/cop/style/top_level_method_definition.rb +3 -1
- data/lib/rubocop/cop/style/trailing_body_on_class.rb +1 -1
- data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +1 -1
- data/lib/rubocop/cop/style/trailing_body_on_module.rb +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +2 -2
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +1 -1
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -1
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +1 -1
- data/lib/rubocop/cop/style/trivial_accessors.rb +4 -1
- data/lib/rubocop/cop/style/unless_else.rb +1 -1
- data/lib/rubocop/cop/style/unless_logical_operators.rb +1 -1
- data/lib/rubocop/cop/style/unpack_first.rb +5 -2
- data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
- data/lib/rubocop/cop/style/when_then.rb +1 -1
- data/lib/rubocop/cop/style/word_array.rb +4 -5
- data/lib/rubocop/cop/style/yoda_condition.rb +1 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +1 -1
- data/lib/rubocop/cop/team.rb +2 -2
- data/lib/rubocop/cop/util.rb +3 -3
- data/lib/rubocop/cops_documentation_generator.rb +18 -1
- data/lib/rubocop/ext/range.rb +15 -0
- data/lib/rubocop/feature_loader.rb +94 -0
- data/lib/rubocop/formatter/clang_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/disabled_config_formatter.rb +11 -8
- data/lib/rubocop/formatter/formatter_set.rb +20 -19
- data/lib/rubocop/formatter/git_hub_actions_formatter.rb +15 -2
- data/lib/rubocop/formatter/html_formatter.rb +3 -4
- data/lib/rubocop/formatter/markdown_formatter.rb +3 -1
- data/lib/rubocop/formatter/offense_count_formatter.rb +2 -0
- data/lib/rubocop/formatter/simple_text_formatter.rb +9 -8
- data/lib/rubocop/formatter/tap_formatter.rb +1 -1
- data/lib/rubocop/formatter.rb +31 -0
- data/lib/rubocop/magic_comment.rb +27 -2
- data/lib/rubocop/options.rb +81 -39
- data/lib/rubocop/rake_task.rb +34 -9
- data/lib/rubocop/result_cache.rb +24 -21
- data/lib/rubocop/rspec/cop_helper.rb +1 -1
- data/lib/rubocop/rspec/expect_offense.rb +3 -3
- data/lib/rubocop/rspec/shared_contexts.rb +29 -9
- data/lib/rubocop/rspec/support.rb +14 -0
- data/lib/rubocop/runner.rb +13 -5
- data/lib/rubocop/server/cache.rb +144 -0
- data/lib/rubocop/server/cli.rb +121 -0
- data/lib/rubocop/server/client_command/base.rb +44 -0
- data/lib/rubocop/server/client_command/exec.rb +59 -0
- data/lib/rubocop/server/client_command/restart.rb +25 -0
- data/lib/rubocop/server/client_command/start.rb +43 -0
- data/lib/rubocop/server/client_command/status.rb +28 -0
- data/lib/rubocop/server/client_command/stop.rb +31 -0
- data/lib/rubocop/server/client_command.rb +26 -0
- data/lib/rubocop/server/core.rb +79 -0
- data/lib/rubocop/server/errors.rb +23 -0
- data/lib/rubocop/server/helper.rb +34 -0
- data/lib/rubocop/server/server_command/base.rb +50 -0
- data/lib/rubocop/server/server_command/exec.rb +34 -0
- data/lib/rubocop/server/server_command/stop.rb +24 -0
- data/lib/rubocop/server/server_command.rb +21 -0
- data/lib/rubocop/server/socket_reader.rb +65 -0
- data/lib/rubocop/server.rb +53 -0
- data/lib/rubocop/target_ruby.rb +7 -5
- data/lib/rubocop/version.rb +17 -9
- data/lib/rubocop.rb +18 -30
- metadata +60 -10
- data/lib/rubocop/cop/gemspec/date_assignment.rb +0 -49
- data/lib/rubocop/cop/mixin/ignored_methods.rb +0 -52
@@ -0,0 +1,307 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# Ensures magic comments are written consistently throughout your code base.
|
7
|
+
# Looks for discrepancies in separators (`-` vs `_`) and capitalization for
|
8
|
+
# both magic comment directives and values.
|
9
|
+
#
|
10
|
+
# Required capitalization can be set with the `DirectiveCapitalization` and
|
11
|
+
# `ValueCapitalization` configuration keys.
|
12
|
+
#
|
13
|
+
# NOTE: If one of these configuration is set to nil, any capitalization is allowed.
|
14
|
+
#
|
15
|
+
# @example EnforcedStyle: snake_case (default)
|
16
|
+
# # The `snake_case` style will enforce that the frozen string literal
|
17
|
+
# # comment is written in snake case. (Words separated by underscores)
|
18
|
+
# # bad
|
19
|
+
# # frozen-string-literal: true
|
20
|
+
#
|
21
|
+
# module Bar
|
22
|
+
# # ...
|
23
|
+
# end
|
24
|
+
#
|
25
|
+
# # good
|
26
|
+
# # frozen_string_literal: false
|
27
|
+
#
|
28
|
+
# module Bar
|
29
|
+
# # ...
|
30
|
+
# end
|
31
|
+
#
|
32
|
+
# @example EnforcedStyle: kebab_case
|
33
|
+
# # The `kebab_case` style will enforce that the frozen string literal
|
34
|
+
# # comment is written in kebab case. (Words separated by hyphens)
|
35
|
+
# # bad
|
36
|
+
# # frozen_string_literal: true
|
37
|
+
#
|
38
|
+
# module Baz
|
39
|
+
# # ...
|
40
|
+
# end
|
41
|
+
#
|
42
|
+
# # good
|
43
|
+
# # frozen-string-literal: true
|
44
|
+
#
|
45
|
+
# module Baz
|
46
|
+
# # ...
|
47
|
+
# end
|
48
|
+
#
|
49
|
+
# @example DirectiveCapitalization: lowercase (default)
|
50
|
+
# # bad
|
51
|
+
# # FROZEN-STRING-LITERAL: true
|
52
|
+
#
|
53
|
+
# # good
|
54
|
+
# # frozen-string-literal: true
|
55
|
+
#
|
56
|
+
# @example DirectiveCapitalization: uppercase
|
57
|
+
# # bad
|
58
|
+
# # frozen-string-literal: true
|
59
|
+
#
|
60
|
+
# # good
|
61
|
+
# # FROZEN-STRING-LITERAL: true
|
62
|
+
#
|
63
|
+
# @example DirectiveCapitalization: nil
|
64
|
+
# # any capitalization is accepted
|
65
|
+
#
|
66
|
+
# # good
|
67
|
+
# # frozen-string-literal: true
|
68
|
+
#
|
69
|
+
# # good
|
70
|
+
# # FROZEN-STRING-LITERAL: true
|
71
|
+
#
|
72
|
+
# @example ValueCapitalization: nil (default)
|
73
|
+
# # any capitalization is accepted
|
74
|
+
#
|
75
|
+
# # good
|
76
|
+
# # frozen-string-literal: true
|
77
|
+
#
|
78
|
+
# # good
|
79
|
+
# # frozen-string-literal: TRUE
|
80
|
+
#
|
81
|
+
# @example ValueCapitalization: lowercase
|
82
|
+
# # when a value is not given, any capitalization is accepted
|
83
|
+
#
|
84
|
+
# # bad
|
85
|
+
# # frozen-string-literal: TRUE
|
86
|
+
#
|
87
|
+
# # good
|
88
|
+
# # frozen-string-literal: TRUE
|
89
|
+
#
|
90
|
+
# @example ValueCapitalization: uppercase
|
91
|
+
# # bad
|
92
|
+
# # frozen-string-literal: true
|
93
|
+
#
|
94
|
+
# # good
|
95
|
+
# # frozen-string-literal: TRUE
|
96
|
+
#
|
97
|
+
class MagicCommentFormat < Base
|
98
|
+
include ConfigurableEnforcedStyle
|
99
|
+
extend AutoCorrector
|
100
|
+
|
101
|
+
SNAKE_SEPARATOR = '_'
|
102
|
+
KEBAB_SEPARATOR = '-'
|
103
|
+
MSG = 'Prefer %<style>s case for magic comments.'
|
104
|
+
MSG_VALUE = 'Prefer %<case>s for magic comment values.'
|
105
|
+
|
106
|
+
# Value object to extract source ranges for the different parts of a magic comment
|
107
|
+
class CommentRange
|
108
|
+
extend Forwardable
|
109
|
+
|
110
|
+
DIRECTIVE_REGEXP = Regexp.union(MagicComment::KEYWORDS.map do |_, v|
|
111
|
+
Regexp.new(v, Regexp::IGNORECASE)
|
112
|
+
end).freeze
|
113
|
+
|
114
|
+
VALUE_REGEXP = Regexp.new("(?:#{DIRECTIVE_REGEXP}:\s*)(.*?)(?=;|$)")
|
115
|
+
|
116
|
+
def_delegators :@comment, :text, :loc
|
117
|
+
attr_reader :comment
|
118
|
+
|
119
|
+
def initialize(comment)
|
120
|
+
@comment = comment
|
121
|
+
end
|
122
|
+
|
123
|
+
# A magic comment can contain one directive (normal style) or
|
124
|
+
# multiple directives (emacs style)
|
125
|
+
def directives
|
126
|
+
@directives ||= begin
|
127
|
+
matches = []
|
128
|
+
|
129
|
+
text.scan(DIRECTIVE_REGEXP) do
|
130
|
+
offset = Regexp.last_match.offset(0)
|
131
|
+
matches << loc.expression.adjust(begin_pos: offset.first)
|
132
|
+
.with(end_pos: loc.expression.begin_pos + offset.last)
|
133
|
+
end
|
134
|
+
|
135
|
+
matches
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
# A magic comment can contain one value (normal style) or
|
140
|
+
# multiple directives (emacs style)
|
141
|
+
def values
|
142
|
+
@values ||= begin
|
143
|
+
matches = []
|
144
|
+
|
145
|
+
text.scan(VALUE_REGEXP) do
|
146
|
+
offset = Regexp.last_match.offset(1)
|
147
|
+
matches << loc.expression.adjust(begin_pos: offset.first)
|
148
|
+
.with(end_pos: loc.expression.begin_pos + offset.last)
|
149
|
+
end
|
150
|
+
|
151
|
+
matches
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
def on_new_investigation
|
157
|
+
return unless processed_source.ast
|
158
|
+
|
159
|
+
magic_comments.each do |comment|
|
160
|
+
issues = find_issues(comment)
|
161
|
+
register_offenses(issues) if issues.any?
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
private
|
166
|
+
|
167
|
+
def magic_comments
|
168
|
+
processed_source.each_comment_in_lines(leading_comment_lines)
|
169
|
+
.select { |comment| MagicComment.parse(comment.text).valid? }
|
170
|
+
.map { |comment| CommentRange.new(comment) }
|
171
|
+
end
|
172
|
+
|
173
|
+
def leading_comment_lines
|
174
|
+
first_non_comment_token = processed_source.tokens.find { |token| !token.comment? }
|
175
|
+
|
176
|
+
if first_non_comment_token
|
177
|
+
0...first_non_comment_token.line
|
178
|
+
else
|
179
|
+
(0..)
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
def find_issues(comment)
|
184
|
+
issues = { directives: [], values: [] }
|
185
|
+
|
186
|
+
comment.directives.each do |directive|
|
187
|
+
issues[:directives] << directive if directive_offends?(directive)
|
188
|
+
end
|
189
|
+
|
190
|
+
comment.values.each do |value| # rubocop:disable Style/HashEachMethods
|
191
|
+
issues[:values] << value if wrong_capitalization?(value.source, value_capitalization)
|
192
|
+
end
|
193
|
+
|
194
|
+
issues
|
195
|
+
end
|
196
|
+
|
197
|
+
def directive_offends?(directive)
|
198
|
+
incorrect_separator?(directive.source) ||
|
199
|
+
wrong_capitalization?(directive.source, directive_capitalization)
|
200
|
+
end
|
201
|
+
|
202
|
+
def register_offenses(issues)
|
203
|
+
fix_directives(issues[:directives])
|
204
|
+
fix_values(issues[:values])
|
205
|
+
end
|
206
|
+
|
207
|
+
def fix_directives(issues)
|
208
|
+
return if issues.empty?
|
209
|
+
|
210
|
+
msg = format(MSG, style: expected_style)
|
211
|
+
|
212
|
+
issues.each do |directive|
|
213
|
+
add_offense(directive, message: msg) do |corrector|
|
214
|
+
replacement = replace_separator(replace_capitalization(directive.source,
|
215
|
+
directive_capitalization))
|
216
|
+
corrector.replace(directive, replacement)
|
217
|
+
end
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
def fix_values(issues)
|
222
|
+
return if issues.empty?
|
223
|
+
|
224
|
+
msg = format(MSG_VALUE, case: value_capitalization)
|
225
|
+
|
226
|
+
issues.each do |value|
|
227
|
+
add_offense(value, message: msg) do |corrector|
|
228
|
+
corrector.replace(value, replace_capitalization(value.source, value_capitalization))
|
229
|
+
end
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
def expected_style
|
234
|
+
[directive_capitalization, style].compact.join(' ').gsub(/_?case\b/, '')
|
235
|
+
end
|
236
|
+
|
237
|
+
def wrong_separator
|
238
|
+
style == :snake_case ? KEBAB_SEPARATOR : SNAKE_SEPARATOR
|
239
|
+
end
|
240
|
+
|
241
|
+
def correct_separator
|
242
|
+
style == :snake_case ? SNAKE_SEPARATOR : KEBAB_SEPARATOR
|
243
|
+
end
|
244
|
+
|
245
|
+
def incorrect_separator?(text)
|
246
|
+
text[wrong_separator]
|
247
|
+
end
|
248
|
+
|
249
|
+
def wrong_capitalization?(text, expected_case)
|
250
|
+
return false unless expected_case
|
251
|
+
|
252
|
+
case expected_case
|
253
|
+
when :lowercase
|
254
|
+
text != text.downcase
|
255
|
+
when :uppercase
|
256
|
+
text != text.upcase
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
def replace_separator(text)
|
261
|
+
text.tr(wrong_separator, correct_separator)
|
262
|
+
end
|
263
|
+
|
264
|
+
def replace_capitalization(text, style)
|
265
|
+
return text unless style
|
266
|
+
|
267
|
+
case style
|
268
|
+
when :lowercase
|
269
|
+
text.downcase
|
270
|
+
when :uppercase
|
271
|
+
text.upcase
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
275
|
+
def line_range(line)
|
276
|
+
processed_source.buffer.line_range(line)
|
277
|
+
end
|
278
|
+
|
279
|
+
def directive_capitalization
|
280
|
+
cop_config['DirectiveCapitalization']&.to_sym.tap do |style|
|
281
|
+
unless valid_capitalization?(style)
|
282
|
+
raise "Unknown `DirectiveCapitalization` #{style} selected!"
|
283
|
+
end
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
287
|
+
def value_capitalization
|
288
|
+
cop_config['ValueCapitalization']&.to_sym.tap do |style|
|
289
|
+
unless valid_capitalization?(style)
|
290
|
+
raise "Unknown `ValueCapitalization` #{style} selected!"
|
291
|
+
end
|
292
|
+
end
|
293
|
+
end
|
294
|
+
|
295
|
+
def valid_capitalization?(style)
|
296
|
+
return true unless style
|
297
|
+
|
298
|
+
supported_capitalizations.include?(style)
|
299
|
+
end
|
300
|
+
|
301
|
+
def supported_capitalizations
|
302
|
+
cop_config['SupportedCapitalizations'].map(&:to_sym)
|
303
|
+
end
|
304
|
+
end
|
305
|
+
end
|
306
|
+
end
|
307
|
+
end
|
@@ -0,0 +1,136 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# Prefer `select` or `reject` over `map { ... }.compact`.
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
#
|
10
|
+
# # bad
|
11
|
+
# array.map { |e| some_condition? ? e : next }.compact
|
12
|
+
#
|
13
|
+
# # bad
|
14
|
+
# array.map do |e|
|
15
|
+
# if some_condition?
|
16
|
+
# e
|
17
|
+
# else
|
18
|
+
# next
|
19
|
+
# end
|
20
|
+
# end.compact
|
21
|
+
#
|
22
|
+
# # bad
|
23
|
+
# array.map do |e|
|
24
|
+
# next if some_condition?
|
25
|
+
#
|
26
|
+
# e
|
27
|
+
# end.compact
|
28
|
+
#
|
29
|
+
# # bad
|
30
|
+
# array.map do |e|
|
31
|
+
# e if some_condition?
|
32
|
+
# end.compact
|
33
|
+
#
|
34
|
+
# # good
|
35
|
+
# array.select { |e| some_condition? }
|
36
|
+
#
|
37
|
+
# # good
|
38
|
+
# array.reject { |e| some_condition? }
|
39
|
+
#
|
40
|
+
class MapCompactWithConditionalBlock < Base
|
41
|
+
extend AutoCorrector
|
42
|
+
|
43
|
+
MSG = 'Replace `map { ... }.compact` with `%<method>s`.'
|
44
|
+
|
45
|
+
# @!method map_and_compact?(node)
|
46
|
+
def_node_matcher :map_and_compact?, <<~RUBY
|
47
|
+
(send
|
48
|
+
(block
|
49
|
+
(send _ :map)
|
50
|
+
(args
|
51
|
+
$(arg _))
|
52
|
+
{
|
53
|
+
(if $_ $(lvar _) {next nil?})
|
54
|
+
(if $_ {next nil?} $(lvar _))
|
55
|
+
(if $_ (next $(lvar _)) {next nil nil?})
|
56
|
+
(if $_ {next nil nil?} (next $(lvar _)))
|
57
|
+
(begin
|
58
|
+
{
|
59
|
+
(if $_ next nil?)
|
60
|
+
(if $_ nil? next)
|
61
|
+
}
|
62
|
+
$(lvar _))
|
63
|
+
(begin
|
64
|
+
{
|
65
|
+
(if $_ (next $(lvar _)) nil?)
|
66
|
+
(if $_ nil? (next $(lvar _)))
|
67
|
+
}
|
68
|
+
(nil))
|
69
|
+
}) :compact)
|
70
|
+
RUBY
|
71
|
+
|
72
|
+
def on_send(node)
|
73
|
+
map_and_compact?(node) do |block_argument_node, condition_node, return_value_node|
|
74
|
+
return unless returns_block_argument?(block_argument_node, return_value_node)
|
75
|
+
return if condition_node.parent.elsif?
|
76
|
+
|
77
|
+
method = truthy_branch?(return_value_node) ? 'select' : 'reject'
|
78
|
+
range = range(node)
|
79
|
+
|
80
|
+
add_offense(range, message: format(MSG, method: method)) do |corrector|
|
81
|
+
corrector.replace(
|
82
|
+
range,
|
83
|
+
"#{method} { |#{block_argument_node.source}| #{condition_node.source} }"
|
84
|
+
)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
private
|
90
|
+
|
91
|
+
def returns_block_argument?(block_argument_node, return_value_node)
|
92
|
+
block_argument_node.name == return_value_node.children.first
|
93
|
+
end
|
94
|
+
|
95
|
+
def truthy_branch?(node)
|
96
|
+
if node.parent.begin_type?
|
97
|
+
truthy_branch_for_guard?(node)
|
98
|
+
elsif node.parent.next_type?
|
99
|
+
truthy_branch_for_if?(node.parent)
|
100
|
+
else
|
101
|
+
truthy_branch_for_if?(node)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def truthy_branch_for_if?(node)
|
106
|
+
if_node = node.parent
|
107
|
+
|
108
|
+
if if_node.if? || if_node.ternary?
|
109
|
+
if_node.if_branch == node
|
110
|
+
elsif if_node.unless?
|
111
|
+
if_node.else_branch == node
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def truthy_branch_for_guard?(node)
|
116
|
+
if_node = node.left_sibling
|
117
|
+
|
118
|
+
if if_node.if? || if_node.ternary?
|
119
|
+
if_node.else_branch.nil?
|
120
|
+
elsif if_node.unless?
|
121
|
+
if_node.if_branch.nil?
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def range(node)
|
126
|
+
buffer = node.loc.expression.source_buffer
|
127
|
+
map_node = node.receiver.send_node
|
128
|
+
begin_pos = map_node.loc.selector.begin_pos
|
129
|
+
end_pos = node.loc.expression.end_pos
|
130
|
+
|
131
|
+
Parser::Source::Range.new(buffer, begin_pos, end_pos)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
#
|
6
|
+
# Looks for uses of `map.to_h` or `collect.to_h` that could be
|
7
7
|
# written with just `to_h` in Ruby >= 2.6.
|
8
8
|
#
|
9
9
|
# NOTE: `Style/HashTransformKeys` and `Style/HashTransformValues` will
|
@@ -47,7 +47,7 @@ module RuboCop
|
|
47
47
|
|
48
48
|
message = format(MSG, method: map_node.loc.selector.source)
|
49
49
|
add_offense(map_node.loc.selector, message: message) do |corrector|
|
50
|
-
# If the `to_h` call already has a block, do not
|
50
|
+
# If the `to_h` call already has a block, do not autocorrect.
|
51
51
|
next if to_h_node.block_node
|
52
52
|
|
53
53
|
autocorrect(corrector, to_h_node, map_node)
|
@@ -59,7 +59,7 @@ module RuboCop
|
|
59
59
|
def autocorrect(corrector, to_h, map)
|
60
60
|
removal_range = range_between(to_h.loc.dot.begin_pos, to_h.loc.selector.end_pos)
|
61
61
|
|
62
|
-
corrector.remove(range_with_surrounding_space(
|
62
|
+
corrector.remove(range_with_surrounding_space(removal_range, side: :left))
|
63
63
|
corrector.replace(map.loc.selector, 'to_h')
|
64
64
|
end
|
65
65
|
end
|
@@ -25,12 +25,12 @@ module RuboCop
|
|
25
25
|
return if allowed_string_interpolation_method_call?(node)
|
26
26
|
|
27
27
|
add_offense(offense_range(node), message: OMIT_MSG) do |corrector|
|
28
|
-
|
28
|
+
autocorrect(corrector, node)
|
29
29
|
end
|
30
30
|
end
|
31
31
|
# rubocop:enable Metrics/PerceivedComplexity
|
32
32
|
|
33
|
-
def
|
33
|
+
def autocorrect(corrector, node)
|
34
34
|
if parentheses_at_the_end_of_multiline_call?(node)
|
35
35
|
corrector.replace(args_begin(node), ' \\')
|
36
36
|
else
|
@@ -130,7 +130,7 @@ module RuboCop
|
|
130
130
|
call_as_argument_or_chain?(node) ||
|
131
131
|
hash_literal_in_arguments?(node) ||
|
132
132
|
node.descendants.any? do |n|
|
133
|
-
n.forwarded_args_type? ||
|
133
|
+
n.forwarded_args_type? || ambiguous_literal?(n) || logical_operator?(n) ||
|
134
134
|
call_with_braced_block?(n)
|
135
135
|
end
|
136
136
|
end
|
@@ -166,7 +166,7 @@ module RuboCop
|
|
166
166
|
previous.parenthesized? || allowed_chained_call_with_parentheses?(previous)
|
167
167
|
end
|
168
168
|
|
169
|
-
def
|
169
|
+
def ambiguous_literal?(node)
|
170
170
|
splat?(node) || ternary_if?(node) || regexp_slash_literal?(node) || unary_literal?(node)
|
171
171
|
end
|
172
172
|
|
@@ -12,7 +12,7 @@ module RuboCop
|
|
12
12
|
private
|
13
13
|
|
14
14
|
def require_parentheses(node)
|
15
|
-
return if
|
15
|
+
return if allowed_method_name?(node.method_name)
|
16
16
|
return if matches_allowed_pattern?(node.method_name)
|
17
17
|
return if eligible_for_parentheses_omission?(node)
|
18
18
|
return unless node.arguments? && !node.parenthesized?
|
@@ -24,6 +24,10 @@ module RuboCop
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
+
def allowed_method_name?(name)
|
28
|
+
allowed_method?(name) || matches_allowed_pattern?(name)
|
29
|
+
end
|
30
|
+
|
27
31
|
def eligible_for_parentheses_omission?(node)
|
28
32
|
node.operator_method? || node.setter_method? || ignored_macro?(node)
|
29
33
|
end
|
@@ -3,11 +3,11 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
#
|
6
|
+
# Enforces the presence (default) or absence of parentheses in
|
7
7
|
# method calls containing parameters.
|
8
8
|
#
|
9
|
-
# In the default style (require_parentheses), macro methods are
|
10
|
-
# Additional methods can be added to the `
|
9
|
+
# In the default style (require_parentheses), macro methods are allowed.
|
10
|
+
# Additional methods can be added to the `AllowedMethods`
|
11
11
|
# or `AllowedPatterns` list. These options are
|
12
12
|
# valid only in the default style. Macros can be included by
|
13
13
|
# either setting `IgnoreMacros` to false or adding specific macros to
|
@@ -15,13 +15,13 @@ module RuboCop
|
|
15
15
|
#
|
16
16
|
# Precedence of options is all follows:
|
17
17
|
#
|
18
|
-
# 1. `
|
18
|
+
# 1. `AllowedMethods`
|
19
19
|
# 2. `AllowedPatterns`
|
20
20
|
# 3. `IncludedMacros`
|
21
21
|
#
|
22
22
|
# eg. If a method is listed in both
|
23
|
-
# `IncludedMacros` and `
|
24
|
-
# precedence (that is, the method is
|
23
|
+
# `IncludedMacros` and `AllowedMethods`, then the latter takes
|
24
|
+
# precedence (that is, the method is allowed).
|
25
25
|
#
|
26
26
|
# In the alternative style (omit_parentheses), there are three additional
|
27
27
|
# options.
|
@@ -65,7 +65,7 @@ module RuboCop
|
|
65
65
|
# # Setter methods don't need parens
|
66
66
|
# foo.bar = baz
|
67
67
|
#
|
68
|
-
# # okay with `puts` listed in `
|
68
|
+
# # okay with `puts` listed in `AllowedMethods`
|
69
69
|
# puts 'test'
|
70
70
|
#
|
71
71
|
# # okay with `^assert` listed in `AllowedPatterns`
|
@@ -197,7 +197,7 @@ module RuboCop
|
|
197
197
|
require_relative 'method_call_with_args_parentheses/require_parentheses'
|
198
198
|
|
199
199
|
include ConfigurableEnforcedStyle
|
200
|
-
include
|
200
|
+
include AllowedMethods
|
201
201
|
include AllowedPattern
|
202
202
|
include RequireParentheses
|
203
203
|
include OmitParentheses
|
@@ -3,7 +3,10 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
#
|
6
|
+
# Checks for unwanted parentheses in parameterless method calls.
|
7
|
+
#
|
8
|
+
# This cop can be customized allowed methods with `AllowedMethods`.
|
9
|
+
# By default, there are no methods to allowed.
|
7
10
|
#
|
8
11
|
# @example
|
9
12
|
# # bad
|
@@ -11,8 +14,18 @@ module RuboCop
|
|
11
14
|
#
|
12
15
|
# # good
|
13
16
|
# object.some_method
|
17
|
+
#
|
18
|
+
# @example AllowedMethods: [] (default)
|
19
|
+
# # bad
|
20
|
+
# object.foo()
|
21
|
+
#
|
22
|
+
# @example AllowedMethods: [foo]
|
23
|
+
# # good
|
24
|
+
# object.foo()
|
25
|
+
#
|
14
26
|
class MethodCallWithoutArgsParentheses < Base
|
15
|
-
include
|
27
|
+
include AllowedMethods
|
28
|
+
include AllowedPattern
|
16
29
|
extend AutoCorrector
|
17
30
|
|
18
31
|
MSG = 'Do not use parentheses for method calls with no arguments.'
|
@@ -21,7 +34,7 @@ module RuboCop
|
|
21
34
|
return unless !node.arguments? && node.parenthesized?
|
22
35
|
return if ineligible_node?(node)
|
23
36
|
return if default_argument?(node)
|
24
|
-
return if
|
37
|
+
return if allowed_method_name?(node.method_name)
|
25
38
|
return if same_name_assignment?(node)
|
26
39
|
|
27
40
|
register_offense(node)
|
@@ -44,6 +57,10 @@ module RuboCop
|
|
44
57
|
node.parent&.optarg_type?
|
45
58
|
end
|
46
59
|
|
60
|
+
def allowed_method_name?(name)
|
61
|
+
allowed_method?(name) || matches_allowed_pattern?(name)
|
62
|
+
end
|
63
|
+
|
47
64
|
def same_name_assignment?(node)
|
48
65
|
any_assignment?(node) do |asgn_node|
|
49
66
|
next variable_in_mass_assignment?(node.method_name, asgn_node) if asgn_node.masgn_type?
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
#
|
6
|
+
# Checks for methods called on a do...end block. The point of
|
7
7
|
# this check is that it's easy to miss the call tacked on to the block
|
8
8
|
# when reading code.
|
9
9
|
#
|
@@ -35,12 +35,15 @@ module RuboCop
|
|
35
35
|
ignore_node(node.send_node)
|
36
36
|
end
|
37
37
|
|
38
|
+
alias on_numblock on_block
|
39
|
+
|
38
40
|
def on_send(node)
|
39
41
|
return if ignored_node?(node)
|
40
42
|
|
41
43
|
receiver = node.receiver
|
42
44
|
|
43
|
-
return unless receiver&.block_type?
|
45
|
+
return unless (receiver&.block_type? || receiver&.numblock_type?) &&
|
46
|
+
receiver.loc.end.is?('end')
|
44
47
|
|
45
48
|
range = range_between(receiver.loc.end.begin_pos, node.source_range.end_pos)
|
46
49
|
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
#
|
6
|
+
# Checks for parentheses around the arguments in method
|
7
7
|
# definitions. Both instance and class/singleton methods are checked.
|
8
8
|
#
|
9
9
|
# Regardless of style, parentheses are necessary for:
|