rubocop 0.88.0 → 0.89.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 +1 -1
- data/bin/rubocop-profile +1 -0
- data/config/default.yml +96 -16
- data/lib/rubocop.rb +16 -4
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +1 -1
- data/lib/rubocop/cli/command/base.rb +1 -0
- data/lib/rubocop/cli/command/execute_runner.rb +1 -1
- data/lib/rubocop/cli/command/show_cops.rb +1 -1
- data/lib/rubocop/cli/command/version.rb +2 -2
- data/lib/rubocop/comment_config.rb +2 -2
- data/lib/rubocop/config.rb +19 -2
- data/lib/rubocop/config_loader.rb +1 -1
- data/lib/rubocop/config_loader_resolver.rb +3 -3
- data/lib/rubocop/config_obsoletion.rb +6 -1
- data/lib/rubocop/config_validator.rb +1 -3
- data/lib/rubocop/cop/base.rb +2 -2
- data/lib/rubocop/cop/commissioner.rb +0 -1
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +3 -3
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/punctuation_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
- data/lib/rubocop/cop/force.rb +1 -0
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +32 -11
- data/lib/rubocop/cop/generator/configuration_injector.rb +2 -2
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +4 -12
- data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +8 -8
- data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +10 -7
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +7 -8
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
- data/lib/rubocop/cop/layout/block_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines.rb +0 -2
- data/lib/rubocop/cop/layout/extra_spacing.rb +9 -16
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +0 -2
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +9 -1
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +15 -10
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +11 -13
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
- data/lib/rubocop/cop/lint/big_decimal_new.rb +10 -10
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +49 -0
- data/lib/rubocop/cop/lint/boolean_symbol.rb +16 -11
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
- data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
- data/lib/rubocop/cop/lint/debugger.rb +7 -1
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +9 -10
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +17 -13
- data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +7 -4
- data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +60 -0
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
- data/lib/rubocop/cop/lint/else_layout.rb +1 -1
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
- data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
- data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
- data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
- data/lib/rubocop/cop/lint/empty_when.rb +2 -2
- data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +11 -10
- data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
- data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
- data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +5 -4
- data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +2 -2
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +8 -8
- data/lib/rubocop/cop/lint/inherit_exception.rb +12 -7
- data/lib/rubocop/cop/lint/interpolation_check.rb +18 -15
- data/lib/rubocop/cop/lint/literal_as_condition.rb +4 -2
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -7
- data/lib/rubocop/cop/lint/loop.rb +23 -2
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +6 -5
- data/lib/rubocop/cop/lint/missing_super.rb +99 -0
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/multiple_comparison.rb +6 -9
- data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +27 -23
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
- data/lib/rubocop/cop/lint/number_conversion.rb +6 -9
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +61 -0
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +4 -10
- data/lib/rubocop/cop/lint/percent_string_array.rb +13 -12
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +13 -12
- data/lib/rubocop/cop/lint/raise_exception.rb +12 -10
- data/lib/rubocop/cop/lint/rand_one.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +7 -11
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -7
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +13 -9
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +6 -13
- data/lib/rubocop/cop/lint/redundant_with_index.rb +11 -14
- data/lib/rubocop/cop/lint/redundant_with_object.rb +11 -14
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +4 -6
- data/lib/rubocop/cop/lint/require_parentheses.rb +2 -2
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_type.rb +8 -8
- data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -4
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -6
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +14 -10
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +7 -7
- data/lib/rubocop/cop/lint/script_permission.rb +10 -7
- data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +5 -11
- data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
- data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +3 -3
- data/lib/rubocop/cop/lint/struct_new_override.rb +1 -1
- data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
- data/lib/rubocop/cop/lint/to_json.rb +4 -6
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
- data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +4 -4
- data/lib/rubocop/cop/lint/unified_integer.rb +4 -6
- data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_loop.rb +174 -0
- data/lib/rubocop/cop/lint/unused_block_argument.rb +8 -3
- data/lib/rubocop/cop/lint/unused_method_argument.rb +8 -3
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
- data/lib/rubocop/cop/lint/uri_regexp.rb +11 -31
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +25 -15
- data/lib/rubocop/cop/lint/useless_assignment.rb +4 -4
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -15
- data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
- data/lib/rubocop/cop/lint/void.rb +3 -7
- data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
- data/lib/rubocop/cop/metrics/block_length.rb +2 -2
- data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
- data/lib/rubocop/cop/metrics/class_length.rb +2 -2
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
- data/lib/rubocop/cop/metrics/method_length.rb +2 -2
- data/lib/rubocop/cop/metrics/module_length.rb +2 -2
- data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +48 -5
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +52 -24
- data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
- data/lib/rubocop/cop/migration/department_name.rb +13 -15
- data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +1 -1
- data/lib/rubocop/cop/mixin/code_length.rb +22 -5
- data/lib/rubocop/cop/mixin/enforce_superclass.rb +2 -0
- data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
- data/lib/rubocop/cop/mixin/statement_modifier.rb +35 -6
- data/lib/rubocop/cop/mixin/surrounding_space.rb +0 -25
- data/lib/rubocop/cop/mixin/uncommunicative_name.rb +6 -13
- data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
- data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +3 -3
- 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/class_and_module_camel_case.rb +2 -2
- data/lib/rubocop/cop/naming/constant_name.rb +2 -2
- data/lib/rubocop/cop/naming/file_name.rb +3 -3
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +2 -2
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
- data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/predicate_name.rb +3 -5
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -11
- data/lib/rubocop/cop/registry.rb +3 -3
- data/lib/rubocop/cop/security/eval.rb +2 -2
- data/lib/rubocop/cop/security/json_load.rb +6 -8
- data/lib/rubocop/cop/security/marshal_load.rb +2 -4
- data/lib/rubocop/cop/security/open.rb +2 -2
- data/lib/rubocop/cop/security/yaml_load.rb +6 -6
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +11 -1
- data/lib/rubocop/cop/style/accessor_grouping.rb +9 -7
- data/lib/rubocop/cop/style/alias.rb +7 -3
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +0 -2
- data/lib/rubocop/cop/style/case_equality.rb +22 -3
- data/lib/rubocop/cop/style/case_like_if.rb +2 -2
- data/lib/rubocop/cop/style/colon_method_call.rb +3 -3
- data/lib/rubocop/cop/style/conditional_assignment.rb +11 -2
- data/lib/rubocop/cop/style/documentation.rb +4 -4
- data/lib/rubocop/cop/style/each_with_object.rb +0 -2
- data/lib/rubocop/cop/style/empty_method.rb +5 -5
- data/lib/rubocop/cop/style/eval_with_location.rb +4 -0
- data/lib/rubocop/cop/style/expand_path_arguments.rb +4 -0
- data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
- data/lib/rubocop/cop/style/format_string.rb +4 -0
- data/lib/rubocop/cop/style/format_string_token.rb +1 -0
- data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
- data/lib/rubocop/cop/style/guard_clause.rb +2 -2
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +8 -1
- data/lib/rubocop/cop/style/hash_syntax.rb +6 -3
- 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_unless_modifier.rb +0 -20
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +2 -3
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +5 -0
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +9 -2
- data/lib/rubocop/cop/style/multiline_memoization.rb +2 -2
- data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -1
- data/lib/rubocop/cop/style/numeric_predicate.rb +4 -0
- data/lib/rubocop/cop/style/optional_boolean_parameter.rb +42 -0
- data/lib/rubocop/cop/style/parallel_assignment.rb +2 -2
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -2
- data/lib/rubocop/cop/style/random_with_offset.rb +1 -0
- data/lib/rubocop/cop/style/redundant_condition.rb +15 -3
- data/lib/rubocop/cop/style/redundant_exception.rb +4 -0
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +9 -9
- data/lib/rubocop/cop/style/redundant_sort.rb +25 -10
- data/lib/rubocop/cop/style/signal_exception.rb +2 -0
- data/lib/rubocop/cop/style/single_argument_dig.rb +54 -0
- data/lib/rubocop/cop/style/string_concatenation.rb +92 -0
- data/lib/rubocop/cop/style/struct_inheritance.rb +1 -1
- data/lib/rubocop/cop/style/symbol_array.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +1 -1
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +10 -6
- data/lib/rubocop/cop/team.rb +1 -1
- data/lib/rubocop/cop/tokens_util.rb +84 -0
- data/lib/rubocop/cop/util.rb +1 -13
- data/lib/rubocop/cop/variable_force.rb +0 -2
- data/lib/rubocop/cop/variable_force/branch.rb +1 -0
- data/lib/rubocop/cop/variable_force/variable.rb +2 -2
- data/lib/rubocop/cops_documentation_generator.rb +282 -0
- data/lib/rubocop/error.rb +1 -0
- data/lib/rubocop/formatter/formatter_set.rb +1 -0
- data/lib/rubocop/path_util.rb +19 -4
- data/lib/rubocop/rake_task.rb +1 -0
- data/lib/rubocop/rspec/expect_offense.rb +1 -1
- data/lib/rubocop/target_finder.rb +12 -9
- data/lib/rubocop/version.rb +2 -2
- metadata +19 -6
- data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
- data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
- data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -25
- data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
@@ -16,31 +16,34 @@ module RuboCop
|
|
16
16
|
# # good
|
17
17
|
#
|
18
18
|
# foo = "something with #{interpolation} inside"
|
19
|
-
class InterpolationCheck <
|
19
|
+
class InterpolationCheck < Base
|
20
|
+
extend AutoCorrector
|
21
|
+
|
20
22
|
MSG = 'Interpolation in single quoted string detected. '\
|
21
23
|
'Use double quoted strings if you need interpolation.'
|
22
24
|
|
23
25
|
def on_str(node)
|
24
|
-
return if heredoc?(node)
|
25
|
-
|
26
26
|
parent = node.parent
|
27
27
|
return if parent && (parent.dstr_type? || parent.regexp_type?)
|
28
|
-
return unless /(?<!\\)#\{.*\}/.match?(node.source
|
28
|
+
return unless /(?<!\\)#\{.*\}/.match?(node.source)
|
29
|
+
return if heredoc?(node)
|
29
30
|
|
30
|
-
add_offense(node)
|
31
|
+
add_offense(node) do |corrector|
|
32
|
+
autocorrect(corrector, node)
|
33
|
+
end
|
31
34
|
end
|
32
35
|
|
33
|
-
|
34
|
-
lambda do |corrector|
|
35
|
-
starting_token, ending_token = if node.source.include?('"')
|
36
|
-
['%{', '}']
|
37
|
-
else
|
38
|
-
['"', '"']
|
39
|
-
end
|
36
|
+
private
|
40
37
|
|
41
|
-
|
42
|
-
|
43
|
-
|
38
|
+
def autocorrect(corrector, node)
|
39
|
+
starting_token, ending_token = if node.source.include?('"')
|
40
|
+
['%{', '}']
|
41
|
+
else
|
42
|
+
['"', '"']
|
43
|
+
end
|
44
|
+
|
45
|
+
corrector.replace(node.loc.begin, starting_token)
|
46
|
+
corrector.replace(node.loc.end, ending_token)
|
44
47
|
end
|
45
48
|
|
46
49
|
def heredoc?(node)
|
@@ -29,7 +29,7 @@ module RuboCop
|
|
29
29
|
# while true
|
30
30
|
# break if condition
|
31
31
|
# end
|
32
|
-
class LiteralAsCondition <
|
32
|
+
class LiteralAsCondition < Base
|
33
33
|
include RangeHelp
|
34
34
|
|
35
35
|
MSG = 'Literal `%<literal>s` appeared as a condition.'
|
@@ -60,7 +60,9 @@ module RuboCop
|
|
60
60
|
next unless when_node.conditions.all?(&:literal?)
|
61
61
|
|
62
62
|
range = when_conditions_range(when_node)
|
63
|
-
|
63
|
+
message = message(range)
|
64
|
+
|
65
|
+
add_offense(range, message: message)
|
64
66
|
end
|
65
67
|
end
|
66
68
|
end
|
@@ -16,10 +16,11 @@ module RuboCop
|
|
16
16
|
# # good
|
17
17
|
#
|
18
18
|
# "result is 10"
|
19
|
-
class LiteralInInterpolation <
|
19
|
+
class LiteralInInterpolation < Base
|
20
20
|
include Interpolation
|
21
21
|
include RangeHelp
|
22
22
|
include PercentLiteral
|
23
|
+
extend AutoCorrector
|
23
24
|
|
24
25
|
MSG = 'Literal interpolation detected.'
|
25
26
|
COMPOSITE = %i[array hash pair irange erange].freeze
|
@@ -30,14 +31,13 @@ module RuboCop
|
|
30
31
|
return if special_keyword?(final_node)
|
31
32
|
return unless prints_as_self?(final_node)
|
32
33
|
|
33
|
-
add_offense(final_node)
|
34
|
-
|
34
|
+
add_offense(final_node) do |corrector|
|
35
|
+
return if final_node.dstr_type? # nested, fixed in next iteration
|
35
36
|
|
36
|
-
|
37
|
-
return if node.dstr_type? # nested, fixed in next iteration
|
37
|
+
value = autocorrected_value(final_node)
|
38
38
|
|
39
|
-
|
40
|
-
|
39
|
+
corrector.replace(final_node.parent, value)
|
40
|
+
end
|
41
41
|
end
|
42
42
|
|
43
43
|
private
|
@@ -42,7 +42,9 @@ module RuboCop
|
|
42
42
|
# do_something
|
43
43
|
# break if some_condition
|
44
44
|
# end
|
45
|
-
class Loop <
|
45
|
+
class Loop < Base
|
46
|
+
extend AutoCorrector
|
47
|
+
|
46
48
|
MSG = 'Use `Kernel#loop` with `break` rather than ' \
|
47
49
|
'`begin/end/until`(or `while`).'
|
48
50
|
|
@@ -57,7 +59,26 @@ module RuboCop
|
|
57
59
|
private
|
58
60
|
|
59
61
|
def register_offense(node)
|
60
|
-
|
62
|
+
body = node.body
|
63
|
+
|
64
|
+
add_offense(node.loc.keyword) do |corrector|
|
65
|
+
corrector.replace(body.loc.begin, 'loop do')
|
66
|
+
corrector.remove(keyword_and_condition_range(node))
|
67
|
+
corrector.insert_before(body.loc.end, build_break_line(node))
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def keyword_and_condition_range(node)
|
72
|
+
node.body.loc.end.end.join(node.source_range.end)
|
73
|
+
end
|
74
|
+
|
75
|
+
def build_break_line(node)
|
76
|
+
conditional_keyword = node.while_post_type? ? 'unless' : 'if'
|
77
|
+
"break #{conditional_keyword} #{node.condition.source}\n#{indent(node)}"
|
78
|
+
end
|
79
|
+
|
80
|
+
def indent(node)
|
81
|
+
' ' * node.loc.column
|
61
82
|
end
|
62
83
|
end
|
63
84
|
end
|
@@ -42,7 +42,7 @@ module RuboCop
|
|
42
42
|
# # Including this, that's 3 lines on which the cop is disabled.
|
43
43
|
# # rubocop:enable Layout/SpaceAroundOperators
|
44
44
|
#
|
45
|
-
class MissingCopEnableDirective <
|
45
|
+
class MissingCopEnableDirective < Base
|
46
46
|
include RangeHelp
|
47
47
|
|
48
48
|
MSG = 'Re-enable %<cop>s cop with `# rubocop:enable` after ' \
|
@@ -50,7 +50,8 @@ module RuboCop
|
|
50
50
|
MSG_BOUND = 'Re-enable %<cop>s cop within %<max_range>s lines after ' \
|
51
51
|
'disabling it.'
|
52
52
|
|
53
|
-
|
53
|
+
# rubocop:disable Metrics/AbcSize
|
54
|
+
def on_new_investigation
|
54
55
|
max_range = cop_config['MaximumRangeSize']
|
55
56
|
processed_source.disabled_line_ranges.each do |cop, line_ranges|
|
56
57
|
line_ranges.each do |line_range|
|
@@ -61,12 +62,12 @@ module RuboCop
|
|
61
62
|
range = source_range(processed_source.buffer,
|
62
63
|
line_range.min,
|
63
64
|
(0..0))
|
64
|
-
|
65
|
-
|
66
|
-
message: message(max_range: max_range, cop: cop))
|
65
|
+
|
66
|
+
add_offense(range, message: message(max_range: max_range, cop: cop))
|
67
67
|
end
|
68
68
|
end
|
69
69
|
end
|
70
|
+
# rubocop:enable Metrics/AbcSize
|
70
71
|
|
71
72
|
private
|
72
73
|
|
@@ -0,0 +1,99 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Lint
|
6
|
+
# This cop checks for the presence of constructors and lifecycle callbacks
|
7
|
+
# without calls to `super`.
|
8
|
+
#
|
9
|
+
# @example
|
10
|
+
# # bad
|
11
|
+
# class Employee < Person
|
12
|
+
# def initialize(name, salary)
|
13
|
+
# @salary = salary
|
14
|
+
# end
|
15
|
+
# end
|
16
|
+
#
|
17
|
+
# # good
|
18
|
+
# class Employee < Person
|
19
|
+
# def initialize(name, salary)
|
20
|
+
# super(name)
|
21
|
+
# @salary = salary
|
22
|
+
# end
|
23
|
+
# end
|
24
|
+
#
|
25
|
+
# # bad
|
26
|
+
# class Parent
|
27
|
+
# def self.inherited(base)
|
28
|
+
# do_something
|
29
|
+
# end
|
30
|
+
# end
|
31
|
+
#
|
32
|
+
# # good
|
33
|
+
# class Parent
|
34
|
+
# def self.inherited(base)
|
35
|
+
# super
|
36
|
+
# do_something
|
37
|
+
# end
|
38
|
+
# end
|
39
|
+
#
|
40
|
+
class MissingSuper < Base
|
41
|
+
CONSTRUCTOR_MSG = 'Call `super` to initialize state of the parent class.'
|
42
|
+
CALLBACK_MSG = 'Call `super` to invoke callback defined in the parent class.'
|
43
|
+
|
44
|
+
STATELESS_CLASSES = %w[BasicObject Object].freeze
|
45
|
+
|
46
|
+
OBJECT_LIFECYCLE_CALLBACKS = %i[method_missing respond_to_missing?].freeze
|
47
|
+
CLASS_LIFECYCLE_CALLBACKS = %i[inherited].freeze
|
48
|
+
MODULE_LIFECYCLE_CALLBACKS = %i[included extended prepended].freeze
|
49
|
+
|
50
|
+
def on_def(node)
|
51
|
+
return unless offender?(node)
|
52
|
+
|
53
|
+
if node.method?(:initialize)
|
54
|
+
add_offense(node, message: CONSTRUCTOR_MSG) if inside_class_with_stateful_parent?(node)
|
55
|
+
elsif callback_method_def?(node)
|
56
|
+
add_offense(node, message: CALLBACK_MSG)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def on_defs(node)
|
61
|
+
return if !callback_method_def?(node) || contains_super?(node)
|
62
|
+
|
63
|
+
add_offense(node, message: CALLBACK_MSG)
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def offender?(node)
|
69
|
+
(node.method?(:initialize) || callback_method_def?(node)) && !contains_super?(node)
|
70
|
+
end
|
71
|
+
|
72
|
+
def callback_method_def?(node)
|
73
|
+
method_name = node.method_name
|
74
|
+
|
75
|
+
if OBJECT_LIFECYCLE_CALLBACKS.include?(method_name) ||
|
76
|
+
CLASS_LIFECYCLE_CALLBACKS.include?(method_name)
|
77
|
+
|
78
|
+
node.each_ancestor(:class, :sclass, :module).first
|
79
|
+
elsif MODULE_LIFECYCLE_CALLBACKS.include?(method_name)
|
80
|
+
node.each_ancestor(:module).first
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def contains_super?(node)
|
85
|
+
node.each_descendant(:super, :zsuper).any?
|
86
|
+
end
|
87
|
+
|
88
|
+
def inside_class_with_stateful_parent?(node)
|
89
|
+
class_node = node.each_ancestor(:class).first
|
90
|
+
class_node&.parent_class && !stateless_class?(class_node.parent_class)
|
91
|
+
end
|
92
|
+
|
93
|
+
def stateless_class?(node)
|
94
|
+
STATELESS_CLASSES.include?(node.const_name)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -21,7 +21,9 @@ module RuboCop
|
|
21
21
|
#
|
22
22
|
# x < y && y < z
|
23
23
|
# 10 <= x && x <= 20
|
24
|
-
class MultipleComparison <
|
24
|
+
class MultipleComparison < Base
|
25
|
+
extend AutoCorrector
|
26
|
+
|
25
27
|
MSG = 'Use the `&&` operator to compare multiple values.'
|
26
28
|
|
27
29
|
def_node_matcher :multiple_compare?, <<~PATTERN
|
@@ -29,16 +31,11 @@ module RuboCop
|
|
29
31
|
PATTERN
|
30
32
|
|
31
33
|
def on_send(node)
|
32
|
-
return unless multiple_compare?(node)
|
33
|
-
|
34
|
-
add_offense(node)
|
35
|
-
end
|
34
|
+
return unless (center = multiple_compare?(node))
|
36
35
|
|
37
|
-
|
38
|
-
|
39
|
-
new_center = "#{center.source} && #{center.source}"
|
36
|
+
add_offense(node) do |corrector|
|
37
|
+
new_center = "#{center.source} && #{center.source}"
|
40
38
|
|
41
|
-
lambda do |corrector|
|
42
39
|
corrector.replace(center, new_center)
|
43
40
|
end
|
44
41
|
end
|
@@ -15,7 +15,7 @@ module RuboCop
|
|
15
15
|
# valid_attributes: %i[name content],
|
16
16
|
# nested_attributes: %i[name content %i[incorrectly nested]]
|
17
17
|
# }
|
18
|
-
class NestedPercentLiteral <
|
18
|
+
class NestedPercentLiteral < Base
|
19
19
|
include PercentLiteral
|
20
20
|
|
21
21
|
MSG = 'Within percent literals, nested percent literals do not ' \
|
@@ -51,7 +51,9 @@ module RuboCop
|
|
51
51
|
# # good
|
52
52
|
# Dir.glob(Rails.root.join('test', '*.rb')).sort.each(&method(:require))
|
53
53
|
#
|
54
|
-
class NonDeterministicRequireOrder <
|
54
|
+
class NonDeterministicRequireOrder < Base
|
55
|
+
extend AutoCorrector
|
56
|
+
|
55
57
|
MSG = 'Sort files before requiring them.'
|
56
58
|
|
57
59
|
def on_block(node)
|
@@ -61,7 +63,9 @@ module RuboCop
|
|
61
63
|
loop_variable(node.arguments) do |var_name|
|
62
64
|
return unless var_is_required?(node.body, var_name)
|
63
65
|
|
64
|
-
add_offense(node.send_node)
|
66
|
+
add_offense(node.send_node) do |corrector|
|
67
|
+
correct_block(corrector, node.send_node)
|
68
|
+
end
|
65
69
|
end
|
66
70
|
end
|
67
71
|
|
@@ -69,37 +73,37 @@ module RuboCop
|
|
69
73
|
return unless method_require?(node)
|
70
74
|
return unless unsorted_dir_pass?(node.parent)
|
71
75
|
|
72
|
-
|
76
|
+
parent_node = node.parent
|
77
|
+
|
78
|
+
add_offense(parent_node) do |corrector|
|
79
|
+
if parent_node.arguments.last&.block_pass_type?
|
80
|
+
correct_block_pass(corrector, parent_node)
|
81
|
+
else
|
82
|
+
correct_block(corrector, parent_node)
|
83
|
+
end
|
84
|
+
end
|
73
85
|
end
|
74
86
|
|
75
|
-
|
76
|
-
return correct_block_pass(node) if node.arguments.last&.block_pass_type?
|
87
|
+
private
|
77
88
|
|
89
|
+
def correct_block(corrector, node)
|
78
90
|
if unsorted_dir_block?(node)
|
79
|
-
|
80
|
-
corrector.replace(node, "#{node.source}.sort.each")
|
81
|
-
end
|
91
|
+
corrector.replace(node, "#{node.source}.sort.each")
|
82
92
|
else
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
end
|
93
|
+
source = node.receiver.source
|
94
|
+
|
95
|
+
corrector.replace(node, "#{source}.sort.each")
|
87
96
|
end
|
88
97
|
end
|
89
98
|
|
90
|
-
|
91
|
-
|
92
|
-
def correct_block_pass(node)
|
99
|
+
def correct_block_pass(corrector, node)
|
93
100
|
if unsorted_dir_glob_pass?(node)
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
end
|
101
|
+
block_arg = node.arguments.last
|
102
|
+
|
103
|
+
corrector.remove(last_arg_range(node))
|
104
|
+
corrector.insert_after(node, ".sort.each(#{block_arg.source})")
|
99
105
|
else
|
100
|
-
|
101
|
-
corrector.replace(node.loc.selector, 'sort.each')
|
102
|
-
end
|
106
|
+
corrector.replace(node.loc.selector, 'sort.each')
|
103
107
|
end
|
104
108
|
end
|
105
109
|
|
@@ -38,7 +38,7 @@ module RuboCop
|
|
38
38
|
# end
|
39
39
|
# end
|
40
40
|
#
|
41
|
-
class NonLocalExitFromIterator <
|
41
|
+
class NonLocalExitFromIterator < Base
|
42
42
|
MSG = 'Non-local exit from iterator, without return value. ' \
|
43
43
|
'`next`, `break`, `Array#find`, `Array#any?`, etc. ' \
|
44
44
|
'is preferred.'
|
@@ -57,7 +57,7 @@ module RuboCop
|
|
57
57
|
next unless node.arguments?
|
58
58
|
|
59
59
|
if chained_send?(node.send_node)
|
60
|
-
add_offense(return_node
|
60
|
+
add_offense(return_node.loc.keyword)
|
61
61
|
break
|
62
62
|
end
|
63
63
|
end
|
@@ -20,7 +20,9 @@ module RuboCop
|
|
20
20
|
# Integer('10', 10)
|
21
21
|
# Float('10.2')
|
22
22
|
# Complex('10')
|
23
|
-
class NumberConversion <
|
23
|
+
class NumberConversion < Base
|
24
|
+
extend AutoCorrector
|
25
|
+
|
24
26
|
CONVERSION_METHOD_CLASS_MAPPING = {
|
25
27
|
to_i: "#{Integer.name}(%<number_object>s, 10)",
|
26
28
|
to_f: "#{Float.name}(%<number_object>s)",
|
@@ -49,14 +51,9 @@ module RuboCop
|
|
49
51
|
to_method: to_method,
|
50
52
|
corrected_method: correct_method(node, receiver)
|
51
53
|
)
|
52
|
-
add_offense(node, message: message)
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
def autocorrect(node)
|
57
|
-
lambda do |corrector|
|
58
|
-
corrector.replace(node,
|
59
|
-
correct_method(node, node.receiver))
|
54
|
+
add_offense(node, message: message) do |corrector|
|
55
|
+
corrector.replace(node, correct_method(node, node.receiver))
|
56
|
+
end
|
60
57
|
end
|
61
58
|
end
|
62
59
|
|