rubocop 0.73.0 → 0.77.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 +3 -2
- data/bin/console +1 -0
- data/config/default.yml +332 -295
- data/lib/rubocop.rb +46 -30
- data/lib/rubocop/ast/builder.rb +1 -0
- data/lib/rubocop/ast/node.rb +6 -8
- data/lib/rubocop/ast/node/block_node.rb +2 -0
- data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +1 -12
- data/lib/rubocop/ast/node/return_node.rb +24 -0
- data/lib/rubocop/cli.rb +11 -227
- data/lib/rubocop/cli/command.rb +21 -0
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +105 -0
- data/lib/rubocop/cli/command/base.rb +33 -0
- data/lib/rubocop/cli/command/execute_runner.rb +76 -0
- data/lib/rubocop/cli/command/init_dotfile.rb +45 -0
- data/lib/rubocop/cli/command/show_cops.rb +73 -0
- data/lib/rubocop/cli/command/version.rb +17 -0
- data/lib/rubocop/cli/environment.rb +21 -0
- data/lib/rubocop/comment_config.rb +5 -4
- data/lib/rubocop/config.rb +28 -537
- data/lib/rubocop/config_loader.rb +21 -3
- data/lib/rubocop/config_loader_resolver.rb +4 -3
- data/lib/rubocop/config_obsoletion.rb +275 -0
- data/lib/rubocop/config_validator.rb +246 -0
- data/lib/rubocop/cop/autocorrect_logic.rb +2 -2
- data/lib/rubocop/cop/bundler/gem_comment.rb +4 -4
- data/lib/rubocop/cop/commissioner.rb +15 -7
- data/lib/rubocop/cop/cop.rb +33 -9
- data/lib/rubocop/cop/corrector.rb +8 -7
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +43 -17
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/space_corrector.rb +1 -2
- data/lib/rubocop/cop/generator.rb +3 -3
- data/lib/rubocop/cop/generator/configuration_injector.rb +9 -4
- data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
- data/lib/rubocop/cop/internal_affairs.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +59 -0
- data/lib/rubocop/cop/layout/{align_arguments.rb → argument_alignment.rb} +1 -1
- data/lib/rubocop/cop/layout/{align_array.rb → array_alignment.rb} +1 -1
- data/lib/rubocop/cop/layout/{indent_assignment.rb → assignment_indentation.rb} +11 -2
- data/lib/rubocop/cop/layout/block_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/comment_indentation.rb +10 -13
- data/lib/rubocop/cop/layout/empty_comment.rb +7 -16
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +22 -7
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +2 -2
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -2
- data/lib/rubocop/cop/layout/end_of_line.rb +8 -3
- data/lib/rubocop/cop/layout/extra_spacing.rb +15 -60
- data/lib/rubocop/cop/layout/{indent_first_argument.rb → first_argument_indentation.rb} +12 -10
- data/lib/rubocop/cop/layout/{indent_first_array_element.rb → first_array_element_indentation.rb} +4 -4
- data/lib/rubocop/cop/layout/{indent_first_hash_element.rb → first_hash_element_indentation.rb} +4 -4
- data/lib/rubocop/cop/layout/{indent_first_parameter.rb → first_parameter_indentation.rb} +3 -3
- data/lib/rubocop/cop/layout/{align_hash.rb → hash_alignment.rb} +8 -4
- data/lib/rubocop/cop/layout/{indent_heredoc.rb → heredoc_indentation.rb} +2 -2
- data/lib/rubocop/cop/layout/indentation_width.rb +19 -5
- data/lib/rubocop/cop/layout/{leading_blank_lines.rb → leading_empty_lines.rb} +1 -1
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +24 -2
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/{align_parameters.rb → parameter_alignment.rb} +1 -1
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +2 -0
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +5 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +12 -0
- data/lib/rubocop/cop/layout/space_around_operators.rb +43 -24
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -7
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +8 -5
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +7 -0
- data/lib/rubocop/cop/layout/space_inside_parens.rb +6 -6
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +24 -40
- data/lib/rubocop/cop/layout/{trailing_blank_lines.rb → trailing_empty_lines.rb} +1 -1
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +18 -2
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +17 -4
- data/lib/rubocop/cop/lint/debugger.rb +1 -3
- data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +1 -1
- data/lib/rubocop/cop/lint/{duplicated_key.rb → duplicate_hash_key.rb} +1 -1
- data/lib/rubocop/cop/lint/empty_interpolation.rb +4 -4
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +61 -4
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +10 -36
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -8
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +2 -2
- data/lib/rubocop/cop/lint/{multiple_compare.rb → multiple_comparison.rb} +1 -1
- data/lib/rubocop/cop/lint/number_conversion.rb +1 -1
- data/lib/rubocop/cop/lint/{unneeded_cop_disable_directive.rb → redundant_cop_disable_directive.rb} +24 -24
- data/lib/rubocop/cop/lint/{unneeded_cop_enable_directive.rb → redundant_cop_enable_directive.rb} +6 -8
- data/lib/rubocop/cop/lint/{unneeded_require_statement.rb → redundant_require_statement.rb} +1 -1
- data/lib/rubocop/cop/lint/{unneeded_splat_expansion.rb → redundant_splat_expansion.rb} +12 -7
- data/lib/rubocop/cop/lint/{string_conversion_in_interpolation.rb → redundant_string_coercion.rb} +7 -7
- data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_with_object.rb +2 -2
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +5 -6
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +91 -0
- data/lib/rubocop/cop/lint/{handle_exceptions.rb → suppressed_exception.rb} +1 -1
- data/lib/rubocop/cop/lint/unused_block_argument.rb +22 -6
- data/lib/rubocop/cop/lint/unused_method_argument.rb +23 -5
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +57 -23
- data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
- data/lib/rubocop/cop/lint/void.rb +7 -26
- data/lib/rubocop/cop/message_annotator.rb +16 -7
- data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
- data/lib/rubocop/cop/metrics/line_length.rb +48 -42
- data/lib/rubocop/cop/metrics/method_length.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +23 -6
- data/lib/rubocop/cop/migration/department_name.rb +44 -0
- data/lib/rubocop/cop/mixin/alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/documentation_comment.rb +0 -2
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/{hash_alignment.rb → hash_alignment_styles.rb} +1 -1
- data/lib/rubocop/cop/mixin/interpolation.rb +27 -0
- data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
- data/lib/rubocop/cop/mixin/nil_methods.rb +4 -4
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +87 -0
- data/lib/rubocop/cop/mixin/statement_modifier.rb +5 -2
- data/lib/rubocop/cop/mixin/surrounding_space.rb +7 -5
- data/lib/rubocop/cop/mixin/trailing_comma.rb +8 -6
- data/lib/rubocop/cop/naming/{uncommunicative_block_param_name.rb → block_parameter_name.rb} +3 -3
- data/lib/rubocop/cop/naming/file_name.rb +12 -5
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +5 -5
- data/lib/rubocop/cop/naming/method_name.rb +12 -1
- data/lib/rubocop/cop/naming/{uncommunicative_method_param_name.rb → method_parameter_name.rb} +3 -3
- data/lib/rubocop/cop/naming/predicate_name.rb +6 -6
- data/lib/rubocop/cop/naming/variable_name.rb +1 -0
- data/lib/rubocop/cop/offense.rb +18 -7
- data/lib/rubocop/cop/registry.rb +22 -1
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +1 -0
- data/lib/rubocop/cop/style/alias.rb +1 -1
- data/lib/rubocop/cop/style/array_join.rb +1 -1
- data/lib/rubocop/cop/style/attr.rb +2 -2
- data/lib/rubocop/cop/style/block_delimiters.rb +2 -1
- data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +35 -16
- data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
- data/lib/rubocop/cop/style/comment_annotation.rb +5 -5
- data/lib/rubocop/cop/style/commented_keyword.rb +16 -30
- data/lib/rubocop/cop/style/conditional_assignment.rb +5 -7
- data/lib/rubocop/cop/style/constant_visibility.rb +13 -2
- data/lib/rubocop/cop/style/copyright.rb +11 -7
- data/lib/rubocop/cop/style/documentation_method.rb +44 -0
- data/lib/rubocop/cop/style/double_cop_disable_directive.rb +10 -4
- data/lib/rubocop/cop/style/empty_case_condition.rb +2 -2
- data/lib/rubocop/cop/style/empty_literal.rb +2 -2
- data/lib/rubocop/cop/style/empty_method.rb +5 -5
- data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
- data/lib/rubocop/cop/style/even_odd.rb +1 -1
- data/lib/rubocop/cop/style/expand_path_arguments.rb +1 -1
- data/lib/rubocop/cop/style/format_string.rb +10 -7
- data/lib/rubocop/cop/style/format_string_token.rb +19 -68
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +28 -33
- data/lib/rubocop/cop/style/guard_clause.rb +39 -10
- data/lib/rubocop/cop/style/hash_syntax.rb +2 -2
- data/lib/rubocop/cop/style/if_unless_modifier.rb +58 -15
- data/lib/rubocop/cop/style/infinite_loop.rb +5 -4
- data/lib/rubocop/cop/style/inverse_methods.rb +19 -13
- data/lib/rubocop/cop/style/ip_addresses.rb +4 -4
- data/lib/rubocop/cop/style/lambda.rb +0 -2
- data/lib/rubocop/cop/style/line_end_concatenation.rb +14 -10
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +25 -25
- data/lib/rubocop/cop/style/method_def_parentheses.rb +17 -9
- data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
- data/lib/rubocop/cop/style/mixin_usage.rb +11 -1
- data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
- data/lib/rubocop/cop/style/multiline_when_then.rb +1 -1
- data/lib/rubocop/cop/style/nested_modifier.rb +22 -4
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +5 -5
- data/lib/rubocop/cop/style/next.rb +5 -5
- data/lib/rubocop/cop/style/non_nil_check.rb +21 -9
- data/lib/rubocop/cop/style/numeric_literals.rb +7 -3
- data/lib/rubocop/cop/style/option_hash.rb +3 -3
- data/lib/rubocop/cop/style/or_assignment.rb +6 -1
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +14 -0
- data/lib/rubocop/cop/style/{unneeded_capital_w.rb → redundant_capital_w.rb} +1 -1
- data/lib/rubocop/cop/style/{unneeded_condition.rb → redundant_condition.rb} +3 -3
- data/lib/rubocop/cop/style/{unneeded_interpolation.rb → redundant_interpolation.rb} +1 -1
- data/lib/rubocop/cop/style/redundant_parentheses.rb +16 -7
- data/lib/rubocop/cop/style/{unneeded_percent_q.rb → redundant_percent_q.rb} +1 -1
- data/lib/rubocop/cop/style/redundant_return.rb +39 -29
- data/lib/rubocop/cop/style/redundant_self.rb +18 -1
- data/lib/rubocop/cop/style/{unneeded_sort.rb → redundant_sort.rb} +5 -5
- data/lib/rubocop/cop/style/rescue_modifier.rb +24 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +23 -3
- data/lib/rubocop/cop/style/semicolon.rb +13 -2
- data/lib/rubocop/cop/style/single_line_methods.rb +8 -1
- data/lib/rubocop/cop/style/special_global_vars.rb +5 -7
- data/lib/rubocop/cop/style/ternary_parentheses.rb +19 -0
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +4 -6
- data/lib/rubocop/cop/style/trivial_accessors.rb +5 -5
- data/lib/rubocop/cop/style/variable_interpolation.rb +6 -16
- data/lib/rubocop/cop/team.rb +5 -0
- data/lib/rubocop/cop/util.rb +1 -1
- data/lib/rubocop/cop/utils/format_string.rb +120 -0
- data/lib/rubocop/cop/variable_force.rb +7 -5
- data/lib/rubocop/cop/variable_force/variable.rb +15 -2
- data/lib/rubocop/core_ext/string.rb +0 -24
- data/lib/rubocop/formatter/clang_style_formatter.rb +9 -6
- data/lib/rubocop/formatter/emacs_style_formatter.rb +22 -9
- data/lib/rubocop/formatter/file_list_formatter.rb +1 -1
- data/lib/rubocop/formatter/formatter_set.rb +16 -15
- data/lib/rubocop/formatter/pacman_formatter.rb +80 -0
- data/lib/rubocop/formatter/simple_text_formatter.rb +16 -4
- data/lib/rubocop/formatter/tap_formatter.rb +18 -7
- data/lib/rubocop/magic_comment.rb +4 -0
- data/lib/rubocop/node_pattern.rb +3 -1
- data/lib/rubocop/options.rb +17 -22
- data/lib/rubocop/path_util.rb +1 -1
- data/lib/rubocop/processed_source.rb +5 -1
- data/lib/rubocop/rake_task.rb +1 -0
- data/lib/rubocop/result_cache.rb +22 -8
- data/lib/rubocop/rspec/expect_offense.rb +4 -1
- data/lib/rubocop/runner.rb +55 -32
- data/lib/rubocop/target_finder.rb +12 -6
- data/lib/rubocop/version.rb +1 -1
- metadata +47 -32
- data/lib/rubocop/cop/mixin/ignored_method_patterns.rb +0 -19
- data/lib/rubocop/cop/mixin/safe_mode.rb +0 -22
@@ -5,7 +5,7 @@ module RuboCop
|
|
5
5
|
module Naming
|
6
6
|
# This cop checks that your heredocs are using meaningful delimiters.
|
7
7
|
# By default it disallows `END` and `EO*`, and can be configured through
|
8
|
-
#
|
8
|
+
# forbidden listing additional delimiters.
|
9
9
|
#
|
10
10
|
# @example
|
11
11
|
#
|
@@ -41,13 +41,13 @@ module RuboCop
|
|
41
41
|
|
42
42
|
return false unless delimiters =~ /\w/
|
43
43
|
|
44
|
-
|
45
|
-
delimiters =~ Regexp.new(
|
44
|
+
forbidden_delimiters.none? do |forbidden_delimiter|
|
45
|
+
delimiters =~ Regexp.new(forbidden_delimiter)
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
|
-
def
|
50
|
-
cop_config['
|
49
|
+
def forbidden_delimiters
|
50
|
+
cop_config['ForbiddenDelimiters'] || []
|
51
51
|
end
|
52
52
|
end
|
53
53
|
end
|
@@ -6,6 +6,15 @@ module RuboCop
|
|
6
6
|
# This cop makes sure that all methods use the configured style,
|
7
7
|
# snake_case or camelCase, for their names.
|
8
8
|
#
|
9
|
+
# This cop has `IgnoredPatterns` configuration option.
|
10
|
+
#
|
11
|
+
# Naming/MethodName:
|
12
|
+
# IgnoredPatterns:
|
13
|
+
# - '\A\s*onSelectionBulkChange\s*'
|
14
|
+
# - '\A\s*onSelectionCleared\s*'
|
15
|
+
#
|
16
|
+
# Method names matching patterns are always allowed.
|
17
|
+
#
|
9
18
|
# @example EnforcedStyle: snake_case (default)
|
10
19
|
# # bad
|
11
20
|
# def fooBar; end
|
@@ -21,11 +30,13 @@ module RuboCop
|
|
21
30
|
# def fooBar; end
|
22
31
|
class MethodName < Cop
|
23
32
|
include ConfigurableNaming
|
33
|
+
include IgnoredPattern
|
24
34
|
|
25
35
|
MSG = 'Use %<style>s for method names.'
|
26
36
|
|
27
37
|
def on_def(node)
|
28
|
-
return if node.operator_method?
|
38
|
+
return if node.operator_method? ||
|
39
|
+
matches_ignored_pattern?(node.method_name)
|
29
40
|
|
30
41
|
check_name(node, node.method_name, node.loc.name)
|
31
42
|
end
|
data/lib/rubocop/cop/naming/{uncommunicative_method_param_name.rb → method_parameter_name.rb}
RENAMED
@@ -11,9 +11,9 @@ module RuboCop
|
|
11
11
|
# The `AllowNamesEndingInNumbers` config option takes a boolean. When
|
12
12
|
# set to false, this cop will register offenses for names ending with
|
13
13
|
# numbers. Its default is false. The `AllowedNames` config option
|
14
|
-
# takes an array of
|
14
|
+
# takes an array of permitted names that will never register an
|
15
15
|
# offense. The `ForbiddenNames` config option takes an array of
|
16
|
-
#
|
16
|
+
# restricted names that will always register an offense.
|
17
17
|
#
|
18
18
|
# @example
|
19
19
|
# # bad
|
@@ -43,7 +43,7 @@ module RuboCop
|
|
43
43
|
# def baz(age_a, height_b, gender_c)
|
44
44
|
# do_stuff(age_a, height_b, gender_c)
|
45
45
|
# end
|
46
|
-
class
|
46
|
+
class MethodParameterName < Cop
|
47
47
|
include UncommunicativeName
|
48
48
|
|
49
49
|
def on_def(node)
|
@@ -70,11 +70,11 @@ module RuboCop
|
|
70
70
|
!method_name.match(/^#{prefix}[^0-9]/) ||
|
71
71
|
method_name == expected_name(method_name, prefix) ||
|
72
72
|
method_name.end_with?('=') ||
|
73
|
-
|
73
|
+
allowed_methods.include?(method_name)
|
74
74
|
end
|
75
75
|
|
76
76
|
def expected_name(method_name, prefix)
|
77
|
-
new_name = if
|
77
|
+
new_name = if forbidden_prefixes.include?(prefix)
|
78
78
|
method_name.sub(prefix, '')
|
79
79
|
else
|
80
80
|
method_name.dup
|
@@ -87,16 +87,16 @@ module RuboCop
|
|
87
87
|
"Rename `#{method_name}` to `#{new_name}`."
|
88
88
|
end
|
89
89
|
|
90
|
-
def
|
91
|
-
cop_config['
|
90
|
+
def forbidden_prefixes
|
91
|
+
cop_config['ForbiddenPrefixes']
|
92
92
|
end
|
93
93
|
|
94
94
|
def predicate_prefixes
|
95
95
|
cop_config['NamePrefix']
|
96
96
|
end
|
97
97
|
|
98
|
-
def
|
99
|
-
cop_config['
|
98
|
+
def allowed_methods
|
99
|
+
cop_config['AllowedMethods']
|
100
100
|
end
|
101
101
|
|
102
102
|
def method_definition_macros(macro_name)
|
data/lib/rubocop/cop/offense.rb
CHANGED
@@ -67,23 +67,34 @@ module RuboCop
|
|
67
67
|
|
68
68
|
# @api public
|
69
69
|
#
|
70
|
-
# @!attribute [r] corrected
|
70
|
+
# @!attribute [r] corrected?
|
71
71
|
#
|
72
72
|
# @return [Boolean]
|
73
|
-
# whether this offense is automatically corrected
|
74
|
-
|
75
|
-
|
73
|
+
# whether this offense is automatically corrected via
|
74
|
+
# autocorrect or a todo.
|
75
|
+
def corrected?
|
76
|
+
@status == :corrected || @status == :corrected_with_todo
|
77
|
+
end
|
78
|
+
|
79
|
+
# @api public
|
80
|
+
#
|
81
|
+
# @!attribute [r] corrected_with_todo?
|
82
|
+
#
|
83
|
+
# @return [Boolean]
|
84
|
+
# whether this offense is automatically disabled via a todo.
|
85
|
+
def corrected_with_todo?
|
86
|
+
@status == :corrected_with_todo
|
76
87
|
end
|
77
|
-
alias corrected? corrected
|
78
88
|
|
79
89
|
# @api public
|
80
90
|
#
|
81
91
|
# @!attribute [r] disabled?
|
82
92
|
#
|
83
93
|
# @return [Boolean]
|
84
|
-
# whether this offense was locally disabled
|
94
|
+
# whether this offense was locally disabled with a
|
95
|
+
# disable or todo where it occurred.
|
85
96
|
def disabled?
|
86
|
-
@status == :disabled
|
97
|
+
@status == :disabled || @status == :todo
|
87
98
|
end
|
88
99
|
|
89
100
|
# @api public
|
data/lib/rubocop/cop/registry.rb
CHANGED
@@ -91,8 +91,11 @@ module RuboCop
|
|
91
91
|
# @note Emits a warning if the provided name has an incorrect namespace
|
92
92
|
#
|
93
93
|
# @return [String] Qualified cop name
|
94
|
-
def qualified_cop_name(name, path)
|
94
|
+
def qualified_cop_name(name, path, shall_warn = true)
|
95
95
|
badge = Badge.parse(name)
|
96
|
+
if shall_warn && department_missing?(badge, name)
|
97
|
+
print_warning(name, path)
|
98
|
+
end
|
96
99
|
return name if registered?(badge)
|
97
100
|
|
98
101
|
potential_badges = qualify_badge(badge)
|
@@ -104,6 +107,24 @@ module RuboCop
|
|
104
107
|
end
|
105
108
|
end
|
106
109
|
|
110
|
+
def department_missing?(badge, name)
|
111
|
+
!badge.qualified? && unqualified_cop_names.include?(name)
|
112
|
+
end
|
113
|
+
|
114
|
+
def print_warning(name, path)
|
115
|
+
message = "#{path}: Warning: no department given for #{name}."
|
116
|
+
if path.end_with?('.rb')
|
117
|
+
message += ' Run `rubocop -a --only Migration/DepartmentName` to fix.'
|
118
|
+
end
|
119
|
+
warn message
|
120
|
+
end
|
121
|
+
|
122
|
+
def unqualified_cop_names
|
123
|
+
@unqualified_cop_names ||=
|
124
|
+
Set.new(@cops_by_cop_name.keys.map { |qn| File.basename(qn) }) <<
|
125
|
+
'RedundantCopDisableDirective'
|
126
|
+
end
|
127
|
+
|
107
128
|
# @return [Hash{String => Array<Class>}]
|
108
129
|
def to_h
|
109
130
|
@cops_by_cop_name
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
# This cop checks for uses of "
|
6
|
+
# This cop checks for uses of "\*" as a substitute for *join*.
|
7
7
|
#
|
8
8
|
# Not all cases can reliably checked, due to Ruby's dynamic
|
9
9
|
# types, so we consider only cases when the first argument is an
|
@@ -31,7 +31,7 @@ module RuboCop
|
|
31
31
|
node_expr = node.source_range
|
32
32
|
attr_expr = attr_name.source_range
|
33
33
|
|
34
|
-
if setter
|
34
|
+
if setter&.boolean_type?
|
35
35
|
remove = range_between(attr_expr.end_pos, node_expr.end_pos)
|
36
36
|
end
|
37
37
|
|
@@ -50,7 +50,7 @@ module RuboCop
|
|
50
50
|
def replacement_method(node)
|
51
51
|
setter = node.last_argument
|
52
52
|
|
53
|
-
if setter
|
53
|
+
if setter&.boolean_type?
|
54
54
|
setter.true_type? ? 'attr_accessor' : 'attr_reader'
|
55
55
|
else
|
56
56
|
'attr_reader'
|
@@ -114,7 +114,8 @@ module RuboCop
|
|
114
114
|
|
115
115
|
def on_send(node)
|
116
116
|
return unless node.arguments?
|
117
|
-
return if node.parenthesized?
|
117
|
+
return if node.parenthesized?
|
118
|
+
return if node.operator_method? || node.assignment_method?
|
118
119
|
|
119
120
|
node.arguments.each do |arg|
|
120
121
|
get_blocks(arg) do |block|
|
@@ -55,10 +55,6 @@ module RuboCop
|
|
55
55
|
end
|
56
56
|
alias on_csend on_send
|
57
57
|
|
58
|
-
# We let AutocorrectUnlessChangingAST#autocorrect work with the send
|
59
|
-
# node, because that context is needed. When parsing the code to see if
|
60
|
-
# the AST has changed, a braceless hash would not be parsed as a hash
|
61
|
-
# otherwise.
|
62
58
|
def autocorrect(send_node)
|
63
59
|
hash_node = send_node.last_argument
|
64
60
|
|
@@ -76,20 +72,32 @@ module RuboCop
|
|
76
72
|
private
|
77
73
|
|
78
74
|
def check(arg, args)
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
75
|
+
case style
|
76
|
+
when :braces
|
77
|
+
check_braces(arg)
|
78
|
+
when :no_braces
|
79
|
+
check_no_braces(arg)
|
80
|
+
when :context_dependent
|
84
81
|
check_context_dependent(arg, args)
|
85
82
|
end
|
86
83
|
end
|
87
84
|
|
85
|
+
def check_braces(arg)
|
86
|
+
add_arg_offense(arg, :missing) unless arg.braces?
|
87
|
+
end
|
88
|
+
|
89
|
+
def check_no_braces(arg)
|
90
|
+
return unless arg.braces? && !braces_needed_for_semantics?(arg)
|
91
|
+
|
92
|
+
add_arg_offense(arg, :redundant)
|
93
|
+
end
|
94
|
+
|
88
95
|
def check_context_dependent(arg, args)
|
89
96
|
braces_around_second_from_end = args.size > 1 && args[-2].hash_type?
|
90
97
|
|
91
98
|
if arg.braces?
|
92
|
-
unless braces_around_second_from_end
|
99
|
+
unless braces_around_second_from_end ||
|
100
|
+
braces_needed_for_semantics?(arg)
|
93
101
|
add_arg_offense(arg, :redundant)
|
94
102
|
end
|
95
103
|
elsif braces_around_second_from_end
|
@@ -97,6 +105,17 @@ module RuboCop
|
|
97
105
|
end
|
98
106
|
end
|
99
107
|
|
108
|
+
# Returns true if there's block inside the braces of the given hash arg
|
109
|
+
# and that block uses do..end. The reason for wanting to check this is
|
110
|
+
# that the do..end could bind to a different method invocation if the
|
111
|
+
# hash braces were removed.
|
112
|
+
def braces_needed_for_semantics?(arg)
|
113
|
+
arg.each_pair do |_key, value|
|
114
|
+
return true if value.block_type? && !value.braces?
|
115
|
+
end
|
116
|
+
false
|
117
|
+
end
|
118
|
+
|
100
119
|
def add_arg_offense(arg, type)
|
101
120
|
add_offense(arg.parent, location: arg.source_range,
|
102
121
|
message: format(MSG,
|
@@ -128,16 +147,16 @@ module RuboCop
|
|
128
147
|
end
|
129
148
|
|
130
149
|
def remove_braces_with_whitespace(corrector, node, space)
|
150
|
+
loc = node.loc
|
151
|
+
|
131
152
|
if node.multiline?
|
132
153
|
remove_braces_with_range(corrector,
|
133
|
-
left_whole_line_range(
|
134
|
-
right_whole_line_range(
|
154
|
+
left_whole_line_range(loc.begin),
|
155
|
+
right_whole_line_range(loc.end))
|
135
156
|
else
|
136
|
-
right_brace_and_space = right_brace_and_space(node.loc.end, space)
|
137
|
-
left_brace_and_space = left_brace_and_space(node.loc.begin, space)
|
138
157
|
remove_braces_with_range(corrector,
|
139
|
-
left_brace_and_space,
|
140
|
-
right_brace_and_space)
|
158
|
+
left_brace_and_space(loc.begin, space),
|
159
|
+
right_brace_and_space(loc.end, space))
|
141
160
|
end
|
142
161
|
end
|
143
162
|
|
@@ -49,10 +49,10 @@ module RuboCop
|
|
49
49
|
next unless annotation?(comment) &&
|
50
50
|
!correct_annotation?(first_word, colon, space, note)
|
51
51
|
|
52
|
-
length = concat_length(first_word, colon, space)
|
53
52
|
add_offense(
|
54
53
|
comment,
|
55
|
-
location: annotation_range(comment, margin,
|
54
|
+
location: annotation_range(comment, margin,
|
55
|
+
first_word, colon, space),
|
56
56
|
message: format(note ? MSG : MISSING_NOTE, keyword: first_word)
|
57
57
|
)
|
58
58
|
end
|
@@ -62,8 +62,7 @@ module RuboCop
|
|
62
62
|
margin, first_word, colon, space, note = split_comment(comment)
|
63
63
|
return if note.nil?
|
64
64
|
|
65
|
-
|
66
|
-
range = annotation_range(comment, margin, length)
|
65
|
+
range = annotation_range(comment, margin, first_word, colon, space)
|
67
66
|
|
68
67
|
->(corrector) { corrector.replace(range, "#{first_word.upcase}: ") }
|
69
68
|
end
|
@@ -79,8 +78,9 @@ module RuboCop
|
|
79
78
|
!comment_line?(comment.loc.expression.source_line)
|
80
79
|
end
|
81
80
|
|
82
|
-
def annotation_range(comment, margin,
|
81
|
+
def annotation_range(comment, margin, first_word, colon, space)
|
83
82
|
start = comment.loc.expression.begin_pos + margin.length
|
83
|
+
length = concat_length(first_word, colon, space)
|
84
84
|
range_between(start, start + length)
|
85
85
|
end
|
86
86
|
|
@@ -6,7 +6,8 @@ module RuboCop
|
|
6
6
|
# This cop checks for comments put on the same line as some keywords.
|
7
7
|
# These keywords are: `begin`, `class`, `def`, `end`, `module`.
|
8
8
|
#
|
9
|
-
# Note that some comments
|
9
|
+
# Note that some comments
|
10
|
+
# (`:nodoc:`, `:yields:`, `rubocop:disable` and `rubocop:todo`)
|
10
11
|
# are allowed.
|
11
12
|
#
|
12
13
|
# @example
|
@@ -33,53 +34,38 @@ module RuboCop
|
|
33
34
|
# y
|
34
35
|
# end
|
35
36
|
class CommentedKeyword < Cop
|
36
|
-
include RangeHelp
|
37
|
-
|
38
37
|
MSG = 'Do not place comments on the same line as the ' \
|
39
38
|
'`%<keyword>s` keyword.'
|
40
39
|
|
41
40
|
def investigate(processed_source)
|
42
|
-
heredoc_lines = extract_heredoc_lines(processed_source.ast)
|
43
|
-
|
44
41
|
processed_source.each_comment do |comment|
|
45
|
-
|
46
|
-
line_position = location.line
|
47
|
-
line = processed_source.lines[line_position - 1]
|
48
|
-
next if heredoc_lines.any? { |r| r.include?(line_position) }
|
49
|
-
next unless offensive?(line)
|
50
|
-
|
51
|
-
range = source_range(processed_source.buffer,
|
52
|
-
line_position,
|
53
|
-
(location.column)...(location.last_column))
|
54
|
-
|
55
|
-
add_offense(range, location: range)
|
42
|
+
add_offense(comment) if offensive?(comment)
|
56
43
|
end
|
57
44
|
end
|
58
45
|
|
59
46
|
private
|
60
47
|
|
61
48
|
KEYWORDS = %w[begin class def end module].freeze
|
62
|
-
ALLOWED_COMMENTS = %w[
|
49
|
+
ALLOWED_COMMENTS = %w[
|
50
|
+
:nodoc:
|
51
|
+
:yields:
|
52
|
+
rubocop:disable
|
53
|
+
rubocop:todo
|
54
|
+
].freeze
|
63
55
|
|
64
|
-
def offensive?(
|
65
|
-
line = line
|
66
|
-
KEYWORDS.any? { |word| line =~
|
56
|
+
def offensive?(comment)
|
57
|
+
line = line(comment)
|
58
|
+
KEYWORDS.any? { |word| line =~ /^\s*#{word}\s/ } &&
|
67
59
|
ALLOWED_COMMENTS.none? { |c| line =~ /#\s*#{c}/ }
|
68
60
|
end
|
69
61
|
|
70
|
-
def message(
|
71
|
-
|
72
|
-
keyword = /^\s*(\S+).*#/.match(line)[1]
|
62
|
+
def message(comment)
|
63
|
+
keyword = line(comment).match(/(\S+).*#/)[1]
|
73
64
|
format(MSG, keyword: keyword)
|
74
65
|
end
|
75
66
|
|
76
|
-
def
|
77
|
-
|
78
|
-
|
79
|
-
ast.each_node(:str, :dstr, :xstr).select(&:heredoc?).map do |node|
|
80
|
-
body = node.location.heredoc_body
|
81
|
-
(body.first_line...body.last_line)
|
82
|
-
end
|
67
|
+
def line(comment)
|
68
|
+
comment.location.expression.source_line
|
83
69
|
end
|
84
70
|
end
|
85
71
|
end
|