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
|
@@ -5,8 +5,11 @@ module RuboCop
|
|
|
5
5
|
module Style
|
|
6
6
|
# Checks for endless methods.
|
|
7
7
|
#
|
|
8
|
-
# It can enforce
|
|
9
|
-
#
|
|
8
|
+
# It can enforce endless method definitions whenever possible or with single line methods.
|
|
9
|
+
# It can also disallow multiline endless method definitions or all endless definitions.
|
|
10
|
+
#
|
|
11
|
+
# `require_single_line` style enforces endless method definitions for single line methods.
|
|
12
|
+
# `require_always` style enforces endless method definitions for single statement methods.
|
|
10
13
|
#
|
|
11
14
|
# Other method definition types are not considered by this cop.
|
|
12
15
|
#
|
|
@@ -15,36 +18,116 @@ module RuboCop
|
|
|
15
18
|
# * allow_single_line (default) - only single line endless method definitions are allowed.
|
|
16
19
|
# * allow_always - all endless method definitions are allowed.
|
|
17
20
|
# * disallow - all endless method definitions are disallowed.
|
|
21
|
+
# * require_single_line - endless method definitions are required for single line methods.
|
|
22
|
+
# * require_always - all endless method definitions are required.
|
|
18
23
|
#
|
|
19
24
|
# NOTE: Incorrect endless method definitions will always be
|
|
20
25
|
# corrected to a multi-line definition.
|
|
21
26
|
#
|
|
22
27
|
# @example EnforcedStyle: allow_single_line (default)
|
|
28
|
+
# # bad, multi-line endless method
|
|
29
|
+
# def my_method = x.foo
|
|
30
|
+
# .bar
|
|
31
|
+
# .baz
|
|
32
|
+
#
|
|
23
33
|
# # good
|
|
24
|
-
# def my_method
|
|
34
|
+
# def my_method
|
|
35
|
+
# x
|
|
36
|
+
# end
|
|
25
37
|
#
|
|
26
|
-
# #
|
|
27
|
-
# def my_method
|
|
28
|
-
#
|
|
29
|
-
#
|
|
38
|
+
# # good
|
|
39
|
+
# def my_method = x
|
|
40
|
+
#
|
|
41
|
+
# # good
|
|
42
|
+
# def my_method
|
|
43
|
+
# x.foo
|
|
44
|
+
# .bar
|
|
45
|
+
# .baz
|
|
46
|
+
# end
|
|
30
47
|
#
|
|
31
48
|
# @example EnforcedStyle: allow_always
|
|
32
49
|
# # good
|
|
33
|
-
# def my_method
|
|
50
|
+
# def my_method
|
|
51
|
+
# x
|
|
52
|
+
# end
|
|
34
53
|
#
|
|
35
54
|
# # good
|
|
36
|
-
# def my_method
|
|
37
|
-
#
|
|
38
|
-
#
|
|
55
|
+
# def my_method = x
|
|
56
|
+
#
|
|
57
|
+
# # good
|
|
58
|
+
# def my_method = x.foo
|
|
59
|
+
# .bar
|
|
60
|
+
# .baz
|
|
61
|
+
#
|
|
62
|
+
# # good
|
|
63
|
+
# def my_method
|
|
64
|
+
# x.foo
|
|
65
|
+
# .bar
|
|
66
|
+
# .baz
|
|
67
|
+
# end
|
|
39
68
|
#
|
|
40
69
|
# @example EnforcedStyle: disallow
|
|
41
70
|
# # bad
|
|
42
|
-
# def my_method
|
|
71
|
+
# def my_method = x
|
|
72
|
+
#
|
|
73
|
+
# # bad
|
|
74
|
+
# def my_method = x.foo
|
|
75
|
+
# .bar
|
|
76
|
+
# .baz
|
|
77
|
+
#
|
|
78
|
+
# # good
|
|
79
|
+
# def my_method
|
|
80
|
+
# x
|
|
81
|
+
# end
|
|
82
|
+
#
|
|
83
|
+
# # good
|
|
84
|
+
# def my_method
|
|
85
|
+
# x.foo
|
|
86
|
+
# .bar
|
|
87
|
+
# .baz
|
|
88
|
+
# end
|
|
89
|
+
#
|
|
90
|
+
# @example EnforcedStyle: require_single_line
|
|
91
|
+
# # bad
|
|
92
|
+
# def my_method
|
|
93
|
+
# x
|
|
94
|
+
# end
|
|
43
95
|
#
|
|
44
96
|
# # bad
|
|
45
|
-
# def my_method
|
|
46
|
-
#
|
|
47
|
-
#
|
|
97
|
+
# def my_method = x.foo
|
|
98
|
+
# .bar
|
|
99
|
+
# .baz
|
|
100
|
+
#
|
|
101
|
+
# # good
|
|
102
|
+
# def my_method = x
|
|
103
|
+
#
|
|
104
|
+
# # good
|
|
105
|
+
# def my_method
|
|
106
|
+
# x.foo
|
|
107
|
+
# .bar
|
|
108
|
+
# .baz
|
|
109
|
+
# end
|
|
110
|
+
#
|
|
111
|
+
# @example EnforcedStyle: require_always
|
|
112
|
+
# # bad
|
|
113
|
+
# def my_method
|
|
114
|
+
# x
|
|
115
|
+
# end
|
|
116
|
+
#
|
|
117
|
+
# # bad
|
|
118
|
+
# def my_method
|
|
119
|
+
# x.foo
|
|
120
|
+
# .bar
|
|
121
|
+
# .baz
|
|
122
|
+
# end
|
|
123
|
+
#
|
|
124
|
+
# # good
|
|
125
|
+
# def my_method = x
|
|
126
|
+
#
|
|
127
|
+
# # good
|
|
128
|
+
# def my_method = x.foo
|
|
129
|
+
# .bar
|
|
130
|
+
# .baz
|
|
48
131
|
#
|
|
49
132
|
class EndlessMethod < Base
|
|
50
133
|
include ConfigurableEnforcedStyle
|
|
@@ -57,12 +140,21 @@ module RuboCop
|
|
|
57
140
|
CORRECTION_STYLES = %w[multiline single_line].freeze
|
|
58
141
|
MSG = 'Avoid endless method definitions.'
|
|
59
142
|
MSG_MULTI_LINE = 'Avoid endless method definitions with multiple lines.'
|
|
143
|
+
MSG_REQUIRE_SINGLE = 'Use endless method definitions for single line methods.'
|
|
144
|
+
MSG_REQUIRE_ALWAYS = 'Use endless method definitions.'
|
|
60
145
|
|
|
61
146
|
def on_def(node)
|
|
62
|
-
if
|
|
63
|
-
|
|
64
|
-
|
|
147
|
+
return if node.assignment_method? || use_heredoc?(node)
|
|
148
|
+
|
|
149
|
+
case style
|
|
150
|
+
when :allow_single_line, :allow_always
|
|
65
151
|
handle_allow_style(node)
|
|
152
|
+
when :disallow
|
|
153
|
+
handle_disallow_style(node)
|
|
154
|
+
when :require_single_line
|
|
155
|
+
handle_require_single_line_style(node)
|
|
156
|
+
when :require_always
|
|
157
|
+
handle_require_always_style(node)
|
|
66
158
|
end
|
|
67
159
|
end
|
|
68
160
|
|
|
@@ -77,11 +169,77 @@ module RuboCop
|
|
|
77
169
|
end
|
|
78
170
|
end
|
|
79
171
|
|
|
172
|
+
def handle_require_single_line_style(node)
|
|
173
|
+
if node.endless? && !node.single_line?
|
|
174
|
+
add_offense(node, message: MSG_MULTI_LINE) do |corrector|
|
|
175
|
+
correct_to_multiline(corrector, node)
|
|
176
|
+
end
|
|
177
|
+
elsif !node.endless? && can_be_made_endless?(node) && node.body.single_line?
|
|
178
|
+
return if too_long_when_made_endless?(node)
|
|
179
|
+
|
|
180
|
+
add_offense(node, message: MSG_REQUIRE_SINGLE) do |corrector|
|
|
181
|
+
corrector.replace(node, endless_replacement(node))
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
def handle_require_always_style(node)
|
|
187
|
+
return if node.endless? || !can_be_made_endless?(node)
|
|
188
|
+
return if too_long_when_made_endless?(node)
|
|
189
|
+
|
|
190
|
+
add_offense(node, message: MSG_REQUIRE_ALWAYS) do |corrector|
|
|
191
|
+
corrector.replace(node, endless_replacement(node))
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
|
|
80
195
|
def handle_disallow_style(node)
|
|
81
196
|
return unless node.endless?
|
|
82
197
|
|
|
83
198
|
add_offense(node) { |corrector| correct_to_multiline(corrector, node) }
|
|
84
199
|
end
|
|
200
|
+
|
|
201
|
+
def use_heredoc?(node)
|
|
202
|
+
return false unless (body = node.body)
|
|
203
|
+
return true if body.str_type? && body.heredoc?
|
|
204
|
+
|
|
205
|
+
body.each_descendant(:str).any?(&:heredoc?)
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
def correct_to_multiline(corrector, node)
|
|
209
|
+
replacement = <<~RUBY.strip
|
|
210
|
+
def #{node.method_name}#{arguments(node)}
|
|
211
|
+
#{node.body.source}
|
|
212
|
+
end
|
|
213
|
+
RUBY
|
|
214
|
+
|
|
215
|
+
corrector.replace(node, replacement)
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
def endless_replacement(node)
|
|
219
|
+
<<~RUBY.strip
|
|
220
|
+
def #{node.method_name}#{arguments(node)} = #{node.body.source}
|
|
221
|
+
RUBY
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
def arguments(node, missing = '')
|
|
225
|
+
node.arguments.any? ? node.arguments.source : missing
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
def can_be_made_endless?(node)
|
|
229
|
+
node.body && !node.body.begin_type? && !node.body.kwbegin_type?
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
def too_long_when_made_endless?(node)
|
|
233
|
+
return false unless config.cop_enabled?('Layout/LineLength')
|
|
234
|
+
|
|
235
|
+
offset = modifier_offset(node)
|
|
236
|
+
|
|
237
|
+
endless_replacement(node).length + offset > config.for_cop('Layout/LineLength')['Max']
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
def modifier_offset(node)
|
|
241
|
+
same_line?(node.parent, node) ? node.loc.column - node.parent.loc.column : 0
|
|
242
|
+
end
|
|
85
243
|
end
|
|
86
244
|
end
|
|
87
245
|
end
|
|
@@ -4,12 +4,12 @@ module RuboCop
|
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
6
|
# Ensures that eval methods (`eval`, `instance_eval`, `class_eval`
|
|
7
|
-
# and `module_eval`) are given filename and line number values (
|
|
8
|
-
# and
|
|
7
|
+
# and `module_eval`) are given filename and line number values (`+__FILE__+`
|
|
8
|
+
# and `+__LINE__+`). This data is used to ensure that any errors raised
|
|
9
9
|
# within the evaluated code will be given the correct identification
|
|
10
10
|
# in a backtrace.
|
|
11
11
|
#
|
|
12
|
-
# The cop also checks that the line number given relative to
|
|
12
|
+
# The cop also checks that the line number given relative to `+__LINE__+` is
|
|
13
13
|
# correct.
|
|
14
14
|
#
|
|
15
15
|
# This cop will autocorrect incorrect or missing filename and line number
|
|
@@ -137,11 +137,11 @@ module RuboCop
|
|
|
137
137
|
|
|
138
138
|
case depth(stripped_current_path)
|
|
139
139
|
when 0
|
|
140
|
-
range = arguments_range(current_path)
|
|
140
|
+
range = arguments_range(current_path.parent)
|
|
141
141
|
|
|
142
142
|
corrector.replace(range, '__FILE__')
|
|
143
143
|
when 1
|
|
144
|
-
range = arguments_range(current_path)
|
|
144
|
+
range = arguments_range(current_path.parent)
|
|
145
145
|
|
|
146
146
|
corrector.replace(range, '__dir__')
|
|
147
147
|
else
|
|
@@ -185,11 +185,6 @@ module RuboCop
|
|
|
185
185
|
corrector.remove(node.loc.dot)
|
|
186
186
|
corrector.remove(node.loc.selector)
|
|
187
187
|
end
|
|
188
|
-
|
|
189
|
-
def arguments_range(node)
|
|
190
|
-
range_between(node.parent.first_argument.source_range.begin_pos,
|
|
191
|
-
node.parent.last_argument.source_range.end_pos)
|
|
192
|
-
end
|
|
193
188
|
end
|
|
194
189
|
end
|
|
195
190
|
end
|
|
@@ -56,7 +56,7 @@ module RuboCop
|
|
|
56
56
|
|
|
57
57
|
def initialize(config = nil, options = nil)
|
|
58
58
|
super
|
|
59
|
-
@def_nodes = Set.new
|
|
59
|
+
@def_nodes = Set.new.compare_by_identity
|
|
60
60
|
end
|
|
61
61
|
|
|
62
62
|
def on_yield(node)
|
|
@@ -65,7 +65,7 @@ module RuboCop
|
|
|
65
65
|
yielding_block?(block_node) do |send_node, block_args, yield_args|
|
|
66
66
|
return unless yielding_arguments?(block_args, yield_args)
|
|
67
67
|
|
|
68
|
-
def_node = block_node.each_ancestor(:
|
|
68
|
+
def_node = block_node.each_ancestor(:any_def).first
|
|
69
69
|
# if `yield` is being called outside of a method context, ignore
|
|
70
70
|
# this is not a valid ruby pattern, but can happen in haml or erb,
|
|
71
71
|
# so this can cause crashes in haml_lint
|
|
@@ -151,7 +151,7 @@ module RuboCop
|
|
|
151
151
|
end
|
|
152
152
|
|
|
153
153
|
def build_new_arguments_for_zsuper(node)
|
|
154
|
-
def_node = node.each_ancestor(:
|
|
154
|
+
def_node = node.each_ancestor(:any_def).first
|
|
155
155
|
def_node.arguments.map do |arg|
|
|
156
156
|
arg.optarg_type? ? arg.node_parts[0] : arg.source
|
|
157
157
|
end
|
|
@@ -59,9 +59,10 @@ module RuboCop
|
|
|
59
59
|
#
|
|
60
60
|
class ExponentialNotation < Base
|
|
61
61
|
include ConfigurableEnforcedStyle
|
|
62
|
+
|
|
62
63
|
MESSAGES = {
|
|
63
|
-
scientific: 'Use a mantissa
|
|
64
|
-
engineering: 'Use an exponent divisible by 3 and a mantissa
|
|
64
|
+
scientific: 'Use a mantissa >= 1 and < 10.',
|
|
65
|
+
engineering: 'Use an exponent divisible by 3 and a mantissa >= 0.1 and < 1000.',
|
|
65
66
|
integral: 'Use an integer as mantissa, without trailing zero.'
|
|
66
67
|
}.freeze
|
|
67
68
|
|
|
@@ -87,7 +88,7 @@ module RuboCop
|
|
|
87
88
|
true
|
|
88
89
|
end
|
|
89
90
|
|
|
90
|
-
def integral(node)
|
|
91
|
+
def integral?(node)
|
|
91
92
|
mantissa, = node.source.split('e')
|
|
92
93
|
/^-?[1-9](\d*[1-9])?$/.match?(mantissa)
|
|
93
94
|
end
|
|
@@ -101,7 +102,7 @@ module RuboCop
|
|
|
101
102
|
when :engineering
|
|
102
103
|
!engineering?(node)
|
|
103
104
|
when :integral
|
|
104
|
-
!integral(node)
|
|
105
|
+
!integral?(node)
|
|
105
106
|
else
|
|
106
107
|
false
|
|
107
108
|
end
|
|
@@ -9,7 +9,20 @@ module RuboCop
|
|
|
9
9
|
# On the other hand, `ENV.fetch` raises `KeyError` or returns the explicitly
|
|
10
10
|
# specified default value.
|
|
11
11
|
#
|
|
12
|
-
# @example
|
|
12
|
+
# @example DefaultToNil: true (default)
|
|
13
|
+
# # bad
|
|
14
|
+
# ENV['X']
|
|
15
|
+
# x = ENV['X']
|
|
16
|
+
#
|
|
17
|
+
# # good
|
|
18
|
+
# ENV.fetch('X', nil)
|
|
19
|
+
# x = ENV.fetch('X', nil)
|
|
20
|
+
#
|
|
21
|
+
# # also good
|
|
22
|
+
# !ENV['X']
|
|
23
|
+
# ENV['X'].some_method # (e.g. `.nil?`)
|
|
24
|
+
#
|
|
25
|
+
# @example DefaultToNil: false
|
|
13
26
|
# # bad
|
|
14
27
|
# ENV['X']
|
|
15
28
|
# x = ENV['X']
|
|
@@ -25,7 +38,8 @@ module RuboCop
|
|
|
25
38
|
class FetchEnvVar < Base
|
|
26
39
|
extend AutoCorrector
|
|
27
40
|
|
|
28
|
-
|
|
41
|
+
MSG_WITH_NIL = 'Use `ENV.fetch(%<key>s, nil)` instead of `ENV[%<key>s]`.'
|
|
42
|
+
MSG_WITHOUT_NIL = 'Use `ENV.fetch(%<key>s)` instead of `ENV[%<key>s]`.'
|
|
29
43
|
RESTRICT_ON_SEND = [:[]].freeze
|
|
30
44
|
|
|
31
45
|
# @!method env_with_bracket?(node)
|
|
@@ -37,7 +51,7 @@ module RuboCop
|
|
|
37
51
|
env_with_bracket?(node) do |name_node|
|
|
38
52
|
break unless offensive?(node)
|
|
39
53
|
|
|
40
|
-
message = format(
|
|
54
|
+
message = format(offense_message, key: name_node.source)
|
|
41
55
|
add_offense(node, message: message) do |corrector|
|
|
42
56
|
corrector.replace(node, new_code(name_node))
|
|
43
57
|
end
|
|
@@ -46,6 +60,14 @@ module RuboCop
|
|
|
46
60
|
|
|
47
61
|
private
|
|
48
62
|
|
|
63
|
+
def default_to_nil?
|
|
64
|
+
cop_config.fetch('DefaultToNil', true)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def offense_message
|
|
68
|
+
default_to_nil? ? MSG_WITH_NIL : MSG_WITHOUT_NIL
|
|
69
|
+
end
|
|
70
|
+
|
|
49
71
|
def allowed_var?(node)
|
|
50
72
|
env_key_node = node.children.last
|
|
51
73
|
env_key_node.str_type? && cop_config['AllowedVars'].include?(env_key_node.value)
|
|
@@ -53,12 +75,12 @@ module RuboCop
|
|
|
53
75
|
|
|
54
76
|
def used_as_flag?(node)
|
|
55
77
|
return false if node.root?
|
|
56
|
-
return true if used_if_condition_in_body(node)
|
|
78
|
+
return true if used_if_condition_in_body?(node)
|
|
57
79
|
|
|
58
80
|
node.parent.send_type? && (node.parent.prefix_bang? || node.parent.comparison_method?)
|
|
59
81
|
end
|
|
60
82
|
|
|
61
|
-
def used_if_condition_in_body(node)
|
|
83
|
+
def used_if_condition_in_body?(node)
|
|
62
84
|
if_node = node.ancestors.find(&:if_type?)
|
|
63
85
|
|
|
64
86
|
return false unless (condition = if_node&.condition)
|
|
@@ -125,7 +147,11 @@ module RuboCop
|
|
|
125
147
|
end
|
|
126
148
|
|
|
127
149
|
def new_code(name_node)
|
|
128
|
-
|
|
150
|
+
if default_to_nil?
|
|
151
|
+
"ENV.fetch(#{name_node.source}, nil)"
|
|
152
|
+
else
|
|
153
|
+
"ENV.fetch(#{name_node.source})"
|
|
154
|
+
end
|
|
129
155
|
end
|
|
130
156
|
end
|
|
131
157
|
end
|
|
@@ -7,9 +7,12 @@ module RuboCop
|
|
|
7
7
|
# It is recommended to either always use `fdiv` or coerce one side only.
|
|
8
8
|
# This cop also provides other options for code consistency.
|
|
9
9
|
#
|
|
10
|
+
# For `Regexp.last_match` and nth reference (e.g., `$1`), it assumes that the value
|
|
11
|
+
# is a string matched by a regular expression, and allows conversion with `#to_f`.
|
|
12
|
+
#
|
|
10
13
|
# @safety
|
|
11
14
|
# This cop is unsafe, because if the operand variable is a string object
|
|
12
|
-
# then
|
|
15
|
+
# then `#to_f` will be removed and an error will occur.
|
|
13
16
|
#
|
|
14
17
|
# [source,ruby]
|
|
15
18
|
# ----
|
|
@@ -84,6 +87,14 @@ module RuboCop
|
|
|
84
87
|
(send !nil? :to_f)
|
|
85
88
|
PATTERN
|
|
86
89
|
|
|
90
|
+
# @!method regexp_last_match?(node)
|
|
91
|
+
def_node_matcher :regexp_last_match?, <<~PATTERN
|
|
92
|
+
{
|
|
93
|
+
(send (const {nil? cbase} :Regexp) :last_match int)
|
|
94
|
+
(:nth_ref _)
|
|
95
|
+
}
|
|
96
|
+
PATTERN
|
|
97
|
+
|
|
87
98
|
def on_send(node)
|
|
88
99
|
return unless offense_condition?(node)
|
|
89
100
|
|
|
@@ -104,6 +115,9 @@ module RuboCop
|
|
|
104
115
|
private
|
|
105
116
|
|
|
106
117
|
def offense_condition?(node)
|
|
118
|
+
return false if regexp_last_match?(node.receiver.receiver) ||
|
|
119
|
+
regexp_last_match?(node.first_argument.receiver)
|
|
120
|
+
|
|
107
121
|
case style
|
|
108
122
|
when :left_coerce
|
|
109
123
|
right_coerce?(node)
|
|
@@ -3,16 +3,24 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
# Use a consistent style for
|
|
6
|
+
# Use a consistent style for tokens within a format string.
|
|
7
7
|
#
|
|
8
|
-
#
|
|
9
|
-
#
|
|
10
|
-
#
|
|
11
|
-
# The reason is that _unannotated_ format is very similar
|
|
12
|
-
# to encoded URLs or Date/Time formatting strings.
|
|
8
|
+
# By default, all strings are evaluated. In some cases, this may be undesirable,
|
|
9
|
+
# as they could be used as arguments to a method that does not consider
|
|
10
|
+
# them to be tokens, but rather other identifiers or just part of the string.
|
|
13
11
|
#
|
|
14
|
-
#
|
|
15
|
-
#
|
|
12
|
+
# `AllowedMethods` or `AllowedPatterns` can be configured with in order to mark specific
|
|
13
|
+
# methods as always allowed, thereby avoiding an offense from the cop. By default, there
|
|
14
|
+
# are no allowed methods.
|
|
15
|
+
#
|
|
16
|
+
# Additionally, the cop can be made conservative by configuring it with
|
|
17
|
+
# `Mode: conservative` (default `aggressive`). In this mode, tokens (regardless
|
|
18
|
+
# of `EnforcedStyle`) are only considered if used in the format string argument to the
|
|
19
|
+
# methods `printf`, `sprintf`, `format` and `%`.
|
|
20
|
+
#
|
|
21
|
+
# NOTE: Tokens in the `unannotated` style (eg. `%s`) are always treated as if
|
|
22
|
+
# configured with `Conservative: true`. This is done in order to prevent false positives,
|
|
23
|
+
# because this format is very similar to encoded URLs or Date/Time formatting strings.
|
|
16
24
|
#
|
|
17
25
|
# @example EnforcedStyle: annotated (default)
|
|
18
26
|
#
|
|
@@ -82,6 +90,20 @@ module RuboCop
|
|
|
82
90
|
# # good
|
|
83
91
|
# redirect('foo/%{bar_id}')
|
|
84
92
|
#
|
|
93
|
+
# @example Mode: conservative, EnforcedStyle: annotated
|
|
94
|
+
# # In `conservative` mode, offenses are only registered for strings
|
|
95
|
+
# # given to a known formatting method.
|
|
96
|
+
#
|
|
97
|
+
# # good
|
|
98
|
+
# "%{greeting}"
|
|
99
|
+
# foo("%{greeting}")
|
|
100
|
+
#
|
|
101
|
+
# # bad
|
|
102
|
+
# format("%{greeting}", greeting: 'Hello')
|
|
103
|
+
# printf("%{greeting}", greeting: 'Hello')
|
|
104
|
+
# sprintf("%{greeting}", greeting: 'Hello')
|
|
105
|
+
# "%{greeting}" % { greeting: 'Hello' }
|
|
106
|
+
#
|
|
85
107
|
class FormatStringToken < Base
|
|
86
108
|
include ConfigurableEnforcedStyle
|
|
87
109
|
include AllowedMethods
|
|
@@ -153,8 +175,9 @@ module RuboCop
|
|
|
153
175
|
corrector.replace(token_range, correction)
|
|
154
176
|
end
|
|
155
177
|
|
|
156
|
-
def
|
|
157
|
-
detected_style == :unannotated
|
|
178
|
+
def allowed_string?(node, detected_style)
|
|
179
|
+
(detected_style == :unannotated || conservative?) &&
|
|
180
|
+
!format_string_in_typical_context?(node)
|
|
158
181
|
end
|
|
159
182
|
|
|
160
183
|
def message(detected_style)
|
|
@@ -203,7 +226,7 @@ module RuboCop
|
|
|
203
226
|
def collect_detections(node)
|
|
204
227
|
detections = []
|
|
205
228
|
tokens(node) do |detected_sequence, token_range|
|
|
206
|
-
unless
|
|
229
|
+
unless allowed_string?(node, detected_sequence.style)
|
|
207
230
|
detections << [detected_sequence, token_range]
|
|
208
231
|
end
|
|
209
232
|
end
|
|
@@ -222,6 +245,10 @@ module RuboCop
|
|
|
222
245
|
def max_unannotated_placeholders_allowed
|
|
223
246
|
cop_config['MaxUnannotatedPlaceholdersAllowed']
|
|
224
247
|
end
|
|
248
|
+
|
|
249
|
+
def conservative?
|
|
250
|
+
cop_config.fetch('Mode', :aggressive).to_sym == :conservative
|
|
251
|
+
end
|
|
225
252
|
end
|
|
226
253
|
end
|
|
227
254
|
end
|
|
@@ -151,7 +151,7 @@ module RuboCop
|
|
|
151
151
|
|
|
152
152
|
def frozen_string_literal_comment(processed_source)
|
|
153
153
|
processed_source.tokens.find do |token|
|
|
154
|
-
token.text.
|
|
154
|
+
MagicComment.parse(token.text).frozen_string_literal_specified?
|
|
155
155
|
end
|
|
156
156
|
end
|
|
157
157
|
|
|
@@ -189,8 +189,9 @@ module RuboCop
|
|
|
189
189
|
|
|
190
190
|
def enable_comment(corrector)
|
|
191
191
|
comment = frozen_string_literal_comment(processed_source)
|
|
192
|
+
replacement = MagicComment.parse(comment.text).new_frozen_string_literal(true)
|
|
192
193
|
|
|
193
|
-
corrector.replace(line_range(comment.line),
|
|
194
|
+
corrector.replace(line_range(comment.line), replacement)
|
|
194
195
|
end
|
|
195
196
|
|
|
196
197
|
def insert_comment(corrector)
|
|
@@ -8,6 +8,9 @@ module RuboCop
|
|
|
8
8
|
# reassign (possibly to redirect some stream) constants in Ruby, you'll get
|
|
9
9
|
# an interpreter warning if you do so.
|
|
10
10
|
#
|
|
11
|
+
# Additionally, `$stdout/$stderr/$stdin` can safely be accessed in a Ractor because they
|
|
12
|
+
# are ractor-local, while `STDOUT/STDERR/STDIN` will raise `Ractor::IsolationError`.
|
|
13
|
+
#
|
|
11
14
|
# @safety
|
|
12
15
|
# Autocorrection is unsafe because `STDOUT` and `$stdout` may point to different
|
|
13
16
|
# objects, for example.
|
|
@@ -135,6 +135,7 @@ module RuboCop
|
|
|
135
135
|
on_def(node)
|
|
136
136
|
end
|
|
137
137
|
alias on_numblock on_block
|
|
138
|
+
alias on_itblock on_block
|
|
138
139
|
|
|
139
140
|
def on_if(node)
|
|
140
141
|
return if accepted_form?(node)
|
|
@@ -213,7 +214,7 @@ module RuboCop
|
|
|
213
214
|
if_branch = node.if_branch
|
|
214
215
|
else_branch = node.else_branch
|
|
215
216
|
|
|
216
|
-
corrector.replace(node.loc.begin, "\n") if node.
|
|
217
|
+
corrector.replace(node.loc.begin, "\n") if node.then?
|
|
217
218
|
|
|
218
219
|
if if_branch&.send_type? && heredoc?(if_branch.last_argument)
|
|
219
220
|
autocorrect_heredoc_argument(corrector, node, if_branch, else_branch, guard)
|
|
@@ -44,17 +44,17 @@ module RuboCop
|
|
|
44
44
|
class HashConversion < Base
|
|
45
45
|
extend AutoCorrector
|
|
46
46
|
|
|
47
|
-
MSG_TO_H = 'Prefer ary.to_h to Hash[ary]
|
|
48
|
-
MSG_LITERAL_MULTI_ARG = 'Prefer literal hash to Hash[arg1, arg2, ...]
|
|
49
|
-
MSG_LITERAL_HASH_ARG = 'Prefer literal hash to Hash[key: value, ...]
|
|
50
|
-
MSG_SPLAT = 'Prefer array_of_pairs.to_h to Hash[*array]
|
|
47
|
+
MSG_TO_H = 'Prefer `ary.to_h` to `Hash[ary]`.'
|
|
48
|
+
MSG_LITERAL_MULTI_ARG = 'Prefer literal hash to `Hash[arg1, arg2, ...]`.'
|
|
49
|
+
MSG_LITERAL_HASH_ARG = 'Prefer literal hash to `Hash[key: value, ...]`.'
|
|
50
|
+
MSG_SPLAT = 'Prefer `array_of_pairs.to_h` to `Hash[*array]`.'
|
|
51
51
|
RESTRICT_ON_SEND = %i[[]].freeze
|
|
52
52
|
|
|
53
53
|
# @!method hash_from_array?(node)
|
|
54
54
|
def_node_matcher :hash_from_array?, '(send (const {nil? cbase} :Hash) :[] ...)'
|
|
55
55
|
|
|
56
56
|
def on_send(node)
|
|
57
|
-
return
|
|
57
|
+
return if part_of_ignored_node?(node) || !hash_from_array?(node)
|
|
58
58
|
|
|
59
59
|
# There are several cases:
|
|
60
60
|
# If there is one argument:
|
|
@@ -63,7 +63,8 @@ module RuboCop
|
|
|
63
63
|
# If there is 0 or 2+ arguments:
|
|
64
64
|
# Hash[a1, a2, a3, a4] => {a1 => a2, a3 => a4}
|
|
65
65
|
# ...but don't suggest correction if there is odd number of them (it is a bug)
|
|
66
|
-
node.arguments.
|
|
66
|
+
node.arguments.one? ? single_argument(node) : multi_argument(node)
|
|
67
|
+
ignore_node(node)
|
|
67
68
|
end
|
|
68
69
|
|
|
69
70
|
private
|
|
@@ -111,7 +112,12 @@ module RuboCop
|
|
|
111
112
|
end
|
|
112
113
|
|
|
113
114
|
def requires_parens?(node)
|
|
114
|
-
|
|
115
|
+
if node.call_type?
|
|
116
|
+
return false if node.method?(:[])
|
|
117
|
+
return true if node.arguments.any? && !node.parenthesized?
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
node.operator_keyword?
|
|
115
121
|
end
|
|
116
122
|
|
|
117
123
|
def multi_argument(node)
|
|
@@ -122,7 +128,9 @@ module RuboCop
|
|
|
122
128
|
corrector.replace(node, args_to_hash(node.arguments))
|
|
123
129
|
|
|
124
130
|
parent = node.parent
|
|
125
|
-
|
|
131
|
+
if parent&.send_type? && !parent.method?(:to_h) && !parent.parenthesized?
|
|
132
|
+
add_parentheses(parent, corrector)
|
|
133
|
+
end
|
|
126
134
|
end
|
|
127
135
|
end
|
|
128
136
|
end
|