rubocop 1.84.2 → 1.88.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/config/default.yml +180 -86
- data/config/obsoletion.yml +26 -1
- data/lib/rubocop/cache_config.rb +1 -1
- data/lib/rubocop/cli/command/auto_generate_config.rb +34 -2
- data/lib/rubocop/cli/command/list_enabled_cops_for.rb +40 -0
- data/lib/rubocop/cli/command/mcp.rb +19 -0
- data/lib/rubocop/cli/command/show_cops.rb +2 -2
- data/lib/rubocop/cli/command/show_docs_url.rb +4 -8
- data/lib/rubocop/cli/command/suggest_extensions.rb +1 -1
- data/lib/rubocop/cli.rb +9 -7
- data/lib/rubocop/comment_config.rb +12 -15
- data/lib/rubocop/config.rb +14 -10
- data/lib/rubocop/config_finder.rb +1 -1
- data/lib/rubocop/config_loader.rb +17 -2
- data/lib/rubocop/config_loader_resolver.rb +13 -4
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -2
- data/lib/rubocop/config_store.rb +2 -2
- data/lib/rubocop/config_validator.rb +1 -1
- data/lib/rubocop/cop/autocorrect_logic.rb +2 -1
- data/lib/rubocop/cop/base.rb +25 -4
- data/lib/rubocop/cop/bundler/gem_comment.rb +2 -2
- data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1 -5
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +33 -2
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors.rb +28 -0
- data/lib/rubocop/cop/documentation.rb +2 -3
- data/lib/rubocop/cop/exclude_limit.rb +31 -5
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +2 -2
- data/lib/rubocop/cop/gemspec/require_mfa.rb +5 -5
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +3 -3
- data/lib/rubocop/cop/internal_affairs/itblock_handler.rb +69 -0
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +5 -3
- data/lib/rubocop/cop/internal_affairs.rb +1 -0
- data/lib/rubocop/cop/layout/argument_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +41 -4
- data/lib/rubocop/cop/layout/class_structure.rb +1 -1
- data/lib/rubocop/cop/layout/dot_position.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +23 -7
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +12 -2
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +16 -2
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +16 -2
- data/lib/rubocop/cop/layout/end_alignment.rb +8 -5
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +7 -1
- data/lib/rubocop/cop/layout/hash_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +12 -0
- data/lib/rubocop/cop/layout/line_length.rb +5 -3
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +9 -2
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +53 -3
- data/lib/rubocop/cop/layout/parameter_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/redundant_line_break.rb +3 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +3 -1
- data/lib/rubocop/cop/layout/space_before_brackets.rb +1 -1
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +1 -0
- data/lib/rubocop/cop/lint/ambiguous_assignment.rb +1 -11
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +1 -10
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -3
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +1 -1
- data/lib/rubocop/cop/lint/constant_reassignment.rb +93 -11
- data/lib/rubocop/cop/lint/constant_resolution.rb +6 -6
- data/lib/rubocop/cop/lint/data_define_override.rb +63 -0
- data/lib/rubocop/cop/lint/debugger.rb +0 -1
- data/lib/rubocop/cop/lint/deprecated_constants.rb +2 -8
- data/lib/rubocop/cop/lint/duplicate_methods.rb +55 -8
- data/lib/rubocop/cop/lint/empty_block.rb +4 -4
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +6 -1
- data/lib/rubocop/cop/lint/empty_in_pattern.rb +8 -1
- data/lib/rubocop/cop/lint/empty_when.rb +8 -1
- data/lib/rubocop/cop/lint/ensure_return.rb +19 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +4 -2
- data/lib/rubocop/cop/lint/float_comparison.rb +1 -0
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -1
- data/lib/rubocop/cop/lint/interpolation_check.rb +25 -5
- data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +11 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +8 -11
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +5 -5
- data/lib/rubocop/cop/lint/multiple_comparison.rb +2 -2
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +2 -0
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +16 -0
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +4 -2
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
- data/lib/rubocop/cop/lint/number_conversion.rb +19 -10
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +3 -0
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +7 -7
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +3 -13
- 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 +4 -1
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +6 -12
- data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +15 -4
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +36 -12
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +4 -0
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +10 -3
- data/lib/rubocop/cop/lint/redundant_with_index.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_with_object.rb +5 -0
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +8 -1
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +9 -1
- data/lib/rubocop/cop/lint/require_parentheses.rb +13 -4
- data/lib/rubocop/cop/lint/require_range_parentheses.rb +2 -1
- data/lib/rubocop/cop/lint/require_relative_self_path.rb +7 -5
- data/lib/rubocop/cop/lint/rescue_type.rb +1 -1
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +18 -0
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +7 -1
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
- data/lib/rubocop/cop/lint/script_permission.rb +5 -1
- data/lib/rubocop/cop/lint/self_assignment.rb +24 -1
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -1
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +14 -0
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +3 -1
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +12 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +21 -4
- data/lib/rubocop/cop/lint/syntax.rb +25 -1
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +28 -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 +5 -1
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +4 -2
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -0
- data/lib/rubocop/cop/lint/unreachable_code.rb +2 -2
- data/lib/rubocop/cop/lint/unreachable_pattern_branch.rb +113 -0
- data/lib/rubocop/cop/lint/unused_method_argument.rb +10 -0
- data/lib/rubocop/cop/lint/useless_assignment.rb +14 -14
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +4 -4
- data/lib/rubocop/cop/lint/useless_default_value_argument.rb +2 -0
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +8 -4
- data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -1
- data/lib/rubocop/cop/lint/useless_times.rb +22 -1
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +35 -9
- data/lib/rubocop/cop/lint/void.rb +32 -12
- data/lib/rubocop/cop/metrics/block_length.rb +1 -1
- data/lib/rubocop/cop/metrics/block_nesting.rb +23 -0
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +1 -1
- data/lib/rubocop/cop/metrics/method_length.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/iterating_block.rb +1 -1
- data/lib/rubocop/cop/migration/department_name.rb +12 -1
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +1 -1
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +2 -2
- data/lib/rubocop/cop/mixin/configurable_max.rb +6 -5
- data/lib/rubocop/cop/mixin/hash_transform_method/autocorrection.rb +63 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +10 -60
- data/lib/rubocop/cop/mixin/project_index_help.rb +48 -0
- data/lib/rubocop/cop/mixin.rb +86 -0
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
- data/lib/rubocop/cop/naming/predicate_method.rb +2 -2
- data/lib/rubocop/cop/naming/predicate_prefix.rb +1 -1
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +1 -1
- data/lib/rubocop/cop/offense.rb +8 -0
- data/lib/rubocop/cop/registry.rb +62 -38
- data/lib/rubocop/cop/security/eval.rb +15 -2
- data/lib/rubocop/cop/security/io_methods.rb +1 -1
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +14 -2
- data/lib/rubocop/cop/style/accessor_grouping.rb +4 -2
- data/lib/rubocop/cop/style/alias.rb +15 -3
- data/lib/rubocop/cop/style/and_or.rb +2 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +25 -7
- data/lib/rubocop/cop/style/array_first_last.rb +12 -1
- data/lib/rubocop/cop/style/array_intersect.rb +4 -0
- data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +3 -0
- data/lib/rubocop/cop/style/array_join.rb +4 -2
- data/lib/rubocop/cop/style/ascii_comments.rb +6 -3
- data/lib/rubocop/cop/style/attr.rb +5 -2
- data/lib/rubocop/cop/style/bare_percent_literals.rb +3 -1
- data/lib/rubocop/cop/style/begin_block.rb +3 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +37 -31
- data/lib/rubocop/cop/style/case_equality.rb +18 -2
- data/lib/rubocop/cop/style/character_literal.rb +2 -2
- data/lib/rubocop/cop/style/class_and_module_children.rb +18 -2
- data/lib/rubocop/cop/style/class_equality_comparison.rb +21 -13
- data/lib/rubocop/cop/style/class_methods_definitions.rb +11 -5
- data/lib/rubocop/cop/style/collection_compact.rb +36 -16
- data/lib/rubocop/cop/style/colon_method_call.rb +16 -7
- data/lib/rubocop/cop/style/combinable_loops.rb +5 -0
- data/lib/rubocop/cop/style/comparable_clamp.rb +12 -1
- data/lib/rubocop/cop/style/concat_array_literals.rb +7 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +6 -5
- data/lib/rubocop/cop/style/constant_visibility.rb +4 -1
- data/lib/rubocop/cop/style/copyright.rb +22 -11
- data/lib/rubocop/cop/style/date_time.rb +4 -4
- data/lib/rubocop/cop/style/dig_chain.rb +5 -0
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +1 -1
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +6 -1
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
- data/lib/rubocop/cop/style/each_with_object.rb +2 -0
- data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_class_definition.rb +43 -20
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -1
- data/lib/rubocop/cop/style/encoding.rb +7 -1
- data/lib/rubocop/cop/style/end_block.rb +3 -1
- data/lib/rubocop/cop/style/endless_method.rb +8 -3
- data/lib/rubocop/cop/style/fetch_env_var.rb +1 -1
- data/lib/rubocop/cop/style/file_open.rb +84 -0
- data/lib/rubocop/cop/style/file_write.rb +21 -16
- data/lib/rubocop/cop/style/for.rb +3 -0
- data/lib/rubocop/cop/style/format_string.rb +4 -3
- data/lib/rubocop/cop/style/format_string_token.rb +29 -2
- data/lib/rubocop/cop/style/global_vars.rb +5 -2
- data/lib/rubocop/cop/style/guard_clause.rb +9 -6
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +21 -5
- data/lib/rubocop/cop/style/hash_conversion.rb +1 -1
- data/lib/rubocop/cop/style/hash_lookup_method.rb +19 -7
- data/lib/rubocop/cop/style/hash_slice.rb +16 -0
- data/lib/rubocop/cop/style/hash_transform_keys.rb +17 -7
- data/lib/rubocop/cop/style/hash_transform_values.rb +17 -7
- data/lib/rubocop/cop/style/if_inside_else.rb +16 -7
- data/lib/rubocop/cop/style/if_unless_modifier.rb +15 -4
- data/lib/rubocop/cop/style/if_with_semicolon.rb +7 -5
- data/lib/rubocop/cop/style/inline_comment.rb +4 -1
- data/lib/rubocop/cop/style/ip_addresses.rb +1 -2
- data/lib/rubocop/cop/style/magic_comment_format.rb +3 -3
- data/lib/rubocop/cop/style/map_join.rb +123 -0
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +5 -3
- data/lib/rubocop/cop/style/min_max_comparison.rb +1 -1
- data/lib/rubocop/cop/style/module_member_existence_check.rb +7 -14
- data/lib/rubocop/cop/style/multiline_if_then.rb +3 -1
- data/lib/rubocop/cop/style/mutable_constant.rb +106 -12
- data/lib/rubocop/cop/style/nil_comparison.rb +2 -3
- data/lib/rubocop/cop/style/nil_lambda.rb +1 -1
- data/lib/rubocop/cop/style/non_nil_check.rb +5 -11
- data/lib/rubocop/cop/style/not.rb +2 -0
- data/lib/rubocop/cop/style/numeric_literals.rb +3 -2
- data/lib/rubocop/cop/style/one_class_per_file.rb +115 -0
- data/lib/rubocop/cop/style/one_line_conditional.rb +4 -3
- data/lib/rubocop/cop/style/parallel_assignment.rb +12 -1
- data/lib/rubocop/cop/style/partition_instead_of_double_select.rb +270 -0
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -0
- data/lib/rubocop/cop/style/predicate_with_kind.rb +84 -0
- data/lib/rubocop/cop/style/proc.rb +3 -2
- data/lib/rubocop/cop/style/raise_args.rb +1 -1
- data/lib/rubocop/cop/style/reduce_to_hash.rb +200 -0
- data/lib/rubocop/cop/style/redundant_array_constructor.rb +2 -2
- data/lib/rubocop/cop/style/redundant_begin.rb +3 -3
- data/lib/rubocop/cop/style/redundant_constant_base.rb +5 -5
- data/lib/rubocop/cop/style/redundant_each.rb +3 -3
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +1 -1
- data/lib/rubocop/cop/style/redundant_format.rb +1 -0
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +26 -10
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +16 -0
- data/lib/rubocop/cop/style/redundant_min_max_by.rb +93 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +25 -22
- data/lib/rubocop/cop/style/redundant_percent_q.rb +4 -1
- data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +2 -2
- data/lib/rubocop/cop/style/redundant_return.rb +3 -1
- data/lib/rubocop/cop/style/redundant_self.rb +2 -2
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +0 -5
- data/lib/rubocop/cop/style/redundant_struct_keyword_init.rb +114 -0
- data/lib/rubocop/cop/style/regexp_literal.rb +31 -2
- data/lib/rubocop/cop/style/rescue_modifier.rb +3 -3
- data/lib/rubocop/cop/style/safe_navigation.rb +7 -7
- data/lib/rubocop/cop/style/select_by_kind.rb +158 -0
- data/lib/rubocop/cop/style/select_by_range.rb +197 -0
- data/lib/rubocop/cop/style/select_by_regexp.rb +51 -21
- data/lib/rubocop/cop/style/self_assignment.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +18 -1
- data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +1 -1
- data/lib/rubocop/cop/style/single_line_methods.rb +3 -1
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +4 -2
- data/lib/rubocop/cop/style/special_global_vars.rb +6 -1
- data/lib/rubocop/cop/style/struct_inheritance.rb +13 -0
- data/lib/rubocop/cop/style/symbol_proc.rb +7 -6
- data/lib/rubocop/cop/style/tally_method.rb +181 -0
- data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -2
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -0
- data/lib/rubocop/cop/style/unless_logical_operators.rb +3 -3
- data/lib/rubocop/cop/style/while_until_do.rb +7 -0
- data/lib/rubocop/cop/style/while_until_modifier.rb +16 -0
- data/lib/rubocop/cop/style/word_array.rb +1 -0
- data/lib/rubocop/cop/style/yoda_condition.rb +1 -1
- data/lib/rubocop/cop/style/yoda_expression.rb +1 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +6 -3
- data/lib/rubocop/cop/team.rb +86 -35
- data/lib/rubocop/cop/variable_force/branch.rb +2 -2
- data/lib/rubocop/directive_comment.rb +2 -1
- data/lib/rubocop/file_patterns.rb +9 -1
- data/lib/rubocop/formatter/disabled_config_formatter.rb +19 -9
- data/lib/rubocop/formatter/formatter_set.rb +1 -1
- data/lib/rubocop/formatter/junit_formatter.rb +1 -1
- data/lib/rubocop/formatter/simple_text_formatter.rb +0 -2
- data/lib/rubocop/formatter/worst_offenders_formatter.rb +1 -1
- data/lib/rubocop/formatter.rb +22 -21
- data/lib/rubocop/lsp/diagnostic.rb +1 -0
- data/lib/rubocop/lsp/routes.rb +10 -3
- data/lib/rubocop/lsp/runtime.rb +1 -2
- data/lib/rubocop/mcp/server.rb +200 -0
- data/lib/rubocop/options.rb +35 -4
- data/lib/rubocop/path_util.rb +14 -2
- data/lib/rubocop/plugin/loader.rb +1 -1
- data/lib/rubocop/project_index_loader.rb +66 -0
- data/lib/rubocop/result_cache.rb +22 -10
- data/lib/rubocop/rspec/cop_helper.rb +8 -0
- data/lib/rubocop/rspec/shared_contexts.rb +32 -2
- data/lib/rubocop/runner.rb +124 -53
- data/lib/rubocop/server/cache.rb +5 -7
- data/lib/rubocop/server/core.rb +8 -0
- data/lib/rubocop/target_finder.rb +14 -7
- data/lib/rubocop/target_ruby.rb +18 -12
- data/lib/rubocop/version.rb +21 -3
- data/lib/rubocop.rb +22 -96
- metadata +27 -5
|
@@ -19,6 +19,22 @@ module RuboCop
|
|
|
19
19
|
# This cop is unsafe because it cannot be guaranteed that the receiver
|
|
20
20
|
# is a `Hash` or responds to the replacement method.
|
|
21
21
|
#
|
|
22
|
+
# Additionally, the replacement may change the order of the resulting
|
|
23
|
+
# hash: `Hash#slice` returns entries in the order the keys are given,
|
|
24
|
+
# whereas `select`, `filter`, and `reject` preserve the entry order of
|
|
25
|
+
# the receiver.
|
|
26
|
+
#
|
|
27
|
+
# For example:
|
|
28
|
+
#
|
|
29
|
+
# [source,ruby]
|
|
30
|
+
# ----
|
|
31
|
+
# hash = {foo: 1, bar: 2, baz: 3}
|
|
32
|
+
# keys = %i[baz foo]
|
|
33
|
+
#
|
|
34
|
+
# hash.select { |k, _v| keys.include?(k) } # => {foo: 1, baz: 3}
|
|
35
|
+
# hash.slice(*keys) # => {baz: 3, foo: 1}
|
|
36
|
+
# ----
|
|
37
|
+
#
|
|
22
38
|
# @example
|
|
23
39
|
#
|
|
24
40
|
# # bad
|
|
@@ -11,9 +11,11 @@ module RuboCop
|
|
|
11
11
|
# (`transform_keys` was added in Ruby 2.5.)
|
|
12
12
|
#
|
|
13
13
|
# @safety
|
|
14
|
-
# This cop
|
|
15
|
-
#
|
|
16
|
-
#
|
|
14
|
+
# This cop identifies the receiver as a hash by checking for literal hash
|
|
15
|
+
# syntax and common methods that are known to return hashes (e.g. `to_h`,
|
|
16
|
+
# `merge`, `invert`, `group_by`, etc.). However, it is unsafe because it
|
|
17
|
+
# is possible for a custom class to define one of these methods and return
|
|
18
|
+
# something other than a hash.
|
|
17
19
|
#
|
|
18
20
|
# @example
|
|
19
21
|
# # bad
|
|
@@ -21,10 +23,18 @@ module RuboCop
|
|
|
21
23
|
# Hash[{a: 1, b: 2}.collect { |k, v| [foo(k), v] }]
|
|
22
24
|
# {a: 1, b: 2}.map { |k, v| [k.to_s, v] }.to_h
|
|
23
25
|
# {a: 1, b: 2}.to_h { |k, v| [k.to_s, v] }
|
|
26
|
+
# foo.to_h.each_with_object({}) { |(k, v), h| h[k.to_sym] = v }
|
|
27
|
+
# foo.merge(bar).map { |k, v| [k.to_s, v] }.to_h
|
|
24
28
|
#
|
|
25
29
|
# # good
|
|
26
30
|
# {a: 1, b: 2}.transform_keys { |k| foo(k) }
|
|
27
31
|
# {a: 1, b: 2}.transform_keys { |k| k.to_s }
|
|
32
|
+
# foo.to_h.transform_keys { |k| k.to_sym }
|
|
33
|
+
# foo.merge(bar).transform_keys { |k| k.to_s }
|
|
34
|
+
#
|
|
35
|
+
# # Won't register an offense - receiver is not known to be a hash
|
|
36
|
+
# foo.bar.each_with_object({}) { |(k, v), h| h[k.to_s] = v }
|
|
37
|
+
# baz.map { |k, v| [k.to_s, v] }.to_h
|
|
28
38
|
class HashTransformKeys < Base
|
|
29
39
|
include HashTransformMethod
|
|
30
40
|
extend AutoCorrector
|
|
@@ -35,7 +45,7 @@ module RuboCop
|
|
|
35
45
|
# @!method on_bad_each_with_object(node)
|
|
36
46
|
def_node_matcher :on_bad_each_with_object, <<~PATTERN
|
|
37
47
|
(block
|
|
38
|
-
(call
|
|
48
|
+
(call #hash_receiver? :each_with_object (hash))
|
|
39
49
|
(args
|
|
40
50
|
(mlhs
|
|
41
51
|
(arg $_)
|
|
@@ -50,7 +60,7 @@ module RuboCop
|
|
|
50
60
|
(const _ :Hash)
|
|
51
61
|
:[]
|
|
52
62
|
(block
|
|
53
|
-
(call
|
|
63
|
+
(call #hash_receiver? {:map :collect})
|
|
54
64
|
(args
|
|
55
65
|
(arg $_)
|
|
56
66
|
(arg _val))
|
|
@@ -61,7 +71,7 @@ module RuboCop
|
|
|
61
71
|
def_node_matcher :on_bad_map_to_h, <<~PATTERN
|
|
62
72
|
(call
|
|
63
73
|
(block
|
|
64
|
-
(call
|
|
74
|
+
(call #hash_receiver? {:map :collect})
|
|
65
75
|
(args
|
|
66
76
|
(arg $_)
|
|
67
77
|
(arg _val))
|
|
@@ -72,7 +82,7 @@ module RuboCop
|
|
|
72
82
|
# @!method on_bad_to_h(node)
|
|
73
83
|
def_node_matcher :on_bad_to_h, <<~PATTERN
|
|
74
84
|
(block
|
|
75
|
-
(call
|
|
85
|
+
(call #hash_receiver? :to_h)
|
|
76
86
|
(args
|
|
77
87
|
(arg $_)
|
|
78
88
|
(arg _val))
|
|
@@ -9,9 +9,11 @@ module RuboCop
|
|
|
9
9
|
# call to `transform_values` instead.
|
|
10
10
|
#
|
|
11
11
|
# @safety
|
|
12
|
-
# This cop
|
|
13
|
-
#
|
|
14
|
-
#
|
|
12
|
+
# This cop identifies the receiver as a hash by checking for literal hash
|
|
13
|
+
# syntax and common methods that are known to return hashes (e.g. `to_h`,
|
|
14
|
+
# `merge`, `invert`, `group_by`, etc.). However, it is unsafe because it
|
|
15
|
+
# is possible for a custom class to define one of these methods and return
|
|
16
|
+
# something other than a hash.
|
|
15
17
|
#
|
|
16
18
|
# @example
|
|
17
19
|
# # bad
|
|
@@ -19,10 +21,18 @@ module RuboCop
|
|
|
19
21
|
# Hash[{a: 1, b: 2}.collect { |k, v| [k, foo(v)] }]
|
|
20
22
|
# {a: 1, b: 2}.map { |k, v| [k, v * v] }.to_h
|
|
21
23
|
# {a: 1, b: 2}.to_h { |k, v| [k, v * v] }
|
|
24
|
+
# foo.to_h.each_with_object({}) { |(k, v), h| h[k] = foo(v) }
|
|
25
|
+
# foo.merge(bar).map { |k, v| [k, v.to_s] }.to_h
|
|
22
26
|
#
|
|
23
27
|
# # good
|
|
24
28
|
# {a: 1, b: 2}.transform_values { |v| foo(v) }
|
|
25
29
|
# {a: 1, b: 2}.transform_values { |v| v * v }
|
|
30
|
+
# foo.to_h.transform_values { |v| foo(v) }
|
|
31
|
+
# foo.merge(bar).transform_values { |v| v.to_s }
|
|
32
|
+
#
|
|
33
|
+
# # Won't register an offense - receiver is not known to be a hash
|
|
34
|
+
# foo.bar.each_with_object({}) { |(k, v), h| h[k] = v.to_s }
|
|
35
|
+
# baz.map { |k, v| [k, v.to_s] }.to_h
|
|
26
36
|
class HashTransformValues < Base
|
|
27
37
|
include HashTransformMethod
|
|
28
38
|
extend AutoCorrector
|
|
@@ -33,7 +43,7 @@ module RuboCop
|
|
|
33
43
|
# @!method on_bad_each_with_object(node)
|
|
34
44
|
def_node_matcher :on_bad_each_with_object, <<~PATTERN
|
|
35
45
|
(block
|
|
36
|
-
(call
|
|
46
|
+
(call #hash_receiver? :each_with_object (hash))
|
|
37
47
|
(args
|
|
38
48
|
(mlhs
|
|
39
49
|
(arg _key)
|
|
@@ -48,7 +58,7 @@ module RuboCop
|
|
|
48
58
|
(const _ :Hash)
|
|
49
59
|
:[]
|
|
50
60
|
(block
|
|
51
|
-
(call
|
|
61
|
+
(call #hash_receiver? {:map :collect})
|
|
52
62
|
(args
|
|
53
63
|
(arg _key)
|
|
54
64
|
(arg $_))
|
|
@@ -59,7 +69,7 @@ module RuboCop
|
|
|
59
69
|
def_node_matcher :on_bad_map_to_h, <<~PATTERN
|
|
60
70
|
(call
|
|
61
71
|
(block
|
|
62
|
-
(call
|
|
72
|
+
(call #hash_receiver? {:map :collect})
|
|
63
73
|
(args
|
|
64
74
|
(arg _key)
|
|
65
75
|
(arg $_))
|
|
@@ -70,7 +80,7 @@ module RuboCop
|
|
|
70
80
|
# @!method on_bad_to_h(node)
|
|
71
81
|
def_node_matcher :on_bad_to_h, <<~PATTERN
|
|
72
82
|
(block
|
|
73
|
-
(call
|
|
83
|
+
(call #hash_receiver? :to_h)
|
|
74
84
|
(args
|
|
75
85
|
(arg _key)
|
|
76
86
|
(arg $_))
|
|
@@ -64,7 +64,7 @@ module RuboCop
|
|
|
64
64
|
|
|
65
65
|
MSG = 'Convert `if` nested inside `else` to `elsif`.'
|
|
66
66
|
|
|
67
|
-
# rubocop:disable Metrics/CyclomaticComplexity
|
|
67
|
+
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
68
68
|
def on_if(node)
|
|
69
69
|
return if node.ternary? || node.unless?
|
|
70
70
|
|
|
@@ -72,6 +72,7 @@ module RuboCop
|
|
|
72
72
|
|
|
73
73
|
return unless else_branch&.if_type? && else_branch.if?
|
|
74
74
|
return if allow_if_modifier_in_else_branch?(else_branch)
|
|
75
|
+
return if comments_between_else_and_if?(node, else_branch)
|
|
75
76
|
|
|
76
77
|
add_offense(else_branch.loc.keyword) do |corrector|
|
|
77
78
|
next if part_of_ignored_node?(node)
|
|
@@ -80,12 +81,12 @@ module RuboCop
|
|
|
80
81
|
ignore_node(node)
|
|
81
82
|
end
|
|
82
83
|
end
|
|
83
|
-
# rubocop:enable Metrics/CyclomaticComplexity
|
|
84
|
+
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
84
85
|
|
|
85
86
|
private
|
|
86
87
|
|
|
87
88
|
def autocorrect(corrector, node)
|
|
88
|
-
if then?
|
|
89
|
+
if node.then?
|
|
89
90
|
# If the nested `if` is a then node, correct it first,
|
|
90
91
|
# then the next pass will use `correct_to_elsif_from_if_inside_else_form`
|
|
91
92
|
IfThenCorrector.new(node, indentation: 0).call(corrector)
|
|
@@ -124,10 +125,6 @@ module RuboCop
|
|
|
124
125
|
corrector.remove(range_by_whole_lines(find_end_range(node), include_final_newline: true))
|
|
125
126
|
end
|
|
126
127
|
|
|
127
|
-
def then?(node)
|
|
128
|
-
node.loc.begin&.source == 'then'
|
|
129
|
-
end
|
|
130
|
-
|
|
131
128
|
def find_end_range(node)
|
|
132
129
|
end_range = node.loc.end
|
|
133
130
|
return end_range if end_range
|
|
@@ -139,6 +136,18 @@ module RuboCop
|
|
|
139
136
|
range_between(node.loc.keyword.begin_pos, condition.source_range.end_pos)
|
|
140
137
|
end
|
|
141
138
|
|
|
139
|
+
def comments_between_else_and_if?(node, else_branch)
|
|
140
|
+
return false if else_branch.modifier_form?
|
|
141
|
+
|
|
142
|
+
else_end = node.loc.else.end_pos
|
|
143
|
+
if_begin = else_branch.loc.keyword.begin_pos
|
|
144
|
+
|
|
145
|
+
processed_source.comments.any? do |comment|
|
|
146
|
+
comment_pos = comment.source_range.begin_pos
|
|
147
|
+
comment_pos > else_end && comment_pos < if_begin
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
142
151
|
def allow_if_modifier_in_else_branch?(else_branch)
|
|
143
152
|
allow_if_modifier? && else_branch&.modifier_form?
|
|
144
153
|
end
|
|
@@ -86,12 +86,12 @@ module RuboCop
|
|
|
86
86
|
MSG_USE_NORMAL = 'Modifier form of `%<keyword>s` makes the line too long.'
|
|
87
87
|
|
|
88
88
|
def self.autocorrect_incompatible_with
|
|
89
|
-
[Style::SoleNestedConditional]
|
|
89
|
+
[Style::Next, Style::SoleNestedConditional]
|
|
90
90
|
end
|
|
91
91
|
|
|
92
|
-
# rubocop:disable Metrics/AbcSize
|
|
92
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
93
93
|
def on_if(node)
|
|
94
|
-
return if endless_method?(node.body)
|
|
94
|
+
return if endless_method?(node.body) || node.ancestors.any?(&:dstr_type?)
|
|
95
95
|
|
|
96
96
|
condition = node.condition
|
|
97
97
|
return if defined_nodes(condition).any? { |n| defined_argument_is_undefined?(node, n) } ||
|
|
@@ -101,12 +101,13 @@ module RuboCop
|
|
|
101
101
|
|
|
102
102
|
add_offense(node.loc.keyword, message: format(msg, keyword: node.keyword)) do |corrector|
|
|
103
103
|
next if part_of_ignored_node?(node)
|
|
104
|
+
next if another_modifier_if_on_same_line?(node)
|
|
104
105
|
|
|
105
106
|
autocorrect(corrector, node)
|
|
106
107
|
ignore_node(node)
|
|
107
108
|
end
|
|
108
109
|
end
|
|
109
|
-
# rubocop:enable Metrics/AbcSize
|
|
110
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
110
111
|
|
|
111
112
|
private
|
|
112
113
|
|
|
@@ -280,6 +281,16 @@ module RuboCop
|
|
|
280
281
|
node.parent if node&.type?(:pair)
|
|
281
282
|
end
|
|
282
283
|
|
|
284
|
+
def another_modifier_if_on_same_line?(node)
|
|
285
|
+
collection = find_containing_collection(node)
|
|
286
|
+
return false unless collection
|
|
287
|
+
|
|
288
|
+
line = node.source_range.line
|
|
289
|
+
collection.each_descendant(:if).any? do |sibling|
|
|
290
|
+
sibling != node && sibling.modifier_form? && sibling.source_range.line == line
|
|
291
|
+
end
|
|
292
|
+
end
|
|
293
|
+
|
|
283
294
|
def non_simple_if_unless?(node)
|
|
284
295
|
node.ternary? || node.elsif? || node.else?
|
|
285
296
|
end
|
|
@@ -17,9 +17,9 @@ module RuboCop
|
|
|
17
17
|
include OnNormalIfUnless
|
|
18
18
|
extend AutoCorrector
|
|
19
19
|
|
|
20
|
-
MSG_IF_ELSE = 'Do not use
|
|
21
|
-
MSG_NEWLINE = 'Do not use
|
|
22
|
-
MSG_TERNARY = 'Do not use
|
|
20
|
+
MSG_IF_ELSE = 'Do not use `%<keyword>s %<expr>s;` - use `if/else` instead.'
|
|
21
|
+
MSG_NEWLINE = 'Do not use `%<keyword>s %<expr>s;` - use a newline instead.'
|
|
22
|
+
MSG_TERNARY = 'Do not use `%<keyword>s %<expr>s;` - use a ternary operator instead.'
|
|
23
23
|
|
|
24
24
|
def on_normal_if_unless(node)
|
|
25
25
|
return if node.parent&.if_type?
|
|
@@ -49,7 +49,7 @@ module RuboCop
|
|
|
49
49
|
MSG_TERNARY
|
|
50
50
|
end
|
|
51
51
|
|
|
52
|
-
format(template, expr: node.condition.source)
|
|
52
|
+
format(template, keyword: node.keyword, expr: node.condition.source)
|
|
53
53
|
end
|
|
54
54
|
|
|
55
55
|
def autocorrect(corrector, node)
|
|
@@ -71,7 +71,7 @@ module RuboCop
|
|
|
71
71
|
end
|
|
72
72
|
|
|
73
73
|
def use_return_with_argument?(node)
|
|
74
|
-
node.
|
|
74
|
+
node.branches.compact.any? { |branch| branch.return_type? && branch.arguments.any? }
|
|
75
75
|
end
|
|
76
76
|
|
|
77
77
|
def replacement(node)
|
|
@@ -80,6 +80,8 @@ module RuboCop
|
|
|
80
80
|
then_code = node.if_branch ? build_expression(node.if_branch) : 'nil'
|
|
81
81
|
else_code = node.else_branch ? build_expression(node.else_branch) : 'nil'
|
|
82
82
|
|
|
83
|
+
then_code, else_code = else_code, then_code if node.unless?
|
|
84
|
+
|
|
83
85
|
"#{node.condition.source} ? #{then_code} : #{else_code}"
|
|
84
86
|
end
|
|
85
87
|
|
|
@@ -3,7 +3,10 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
# Checks for trailing inline comments.
|
|
6
|
+
# Checks for trailing inline comments. Inline comments can
|
|
7
|
+
# make lines harder to read, especially when they are long.
|
|
8
|
+
# Placing comments on their own line above the code they
|
|
9
|
+
# describe is often clearer.
|
|
7
10
|
#
|
|
8
11
|
# @example
|
|
9
12
|
#
|
|
@@ -48,8 +48,7 @@ module RuboCop
|
|
|
48
48
|
private
|
|
49
49
|
|
|
50
50
|
def allowed_addresses
|
|
51
|
-
allowed_addresses
|
|
52
|
-
Array(allowed_addresses).map(&:downcase)
|
|
51
|
+
@allowed_addresses ||= Array(cop_config['AllowedAddresses']).map(&:downcase).freeze
|
|
53
52
|
end
|
|
54
53
|
|
|
55
54
|
def potential_ip?(str)
|
|
@@ -10,7 +10,7 @@ module RuboCop
|
|
|
10
10
|
# Required capitalization can be set with the `DirectiveCapitalization` and
|
|
11
11
|
# `ValueCapitalization` configuration keys.
|
|
12
12
|
#
|
|
13
|
-
# NOTE: If one of these
|
|
13
|
+
# NOTE: If one of these configurations is set to nil, any capitalization is allowed.
|
|
14
14
|
#
|
|
15
15
|
# @example EnforcedStyle: snake_case (default)
|
|
16
16
|
# # The `snake_case` style will enforce that the frozen string literal
|
|
@@ -176,7 +176,7 @@ module RuboCop
|
|
|
176
176
|
if first_non_comment_token
|
|
177
177
|
0...first_non_comment_token.line
|
|
178
178
|
else
|
|
179
|
-
|
|
179
|
+
0..
|
|
180
180
|
end
|
|
181
181
|
end
|
|
182
182
|
|
|
@@ -299,7 +299,7 @@ module RuboCop
|
|
|
299
299
|
end
|
|
300
300
|
|
|
301
301
|
def supported_capitalizations
|
|
302
|
-
cop_config['SupportedCapitalizations'].map(&:to_sym)
|
|
302
|
+
@supported_capitalizations ||= cop_config['SupportedCapitalizations'].map(&:to_sym).freeze
|
|
303
303
|
end
|
|
304
304
|
end
|
|
305
305
|
end
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Style
|
|
6
|
+
# Checks for `map { |x| x.to_s }.join` and similar calls where the
|
|
7
|
+
# `map` is redundant because `Array#join` implicitly calls `#to_s` on
|
|
8
|
+
# each element.
|
|
9
|
+
#
|
|
10
|
+
# @safety
|
|
11
|
+
# This cop is unsafe because it cannot guarantee that the receiver
|
|
12
|
+
# is an `Array` by static analysis. If the receiver does not have
|
|
13
|
+
# an `Array#join`-compatible implementation (i.e. one that calls
|
|
14
|
+
# `#to_s` on elements), the correction may change behavior.
|
|
15
|
+
#
|
|
16
|
+
# @example
|
|
17
|
+
# # bad
|
|
18
|
+
# array.map(&:to_s).join(', ')
|
|
19
|
+
#
|
|
20
|
+
# # bad
|
|
21
|
+
# array.map { |x| x.to_s }.join(', ')
|
|
22
|
+
#
|
|
23
|
+
# # bad
|
|
24
|
+
# array.collect(&:to_s).join
|
|
25
|
+
#
|
|
26
|
+
# # good
|
|
27
|
+
# array.join(', ')
|
|
28
|
+
#
|
|
29
|
+
# # good
|
|
30
|
+
# array.join
|
|
31
|
+
#
|
|
32
|
+
class MapJoin < Base
|
|
33
|
+
extend AutoCorrector
|
|
34
|
+
include RangeHelp
|
|
35
|
+
|
|
36
|
+
MSG = 'Remove redundant `%<method>s(&:to_s)` before `join`.'
|
|
37
|
+
RESTRICT_ON_SEND = %i[join].freeze
|
|
38
|
+
|
|
39
|
+
# map(&:to_s).join(...)
|
|
40
|
+
# @!method map_to_s_join?(node)
|
|
41
|
+
def_node_matcher :map_to_s_join?, <<~PATTERN
|
|
42
|
+
(call
|
|
43
|
+
$(call _ ${:map :collect} (block_pass (sym :to_s)))
|
|
44
|
+
:join ...)
|
|
45
|
+
PATTERN
|
|
46
|
+
|
|
47
|
+
# map { |x| x.to_s }.join(...)
|
|
48
|
+
# @!method map_to_s_block_join?(node)
|
|
49
|
+
def_node_matcher :map_to_s_block_join?, <<~PATTERN
|
|
50
|
+
(call
|
|
51
|
+
$(block
|
|
52
|
+
(call _ ${:map :collect})
|
|
53
|
+
(args (arg _x))
|
|
54
|
+
(send (lvar _x) :to_s))
|
|
55
|
+
:join ...)
|
|
56
|
+
PATTERN
|
|
57
|
+
|
|
58
|
+
# map { _1.to_s }.join(...)
|
|
59
|
+
# @!method map_to_s_numblock_join?(node)
|
|
60
|
+
def_node_matcher :map_to_s_numblock_join?, <<~PATTERN
|
|
61
|
+
(call
|
|
62
|
+
$(numblock
|
|
63
|
+
(call _ ${:map :collect})
|
|
64
|
+
1
|
|
65
|
+
(send (lvar :_1) :to_s))
|
|
66
|
+
:join ...)
|
|
67
|
+
PATTERN
|
|
68
|
+
|
|
69
|
+
# map { it.to_s }.join(...)
|
|
70
|
+
# @!method map_to_s_itblock_join?(node)
|
|
71
|
+
def_node_matcher :map_to_s_itblock_join?, <<~PATTERN
|
|
72
|
+
(call
|
|
73
|
+
$(itblock
|
|
74
|
+
(call _ ${:map :collect})
|
|
75
|
+
:it
|
|
76
|
+
(send (lvar :it) :to_s))
|
|
77
|
+
:join ...)
|
|
78
|
+
PATTERN
|
|
79
|
+
|
|
80
|
+
def on_send(node)
|
|
81
|
+
map_to_s_join?(node) { |m, n| register_offense(node, m, n) } ||
|
|
82
|
+
map_to_s_block_join?(node) { |m, n| register_offense(node, m, n) } ||
|
|
83
|
+
map_to_s_numblock_join?(node) { |m, n| register_offense(node, m, n) } ||
|
|
84
|
+
map_to_s_itblock_join?(node) { |m, n| register_offense(node, m, n) }
|
|
85
|
+
end
|
|
86
|
+
alias on_csend on_send
|
|
87
|
+
|
|
88
|
+
private
|
|
89
|
+
|
|
90
|
+
def register_offense(join_node, map_node, method_name)
|
|
91
|
+
map_send = map_node.any_block_type? ? map_node.send_node : map_node
|
|
92
|
+
message = format(MSG, method: method_name)
|
|
93
|
+
|
|
94
|
+
add_offense(map_send.loc.selector, message: message) do |corrector|
|
|
95
|
+
remove_map_call(corrector, join_node, map_node, map_send)
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def remove_map_call(corrector, join_node, map_node, map_send)
|
|
100
|
+
receiver = map_send.receiver
|
|
101
|
+
if receiver
|
|
102
|
+
corrector.replace(removal_range(receiver, map_node, map_send), '')
|
|
103
|
+
else
|
|
104
|
+
corrector.replace(no_receiver_range(map_node, join_node), '')
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def removal_range(receiver, map_node, map_send)
|
|
109
|
+
start_pos = if receiver.last_line < map_send.loc.dot.line
|
|
110
|
+
receiver.source_range.end_pos
|
|
111
|
+
else
|
|
112
|
+
map_send.loc.dot.begin_pos
|
|
113
|
+
end
|
|
114
|
+
range_between(start_pos, map_node.source_range.end_pos)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def no_receiver_range(map_node, join_node)
|
|
118
|
+
range_between(map_node.source_range.begin_pos, join_node.loc.dot.end_pos)
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
@@ -33,16 +33,18 @@ module RuboCop
|
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
def included_macros_list
|
|
36
|
-
cop_config.fetch('IncludedMacros', []).map(&:to_sym)
|
|
36
|
+
@included_macros_list ||= cop_config.fetch('IncludedMacros', []).map(&:to_sym).freeze
|
|
37
37
|
end
|
|
38
38
|
|
|
39
39
|
def included_macro_patterns
|
|
40
|
-
|
|
40
|
+
@included_macro_patterns ||=
|
|
41
|
+
cop_config.fetch('IncludedMacroPatterns', [])
|
|
42
|
+
.map { |pattern| Regexp.new(pattern) }.freeze
|
|
41
43
|
end
|
|
42
44
|
|
|
43
45
|
def matches_included_macro_pattern?(method_name)
|
|
44
46
|
included_macro_patterns.any? do |pattern|
|
|
45
|
-
|
|
47
|
+
pattern.match?(method_name.to_s)
|
|
46
48
|
end
|
|
47
49
|
end
|
|
48
50
|
|
|
@@ -6,7 +6,7 @@ module RuboCop
|
|
|
6
6
|
# Enforces the use of `max` or `min` instead of comparison for greater or less.
|
|
7
7
|
#
|
|
8
8
|
# NOTE: It can be used if you want to present limit or threshold in Ruby 2.7+.
|
|
9
|
-
#
|
|
9
|
+
# It is slow though. So autocorrection will apply generic `max` or `min`:
|
|
10
10
|
#
|
|
11
11
|
# [source,ruby]
|
|
12
12
|
# ----
|
|
@@ -13,6 +13,12 @@ module RuboCop
|
|
|
13
13
|
# array, while `method_defined?` will do direct method lookup, which is much
|
|
14
14
|
# faster and consumes less memory.
|
|
15
15
|
#
|
|
16
|
+
# NOTE: `constants.include?` is not handled by this cop because
|
|
17
|
+
# `Module#const_defined?` has different lookup behavior than
|
|
18
|
+
# `Module#constants` - `const_defined?` searches up to `Object`
|
|
19
|
+
# (top-level constants like `String`, `Integer`, etc.) while
|
|
20
|
+
# `constants` does not, which can cause behavior changes after autocorrection.
|
|
21
|
+
#
|
|
16
22
|
# @example
|
|
17
23
|
# # bad
|
|
18
24
|
# Array.instance_methods.include?(:size)
|
|
@@ -28,27 +34,17 @@ module RuboCop
|
|
|
28
34
|
#
|
|
29
35
|
# # bad
|
|
30
36
|
# Array.class_variables.include?(:foo)
|
|
31
|
-
# Array.constants.include?(:foo)
|
|
32
37
|
# Array.private_instance_methods.include?(:foo)
|
|
33
38
|
# Array.protected_instance_methods.include?(:foo)
|
|
34
39
|
# Array.public_instance_methods.include?(:foo)
|
|
35
|
-
# Array.included_modules.include?(:foo)
|
|
36
40
|
#
|
|
37
41
|
# # good
|
|
38
42
|
# Array.class_variable_defined?(:foo)
|
|
39
|
-
# Array.const_defined?(:foo)
|
|
40
43
|
# Array.private_method_defined?(:foo)
|
|
41
44
|
# Array.protected_method_defined?(:foo)
|
|
42
45
|
# Array.public_method_defined?(:foo)
|
|
43
|
-
# Array.include?(:foo)
|
|
44
|
-
#
|
|
45
|
-
# @example AllowedMethods: [included_modules]
|
|
46
|
-
#
|
|
47
|
-
# # good
|
|
48
|
-
# Array.included_modules.include?(:foo)
|
|
49
46
|
#
|
|
50
47
|
class ModuleMemberExistenceCheck < Base
|
|
51
|
-
include AllowedMethods
|
|
52
48
|
extend AutoCorrector
|
|
53
49
|
|
|
54
50
|
MSG = 'Use `%<replacement>s` instead.'
|
|
@@ -63,15 +59,13 @@ module RuboCop
|
|
|
63
59
|
|
|
64
60
|
METHOD_REPLACEMENTS = {
|
|
65
61
|
class_variables: :class_variable_defined?,
|
|
66
|
-
constants: :const_defined?,
|
|
67
|
-
included_modules: :include?,
|
|
68
62
|
instance_methods: :method_defined?,
|
|
69
63
|
private_instance_methods: :private_method_defined?,
|
|
70
64
|
protected_instance_methods: :protected_method_defined?,
|
|
71
65
|
public_instance_methods: :public_method_defined?
|
|
72
66
|
}.freeze
|
|
73
67
|
|
|
74
|
-
METHODS_WITHOUT_INHERIT_PARAM = Set[:class_variables
|
|
68
|
+
METHODS_WITHOUT_INHERIT_PARAM = Set[:class_variables].freeze
|
|
75
69
|
METHODS_WITH_INHERIT_PARAM =
|
|
76
70
|
(METHOD_REPLACEMENTS.keys.to_set - METHODS_WITHOUT_INHERIT_PARAM).freeze
|
|
77
71
|
|
|
@@ -81,7 +75,6 @@ module RuboCop
|
|
|
81
75
|
return unless (parent = node.parent)
|
|
82
76
|
return unless module_member_inclusion?(parent)
|
|
83
77
|
return unless simple_method_argument?(node) && simple_method_argument?(parent)
|
|
84
|
-
return if allowed_method?(node.method_name)
|
|
85
78
|
|
|
86
79
|
offense_range = node.location.selector.join(parent.source_range.end)
|
|
87
80
|
replacement = replacement_for(node, parent)
|
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
# Checks for uses of the `then` keyword in multi-line if statements.
|
|
6
|
+
# Checks for uses of the `then` keyword in multi-line `if` statements.
|
|
7
|
+
# In multi-line `if` statements, `then` is redundant because the newline
|
|
8
|
+
# already separates the condition from the body.
|
|
7
9
|
#
|
|
8
10
|
# @example
|
|
9
11
|
# # bad
|