rubocop 1.62.1 → 1.67.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +67 -68
- data/config/default.yml +82 -12
- data/config/internal_affairs.yml +11 -0
- data/exe/rubocop +4 -3
- data/lib/rubocop/cached_data.rb +11 -3
- data/lib/rubocop/cli/command/auto_generate_config.rb +6 -7
- data/lib/rubocop/cli/command/lsp.rb +2 -2
- data/lib/rubocop/cli/command/show_docs_url.rb +2 -2
- data/lib/rubocop/cli.rb +4 -0
- data/lib/rubocop/comment_config.rb +1 -1
- data/lib/rubocop/config.rb +37 -11
- data/lib/rubocop/config_loader.rb +15 -9
- data/lib/rubocop/config_loader_resolver.rb +13 -8
- data/lib/rubocop/config_obsoletion.rb +1 -1
- data/lib/rubocop/config_validator.rb +3 -2
- data/lib/rubocop/cop/base.rb +56 -16
- data/lib/rubocop/cop/bundler/gem_version.rb +4 -5
- data/lib/rubocop/cop/cop.rb +30 -4
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -0
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +1 -1
- data/lib/rubocop/cop/documentation.rb +32 -5
- data/lib/rubocop/cop/force.rb +12 -0
- data/lib/rubocop/cop/gemspec/add_runtime_dependency.rb +38 -0
- data/lib/rubocop/cop/gemspec/dependency_version.rb +3 -5
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +2 -2
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +3 -3
- data/lib/rubocop/cop/internal_affairs/cop_description.rb +0 -4
- data/lib/rubocop/cop/internal_affairs/empty_line_between_expect_offense_and_correction.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/example_description.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +6 -21
- data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +8 -1
- data/lib/rubocop/cop/internal_affairs/undefined_config.rb +11 -1
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +0 -5
- data/lib/rubocop/cop/internal_affairs.rb +16 -0
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +5 -1
- data/lib/rubocop/cop/layout/assignment_indentation.rb +3 -2
- data/lib/rubocop/cop/layout/block_alignment.rb +30 -12
- data/lib/rubocop/cop/layout/case_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/condition_position.rb +0 -4
- data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/empty_comment.rb +3 -1
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +2 -1
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +8 -3
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -3
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +8 -0
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +5 -6
- data/lib/rubocop/cop/layout/leading_comment_space.rb +28 -1
- data/lib/rubocop/cop/layout/line_length.rb +20 -20
- data/lib/rubocop/cop/layout/space_around_operators.rb +3 -0
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +3 -4
- data/lib/rubocop/cop/legacy/corrector.rb +12 -2
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +0 -2
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +0 -2
- data/lib/rubocop/cop/lint/ambiguous_range.rb +4 -1
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +0 -2
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
- data/lib/rubocop/cop/lint/big_decimal_new.rb +4 -7
- data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -3
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +0 -13
- data/lib/rubocop/cop/lint/debugger.rb +27 -6
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +0 -10
- data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -5
- data/lib/rubocop/cop/lint/duplicate_hash_key.rb +0 -4
- data/lib/rubocop/cop/lint/duplicate_methods.rb +0 -10
- data/lib/rubocop/cop/lint/duplicate_set_element.rb +74 -0
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +0 -4
- data/lib/rubocop/cop/lint/else_layout.rb +0 -2
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +28 -7
- data/lib/rubocop/cop/lint/empty_ensure.rb +1 -11
- data/lib/rubocop/cop/lint/empty_interpolation.rb +0 -4
- data/lib/rubocop/cop/lint/empty_when.rb +1 -3
- data/lib/rubocop/cop/lint/ensure_return.rb +1 -9
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +21 -14
- data/lib/rubocop/cop/lint/float_comparison.rb +1 -1
- data/lib/rubocop/cop/lint/float_out_of_range.rb +0 -4
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +0 -10
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +23 -12
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +0 -7
- data/lib/rubocop/cop/lint/interpolation_check.rb +0 -4
- data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +5 -14
- data/lib/rubocop/cop/lint/literal_as_condition.rb +1 -1
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +1 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +25 -6
- data/lib/rubocop/cop/lint/loop.rb +6 -12
- data/lib/rubocop/cop/lint/mixed_case_range.rb +9 -4
- data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -7
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +0 -4
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +0 -5
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +1 -1
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +5 -6
- data/lib/rubocop/cop/lint/percent_string_array.rb +0 -4
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +0 -4
- data/lib/rubocop/cop/lint/rand_one.rb +0 -4
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +3 -1
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +0 -4
- data/lib/rubocop/cop/lint/redundant_with_index.rb +3 -0
- data/lib/rubocop/cop/lint/require_parentheses.rb +0 -4
- data/lib/rubocop/cop/lint/rescue_exception.rb +0 -4
- data/lib/rubocop/cop/lint/return_in_void_context.rb +0 -2
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +0 -4
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +105 -41
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +6 -10
- data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +2 -9
- data/lib/rubocop/cop/lint/unified_integer.rb +0 -4
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -0
- data/lib/rubocop/cop/lint/unreachable_code.rb +4 -7
- data/lib/rubocop/cop/lint/unreachable_loop.rb +8 -2
- data/lib/rubocop/cop/lint/uri_regexp.rb +25 -7
- data/lib/rubocop/cop/lint/useless_assignment.rb +19 -16
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +0 -4
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +77 -0
- data/lib/rubocop/cop/lint/useless_setter_call.rb +0 -4
- data/lib/rubocop/cop/lint/void.rb +35 -8
- data/lib/rubocop/cop/metrics/block_length.rb +6 -5
- data/lib/rubocop/cop/metrics/block_nesting.rb +19 -7
- data/lib/rubocop/cop/metrics/class_length.rb +6 -5
- data/lib/rubocop/cop/metrics/method_length.rb +6 -5
- data/lib/rubocop/cop/metrics/module_length.rb +6 -5
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +5 -5
- data/lib/rubocop/cop/mixin/alignment.rb +5 -1
- data/lib/rubocop/cop/mixin/allowed_methods.rb +7 -1
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +15 -3
- data/lib/rubocop/cop/mixin/annotation_comment.rb +0 -2
- data/lib/rubocop/cop/mixin/code_length.rb +12 -1
- data/lib/rubocop/cop/mixin/configurable_max.rb +5 -1
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +19 -9
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +9 -2
- data/lib/rubocop/cop/mixin/line_length_help.rb +7 -2
- data/lib/rubocop/cop/mixin/method_complexity.rb +15 -6
- data/lib/rubocop/cop/mixin/percent_array.rb +1 -1
- data/lib/rubocop/cop/mixin/rescue_node.rb +4 -0
- data/lib/rubocop/cop/mixin/safe_assignment.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +3 -2
- data/lib/rubocop/cop/mixin/string_literals_help.rb +12 -0
- data/lib/rubocop/cop/naming/accessor_method_name.rb +5 -0
- data/lib/rubocop/cop/naming/block_forwarding.rb +31 -12
- data/lib/rubocop/cop/naming/file_name.rb +2 -2
- data/lib/rubocop/cop/naming/inclusive_language.rb +13 -5
- data/lib/rubocop/cop/naming/predicate_name.rb +53 -27
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +10 -1
- data/lib/rubocop/cop/offense.rb +2 -2
- data/lib/rubocop/cop/security/compound_hash.rb +2 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +62 -2
- data/lib/rubocop/cop/style/accessor_grouping.rb +10 -2
- data/lib/rubocop/cop/style/alias.rb +2 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +59 -11
- data/lib/rubocop/cop/style/block_delimiters.rb +14 -1
- data/lib/rubocop/cop/style/collection_compact.rb +9 -9
- data/lib/rubocop/cop/style/combinable_loops.rb +7 -0
- data/lib/rubocop/cop/style/commented_keyword.rb +7 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +2 -2
- data/lib/rubocop/cop/style/copyright.rb +31 -21
- data/lib/rubocop/cop/style/data_inheritance.rb +1 -1
- data/lib/rubocop/cop/style/def_with_parentheses.rb +0 -2
- data/lib/rubocop/cop/style/documentation.rb +24 -24
- data/lib/rubocop/cop/style/documentation_method.rb +20 -0
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +0 -1
- data/lib/rubocop/cop/style/empty_else.rb +6 -5
- data/lib/rubocop/cop/style/empty_heredoc.rb +1 -14
- data/lib/rubocop/cop/style/empty_literal.rb +31 -22
- data/lib/rubocop/cop/style/eval_with_location.rb +16 -13
- data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -1
- data/lib/rubocop/cop/style/file_read.rb +2 -5
- data/lib/rubocop/cop/style/file_write.rb +2 -5
- data/lib/rubocop/cop/style/format_string.rb +9 -9
- data/lib/rubocop/cop/style/format_string_token.rb +2 -2
- data/lib/rubocop/cop/style/global_std_stream.rb +7 -1
- data/lib/rubocop/cop/style/guard_clause.rb +3 -1
- data/lib/rubocop/cop/style/hash_each_methods.rb +6 -0
- data/lib/rubocop/cop/style/hash_except.rb +8 -5
- data/lib/rubocop/cop/style/hash_syntax.rb +20 -2
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +1 -1
- data/lib/rubocop/cop/style/if_inside_else.rb +1 -1
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +5 -4
- data/lib/rubocop/cop/style/if_with_semicolon.rb +49 -6
- data/lib/rubocop/cop/style/in_pattern_then.rb +6 -2
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +2 -2
- data/lib/rubocop/cop/style/lambda.rb +1 -1
- data/lib/rubocop/cop/style/magic_comment_format.rb +1 -1
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +77 -43
- data/lib/rubocop/cop/style/map_into_array.rb +228 -0
- data/lib/rubocop/cop/style/map_to_hash.rb +1 -1
- data/lib/rubocop/cop/style/map_to_set.rb +1 -1
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +17 -7
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +2 -2
- data/lib/rubocop/cop/style/missing_else.rb +0 -4
- data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
- data/lib/rubocop/cop/style/multiline_when_then.rb +0 -4
- data/lib/rubocop/cop/style/multiple_comparison.rb +3 -11
- data/lib/rubocop/cop/style/nested_modifier.rb +1 -1
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
- data/lib/rubocop/cop/style/numeric_predicate.rb +12 -4
- data/lib/rubocop/cop/style/one_line_conditional.rb +6 -2
- data/lib/rubocop/cop/style/operator_method_call.rb +25 -6
- data/lib/rubocop/cop/style/parallel_assignment.rb +5 -4
- data/lib/rubocop/cop/style/quoted_symbols.rb +1 -3
- data/lib/rubocop/cop/style/redundant_argument.rb +24 -1
- data/lib/rubocop/cop/style/redundant_begin.rb +5 -1
- data/lib/rubocop/cop/style/redundant_condition.rb +4 -4
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +1 -1
- data/lib/rubocop/cop/style/redundant_each.rb +1 -1
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +1 -1
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +46 -0
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +15 -18
- data/lib/rubocop/cop/style/redundant_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +4 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +8 -24
- data/lib/rubocop/cop/style/require_order.rb +2 -2
- data/lib/rubocop/cop/style/rescue_modifier.rb +13 -1
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +54 -12
- data/lib/rubocop/cop/style/safe_navigation.rb +94 -52
- data/lib/rubocop/cop/style/select_by_regexp.rb +9 -6
- data/lib/rubocop/cop/style/semicolon.rb +1 -1
- data/lib/rubocop/cop/style/send.rb +4 -4
- data/lib/rubocop/cop/style/send_with_literal_method_name.rb +104 -0
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +21 -2
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -2
- data/lib/rubocop/cop/style/struct_inheritance.rb +1 -1
- data/lib/rubocop/cop/style/super_arguments.rb +174 -0
- data/lib/rubocop/cop/style/symbol_proc.rb +39 -5
- data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/top_level_method_definition.rb +1 -1
- data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
- data/lib/rubocop/cop/style/while_until_do.rb +0 -2
- data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +32 -24
- data/lib/rubocop/cop/team.rb +27 -3
- data/lib/rubocop/cop/util.rb +8 -2
- data/lib/rubocop/cop/variable_force.rb +13 -1
- data/lib/rubocop/cops_documentation_generator.rb +73 -34
- data/lib/rubocop/core_ext/string.rb +2 -6
- data/lib/rubocop/ext/regexp_node.rb +9 -31
- data/lib/rubocop/ext/regexp_parser.rb +4 -21
- data/lib/rubocop/file_finder.rb +9 -4
- data/lib/rubocop/formatter/clang_style_formatter.rb +3 -7
- data/lib/rubocop/formatter/disabled_config_formatter.rb +13 -9
- data/lib/rubocop/formatter/formatter_set.rb +7 -1
- data/lib/rubocop/formatter/html_formatter.rb +3 -1
- data/lib/rubocop/formatter/junit_formatter.rb +70 -23
- data/lib/rubocop/formatter/tap_formatter.rb +3 -7
- data/lib/rubocop/lockfile.rb +58 -7
- data/lib/rubocop/lsp/routes.rb +10 -13
- data/lib/rubocop/lsp/runtime.rb +2 -0
- data/lib/rubocop/lsp/server.rb +2 -1
- data/lib/rubocop/lsp.rb +9 -2
- data/lib/rubocop/options.rb +6 -4
- data/lib/rubocop/rake_task.rb +1 -1
- data/lib/rubocop/remote_config.rb +5 -1
- data/lib/rubocop/result_cache.rb +2 -8
- data/lib/rubocop/rspec/expect_offense.rb +9 -0
- data/lib/rubocop/rspec/shared_contexts.rb +35 -3
- data/lib/rubocop/rspec/support.rb +1 -0
- data/lib/rubocop/runner.rb +8 -1
- data/lib/rubocop/server/cache.rb +16 -1
- data/lib/rubocop/server/client_command/exec.rb +2 -2
- data/lib/rubocop/server/client_command/start.rb +1 -1
- data/lib/rubocop/server/core.rb +5 -0
- data/lib/rubocop/target_ruby.rb +19 -15
- data/lib/rubocop/version.rb +7 -5
- data/lib/rubocop/yaml_duplication_checker.rb +20 -26
- data/lib/rubocop.rb +13 -1
- metadata +20 -32
|
@@ -65,17 +65,15 @@ module RuboCop
|
|
|
65
65
|
|
|
66
66
|
minimum_target_ruby_version 2.6
|
|
67
67
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
'`ERB.new(str, eoutvar: %<arg_value>s)` instead.'
|
|
78
|
-
].freeze
|
|
68
|
+
MESSAGE_SAFE_LEVEL = 'Passing safe_level with the 2nd argument of `ERB.new` is ' \
|
|
69
|
+
'deprecated. Do not use it, and specify other arguments as ' \
|
|
70
|
+
'keyword arguments.'
|
|
71
|
+
MESSAGE_TRIM_MODE = 'Passing trim_mode with the 3rd argument of `ERB.new` is ' \
|
|
72
|
+
'deprecated. Use keyword argument like ' \
|
|
73
|
+
'`ERB.new(str, trim_mode: %<arg_value>s)` instead.'
|
|
74
|
+
MESSAGE_EOUTVAR = 'Passing eoutvar with the 4th argument of `ERB.new` is ' \
|
|
75
|
+
'deprecated. Use keyword argument like ' \
|
|
76
|
+
'`ERB.new(str, eoutvar: %<arg_value>s)` instead.'
|
|
79
77
|
|
|
80
78
|
RESTRICT_ON_SEND = %i[new].freeze
|
|
81
79
|
|
|
@@ -92,10 +90,8 @@ module RuboCop
|
|
|
92
90
|
arguments[1..3].each_with_index do |argument, i|
|
|
93
91
|
next if !argument || argument.hash_type?
|
|
94
92
|
|
|
95
|
-
message = format(MESSAGES[i], arg_value: argument.source)
|
|
96
|
-
|
|
97
93
|
add_offense(
|
|
98
|
-
argument
|
|
94
|
+
argument, message: message(i, argument.source)
|
|
99
95
|
) do |corrector|
|
|
100
96
|
autocorrect(corrector, node)
|
|
101
97
|
end
|
|
@@ -105,6 +101,17 @@ module RuboCop
|
|
|
105
101
|
|
|
106
102
|
private
|
|
107
103
|
|
|
104
|
+
def message(positional_argument_index, arg_value)
|
|
105
|
+
case positional_argument_index
|
|
106
|
+
when 0
|
|
107
|
+
MESSAGE_SAFE_LEVEL
|
|
108
|
+
when 1
|
|
109
|
+
format(MESSAGE_TRIM_MODE, arg_value: arg_value)
|
|
110
|
+
when 2
|
|
111
|
+
format(MESSAGE_EOUTVAR, arg_value: arg_value)
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
108
115
|
def autocorrect(corrector, node)
|
|
109
116
|
str_arg = node.first_argument.source
|
|
110
117
|
|
|
@@ -14,25 +14,15 @@ module RuboCop
|
|
|
14
14
|
# @example
|
|
15
15
|
#
|
|
16
16
|
# # bad
|
|
17
|
-
#
|
|
18
17
|
# format('A value: %s and another: %i', a_value)
|
|
19
18
|
#
|
|
20
|
-
# @example
|
|
21
|
-
#
|
|
22
19
|
# # good
|
|
23
|
-
#
|
|
24
20
|
# format('A value: %s and another: %i', a_value, another)
|
|
25
21
|
#
|
|
26
|
-
# @example
|
|
27
|
-
#
|
|
28
22
|
# # bad
|
|
29
|
-
#
|
|
30
23
|
# format('Unnumbered format: %s and numbered: %2$s', a_value, another)
|
|
31
24
|
#
|
|
32
|
-
# @example
|
|
33
|
-
#
|
|
34
25
|
# # good
|
|
35
|
-
#
|
|
36
26
|
# format('Numbered format: %1$s and numbered %2$s', a_value, another)
|
|
37
27
|
class FormatParameterMismatch < Base
|
|
38
28
|
# http://rubular.com/r/CvpbxkcTzy
|
|
@@ -9,13 +9,9 @@ module RuboCop
|
|
|
9
9
|
# @example
|
|
10
10
|
#
|
|
11
11
|
# # bad
|
|
12
|
-
#
|
|
13
12
|
# array = ['Item 1' 'Item 2']
|
|
14
13
|
#
|
|
15
|
-
# @example
|
|
16
|
-
#
|
|
17
14
|
# # good
|
|
18
|
-
#
|
|
19
15
|
# array = ['Item 1Item 2']
|
|
20
16
|
# array = ['Item 1' + 'Item 2']
|
|
21
17
|
# array = [
|
|
@@ -23,27 +19,40 @@ module RuboCop
|
|
|
23
19
|
# 'Item 2'
|
|
24
20
|
# ]
|
|
25
21
|
class ImplicitStringConcatenation < Base
|
|
26
|
-
|
|
22
|
+
extend AutoCorrector
|
|
23
|
+
|
|
24
|
+
MSG = 'Combine %<lhs>s and %<rhs>s into a single string ' \
|
|
27
25
|
'literal, rather than using implicit string concatenation.'
|
|
28
26
|
FOR_ARRAY = ' Or, if they were intended to be separate array ' \
|
|
29
27
|
'elements, separate them with a comma.'
|
|
30
28
|
FOR_METHOD = ' Or, if they were intended to be separate method ' \
|
|
31
29
|
'arguments, separate them with a comma.'
|
|
32
30
|
|
|
31
|
+
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/PerceivedComplexity
|
|
33
32
|
def on_dstr(node)
|
|
34
|
-
each_bad_cons(node) do |
|
|
35
|
-
range
|
|
36
|
-
message = format(MSG,
|
|
37
|
-
string1: display_str(child_node1),
|
|
38
|
-
string2: display_str(child_node2))
|
|
33
|
+
each_bad_cons(node) do |lhs_node, rhs_node|
|
|
34
|
+
range = lhs_node.source_range.join(rhs_node.source_range)
|
|
35
|
+
message = format(MSG, lhs: display_str(lhs_node), rhs: display_str(rhs_node))
|
|
39
36
|
if node.parent&.array_type?
|
|
40
37
|
message << FOR_ARRAY
|
|
41
38
|
elsif node.parent&.send_type?
|
|
42
39
|
message << FOR_METHOD
|
|
43
40
|
end
|
|
44
|
-
|
|
41
|
+
|
|
42
|
+
add_offense(range, message: message) do |corrector|
|
|
43
|
+
if lhs_node.value == ''
|
|
44
|
+
corrector.remove(lhs_node)
|
|
45
|
+
elsif rhs_node.value == ''
|
|
46
|
+
corrector.remove(rhs_node)
|
|
47
|
+
else
|
|
48
|
+
range = lhs_node.source_range.end.join(rhs_node.source_range.begin)
|
|
49
|
+
|
|
50
|
+
corrector.replace(range, ' + ')
|
|
51
|
+
end
|
|
52
|
+
end
|
|
45
53
|
end
|
|
46
54
|
end
|
|
55
|
+
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength, Metrics/PerceivedComplexity
|
|
47
56
|
|
|
48
57
|
private
|
|
49
58
|
|
|
@@ -73,7 +82,7 @@ module RuboCop
|
|
|
73
82
|
end
|
|
74
83
|
|
|
75
84
|
def string_literal?(node)
|
|
76
|
-
node.str_type? ||
|
|
85
|
+
node.str_type? || node.dstr_type?
|
|
77
86
|
end
|
|
78
87
|
|
|
79
88
|
def string_literals?(node1, node2)
|
|
@@ -89,6 +98,8 @@ module RuboCop
|
|
|
89
98
|
end
|
|
90
99
|
|
|
91
100
|
def str_content(node)
|
|
101
|
+
return unless node.respond_to?(:str_type?)
|
|
102
|
+
|
|
92
103
|
if node.str_type?
|
|
93
104
|
node.children[0]
|
|
94
105
|
else
|
|
@@ -11,7 +11,6 @@ module RuboCop
|
|
|
11
11
|
# @example
|
|
12
12
|
#
|
|
13
13
|
# # bad
|
|
14
|
-
#
|
|
15
14
|
# class C
|
|
16
15
|
# private
|
|
17
16
|
#
|
|
@@ -20,10 +19,7 @@ module RuboCop
|
|
|
20
19
|
# end
|
|
21
20
|
# end
|
|
22
21
|
#
|
|
23
|
-
# @example
|
|
24
|
-
#
|
|
25
22
|
# # good
|
|
26
|
-
#
|
|
27
23
|
# class C
|
|
28
24
|
# def self.method
|
|
29
25
|
# puts 'hi'
|
|
@@ -32,10 +28,7 @@ module RuboCop
|
|
|
32
28
|
# private_class_method :method
|
|
33
29
|
# end
|
|
34
30
|
#
|
|
35
|
-
# @example
|
|
36
|
-
#
|
|
37
31
|
# # good
|
|
38
|
-
#
|
|
39
32
|
# class C
|
|
40
33
|
# class << self
|
|
41
34
|
# private
|
|
@@ -14,13 +14,9 @@ module RuboCop
|
|
|
14
14
|
# @example
|
|
15
15
|
#
|
|
16
16
|
# # bad
|
|
17
|
-
#
|
|
18
17
|
# foo = 'something with #{interpolation} inside'
|
|
19
18
|
#
|
|
20
|
-
# @example
|
|
21
|
-
#
|
|
22
19
|
# # good
|
|
23
|
-
#
|
|
24
20
|
# foo = "something with #{interpolation} inside"
|
|
25
21
|
class InterpolationCheck < Base
|
|
26
22
|
extend AutoCorrector
|
|
@@ -29,25 +29,16 @@ module RuboCop
|
|
|
29
29
|
|
|
30
30
|
MSG = '`it` calls without arguments will refer to the first block param in Ruby 3.4; ' \
|
|
31
31
|
'use `it()` or `self.it`.'
|
|
32
|
+
RESTRICT_ON_SEND = %i[it].freeze
|
|
32
33
|
|
|
33
|
-
def
|
|
34
|
-
return unless (
|
|
35
|
-
return unless
|
|
34
|
+
def on_send(node)
|
|
35
|
+
return unless (block_node = node.each_ancestor(:block).first)
|
|
36
|
+
return unless block_node.arguments.empty_and_without_delimiters?
|
|
36
37
|
|
|
37
|
-
if
|
|
38
|
-
add_offense(body)
|
|
39
|
-
else
|
|
40
|
-
body.each_descendant(:send).each do |send_node|
|
|
41
|
-
next unless deprecated_it_method?(send_node)
|
|
42
|
-
|
|
43
|
-
add_offense(send_node)
|
|
44
|
-
end
|
|
45
|
-
end
|
|
38
|
+
add_offense(node) if deprecated_it_method?(node)
|
|
46
39
|
end
|
|
47
40
|
|
|
48
41
|
def deprecated_it_method?(node)
|
|
49
|
-
return false unless node.method?(:it)
|
|
50
|
-
|
|
51
42
|
!node.receiver && node.arguments.empty? && !node.parenthesized? && !node.block_literal?
|
|
52
43
|
end
|
|
53
44
|
end
|
|
@@ -8,13 +8,9 @@ module RuboCop
|
|
|
8
8
|
# @example
|
|
9
9
|
#
|
|
10
10
|
# # bad
|
|
11
|
-
#
|
|
12
11
|
# "result is #{10}"
|
|
13
12
|
#
|
|
14
|
-
# @example
|
|
15
|
-
#
|
|
16
13
|
# # good
|
|
17
|
-
#
|
|
18
14
|
# "result is 10"
|
|
19
15
|
class LiteralInInterpolation < Base
|
|
20
16
|
include Interpolation
|
|
@@ -34,6 +30,8 @@ module RuboCop
|
|
|
34
30
|
# interpolation should not be removed if the expanded value
|
|
35
31
|
# contains a space character.
|
|
36
32
|
expanded_value = autocorrected_value(final_node)
|
|
33
|
+
expanded_value = handle_special_regexp_chars(begin_node, expanded_value)
|
|
34
|
+
|
|
37
35
|
return if in_array_percent_literal?(begin_node) && /\s|\A\z/.match?(expanded_value)
|
|
38
36
|
|
|
39
37
|
add_offense(final_node) do |corrector|
|
|
@@ -81,6 +79,27 @@ module RuboCop
|
|
|
81
79
|
end
|
|
82
80
|
# rubocop:enable Metrics/MethodLength, Metrics/CyclomaticComplexity
|
|
83
81
|
|
|
82
|
+
def handle_special_regexp_chars(begin_node, value)
|
|
83
|
+
parent_node = begin_node.parent
|
|
84
|
+
|
|
85
|
+
return value unless parent_node.regexp_type? && parent_node.slash_literal? && value['/']
|
|
86
|
+
|
|
87
|
+
# When a literal string containing a forward slash preceded by backslashes
|
|
88
|
+
# is interpolated inside a regexp, the number of resultant backslashes in the
|
|
89
|
+
# compiled Regexp is `(2(n+1) / 4)+1`, where `n` is the number of backslashes
|
|
90
|
+
# inside the interpolation.
|
|
91
|
+
# ie. 0-2 backslashes is compiled to 1, 3-6 is compiled to 3, etc.
|
|
92
|
+
# This maintains that same behavior in order to ensure the Regexp behavior
|
|
93
|
+
# does not change upon removing the interpolation.
|
|
94
|
+
value.gsub(%r{(\\*)/}) do
|
|
95
|
+
backslashes = Regexp.last_match[1]
|
|
96
|
+
backslash_count = backslashes.length
|
|
97
|
+
needed_backslashes = (2 * ((backslash_count + 1) / 4)) + 1
|
|
98
|
+
|
|
99
|
+
"#{'\\' * needed_backslashes}/"
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
84
103
|
def autocorrected_value_for_string(node)
|
|
85
104
|
if node.source.start_with?("'", '%q')
|
|
86
105
|
node.children.last.inspect[1..-2]
|
|
@@ -154,7 +173,7 @@ module RuboCop
|
|
|
154
173
|
|
|
155
174
|
def ends_heredoc_line?(node)
|
|
156
175
|
grandparent = node.parent.parent
|
|
157
|
-
return false unless grandparent&.dstr_type? && grandparent
|
|
176
|
+
return false unless grandparent&.dstr_type? && grandparent.heredoc?
|
|
158
177
|
|
|
159
178
|
line = processed_source.lines[node.last_line - 1]
|
|
160
179
|
line.size == node.loc.last_column + 1
|
|
@@ -165,7 +184,7 @@ module RuboCop
|
|
|
165
184
|
return false unless parent.dstr_type? || parent.dsym_type?
|
|
166
185
|
|
|
167
186
|
grandparent = parent.parent
|
|
168
|
-
grandparent&.array_type? && grandparent
|
|
187
|
+
grandparent&.array_type? && grandparent.percent_literal?
|
|
169
188
|
end
|
|
170
189
|
end
|
|
171
190
|
end
|
|
@@ -19,17 +19,6 @@ module RuboCop
|
|
|
19
19
|
# do_something
|
|
20
20
|
# end while some_condition
|
|
21
21
|
#
|
|
22
|
-
# @example
|
|
23
|
-
#
|
|
24
|
-
# # bad
|
|
25
|
-
#
|
|
26
|
-
# # using until
|
|
27
|
-
# begin
|
|
28
|
-
# do_something
|
|
29
|
-
# end until some_condition
|
|
30
|
-
#
|
|
31
|
-
# @example
|
|
32
|
-
#
|
|
33
22
|
# # good
|
|
34
23
|
#
|
|
35
24
|
# # while replacement
|
|
@@ -38,7 +27,12 @@ module RuboCop
|
|
|
38
27
|
# break unless some_condition
|
|
39
28
|
# end
|
|
40
29
|
#
|
|
41
|
-
#
|
|
30
|
+
# # bad
|
|
31
|
+
#
|
|
32
|
+
# # using until
|
|
33
|
+
# begin
|
|
34
|
+
# do_something
|
|
35
|
+
# end until some_condition
|
|
42
36
|
#
|
|
43
37
|
# # good
|
|
44
38
|
#
|
|
@@ -47,8 +47,10 @@ module RuboCop
|
|
|
47
47
|
|
|
48
48
|
def on_regexp(node)
|
|
49
49
|
each_unsafe_regexp_range(node) do |loc|
|
|
50
|
+
next unless (replacement = regexp_range(loc.source))
|
|
51
|
+
|
|
50
52
|
add_offense(loc) do |corrector|
|
|
51
|
-
corrector.replace(loc,
|
|
53
|
+
corrector.replace(loc, replacement)
|
|
52
54
|
end
|
|
53
55
|
end
|
|
54
56
|
end
|
|
@@ -99,10 +101,13 @@ module RuboCop
|
|
|
99
101
|
end
|
|
100
102
|
end
|
|
101
103
|
|
|
102
|
-
def
|
|
104
|
+
def regexp_range(source)
|
|
103
105
|
open, close = source.split('-')
|
|
104
|
-
|
|
105
|
-
|
|
106
|
+
return unless (open_range = range_for(open))
|
|
107
|
+
return unless (close_range = range_for(close))
|
|
108
|
+
|
|
109
|
+
first = [open, open_range.end]
|
|
110
|
+
second = [close_range.begin, close]
|
|
106
111
|
"#{first.uniq.join('-')}#{second.uniq.join('-')}"
|
|
107
112
|
end
|
|
108
113
|
end
|
|
@@ -17,8 +17,6 @@ module RuboCop
|
|
|
17
17
|
# end
|
|
18
18
|
# end
|
|
19
19
|
#
|
|
20
|
-
# @example
|
|
21
|
-
#
|
|
22
20
|
# # good
|
|
23
21
|
#
|
|
24
22
|
# def foo
|
|
@@ -26,8 +24,6 @@ module RuboCop
|
|
|
26
24
|
# bar.call
|
|
27
25
|
# end
|
|
28
26
|
#
|
|
29
|
-
# @example
|
|
30
|
-
#
|
|
31
27
|
# # good
|
|
32
28
|
#
|
|
33
29
|
# # `class_eval`, `instance_eval`, `module_eval`, `class_exec`, `instance_exec`, and
|
|
@@ -47,8 +43,6 @@ module RuboCop
|
|
|
47
43
|
# end
|
|
48
44
|
# end
|
|
49
45
|
#
|
|
50
|
-
# @example
|
|
51
|
-
#
|
|
52
46
|
# # good
|
|
53
47
|
#
|
|
54
48
|
# def foo
|
|
@@ -102,7 +96,7 @@ module RuboCop
|
|
|
102
96
|
|
|
103
97
|
def on_def(node)
|
|
104
98
|
subject, = *node
|
|
105
|
-
return if node.defs_type? && subject.
|
|
99
|
+
return if node.defs_type? && subject.variable?
|
|
106
100
|
|
|
107
101
|
def_ancestor = node.each_ancestor(:def, :defs).first
|
|
108
102
|
return unless def_ancestor
|
|
@@ -8,16 +8,12 @@ module RuboCop
|
|
|
8
8
|
# @example
|
|
9
9
|
#
|
|
10
10
|
# # bad
|
|
11
|
-
#
|
|
12
11
|
# result = (1..4).reduce(0) do |acc, i|
|
|
13
12
|
# next if i.odd?
|
|
14
13
|
# acc + i
|
|
15
14
|
# end
|
|
16
15
|
#
|
|
17
|
-
# @example
|
|
18
|
-
#
|
|
19
16
|
# # good
|
|
20
|
-
#
|
|
21
17
|
# result = (1..4).reduce(0) do |acc, i|
|
|
22
18
|
# next acc if i.odd?
|
|
23
19
|
# acc + i
|
|
@@ -11,17 +11,13 @@ module RuboCop
|
|
|
11
11
|
# @example
|
|
12
12
|
#
|
|
13
13
|
# # bad
|
|
14
|
-
#
|
|
15
14
|
# @some_variable ||= begin
|
|
16
15
|
# return some_value if some_condition_is_met
|
|
17
16
|
#
|
|
18
17
|
# do_something
|
|
19
18
|
# end
|
|
20
19
|
#
|
|
21
|
-
# @example
|
|
22
|
-
#
|
|
23
20
|
# # good
|
|
24
|
-
#
|
|
25
21
|
# @some_variable ||= begin
|
|
26
22
|
# if some_condition_is_met
|
|
27
23
|
# some_value
|
|
@@ -31,7 +27,6 @@ module RuboCop
|
|
|
31
27
|
# end
|
|
32
28
|
#
|
|
33
29
|
# # good
|
|
34
|
-
#
|
|
35
30
|
# some_variable = if some_condition_is_met
|
|
36
31
|
# return if another_condition_is_met
|
|
37
32
|
#
|
|
@@ -130,7 +130,7 @@ module RuboCop
|
|
|
130
130
|
# @return [Parser::Source::Range]
|
|
131
131
|
#
|
|
132
132
|
def last_arg_range(node)
|
|
133
|
-
node.last_argument.source_range.
|
|
133
|
+
node.last_argument.source_range.join(node.arguments[-2].source_range.end)
|
|
134
134
|
end
|
|
135
135
|
|
|
136
136
|
def unsorted_dir_loop?(node)
|
|
@@ -37,9 +37,7 @@ module RuboCop
|
|
|
37
37
|
private
|
|
38
38
|
|
|
39
39
|
def valid_context?(node)
|
|
40
|
-
unless node.arguments.one? &&
|
|
41
|
-
return true
|
|
42
|
-
end
|
|
40
|
+
return true unless node.arguments.one? && node.first_argument.parenthesized_call?
|
|
43
41
|
return true if first_argument_block_type?(node.first_argument)
|
|
44
42
|
|
|
45
43
|
node.operator_method? || node.setter_method? || chained_calls?(node) ||
|
|
@@ -51,11 +49,12 @@ module RuboCop
|
|
|
51
49
|
end
|
|
52
50
|
|
|
53
51
|
def valid_first_argument?(first_arg)
|
|
54
|
-
first_arg.operator_keyword? || first_arg.hash_type? || ternary_expression?(first_arg)
|
|
52
|
+
first_arg.operator_keyword? || first_arg.hash_type? || ternary_expression?(first_arg) ||
|
|
53
|
+
compound_range?(first_arg)
|
|
55
54
|
end
|
|
56
55
|
|
|
57
|
-
def
|
|
58
|
-
|
|
56
|
+
def compound_range?(first_arg)
|
|
57
|
+
first_arg.range_type? && first_arg.parenthesized_call?
|
|
59
58
|
end
|
|
60
59
|
|
|
61
60
|
def chained_calls?(node)
|
|
@@ -9,16 +9,12 @@ module RuboCop
|
|
|
9
9
|
# @example
|
|
10
10
|
#
|
|
11
11
|
# # bad
|
|
12
|
-
#
|
|
13
12
|
# rand 1
|
|
14
13
|
# Kernel.rand(-1)
|
|
15
14
|
# rand 1.0
|
|
16
15
|
# rand(-1.0)
|
|
17
16
|
#
|
|
18
|
-
# @example
|
|
19
|
-
#
|
|
20
17
|
# # good
|
|
21
|
-
#
|
|
22
18
|
# 0 # just use 0 instead
|
|
23
19
|
class RandOne < Base
|
|
24
20
|
MSG = '`%<method>s` always returns `0`. Perhaps you meant `rand(2)` or `rand`?'
|
|
@@ -14,14 +14,16 @@ module RuboCop
|
|
|
14
14
|
#
|
|
15
15
|
# When comment enables all cops at once `rubocop:enable all`
|
|
16
16
|
# that cop checks whether any cop was actually enabled.
|
|
17
|
+
#
|
|
17
18
|
# @example
|
|
19
|
+
#
|
|
18
20
|
# # bad
|
|
19
21
|
# foo = 1
|
|
20
22
|
# # rubocop:enable Layout/LineLength
|
|
21
23
|
#
|
|
22
24
|
# # good
|
|
23
25
|
# foo = 1
|
|
24
|
-
#
|
|
26
|
+
#
|
|
25
27
|
# # bad
|
|
26
28
|
# # rubocop:disable Style/StringLiterals
|
|
27
29
|
# foo = "1"
|
|
@@ -131,7 +131,7 @@ module RuboCop
|
|
|
131
131
|
private
|
|
132
132
|
|
|
133
133
|
def assume_receiver_instance_exists?(receiver)
|
|
134
|
-
return true if receiver.const_type? && !receiver.
|
|
134
|
+
return true if receiver.const_type? && !receiver.short_name.match?(SNAKE_CASE)
|
|
135
135
|
|
|
136
136
|
receiver.literal? && !receiver.nil_type?
|
|
137
137
|
end
|
|
@@ -9,16 +9,12 @@ module RuboCop
|
|
|
9
9
|
# @example
|
|
10
10
|
#
|
|
11
11
|
# # bad
|
|
12
|
-
#
|
|
13
12
|
# "result is #{something.to_s}"
|
|
14
13
|
# print something.to_s
|
|
15
14
|
# puts something.to_s
|
|
16
15
|
# warn something.to_s
|
|
17
16
|
#
|
|
18
|
-
# @example
|
|
19
|
-
#
|
|
20
17
|
# # good
|
|
21
|
-
#
|
|
22
18
|
# "result is #{something}"
|
|
23
19
|
# print something
|
|
24
20
|
# puts something
|
|
@@ -33,8 +33,10 @@ module RuboCop
|
|
|
33
33
|
MSG_EACH_WITH_INDEX = 'Use `each` instead of `each_with_index`.'
|
|
34
34
|
MSG_WITH_INDEX = 'Remove redundant `with_index`.'
|
|
35
35
|
|
|
36
|
+
# rubocop:disable Metrics/AbcSize
|
|
36
37
|
def on_block(node)
|
|
37
38
|
return unless node.receiver
|
|
39
|
+
return if node.method?(:with_index) && !node.receiver.receiver
|
|
38
40
|
return unless (send = redundant_with_index?(node))
|
|
39
41
|
|
|
40
42
|
range = with_index_range(send)
|
|
@@ -48,6 +50,7 @@ module RuboCop
|
|
|
48
50
|
end
|
|
49
51
|
end
|
|
50
52
|
end
|
|
53
|
+
# rubocop:enable Metrics/AbcSize
|
|
51
54
|
|
|
52
55
|
alias on_numblock on_block
|
|
53
56
|
|