rubocop 1.72.1 → 1.81.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +22 -18
- data/config/default.yml +240 -65
- data/config/internal_affairs.yml +20 -0
- data/config/obsoletion.yml +8 -3
- data/exe/rubocop +1 -8
- data/lib/rubocop/cli/command/auto_generate_config.rb +2 -2
- data/lib/rubocop/cli.rb +19 -4
- data/lib/rubocop/config.rb +35 -6
- data/lib/rubocop/config_loader.rb +8 -40
- data/lib/rubocop/config_loader_resolver.rb +9 -7
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
- data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
- data/lib/rubocop/config_obsoletion.rb +46 -2
- data/lib/rubocop/config_store.rb +5 -0
- data/lib/rubocop/config_validator.rb +7 -6
- data/lib/rubocop/cop/autocorrect_logic.rb +22 -14
- data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +7 -4
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +7 -2
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -2
- data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +37 -15
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/require_mfa.rb +15 -1
- data/lib/rubocop/cop/internal_affairs/example_description.rb +9 -5
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +4 -4
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +6 -2
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +92 -0
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
- data/lib/rubocop/cop/internal_affairs/undefined_config.rb +6 -1
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
- data/lib/rubocop/cop/internal_affairs.rb +1 -0
- data/lib/rubocop/cop/layout/block_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/class_structure.rb +36 -1
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- 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_line_after_guard_clause.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +32 -14
- data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +101 -0
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +34 -4
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +8 -29
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +1 -1
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/hash_alignment.rb +4 -7
- data/lib/rubocop/cop/layout/indentation_width.rb +1 -0
- data/lib/rubocop/cop/layout/leading_comment_space.rb +13 -1
- data/lib/rubocop/cop/layout/line_length.rb +43 -10
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +9 -5
- data/lib/rubocop/cop/layout/redundant_line_break.rb +9 -5
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +11 -5
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +10 -0
- data/lib/rubocop/cop/layout/space_around_keyword.rb +6 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +12 -1
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
- data/lib/rubocop/cop/layout/space_before_brackets.rb +5 -38
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +12 -3
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +3 -0
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_range.rb +5 -0
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +2 -3
- data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +2 -5
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +3 -2
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +13 -7
- data/lib/rubocop/cop/lint/debugger.rb +2 -4
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +5 -2
- data/lib/rubocop/cop/lint/duplicate_methods.rb +111 -23
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +5 -42
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +14 -64
- data/lib/rubocop/cop/lint/empty_interpolation.rb +14 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +0 -6
- data/lib/rubocop/cop/lint/float_comparison.rb +32 -10
- data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
- data/lib/rubocop/cop/lint/literal_as_condition.rb +124 -10
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +17 -8
- data/lib/rubocop/cop/lint/mixed_case_range.rb +2 -2
- data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +1 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +1 -1
- data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
- 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 +101 -2
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +43 -13
- data/lib/rubocop/cop/lint/redundant_with_index.rb +3 -0
- data/lib/rubocop/cop/lint/redundant_with_object.rb +3 -0
- data/lib/rubocop/cop/lint/require_range_parentheses.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -4
- data/lib/rubocop/cop/lint/rescue_type.rb +1 -1
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +4 -4
- data/lib/rubocop/cop/lint/self_assignment.rb +31 -5
- data/lib/rubocop/cop/lint/shadowed_argument.rb +7 -7
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +13 -1
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +12 -1
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +1 -1
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +2 -0
- data/lib/rubocop/cop/lint/unreachable_code.rb +1 -0
- data/lib/rubocop/cop/lint/unreachable_loop.rb +5 -5
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -0
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +30 -4
- data/lib/rubocop/cop/lint/useless_assignment.rb +2 -0
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +9 -12
- data/lib/rubocop/cop/lint/useless_default_value_argument.rb +90 -0
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +1 -0
- data/lib/rubocop/cop/lint/useless_or.rb +98 -0
- data/lib/rubocop/cop/lint/useless_rescue.rb +1 -1
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +3 -3
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +121 -0
- data/lib/rubocop/cop/lint/void.rb +16 -2
- data/lib/rubocop/cop/message_annotator.rb +7 -3
- data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
- data/lib/rubocop/cop/metrics/block_length.rb +1 -0
- data/lib/rubocop/cop/metrics/method_length.rb +1 -0
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -1
- data/lib/rubocop/cop/mixin/alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +3 -3
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +2 -2
- data/lib/rubocop/cop/mixin/def_node.rb +1 -1
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -7
- data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
- data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -2
- data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +15 -14
- data/lib/rubocop/cop/mixin/hash_subset.rb +19 -4
- data/lib/rubocop/cop/mixin/line_length_help.rb +24 -8
- data/lib/rubocop/cop/mixin/method_complexity.rb +1 -0
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +2 -0
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
- data/lib/rubocop/cop/mixin/range_help.rb +12 -0
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +1 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +18 -2
- data/lib/rubocop/cop/naming/block_forwarding.rb +3 -3
- data/lib/rubocop/cop/naming/file_name.rb +2 -2
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
- data/lib/rubocop/cop/naming/method_name.rb +187 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +319 -0
- data/lib/rubocop/cop/naming/{predicate_name.rb → predicate_prefix.rb} +4 -4
- data/lib/rubocop/cop/naming/variable_name.rb +51 -6
- data/lib/rubocop/cop/registry.rb +9 -6
- data/lib/rubocop/cop/security/eval.rb +2 -1
- data/lib/rubocop/cop/security/json_load.rb +33 -11
- data/lib/rubocop/cop/security/open.rb +1 -0
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +32 -10
- data/lib/rubocop/cop/style/accessor_grouping.rb +32 -6
- data/lib/rubocop/cop/style/arguments_forwarding.rb +21 -24
- data/lib/rubocop/cop/style/array_intersect.rb +113 -38
- data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +47 -0
- data/lib/rubocop/cop/style/bitwise_predicate.rb +8 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +3 -2
- data/lib/rubocop/cop/style/case_like_if.rb +1 -1
- data/lib/rubocop/cop/style/class_and_module_children.rb +48 -10
- data/lib/rubocop/cop/style/class_equality_comparison.rb +1 -1
- data/lib/rubocop/cop/style/collection_methods.rb +1 -0
- data/lib/rubocop/cop/style/collection_querying.rb +167 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +1 -0
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +12 -5
- data/lib/rubocop/cop/style/comparable_between.rb +78 -0
- data/lib/rubocop/cop/style/conditional_assignment.rb +26 -8
- data/lib/rubocop/cop/style/constant_visibility.rb +14 -9
- data/lib/rubocop/cop/style/data_inheritance.rb +7 -0
- data/lib/rubocop/cop/style/def_with_parentheses.rb +18 -5
- data/lib/rubocop/cop/style/dig_chain.rb +1 -1
- data/lib/rubocop/cop/style/double_negation.rb +3 -3
- data/lib/rubocop/cop/style/empty_literal.rb +4 -0
- data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +100 -0
- data/lib/rubocop/cop/style/endless_method.rb +176 -18
- data/lib/rubocop/cop/style/eval_with_location.rb +3 -3
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +3 -3
- data/lib/rubocop/cop/style/exponential_notation.rb +5 -4
- data/lib/rubocop/cop/style/fetch_env_var.rb +32 -6
- data/lib/rubocop/cop/style/float_division.rb +15 -1
- data/lib/rubocop/cop/style/for.rb +1 -0
- data/lib/rubocop/cop/style/format_string_token.rb +38 -11
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
- data/lib/rubocop/cop/style/global_std_stream.rb +3 -0
- data/lib/rubocop/cop/style/guard_clause.rb +2 -1
- data/lib/rubocop/cop/style/hash_conversion.rb +16 -8
- data/lib/rubocop/cop/style/hash_each_methods.rb +3 -2
- data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +4 -1
- data/lib/rubocop/cop/style/hash_transform_keys.rb +2 -2
- data/lib/rubocop/cop/style/hash_transform_values.rb +2 -2
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +3 -3
- data/lib/rubocop/cop/style/if_inside_else.rb +10 -13
- data/lib/rubocop/cop/style/if_unless_modifier.rb +35 -8
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +4 -7
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +1 -1
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +10 -6
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +2 -2
- data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
- data/lib/rubocop/cop/style/it_assignment.rb +69 -12
- data/lib/rubocop/cop/style/it_block_parameter.rb +121 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +13 -7
- data/lib/rubocop/cop/style/lambda.rb +1 -0
- data/lib/rubocop/cop/style/lambda_call.rb +7 -2
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/map_into_array.rb +4 -1
- data/lib/rubocop/cop/style/map_to_hash.rb +12 -3
- data/lib/rubocop/cop/style/map_to_set.rb +1 -3
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +9 -8
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +16 -0
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -1
- data/lib/rubocop/cop/style/min_max_comparison.rb +13 -5
- data/lib/rubocop/cop/style/multiline_block_chain.rb +2 -1
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -0
- data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -9
- data/lib/rubocop/cop/style/next.rb +44 -0
- data/lib/rubocop/cop/style/nil_comparison.rb +9 -7
- data/lib/rubocop/cop/style/object_then.rb +1 -0
- data/lib/rubocop/cop/style/one_line_conditional.rb +17 -9
- data/lib/rubocop/cop/style/parallel_assignment.rb +32 -20
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/proc.rb +1 -0
- data/lib/rubocop/cop/style/raise_args.rb +8 -8
- data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
- data/lib/rubocop/cop/style/redundant_begin.rb +35 -0
- data/lib/rubocop/cop/style/redundant_condition.rb +57 -0
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +14 -4
- data/lib/rubocop/cop/style/redundant_exception.rb +1 -1
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +1 -9
- data/lib/rubocop/cop/style/redundant_format.rb +79 -18
- data/lib/rubocop/cop/style/redundant_freeze.rb +2 -2
- data/lib/rubocop/cop/style/redundant_interpolation.rb +12 -3
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +1 -4
- data/lib/rubocop/cop/style/redundant_parentheses.rb +73 -18
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +4 -0
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +8 -0
- data/lib/rubocop/cop/style/redundant_self.rb +9 -5
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +1 -1
- data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
- data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
- data/lib/rubocop/cop/style/rescue_modifier.rb +3 -0
- data/lib/rubocop/cop/style/return_nil.rb +2 -2
- data/lib/rubocop/cop/style/safe_navigation.rb +61 -14
- data/lib/rubocop/cop/style/select_by_regexp.rb +4 -1
- data/lib/rubocop/cop/style/semicolon.rb +23 -7
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +3 -1
- data/lib/rubocop/cop/style/single_line_methods.rb +10 -7
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +75 -101
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/string_concatenation.rb +18 -15
- data/lib/rubocop/cop/style/struct_inheritance.rb +8 -1
- data/lib/rubocop/cop/style/super_arguments.rb +1 -2
- data/lib/rubocop/cop/style/symbol_array.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +3 -1
- data/lib/rubocop/cop/style/top_level_method_definition.rb +1 -0
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +52 -1
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
- data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
- data/lib/rubocop/cop/style/unless_else.rb +10 -9
- data/lib/rubocop/cop/team.rb +1 -1
- data/lib/rubocop/cop/util.rb +1 -1
- data/lib/rubocop/cop/utils/format_string.rb +15 -2
- data/lib/rubocop/cop/variable_force/assignment.rb +7 -3
- data/lib/rubocop/cop/variable_force/scope.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +3 -8
- data/lib/rubocop/cop/variable_force.rb +26 -9
- data/lib/rubocop/cops_documentation_generator.rb +23 -7
- data/lib/rubocop/directive_comment.rb +1 -1
- data/lib/rubocop/ext/regexp_node.rb +0 -1
- data/lib/rubocop/formatter/disabled_config_formatter.rb +19 -5
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/html_formatter.rb +1 -1
- data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +1 -1
- data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
- data/lib/rubocop/lsp/diagnostic.rb +25 -24
- data/lib/rubocop/lsp/routes.rb +65 -9
- data/lib/rubocop/lsp/runtime.rb +5 -5
- data/lib/rubocop/lsp/server.rb +2 -2
- data/lib/rubocop/lsp/stdin_runner.rb +3 -17
- data/lib/rubocop/magic_comment.rb +8 -0
- data/lib/rubocop/pending_cops_reporter.rb +56 -0
- data/lib/rubocop/plugin/configuration_integrator.rb +2 -0
- data/lib/rubocop/plugin/load_error.rb +1 -1
- data/lib/rubocop/plugin.rb +9 -2
- data/lib/rubocop/result_cache.rb +14 -12
- data/lib/rubocop/rspec/cop_helper.rb +6 -1
- data/lib/rubocop/rspec/expect_offense.rb +9 -3
- data/lib/rubocop/rspec/shared_contexts.rb +34 -0
- data/lib/rubocop/rspec/support.rb +3 -0
- data/lib/rubocop/runner.rb +10 -4
- data/lib/rubocop/server/cache.rb +17 -12
- data/lib/rubocop/server/client_command/base.rb +10 -0
- data/lib/rubocop/server/client_command/exec.rb +2 -1
- data/lib/rubocop/server/client_command/start.rb +11 -1
- data/lib/rubocop/target_finder.rb +13 -9
- data/lib/rubocop/target_ruby.rb +11 -2
- data/lib/rubocop/version.rb +14 -7
- data/lib/rubocop.rb +17 -2
- data/lib/ruby_lsp/rubocop/addon.rb +25 -10
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +57 -5
- metadata +24 -8
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
|
@@ -29,10 +29,13 @@ module RuboCop
|
|
|
29
29
|
def align_end(corrector, processed_source, node, align_to)
|
|
30
30
|
@processed_source = processed_source
|
|
31
31
|
whitespace = whitespace_range(node)
|
|
32
|
-
return false unless whitespace.source.strip.empty?
|
|
33
|
-
|
|
34
32
|
column = alignment_column(align_to)
|
|
35
|
-
|
|
33
|
+
|
|
34
|
+
if whitespace.source.strip.empty?
|
|
35
|
+
corrector.replace(whitespace, ' ' * column)
|
|
36
|
+
else
|
|
37
|
+
corrector.insert_after(whitespace, "\n#{' ' * column}")
|
|
38
|
+
end
|
|
36
39
|
end
|
|
37
40
|
|
|
38
41
|
private
|
|
@@ -54,7 +57,7 @@ module RuboCop
|
|
|
54
57
|
def inside_string_ranges(node)
|
|
55
58
|
return [] unless node.is_a?(Parser::AST::Node)
|
|
56
59
|
|
|
57
|
-
node.each_node(:
|
|
60
|
+
node.each_node(:any_str).filter_map { |n| inside_string_range(n) }
|
|
58
61
|
end
|
|
59
62
|
|
|
60
63
|
def inside_string_range(node)
|
|
@@ -6,7 +6,7 @@ module RuboCop
|
|
|
6
6
|
class ForToEachCorrector
|
|
7
7
|
extend NodePattern::Macros
|
|
8
8
|
|
|
9
|
-
CORRECTION = '%<collection>s
|
|
9
|
+
CORRECTION = '%<collection>s%<dot>seach do |%<argument>s|'
|
|
10
10
|
|
|
11
11
|
def initialize(for_node)
|
|
12
12
|
@for_node = for_node
|
|
@@ -25,7 +25,12 @@ module RuboCop
|
|
|
25
25
|
attr_reader :for_node, :variable_node, :collection_node
|
|
26
26
|
|
|
27
27
|
def correction
|
|
28
|
-
format(
|
|
28
|
+
format(
|
|
29
|
+
CORRECTION,
|
|
30
|
+
collection: collection_source,
|
|
31
|
+
dot: collection_node.csend_type? ? '&.' : '.',
|
|
32
|
+
argument: variable_node.source
|
|
33
|
+
)
|
|
29
34
|
end
|
|
30
35
|
|
|
31
36
|
def collection_source
|
|
@@ -10,8 +10,11 @@ module RuboCop
|
|
|
10
10
|
COMMA_REGEXP = /(?<=\))\s*,/.freeze
|
|
11
11
|
|
|
12
12
|
def correct(corrector, node)
|
|
13
|
-
|
|
14
|
-
corrector.remove(node.loc.
|
|
13
|
+
buffer = node.source_range.source_buffer
|
|
14
|
+
corrector.remove(range_with_surrounding_space(range: node.loc.begin, buffer: buffer,
|
|
15
|
+
side: :right, whitespace: true))
|
|
16
|
+
corrector.remove(range_with_surrounding_space(range: node.loc.end, buffer: buffer,
|
|
17
|
+
side: :left))
|
|
15
18
|
handle_orphaned_comma(corrector, node)
|
|
16
19
|
|
|
17
20
|
return unless ternary_condition?(node) && next_char_is_question_mark?(node)
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Gemspec
|
|
6
|
+
# Use consistent style for Gemspec attributes assignment.
|
|
7
|
+
#
|
|
8
|
+
# @example
|
|
9
|
+
#
|
|
10
|
+
# # bad
|
|
11
|
+
# # This example uses two styles for assignment of metadata attribute.
|
|
12
|
+
# Gem::Specification.new do |spec|
|
|
13
|
+
# spec.metadata = { 'key' => 'value' }
|
|
14
|
+
# spec.metadata['another-key'] = 'another-value'
|
|
15
|
+
# end
|
|
16
|
+
#
|
|
17
|
+
# # good
|
|
18
|
+
# Gem::Specification.new do |spec|
|
|
19
|
+
# spec.metadata['key'] = 'value'
|
|
20
|
+
# spec.metadata['another-key'] = 'another-value'
|
|
21
|
+
# end
|
|
22
|
+
#
|
|
23
|
+
# # good
|
|
24
|
+
# Gem::Specification.new do |spec|
|
|
25
|
+
# spec.metadata = { 'key' => 'value', 'another-key' => 'another-value' }
|
|
26
|
+
# end
|
|
27
|
+
#
|
|
28
|
+
# # bad
|
|
29
|
+
# # This example uses two styles for assignment of authors attribute.
|
|
30
|
+
# Gem::Specification.new do |spec|
|
|
31
|
+
# spec.authors = %w[author-0 author-1]
|
|
32
|
+
# spec.authors[2] = 'author-2'
|
|
33
|
+
# end
|
|
34
|
+
#
|
|
35
|
+
# # good
|
|
36
|
+
# Gem::Specification.new do |spec|
|
|
37
|
+
# spec.authors = %w[author-0 author-1 author-2]
|
|
38
|
+
# end
|
|
39
|
+
#
|
|
40
|
+
# # good
|
|
41
|
+
# Gem::Specification.new do |spec|
|
|
42
|
+
# spec.authors[0] = 'author-0'
|
|
43
|
+
# spec.authors[1] = 'author-1'
|
|
44
|
+
# spec.authors[2] = 'author-2'
|
|
45
|
+
# end
|
|
46
|
+
#
|
|
47
|
+
# # good
|
|
48
|
+
# # This example uses consistent assignment per attribute,
|
|
49
|
+
# # even though two different styles are used overall.
|
|
50
|
+
# Gem::Specification.new do |spec|
|
|
51
|
+
# spec.metadata = { 'key' => 'value' }
|
|
52
|
+
# spec.authors[0] = 'author-0'
|
|
53
|
+
# spec.authors[1] = 'author-1'
|
|
54
|
+
# spec.authors[2] = 'author-2'
|
|
55
|
+
# end
|
|
56
|
+
#
|
|
57
|
+
class AttributeAssignment < Base
|
|
58
|
+
include GemspecHelp
|
|
59
|
+
|
|
60
|
+
MSG = 'Use consistent style for Gemspec attributes assignment.'
|
|
61
|
+
|
|
62
|
+
def on_new_investigation
|
|
63
|
+
return if processed_source.blank?
|
|
64
|
+
|
|
65
|
+
assignments = source_assignments(processed_source.ast)
|
|
66
|
+
indexed_assignments = source_indexed_assignments(processed_source.ast)
|
|
67
|
+
|
|
68
|
+
assignments.keys.intersection(indexed_assignments.keys).each do |attribute|
|
|
69
|
+
indexed_assignments[attribute].each do |node|
|
|
70
|
+
add_offense(node)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
private
|
|
76
|
+
|
|
77
|
+
def source_assignments(ast)
|
|
78
|
+
assignment_method_declarations(ast)
|
|
79
|
+
.select(&:assignment_method?)
|
|
80
|
+
.group_by(&:method_name)
|
|
81
|
+
.transform_keys { |method_name| method_name.to_s.delete_suffix('=').to_sym }
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def source_indexed_assignments(ast)
|
|
85
|
+
indexed_assignment_method_declarations(ast)
|
|
86
|
+
.group_by { |node| node.children.first.method_name }
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
@@ -6,10 +6,11 @@ module RuboCop
|
|
|
6
6
|
# An attribute assignment method calls should be listed only once
|
|
7
7
|
# in a gemspec.
|
|
8
8
|
#
|
|
9
|
-
# Assigning to an attribute with the same name using `spec.foo =`
|
|
10
|
-
# an unintended usage. On the other hand,
|
|
11
|
-
# as `spec.requirements`,
|
|
12
|
-
# permitted because it is
|
|
9
|
+
# Assigning to an attribute with the same name using `spec.foo =` or
|
|
10
|
+
# `spec.attribute#[]=` will be an unintended usage. On the other hand,
|
|
11
|
+
# duplication of methods such # as `spec.requirements`,
|
|
12
|
+
# `spec.add_runtime_dependency`, and others are permitted because it is
|
|
13
|
+
# the intended use of appending values.
|
|
13
14
|
#
|
|
14
15
|
# @example
|
|
15
16
|
# # bad
|
|
@@ -34,6 +35,18 @@ module RuboCop
|
|
|
34
35
|
# spec.add_dependency('parallel', '~> 1.10')
|
|
35
36
|
# spec.add_dependency('parser', '>= 2.3.3.1', '< 3.0')
|
|
36
37
|
# end
|
|
38
|
+
#
|
|
39
|
+
# # bad
|
|
40
|
+
# Gem::Specification.new do |spec|
|
|
41
|
+
# spec.metadata["key"] = "value"
|
|
42
|
+
# spec.metadata["key"] = "value"
|
|
43
|
+
# end
|
|
44
|
+
#
|
|
45
|
+
# # good
|
|
46
|
+
# Gem::Specification.new do |spec|
|
|
47
|
+
# spec.metadata["key"] = "value"
|
|
48
|
+
# end
|
|
49
|
+
#
|
|
37
50
|
class DuplicatedAssignment < Base
|
|
38
51
|
include RangeHelp
|
|
39
52
|
include GemspecHelp
|
|
@@ -41,15 +54,16 @@ module RuboCop
|
|
|
41
54
|
MSG = '`%<assignment>s` method calls already given on line ' \
|
|
42
55
|
'%<line_of_first_occurrence>d of the gemspec.'
|
|
43
56
|
|
|
44
|
-
# @!method assignment_method_declarations(node)
|
|
45
|
-
def_node_search :assignment_method_declarations, <<~PATTERN
|
|
46
|
-
(send
|
|
47
|
-
(lvar #match_block_variable_name?) _ ...)
|
|
48
|
-
PATTERN
|
|
49
|
-
|
|
50
57
|
def on_new_investigation
|
|
51
58
|
return if processed_source.blank?
|
|
52
59
|
|
|
60
|
+
process_assignment_method_nodes
|
|
61
|
+
process_indexed_assignment_method_nodes
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
private
|
|
65
|
+
|
|
66
|
+
def process_assignment_method_nodes
|
|
53
67
|
duplicated_assignment_method_nodes.each do |nodes|
|
|
54
68
|
nodes[1..].each do |node|
|
|
55
69
|
register_offense(node, node.method_name, nodes.first.first_line)
|
|
@@ -57,11 +71,12 @@ module RuboCop
|
|
|
57
71
|
end
|
|
58
72
|
end
|
|
59
73
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
74
|
+
def process_indexed_assignment_method_nodes
|
|
75
|
+
duplicated_indexed_assignment_method_nodes.each do |nodes|
|
|
76
|
+
nodes[1..].each do |node|
|
|
77
|
+
assignment = "#{node.children.first.method_name}[#{node.first_argument.source}]="
|
|
78
|
+
register_offense(node, assignment, nodes.first.first_line)
|
|
79
|
+
end
|
|
65
80
|
end
|
|
66
81
|
end
|
|
67
82
|
|
|
@@ -73,6 +88,13 @@ module RuboCop
|
|
|
73
88
|
.select { |nodes| nodes.size > 1 }
|
|
74
89
|
end
|
|
75
90
|
|
|
91
|
+
def duplicated_indexed_assignment_method_nodes
|
|
92
|
+
indexed_assignment_method_declarations(processed_source.ast)
|
|
93
|
+
.group_by { |node| [node.children.first.method_name, node.first_argument] }
|
|
94
|
+
.values
|
|
95
|
+
.select { |nodes| nodes.size > 1 }
|
|
96
|
+
end
|
|
97
|
+
|
|
76
98
|
def register_offense(node, assignment, line_of_first_occurrence)
|
|
77
99
|
line_range = node.loc.column...node.loc.last_column
|
|
78
100
|
offense_location = source_range(processed_source.buffer, node.first_line, line_range)
|
|
@@ -71,7 +71,7 @@ module RuboCop
|
|
|
71
71
|
|
|
72
72
|
dependency_declarations(processed_source.ast)
|
|
73
73
|
.each_cons(2) do |previous, current|
|
|
74
|
-
next unless consecutive_lines(previous, current)
|
|
74
|
+
next unless consecutive_lines?(previous, current)
|
|
75
75
|
next unless case_insensitive_out_of_order?(gem_name(current), gem_name(previous))
|
|
76
76
|
next unless get_dependency_name(previous) == get_dependency_name(current)
|
|
77
77
|
|
|
@@ -74,6 +74,14 @@ module RuboCop
|
|
|
74
74
|
}
|
|
75
75
|
PATTERN
|
|
76
76
|
|
|
77
|
+
# @!method metadata_assignment(node)
|
|
78
|
+
def_node_search :metadata_assignment, <<~PATTERN
|
|
79
|
+
`{
|
|
80
|
+
(send _ :metadata= _)
|
|
81
|
+
(send (send _ :metadata) :[]= (str _) _)
|
|
82
|
+
}
|
|
83
|
+
PATTERN
|
|
84
|
+
|
|
77
85
|
# @!method rubygems_mfa_required(node)
|
|
78
86
|
def_node_search :rubygems_mfa_required, <<~PATTERN
|
|
79
87
|
(pair (str "rubygems_mfa_required") $_)
|
|
@@ -131,9 +139,15 @@ module RuboCop
|
|
|
131
139
|
end
|
|
132
140
|
|
|
133
141
|
def insert_mfa_required(corrector, node, block_var)
|
|
134
|
-
|
|
142
|
+
require_mfa_directive = <<~RUBY.strip
|
|
135
143
|
#{block_var}.metadata['rubygems_mfa_required'] = 'true'
|
|
136
144
|
RUBY
|
|
145
|
+
|
|
146
|
+
if (last_assignment = metadata_assignment(processed_source.ast).to_a.last)
|
|
147
|
+
corrector.insert_after(last_assignment, "\n#{require_mfa_directive}")
|
|
148
|
+
else
|
|
149
|
+
corrector.insert_before(node.loc.end, "#{require_mfa_directive}\n")
|
|
150
|
+
end
|
|
137
151
|
end
|
|
138
152
|
|
|
139
153
|
def change_value(corrector, value)
|
|
@@ -46,14 +46,16 @@ module RuboCop
|
|
|
46
46
|
/\A(does not|doesn't) (register|find|flag|report)/ => 'registers',
|
|
47
47
|
/\A(does not|doesn't) add (a|an|any )?offense/ => 'registers an offense',
|
|
48
48
|
/\Aregisters no offense/ => 'registers an offense',
|
|
49
|
-
/\A(accepts|register)\b/ => 'registers'
|
|
49
|
+
/\A(accepts|allows|register)\b/ => 'registers'
|
|
50
50
|
}.freeze
|
|
51
51
|
|
|
52
52
|
EXPECT_NO_CORRECTIONS_DESCRIPTION_MAPPING = {
|
|
53
|
-
/\A(auto[- ]?)?
|
|
53
|
+
/\A(auto[- ]?)?corrects?/ => 'does not correct',
|
|
54
|
+
/\band (auto[- ]?)?corrects/ => 'but does not correct'
|
|
54
55
|
}.freeze
|
|
55
56
|
|
|
56
57
|
EXPECT_CORRECTION_DESCRIPTION_MAPPING = {
|
|
58
|
+
/\bbut (does not|doesn't) (auto[- ]?)?correct/ => 'and autocorrects',
|
|
57
59
|
/\b(does not|doesn't) (auto[- ]?)?correct/ => 'autocorrects'
|
|
58
60
|
}.freeze
|
|
59
61
|
|
|
@@ -67,7 +69,7 @@ module RuboCop
|
|
|
67
69
|
# @!method offense_example(node)
|
|
68
70
|
def_node_matcher :offense_example, <<~PATTERN
|
|
69
71
|
(block
|
|
70
|
-
(send _ {:it :specify} $...)
|
|
72
|
+
(send _ {:it :specify :xit :fit} $...)
|
|
71
73
|
_args
|
|
72
74
|
`(send nil? %RESTRICT_ON_SEND ...)
|
|
73
75
|
)
|
|
@@ -90,8 +92,10 @@ module RuboCop
|
|
|
90
92
|
description_text = string_contents(current_description)
|
|
91
93
|
return unless (new_description = correct_description(description_text, description_map))
|
|
92
94
|
|
|
95
|
+
quote = current_description.dstr_type? ? '"' : "'"
|
|
96
|
+
|
|
93
97
|
add_offense(current_description, message: message) do |corrector|
|
|
94
|
-
corrector.replace(current_description, "
|
|
98
|
+
corrector.replace(current_description, "#{quote}#{new_description}#{quote}")
|
|
95
99
|
end
|
|
96
100
|
end
|
|
97
101
|
|
|
@@ -106,7 +110,7 @@ module RuboCop
|
|
|
106
110
|
end
|
|
107
111
|
|
|
108
112
|
def string_contents(node)
|
|
109
|
-
node.
|
|
113
|
+
node.type?(:str, :dstr) ? node.value : node.source
|
|
110
114
|
end
|
|
111
115
|
end
|
|
112
116
|
end
|
|
@@ -110,8 +110,8 @@ module RuboCop
|
|
|
110
110
|
def directive_offense_type(directive, actual_name)
|
|
111
111
|
return :missing_directive unless directive
|
|
112
112
|
|
|
113
|
-
return :wrong_scope if wrong_scope(directive, actual_name)
|
|
114
|
-
return :no_scope if no_scope(directive, actual_name)
|
|
113
|
+
return :wrong_scope if wrong_scope?(directive, actual_name)
|
|
114
|
+
return :no_scope if no_scope?(directive, actual_name)
|
|
115
115
|
|
|
116
116
|
# The method directive being prefixed by 'self.' is always an offense.
|
|
117
117
|
# The matched method_name does not contain the receiver but the
|
|
@@ -121,11 +121,11 @@ module RuboCop
|
|
|
121
121
|
end
|
|
122
122
|
end
|
|
123
123
|
|
|
124
|
-
def wrong_scope(directive, actual_name)
|
|
124
|
+
def wrong_scope?(directive, actual_name)
|
|
125
125
|
!actual_name.start_with?('self.') && directive[:has_scope_directive]
|
|
126
126
|
end
|
|
127
127
|
|
|
128
|
-
def no_scope(directive, actual_name)
|
|
128
|
+
def no_scope?(directive, actual_name)
|
|
129
129
|
actual_name.start_with?('self.') && !directive[:has_scope_directive]
|
|
130
130
|
end
|
|
131
131
|
|
|
@@ -27,7 +27,11 @@ module RuboCop
|
|
|
27
27
|
MSG = 'Replace `%<names>s` in node pattern union with `%<replacement>s`.'
|
|
28
28
|
RESTRICT_ON_SEND = %i[def_node_matcher def_node_search].freeze
|
|
29
29
|
NODE_GROUPS = {
|
|
30
|
-
any_block: %i[block numblock],
|
|
30
|
+
any_block: %i[block numblock itblock],
|
|
31
|
+
any_def: %i[def defs],
|
|
32
|
+
any_match_pattern: %i[match_pattern match_pattern_p],
|
|
33
|
+
any_str: %i[str dstr xstr],
|
|
34
|
+
any_sym: %i[sym dsym],
|
|
31
35
|
argument: %i[arg optarg restarg kwarg kwoptarg kwrestarg blockarg forward_arg shadowarg],
|
|
32
36
|
boolean: %i[true false],
|
|
33
37
|
call: %i[send csend],
|
|
@@ -208,7 +212,7 @@ module RuboCop
|
|
|
208
212
|
# A heredoc can be a `dstr` without interpolation, but if there is interpolation
|
|
209
213
|
# there'll be a `begin` node, in which case, we cannot evaluate the pattern.
|
|
210
214
|
def acceptable_heredoc?(node)
|
|
211
|
-
node.
|
|
215
|
+
node.any_str_type? && node.heredoc? && node.each_child_node(:begin).none?
|
|
212
216
|
end
|
|
213
217
|
|
|
214
218
|
def process_pattern(pattern_node)
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module InternalAffairs
|
|
6
|
+
# Checks that node types are checked against their group when all types of a
|
|
7
|
+
# group are checked.
|
|
8
|
+
#
|
|
9
|
+
# @example
|
|
10
|
+
# # bad
|
|
11
|
+
# node.type?(:irange, :erange)
|
|
12
|
+
#
|
|
13
|
+
# # good
|
|
14
|
+
# node.range_type?
|
|
15
|
+
#
|
|
16
|
+
# # bad
|
|
17
|
+
# node.type?(:irange, :erange, :send, :csend)
|
|
18
|
+
#
|
|
19
|
+
# # good
|
|
20
|
+
# node.type?(:range, :call)
|
|
21
|
+
#
|
|
22
|
+
class NodeTypeGroup < Base
|
|
23
|
+
extend AutoCorrector
|
|
24
|
+
include RangeHelp
|
|
25
|
+
|
|
26
|
+
MSG = 'Use `:%<group>s` instead of individually listing group types.'
|
|
27
|
+
|
|
28
|
+
RESTRICT_ON_SEND = %i[type? each_ancestor each_child_node each_descendant each_node].freeze
|
|
29
|
+
|
|
30
|
+
def on_send(node)
|
|
31
|
+
return unless node.receiver
|
|
32
|
+
|
|
33
|
+
symbol_args = node.arguments.select(&:sym_type?)
|
|
34
|
+
return if symbol_args.none?
|
|
35
|
+
|
|
36
|
+
NodePatternGroups::NODE_GROUPS.each do |group_name, group_types|
|
|
37
|
+
next unless group_satisfied?(group_types, symbol_args)
|
|
38
|
+
|
|
39
|
+
offense_range = arguments_range(node)
|
|
40
|
+
add_offense(offense_range, message: format(MSG, group: group_name)) do |corrector|
|
|
41
|
+
autocorrect(corrector, node, symbol_args, group_name, group_types)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
alias on_csend on_send
|
|
46
|
+
|
|
47
|
+
private
|
|
48
|
+
|
|
49
|
+
def arguments_range(node)
|
|
50
|
+
range_between(
|
|
51
|
+
node.first_argument.source_range.begin_pos,
|
|
52
|
+
node.last_argument.source_range.end_pos
|
|
53
|
+
)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def group_satisfied?(group_types, symbol_args)
|
|
57
|
+
group_types.all? { |type| symbol_args.any? { |arg| arg.value == type } }
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def autocorrect(corrector, node, symbol_args, group_name, group_types)
|
|
61
|
+
if node.method?(:type?) && node.arguments.count == group_types.count
|
|
62
|
+
autocorrect_to_explicit_predicate(corrector, node, group_name)
|
|
63
|
+
else
|
|
64
|
+
autocorrect_keep_method(corrector, symbol_args, group_name, group_types)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def autocorrect_to_explicit_predicate(corrector, node, group_name)
|
|
69
|
+
range = node.loc.selector.begin.join(node.source_range.end)
|
|
70
|
+
|
|
71
|
+
corrector.replace(range, "#{group_name}_type?")
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def autocorrect_keep_method(corrector, symbol_args, group_name, group_types)
|
|
75
|
+
first_replaced = false
|
|
76
|
+
symbol_args.each do |arg|
|
|
77
|
+
next unless group_types.include?(arg.value)
|
|
78
|
+
|
|
79
|
+
if first_replaced
|
|
80
|
+
range = range_with_surrounding_space(arg.source_range)
|
|
81
|
+
range = range_with_surrounding_comma(range, :left)
|
|
82
|
+
corrector.remove(range)
|
|
83
|
+
else
|
|
84
|
+
first_replaced = true
|
|
85
|
+
corrector.replace(arg, ":#{group_name}")
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
@@ -76,7 +76,7 @@ module RuboCop
|
|
|
76
76
|
end
|
|
77
77
|
|
|
78
78
|
def on_send(node) # rubocop:disable InternalAffairs/OnSendWithoutOnCSend
|
|
79
|
-
new_identifier = node.first_argument
|
|
79
|
+
return unless (new_identifier = node.first_argument)
|
|
80
80
|
return unless new_identifier.basic_literal?
|
|
81
81
|
|
|
82
82
|
new_identifier = new_identifier.value
|
|
@@ -38,23 +38,24 @@ module RuboCop
|
|
|
38
38
|
|
|
39
39
|
describe = find_describe_method_node(node)
|
|
40
40
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
end
|
|
41
|
+
should_append_config = describe && describe.last_argument.source != ':config'
|
|
42
|
+
additional_message = ' and specify `:config` in `describe`' if should_append_config
|
|
44
43
|
|
|
45
44
|
message = format(MSG, additional_message: additional_message)
|
|
46
45
|
|
|
47
46
|
add_offense(node, message: message) do |corrector|
|
|
48
47
|
corrector.remove(range_by_whole_lines(node.source_range, include_final_newline: true))
|
|
49
48
|
|
|
50
|
-
corrector.insert_after(describe.last_argument, ', :config')
|
|
49
|
+
corrector.insert_after(describe.last_argument, ', :config') if should_append_config
|
|
51
50
|
end
|
|
52
51
|
end
|
|
53
52
|
|
|
54
53
|
private
|
|
55
54
|
|
|
56
55
|
def find_describe_method_node(block_node)
|
|
57
|
-
block_node.ancestors.find
|
|
56
|
+
block_node.ancestors.find do |node|
|
|
57
|
+
node.block_type? && node.method?(:describe)
|
|
58
|
+
end&.send_node
|
|
58
59
|
end
|
|
59
60
|
end
|
|
60
61
|
end
|
|
@@ -10,7 +10,12 @@ module RuboCop
|
|
|
10
10
|
extend FileFinder
|
|
11
11
|
|
|
12
12
|
ALLOWED_CONFIGURATIONS = %w[
|
|
13
|
-
Safe SafeAutoCorrect AutoCorrect
|
|
13
|
+
Safe SafeAutoCorrect AutoCorrect
|
|
14
|
+
Severity
|
|
15
|
+
StyleGuide
|
|
16
|
+
Details
|
|
17
|
+
Reference References
|
|
18
|
+
Include Exclude
|
|
14
19
|
].freeze
|
|
15
20
|
RESTRICT_ON_SEND = %i[[] fetch].freeze
|
|
16
21
|
MSG = '`%<name>s` is not defined in the configuration for `%<cop>s` ' \
|
|
@@ -17,6 +17,7 @@ require_relative 'internal_affairs/node_destructuring'
|
|
|
17
17
|
require_relative 'internal_affairs/node_first_or_last_argument'
|
|
18
18
|
require_relative 'internal_affairs/node_matcher_directive'
|
|
19
19
|
require_relative 'internal_affairs/node_pattern_groups'
|
|
20
|
+
require_relative 'internal_affairs/node_type_group'
|
|
20
21
|
require_relative 'internal_affairs/node_type_multiple_predicates'
|
|
21
22
|
require_relative 'internal_affairs/node_type_predicate'
|
|
22
23
|
require_relative 'internal_affairs/numblock_handler'
|
|
@@ -73,8 +73,7 @@ module RuboCop
|
|
|
73
73
|
# @!method block_end_align_target?(node, child)
|
|
74
74
|
def_node_matcher :block_end_align_target?, <<~PATTERN
|
|
75
75
|
{assignment?
|
|
76
|
-
|
|
77
|
-
defs
|
|
76
|
+
any_def
|
|
78
77
|
splat
|
|
79
78
|
and
|
|
80
79
|
or
|
|
@@ -87,6 +86,7 @@ module RuboCop
|
|
|
87
86
|
end
|
|
88
87
|
|
|
89
88
|
alias on_numblock on_block
|
|
89
|
+
alias on_itblock on_block
|
|
90
90
|
|
|
91
91
|
def style_parameter_name
|
|
92
92
|
'EnforcedStyleAlignWith'
|
|
@@ -22,6 +22,11 @@ module RuboCop
|
|
|
22
22
|
# * Private attribute macros (`attr_accessor`, `attr_writer`, `attr_reader`)
|
|
23
23
|
# * Private instance methods
|
|
24
24
|
#
|
|
25
|
+
# NOTE: Simply enabling the cop with `Enabled: true` will not use
|
|
26
|
+
# the example order shown below.
|
|
27
|
+
# To enforce the order of macros like `attr_reader`,
|
|
28
|
+
# you must define both `ExpectedOrder` *and* `Categories`.
|
|
29
|
+
#
|
|
25
30
|
# You can configure the following order:
|
|
26
31
|
#
|
|
27
32
|
# [source,yaml]
|
|
@@ -68,6 +73,36 @@ module RuboCop
|
|
|
68
73
|
# - extend
|
|
69
74
|
# ----
|
|
70
75
|
#
|
|
76
|
+
# If you only set `ExpectedOrder`
|
|
77
|
+
# without defining `Categories`,
|
|
78
|
+
# macros such as `attr_reader` or `has_many`
|
|
79
|
+
# will not be recognized as part of a category, and their order will not be validated.
|
|
80
|
+
# For example, the following will NOT raise any offenses, even if the order is incorrect:
|
|
81
|
+
#
|
|
82
|
+
# [source,yaml]
|
|
83
|
+
# ----
|
|
84
|
+
# Layout/ClassStructure:
|
|
85
|
+
# Enabled: true
|
|
86
|
+
# ExpectedOrder:
|
|
87
|
+
# - public_attribute_macros
|
|
88
|
+
# - initializer
|
|
89
|
+
# ----
|
|
90
|
+
#
|
|
91
|
+
# To make it work as expected, you must also specify `Categories` like this:
|
|
92
|
+
#
|
|
93
|
+
# [source,yaml]
|
|
94
|
+
# ----
|
|
95
|
+
# Layout/ClassStructure:
|
|
96
|
+
# ExpectedOrder:
|
|
97
|
+
# - public_attribute_macros
|
|
98
|
+
# - initializer
|
|
99
|
+
# Categories:
|
|
100
|
+
# attribute_macros:
|
|
101
|
+
# - attr_reader
|
|
102
|
+
# - attr_writer
|
|
103
|
+
# - attr_accessor
|
|
104
|
+
# ----
|
|
105
|
+
#
|
|
71
106
|
# @safety
|
|
72
107
|
# Autocorrection is unsafe because class methods and module inclusion
|
|
73
108
|
# can behave differently, based on which methods or constants have
|
|
@@ -322,7 +357,7 @@ module RuboCop
|
|
|
322
357
|
end
|
|
323
358
|
|
|
324
359
|
def find_heredoc(node)
|
|
325
|
-
node.each_node(:
|
|
360
|
+
node.each_node(:any_str).find(&:heredoc?)
|
|
326
361
|
end
|
|
327
362
|
|
|
328
363
|
def buffer
|
|
@@ -155,13 +155,13 @@ module RuboCop
|
|
|
155
155
|
end
|
|
156
156
|
|
|
157
157
|
def all_elements_aligned?(elements)
|
|
158
|
-
elements.
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
158
|
+
if elements.first.hash_type?
|
|
159
|
+
elements.first.each_child_node.map { |child| child.loc.column }
|
|
160
|
+
else
|
|
161
|
+
elements.flat_map do |e|
|
|
162
162
|
e.loc.column
|
|
163
163
|
end
|
|
164
|
-
end.uniq.
|
|
164
|
+
end.uniq.one?
|
|
165
165
|
end
|
|
166
166
|
|
|
167
167
|
def first_argument_line(elements)
|
|
@@ -48,7 +48,7 @@ module RuboCop
|
|
|
48
48
|
def on_send(node)
|
|
49
49
|
return unless node.def_modifier?
|
|
50
50
|
|
|
51
|
-
method_def = node.each_descendant(:
|
|
51
|
+
method_def = node.each_descendant(:any_def).first
|
|
52
52
|
expr = node.source_range
|
|
53
53
|
|
|
54
54
|
line_start = range_between(expr.begin_pos, method_def.loc.keyword.end_pos)
|