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
@@ -16,19 +16,15 @@ module RuboCop
|
|
16
16
|
# /check #{$pattern}/
|
17
17
|
# "Let's go to the #{@store}"
|
18
18
|
class VariableInterpolation < Cop
|
19
|
+
include Interpolation
|
20
|
+
|
19
21
|
MSG = 'Replace interpolated variable `%<variable>s` ' \
|
20
22
|
'with expression `#{%<variable>s}`.'
|
21
23
|
|
22
|
-
def
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
def on_regexp(node)
|
27
|
-
check_for_interpolation(node)
|
28
|
-
end
|
29
|
-
|
30
|
-
def on_xstr(node)
|
31
|
-
check_for_interpolation(node)
|
24
|
+
def on_node_with_interpolations(node)
|
25
|
+
var_nodes(node.children).each do |var_node|
|
26
|
+
add_offense(var_node)
|
27
|
+
end
|
32
28
|
end
|
33
29
|
|
34
30
|
def autocorrect(node)
|
@@ -39,12 +35,6 @@ module RuboCop
|
|
39
35
|
|
40
36
|
private
|
41
37
|
|
42
|
-
def check_for_interpolation(node)
|
43
|
-
var_nodes(node.children).each do |var_node|
|
44
|
-
add_offense(var_node)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
38
|
def message(node)
|
49
39
|
format(MSG, variable: node.source)
|
50
40
|
end
|
data/lib/rubocop/cop/team.rb
CHANGED
data/lib/rubocop/cop/util.rb
CHANGED
@@ -9,7 +9,7 @@ module RuboCop
|
|
9
9
|
# Match literal regex characters, not including anchors, character
|
10
10
|
# classes, alternatives, groups, repetitions, references, etc
|
11
11
|
LITERAL_REGEX =
|
12
|
-
|
12
|
+
%r{[\w\s\-,"'!#%&<>=;:`~/]|\\[^AbBdDgGhHkpPRwWXsSzZ0-9]}.freeze
|
13
13
|
|
14
14
|
module_function
|
15
15
|
|
@@ -0,0 +1,120 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Utils
|
6
|
+
# Parses {Kernel#sprintf} format strings.
|
7
|
+
class FormatString
|
8
|
+
DIGIT_DOLLAR = /(\d+)\$/.freeze
|
9
|
+
FLAG = /[ #0+-]|#{DIGIT_DOLLAR}/.freeze
|
10
|
+
NUMBER_ARG = /\*#{DIGIT_DOLLAR}?/.freeze
|
11
|
+
NUMBER = /\d+|#{NUMBER_ARG}/.freeze
|
12
|
+
WIDTH = /(?<width>#{NUMBER})/.freeze
|
13
|
+
PRECISION = /\.(?<precision>#{NUMBER})/.freeze
|
14
|
+
TYPE = /(?<type>[bBdiouxXeEfgGaAcps])/.freeze
|
15
|
+
NAME = /<(?<name>\w+)>/.freeze
|
16
|
+
TEMPLATE_NAME = /\{(?<name>\w+)\}/.freeze
|
17
|
+
|
18
|
+
SEQUENCE = /
|
19
|
+
% (?<type>%)
|
20
|
+
| % (?<flags>#{FLAG}*)
|
21
|
+
(?:
|
22
|
+
(?: #{WIDTH}? #{PRECISION}? #{NAME}?
|
23
|
+
| #{WIDTH}? #{NAME} #{PRECISION}?
|
24
|
+
| #{NAME} (?<more_flags>#{FLAG}*) #{WIDTH}? #{PRECISION}?
|
25
|
+
) #{TYPE}
|
26
|
+
| #{WIDTH}? #{PRECISION}? #{TEMPLATE_NAME}
|
27
|
+
)
|
28
|
+
/x.freeze
|
29
|
+
|
30
|
+
# The syntax of a format sequence is as follows.
|
31
|
+
#
|
32
|
+
# ```
|
33
|
+
# %[flags][width][.precision]type
|
34
|
+
# ```
|
35
|
+
#
|
36
|
+
# A format sequence consists of a percent sign, followed by optional
|
37
|
+
# flags, width, and precision indicators, then terminated with a field
|
38
|
+
# type character.
|
39
|
+
#
|
40
|
+
# For more complex formatting, Ruby supports a reference by name.
|
41
|
+
#
|
42
|
+
# @see https://ruby-doc.org/core-2.6.3/Kernel.html#method-i-format
|
43
|
+
class FormatSequence
|
44
|
+
attr_reader :begin_pos, :end_pos
|
45
|
+
attr_reader :flags, :width, :precision, :name, :type
|
46
|
+
|
47
|
+
def initialize(match)
|
48
|
+
@source = match[0]
|
49
|
+
@begin_pos = match.begin(0)
|
50
|
+
@end_pos = match.end(0)
|
51
|
+
@flags = match[:flags].to_s + match[:more_flags].to_s
|
52
|
+
@width = match[:width]
|
53
|
+
@precision = match[:precision]
|
54
|
+
@name = match[:name]
|
55
|
+
@type = match[:type]
|
56
|
+
end
|
57
|
+
|
58
|
+
def percent?
|
59
|
+
type == '%'
|
60
|
+
end
|
61
|
+
|
62
|
+
def annotated?
|
63
|
+
name && @source.include?('<')
|
64
|
+
end
|
65
|
+
|
66
|
+
def template?
|
67
|
+
name && @source.include?('{')
|
68
|
+
end
|
69
|
+
|
70
|
+
# Number of arguments required for the format sequence
|
71
|
+
def arity
|
72
|
+
@source.scan('*').count + 1
|
73
|
+
end
|
74
|
+
|
75
|
+
def max_digit_dollar_num
|
76
|
+
@source.scan(DIGIT_DOLLAR).map do |(digit_dollar_num)|
|
77
|
+
digit_dollar_num.to_i
|
78
|
+
end.max
|
79
|
+
end
|
80
|
+
|
81
|
+
def style
|
82
|
+
if annotated?
|
83
|
+
:annotated
|
84
|
+
elsif template?
|
85
|
+
:template
|
86
|
+
else
|
87
|
+
:unannotated
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def initialize(string)
|
93
|
+
@source = string
|
94
|
+
end
|
95
|
+
|
96
|
+
def format_sequences
|
97
|
+
@format_sequences ||= parse
|
98
|
+
end
|
99
|
+
|
100
|
+
def named_interpolation?
|
101
|
+
format_sequences.any?(&:name)
|
102
|
+
end
|
103
|
+
|
104
|
+
def max_digit_dollar_num
|
105
|
+
format_sequences.map(&:max_digit_dollar_num).max
|
106
|
+
end
|
107
|
+
|
108
|
+
private
|
109
|
+
|
110
|
+
def parse
|
111
|
+
@source.to_enum(:scan, SEQUENCE).map do
|
112
|
+
FormatSequence.new(
|
113
|
+
Regexp.last_match
|
114
|
+
)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
@@ -284,11 +284,7 @@ module RuboCop
|
|
284
284
|
def process_scope(node)
|
285
285
|
if TWISTED_SCOPE_TYPES.include?(node.type)
|
286
286
|
# See the comment at the end of file for this behavior.
|
287
|
-
twisted_nodes
|
288
|
-
twisted_nodes << node.children[1] if node.class_type?
|
289
|
-
twisted_nodes.compact!
|
290
|
-
|
291
|
-
twisted_nodes.each do |twisted_node|
|
287
|
+
twisted_nodes(node).each do |twisted_node|
|
292
288
|
process_node(twisted_node)
|
293
289
|
scanned_nodes << twisted_node
|
294
290
|
end
|
@@ -298,6 +294,12 @@ module RuboCop
|
|
298
294
|
skip_children!
|
299
295
|
end
|
300
296
|
|
297
|
+
def twisted_nodes(node)
|
298
|
+
twisted_nodes = [node.children[0]]
|
299
|
+
twisted_nodes << node.children[1] if node.class_type?
|
300
|
+
twisted_nodes.compact
|
301
|
+
end
|
302
|
+
|
301
303
|
def process_send(node)
|
302
304
|
_receiver, method_name, args = *node
|
303
305
|
return unless method_name == :binding
|
@@ -37,7 +37,7 @@ module RuboCop
|
|
37
37
|
!@references.empty?
|
38
38
|
end
|
39
39
|
|
40
|
-
# rubocop:disable Metrics/AbcSize
|
40
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
41
41
|
def reference!(node)
|
42
42
|
reference = Reference.new(node, @scope)
|
43
43
|
@references << reference
|
@@ -50,6 +50,13 @@ module RuboCop
|
|
50
50
|
assignment.reference!(node)
|
51
51
|
end
|
52
52
|
|
53
|
+
# Modifier if/unless conditions are special. Assignments made in
|
54
|
+
# them do not put the assigned variable in scope to the left of the
|
55
|
+
# if/unless keyword. A preceding assignment is needed to put the
|
56
|
+
# variable in scope. For this reason we skip to the next assignment
|
57
|
+
# here.
|
58
|
+
next if in_modifier_if?(assignment)
|
59
|
+
|
53
60
|
break if !assignment.branch || assignment.branch == reference.branch
|
54
61
|
|
55
62
|
unless assignment.branch.may_run_incompletely?
|
@@ -57,7 +64,13 @@ module RuboCop
|
|
57
64
|
end
|
58
65
|
end
|
59
66
|
end
|
60
|
-
# rubocop:enable Metrics/AbcSize
|
67
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
68
|
+
|
69
|
+
def in_modifier_if?(assignment)
|
70
|
+
parent = assignment.node.parent
|
71
|
+
parent = parent.parent if parent&.begin_type?
|
72
|
+
parent&.if_type? && parent&.modifier_form?
|
73
|
+
end
|
61
74
|
|
62
75
|
def capture_with_block!
|
63
76
|
@captured_by_block = true
|
@@ -20,28 +20,4 @@ class String
|
|
20
20
|
empty? || strip.empty?
|
21
21
|
end
|
22
22
|
end
|
23
|
-
|
24
|
-
unless method_defined? :strip_indent
|
25
|
-
# The method strips the whitespace preceding the base indentation.
|
26
|
-
# Useful for HEREDOCs and other multi-line strings.
|
27
|
-
#
|
28
|
-
# @example
|
29
|
-
#
|
30
|
-
# code = <<~END
|
31
|
-
# def test
|
32
|
-
# some_method
|
33
|
-
# other_method
|
34
|
-
# end
|
35
|
-
# END
|
36
|
-
#
|
37
|
-
# #=> "def\n some_method\n \nother_method\nend"
|
38
|
-
#
|
39
|
-
# @todo Replace call sites with squiggly heredocs when required Ruby
|
40
|
-
# version is >= 2.3.0
|
41
|
-
def strip_indent
|
42
|
-
leading_space = scan(/^[ \t]*(?=\S)/).min
|
43
|
-
indent = leading_space ? leading_space.size : 0
|
44
|
-
gsub(/^[ \t]{#{indent}}/, '')
|
45
|
-
end
|
46
|
-
end
|
47
23
|
end
|
@@ -15,20 +15,23 @@ module RuboCop
|
|
15
15
|
private
|
16
16
|
|
17
17
|
def report_offense(file, offense)
|
18
|
-
output.printf(
|
19
|
-
|
20
|
-
|
18
|
+
output.printf(
|
19
|
+
"%<path>s:%<line>d:%<column>d: %<severity>s: %<message>s\n",
|
20
|
+
path: cyan(smart_path(file)),
|
21
|
+
line: offense.line,
|
22
|
+
column: offense.real_column,
|
23
|
+
severity: colored_severity_code(offense),
|
24
|
+
message: message(offense)
|
25
|
+
)
|
21
26
|
|
22
|
-
# rubocop:disable Lint/HandleExceptions
|
23
27
|
begin
|
24
28
|
return unless valid_line?(offense)
|
25
29
|
|
26
30
|
report_line(offense.location)
|
27
31
|
report_highlighted_area(offense.highlighted_area)
|
28
|
-
rescue IndexError
|
32
|
+
rescue IndexError # rubocop:disable Lint/SuppressedException
|
29
33
|
# range is not on a valid line; perhaps the source file is empty
|
30
34
|
end
|
31
|
-
# rubocop:enable Lint/HandleExceptions
|
32
35
|
end
|
33
36
|
|
34
37
|
def valid_line?(offense)
|
@@ -8,17 +8,30 @@ module RuboCop
|
|
8
8
|
class EmacsStyleFormatter < BaseFormatter
|
9
9
|
def file_finished(file, offenses)
|
10
10
|
offenses.each do |o|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
message.tr("\n", ' '))
|
11
|
+
output.printf(
|
12
|
+
"%<path>s:%<line>d:%<column>d: %<severity>s: %<message>s\n",
|
13
|
+
path: file,
|
14
|
+
line: o.line,
|
15
|
+
column: o.real_column,
|
16
|
+
severity: o.severity.code,
|
17
|
+
message: message(o)
|
18
|
+
)
|
20
19
|
end
|
21
20
|
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def message(offense)
|
25
|
+
message =
|
26
|
+
if offense.corrected_with_todo?
|
27
|
+
"[Todo] #{offense.message}"
|
28
|
+
elsif offense.corrected?
|
29
|
+
"[Corrected] #{offense.message}"
|
30
|
+
else
|
31
|
+
offense.message
|
32
|
+
end
|
33
|
+
message.tr("\n", ' ')
|
34
|
+
end
|
22
35
|
end
|
23
36
|
end
|
24
37
|
end
|
@@ -9,20 +9,21 @@ module RuboCop
|
|
9
9
|
# which invoke same method of each formatters.
|
10
10
|
class FormatterSet < Array
|
11
11
|
BUILTIN_FORMATTERS_FOR_KEYS = {
|
12
|
-
'
|
13
|
-
'
|
14
|
-
'
|
15
|
-
'
|
16
|
-
'
|
17
|
-
'
|
18
|
-
'
|
19
|
-
'
|
20
|
-
'
|
21
|
-
'
|
22
|
-
'
|
23
|
-
'
|
24
|
-
'
|
25
|
-
'
|
12
|
+
'[a]utogenconf' => AutoGenConfigFormatter,
|
13
|
+
'[c]lang' => ClangStyleFormatter,
|
14
|
+
'[d]isabled' => DisabledLinesFormatter,
|
15
|
+
'[e]macs' => EmacsStyleFormatter,
|
16
|
+
'[fi]les' => FileListFormatter,
|
17
|
+
'[fu]ubar' => FuubarStyleFormatter,
|
18
|
+
'[h]tml' => HTMLFormatter,
|
19
|
+
'[j]son' => JSONFormatter,
|
20
|
+
'[o]ffenses' => OffenseCountFormatter,
|
21
|
+
'[pa]cman' => PacmanFormatter,
|
22
|
+
'[p]rogress' => ProgressFormatter,
|
23
|
+
'[q]uiet' => QuietFormatter,
|
24
|
+
'[s]imple' => SimpleTextFormatter,
|
25
|
+
'[t]ap' => TapFormatter,
|
26
|
+
'[w]orst' => WorstOffendersFormatter
|
26
27
|
}.freeze
|
27
28
|
|
28
29
|
FORMATTER_APIS = %i[started finished].freeze
|
@@ -81,7 +82,7 @@ module RuboCop
|
|
81
82
|
|
82
83
|
def builtin_formatter_class(specified_key)
|
83
84
|
matching_keys = BUILTIN_FORMATTERS_FOR_KEYS.keys.select do |key|
|
84
|
-
key.
|
85
|
+
key =~ /^\[#{specified_key}\]/ || specified_key == key.delete('[]')
|
85
86
|
end
|
86
87
|
|
87
88
|
raise %(No formatter for "#{specified_key}") if matching_keys.empty?
|
@@ -0,0 +1,80 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Formatter
|
5
|
+
# This formatter prints a PACDOT per every file to be analyzed.
|
6
|
+
# Pacman will "eat" one PACDOT per file when no offense is detected.
|
7
|
+
# Otherwise it will print a Ghost.
|
8
|
+
# This is inspired by the Pacman formatter for RSpec by Carlos Rojas.
|
9
|
+
# https://github.com/go-labs/rspec_pacman_formatter
|
10
|
+
class PacmanFormatter < ClangStyleFormatter
|
11
|
+
include TextUtil
|
12
|
+
attr_accessor :progress_line
|
13
|
+
|
14
|
+
FALLBACK_TERMINAL_WIDTH = 80
|
15
|
+
GHOST = 'ᗣ'
|
16
|
+
PACMAN = Rainbow('ᗧ').yellow.bright
|
17
|
+
PACDOT = Rainbow('•').yellow.bright
|
18
|
+
|
19
|
+
def initialize(output, options = {})
|
20
|
+
super
|
21
|
+
@progress_line = ''
|
22
|
+
@total_files = 0
|
23
|
+
@repetitions = 0
|
24
|
+
end
|
25
|
+
|
26
|
+
def started(target_files)
|
27
|
+
super
|
28
|
+
@total_files = target_files.size
|
29
|
+
output.puts "Eating #{pluralize(target_files.size, 'file')}"
|
30
|
+
update_progress_line
|
31
|
+
end
|
32
|
+
|
33
|
+
def file_started(_file, _options)
|
34
|
+
step(PACMAN)
|
35
|
+
end
|
36
|
+
|
37
|
+
def file_finished(file, offenses)
|
38
|
+
count_stats(offenses) unless offenses.empty?
|
39
|
+
next_step(offenses)
|
40
|
+
report_file(file, offenses)
|
41
|
+
end
|
42
|
+
|
43
|
+
def next_step(offenses)
|
44
|
+
return step('.') if offenses.empty?
|
45
|
+
|
46
|
+
ghost_color = COLOR_FOR_SEVERITY[offenses.last.severity.name]
|
47
|
+
step(colorize(GHOST, ghost_color))
|
48
|
+
end
|
49
|
+
|
50
|
+
def cols
|
51
|
+
@cols ||= begin
|
52
|
+
_height, width = $stdout.winsize
|
53
|
+
width.nil? || width.zero? ? FALLBACK_TERMINAL_WIDTH : width
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def update_progress_line
|
58
|
+
return pacdots(@total_files) unless @total_files > cols
|
59
|
+
return pacdots(cols) unless (@total_files / cols).eql?(@repetitions)
|
60
|
+
|
61
|
+
pacdots((@total_files - (cols * @repetitions)))
|
62
|
+
end
|
63
|
+
|
64
|
+
def pacdots(number)
|
65
|
+
@progress_line = PACDOT * number
|
66
|
+
end
|
67
|
+
|
68
|
+
def step(character)
|
69
|
+
regex = /#{Regexp.quote(PACMAN)}|#{Regexp.quote(PACDOT)}/
|
70
|
+
@progress_line = @progress_line.sub(regex, character)
|
71
|
+
output.printf("%<line>s\r", line: @progress_line)
|
72
|
+
return unless @progress_line[-1] =~ /ᗣ|\./
|
73
|
+
|
74
|
+
@repetitions += 1
|
75
|
+
output.puts
|
76
|
+
update_progress_line
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|