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
@@ -36,15 +36,17 @@ module RuboCop
|
|
36
36
|
@node.each_node do |child|
|
37
37
|
if child.assignment?
|
38
38
|
@assignment += 1
|
39
|
-
elsif
|
39
|
+
elsif branch?(child)
|
40
40
|
evaluate_branch_nodes(child)
|
41
|
-
elsif
|
42
|
-
|
43
|
-
@condition += 1
|
41
|
+
elsif condition?(child)
|
42
|
+
evaluate_condition_node(child)
|
44
43
|
end
|
45
44
|
end
|
46
45
|
|
47
|
-
|
46
|
+
[
|
47
|
+
Math.sqrt(@assignment**2 + @branch**2 + @condition**2).round(2),
|
48
|
+
"<#{@assignment}, #{@branch}, #{@condition}>"
|
49
|
+
]
|
48
50
|
end
|
49
51
|
|
50
52
|
def evaluate_branch_nodes(node)
|
@@ -55,11 +57,26 @@ module RuboCop
|
|
55
57
|
end
|
56
58
|
end
|
57
59
|
|
58
|
-
def
|
60
|
+
def evaluate_condition_node(node)
|
61
|
+
@condition += 1 if else_branch?(node)
|
62
|
+
@condition += 1
|
63
|
+
end
|
64
|
+
|
65
|
+
def else_branch?(node)
|
59
66
|
%i[case if].include?(node.type) &&
|
60
67
|
node.else? &&
|
61
68
|
node.loc.else.is?('else')
|
62
69
|
end
|
70
|
+
|
71
|
+
private
|
72
|
+
|
73
|
+
def branch?(node)
|
74
|
+
BRANCH_NODES.include?(node.type)
|
75
|
+
end
|
76
|
+
|
77
|
+
def condition?(node)
|
78
|
+
CONDITION_NODES.include?(node.type)
|
79
|
+
end
|
63
80
|
end
|
64
81
|
end
|
65
82
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Migration
|
6
|
+
# Check that cop names in rubocop:disable comments are given with
|
7
|
+
# department name.
|
8
|
+
class DepartmentName < Cop
|
9
|
+
include RangeHelp
|
10
|
+
|
11
|
+
MSG = 'Department name is missing.'
|
12
|
+
|
13
|
+
def investigate(processed_source)
|
14
|
+
processed_source.each_comment do |comment|
|
15
|
+
next if comment.text !~ /\A(# *rubocop:((dis|en)able|todo) +)(.*)/
|
16
|
+
|
17
|
+
offset = Regexp.last_match(1).length
|
18
|
+
Regexp.last_match(4).scan(%r{[\w/]+|\W+}) do |name|
|
19
|
+
check_cop_name(name, comment, offset)
|
20
|
+
offset += name.length
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def autocorrect(range)
|
26
|
+
shall_warn = false
|
27
|
+
qualified_cop_name = Cop.registry.qualified_cop_name(range.source,
|
28
|
+
nil, shall_warn)
|
29
|
+
->(corrector) { corrector.replace(range, qualified_cop_name) }
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def check_cop_name(name, comment, offset)
|
35
|
+
return if name !~ /^[A-Z]/ || name =~ %r{/}
|
36
|
+
|
37
|
+
start = comment.location.expression.begin_pos + offset
|
38
|
+
range = range_between(start, start + name.length)
|
39
|
+
add_offense(range, location: range)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
# Common functionality for working with string interpolations.
|
6
|
+
#
|
7
|
+
# @abstract Subclasses are expected to implement {#on_interpolation}.
|
8
|
+
module Interpolation
|
9
|
+
def on_dstr(node)
|
10
|
+
on_node_with_interpolations(node)
|
11
|
+
end
|
12
|
+
|
13
|
+
alias on_xstr on_dstr
|
14
|
+
alias on_dsym on_dstr
|
15
|
+
alias on_regexp on_dstr
|
16
|
+
|
17
|
+
def on_node_with_interpolations(node)
|
18
|
+
node.each_child_node(:begin) do |begin_node|
|
19
|
+
on_interpolation(begin_node)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# @!method on_interpolation(begin_node)
|
24
|
+
# Inspect the `:begin` node of an interpolation
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -32,13 +32,14 @@ module RuboCop
|
|
32
32
|
return unless node.body
|
33
33
|
|
34
34
|
max = cop_config['Max']
|
35
|
-
complexity = complexity(node.body)
|
35
|
+
complexity, abc_vector = complexity(node.body)
|
36
36
|
|
37
37
|
return unless complexity > max
|
38
38
|
|
39
39
|
msg = format(self.class::MSG,
|
40
40
|
method: method_name,
|
41
41
|
complexity: complexity,
|
42
|
+
abc_vector: abc_vector,
|
42
43
|
max: max)
|
43
44
|
|
44
45
|
add_offense(node, message: msg) do
|
@@ -5,20 +5,20 @@ module RuboCop
|
|
5
5
|
# This module provides a list of methods that are:
|
6
6
|
# 1. In the NilClass by default
|
7
7
|
# 2. Added to NilClass by explicitly requiring any standard libraries
|
8
|
-
# 3. Cop's configuration parameter
|
8
|
+
# 3. Cop's configuration parameter AllowedMethods.
|
9
9
|
module NilMethods
|
10
10
|
private
|
11
11
|
|
12
12
|
def nil_methods
|
13
|
-
nil.methods + other_stdlib_methods +
|
13
|
+
nil.methods + other_stdlib_methods + allowed_methods
|
14
14
|
end
|
15
15
|
|
16
16
|
def other_stdlib_methods
|
17
17
|
[:to_d]
|
18
18
|
end
|
19
19
|
|
20
|
-
def
|
21
|
-
cop_config['
|
20
|
+
def allowed_methods
|
21
|
+
cop_config['AllowedMethods'].map(&:to_sym)
|
22
22
|
end
|
23
23
|
end
|
24
24
|
end
|
@@ -19,6 +19,18 @@ module RuboCop
|
|
19
19
|
aligned_with_adjacent_line?(range, method(:aligned_operator?))
|
20
20
|
end
|
21
21
|
|
22
|
+
def aligned_with_preceding_assignment(token)
|
23
|
+
preceding_line_range = token.line.downto(1)
|
24
|
+
|
25
|
+
aligned_with_assignment(token, preceding_line_range)
|
26
|
+
end
|
27
|
+
|
28
|
+
def aligned_with_subsequent_assignment(token)
|
29
|
+
subsequent_line_range = token.line.upto(processed_source.lines.length)
|
30
|
+
|
31
|
+
aligned_with_assignment(token, subsequent_line_range)
|
32
|
+
end
|
33
|
+
|
22
34
|
def aligned_with_adjacent_line?(range, predicate)
|
23
35
|
# minus 2 because node.loc.line is zero-based
|
24
36
|
pre = (range.line - 2).downto(0)
|
@@ -89,6 +101,81 @@ module RuboCop
|
|
89
101
|
def aligned_identical?(range, line)
|
90
102
|
range.source == line[range.column, range.size]
|
91
103
|
end
|
104
|
+
|
105
|
+
def aligned_with_assignment(token, line_range)
|
106
|
+
token_line_indent = processed_source
|
107
|
+
.line_indentation(token.line)
|
108
|
+
assignment_lines = relevant_assignment_lines(line_range)
|
109
|
+
relevant_line_number = assignment_lines[1]
|
110
|
+
|
111
|
+
return :none unless relevant_line_number
|
112
|
+
|
113
|
+
relevant_indent = processed_source
|
114
|
+
.line_indentation(relevant_line_number)
|
115
|
+
|
116
|
+
return :none if relevant_indent < token_line_indent
|
117
|
+
|
118
|
+
assignment_line = processed_source.lines[relevant_line_number - 1]
|
119
|
+
|
120
|
+
return :none unless assignment_line
|
121
|
+
|
122
|
+
aligned_assignment?(token.pos, assignment_line) ? :yes : :no
|
123
|
+
end
|
124
|
+
|
125
|
+
def assignment_lines
|
126
|
+
@assignment_lines ||= assignment_tokens.map(&:line)
|
127
|
+
end
|
128
|
+
|
129
|
+
def assignment_tokens
|
130
|
+
@assignment_tokens ||= begin
|
131
|
+
tokens = processed_source.tokens.select(&:equal_sign?)
|
132
|
+
|
133
|
+
# we don't want to operate on equals signs which are part of an
|
134
|
+
# optarg in a method definition
|
135
|
+
# e.g.: def method(optarg = default_val); end
|
136
|
+
tokens = remove_optarg_equals(tokens, processed_source)
|
137
|
+
|
138
|
+
# Only attempt to align the first = on each line
|
139
|
+
Set.new(tokens.uniq(&:line))
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
144
|
+
# rubocop:disable Metrics/PerceivedComplexity, Metrics/MethodLength
|
145
|
+
def relevant_assignment_lines(line_range)
|
146
|
+
result = []
|
147
|
+
original_line_indent = processed_source
|
148
|
+
.line_indentation(line_range.first)
|
149
|
+
relevant_line_indent_at_level = true
|
150
|
+
|
151
|
+
line_range.each do |line_number|
|
152
|
+
current_line_indent = processed_source.line_indentation(line_number)
|
153
|
+
blank_line = processed_source.lines[line_number - 1].blank?
|
154
|
+
|
155
|
+
if (current_line_indent < original_line_indent && !blank_line) ||
|
156
|
+
(relevant_line_indent_at_level && blank_line)
|
157
|
+
break
|
158
|
+
end
|
159
|
+
|
160
|
+
result << line_number if assignment_lines.include?(line_number) &&
|
161
|
+
current_line_indent == original_line_indent
|
162
|
+
|
163
|
+
unless blank_line
|
164
|
+
relevant_line_indent_at_level = \
|
165
|
+
current_line_indent == original_line_indent
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
result
|
170
|
+
end
|
171
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
172
|
+
# rubocop:enable Metrics/PerceivedComplexity, Metrics/MethodLength
|
173
|
+
|
174
|
+
def remove_optarg_equals(asgn_tokens, processed_source)
|
175
|
+
optargs = processed_source.ast.each_node(:optarg)
|
176
|
+
optarg_eql = optargs.map { |o| o.loc.operator.begin_pos }.to_set
|
177
|
+
asgn_tokens.reject { |t| optarg_eql.include?(t.begin_pos) }
|
178
|
+
end
|
92
179
|
end
|
93
180
|
end
|
94
181
|
end
|
@@ -41,10 +41,13 @@ module RuboCop
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def length_in_modifier_form(node, cond, body_length)
|
44
|
-
|
45
|
-
|
44
|
+
keyword = node.loc.keyword
|
45
|
+
|
46
|
+
indentation = keyword.column * indentation_multiplier
|
47
|
+
kw_length = keyword.size
|
46
48
|
cond_length = cond.source_range.size
|
47
49
|
space = 1
|
50
|
+
|
48
51
|
indentation + body_length + space + kw_length + space + cond_length
|
49
52
|
end
|
50
53
|
|
@@ -9,6 +9,8 @@ module RuboCop
|
|
9
9
|
NO_SPACE_COMMAND = 'Do not use'
|
10
10
|
SPACE_COMMAND = 'Use'
|
11
11
|
|
12
|
+
SINGLE_SPACE_REGEXP = /[ \t]/.freeze
|
13
|
+
|
12
14
|
private
|
13
15
|
|
14
16
|
def side_space_range(range:, side:)
|
@@ -18,11 +20,11 @@ module RuboCop
|
|
18
20
|
begin_pos = range.begin_pos
|
19
21
|
end_pos = range.end_pos
|
20
22
|
if side == :left
|
23
|
+
end_pos = begin_pos
|
21
24
|
begin_pos = reposition(src, begin_pos, -1)
|
22
|
-
end_pos -= 1
|
23
25
|
end
|
24
26
|
if side == :right
|
25
|
-
begin_pos
|
27
|
+
begin_pos = end_pos
|
26
28
|
end_pos = reposition(src, end_pos, 1)
|
27
29
|
end
|
28
30
|
Parser::Source::Range.new(buffer, begin_pos, end_pos)
|
@@ -85,15 +87,15 @@ module RuboCop
|
|
85
87
|
return false unless token
|
86
88
|
|
87
89
|
if side == :left
|
88
|
-
String(token.space_after?)
|
90
|
+
String(token.space_after?) =~ SINGLE_SPACE_REGEXP
|
89
91
|
else
|
90
|
-
String(token.space_before?)
|
92
|
+
String(token.space_before?) =~ SINGLE_SPACE_REGEXP
|
91
93
|
end
|
92
94
|
end
|
93
95
|
|
94
96
|
def reposition(src, pos, step)
|
95
97
|
offset = step == -1 ? -1 : 0
|
96
|
-
pos += step while src[pos + offset] =~
|
98
|
+
pos += step while src[pos + offset] =~ SINGLE_SPACE_REGEXP
|
97
99
|
pos.negative? ? 0 : pos
|
98
100
|
end
|
99
101
|
|
@@ -18,12 +18,7 @@ module RuboCop
|
|
18
18
|
|
19
19
|
def check(node, items, kind, begin_pos, end_pos)
|
20
20
|
after_last_item = range_between(begin_pos, end_pos)
|
21
|
-
|
22
|
-
# If there is any heredoc in items, then match the comma succeeding
|
23
|
-
# any whitespace (except newlines), otherwise allow for newlines
|
24
|
-
comma_regex = any_heredoc?(items) ? /\A[^\S\n]*,/ : /\A\s*,/
|
25
|
-
comma_offset = after_last_item.source =~ comma_regex &&
|
26
|
-
after_last_item.source.index(',')
|
21
|
+
comma_offset = comma_offset(items, after_last_item)
|
27
22
|
|
28
23
|
if comma_offset && !inside_comment?(after_last_item, comma_offset)
|
29
24
|
check_comma(node, kind, after_last_item.begin_pos + comma_offset)
|
@@ -32,6 +27,13 @@ module RuboCop
|
|
32
27
|
end
|
33
28
|
end
|
34
29
|
|
30
|
+
def comma_offset(items, range)
|
31
|
+
# If there is any heredoc in items, then match the comma succeeding
|
32
|
+
# any whitespace (except newlines), otherwise allow for newlines
|
33
|
+
comma_regex = any_heredoc?(items) ? /\A[^\S\n]*,/ : /\A\s*,/
|
34
|
+
range.source =~ comma_regex && range.source.index(',')
|
35
|
+
end
|
36
|
+
|
35
37
|
def check_comma(node, kind, comma_pos)
|
36
38
|
return if should_have_comma?(style, node)
|
37
39
|
|
@@ -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
|
@@ -35,7 +35,7 @@ module RuboCop
|
|
35
35
|
# foo { |speed, distance| speed * distance }
|
36
36
|
#
|
37
37
|
# baz { |age, height, gender| do_stuff(age, height, gender) }
|
38
|
-
class
|
38
|
+
class BlockParameterName < Cop
|
39
39
|
include UncommunicativeName
|
40
40
|
|
41
41
|
def on_block(node)
|
@@ -50,14 +50,11 @@ module RuboCop
|
|
50
50
|
def for_bad_filename(file_path)
|
51
51
|
basename = File.basename(file_path)
|
52
52
|
msg = if filename_good?(basename)
|
53
|
-
return
|
54
|
-
return if find_class_or_module(processed_source.ast,
|
55
|
-
to_namespace(file_path))
|
53
|
+
return if matching_definition?(file_path)
|
56
54
|
|
57
55
|
no_definition_message(basename, file_path)
|
58
56
|
else
|
59
|
-
return if
|
60
|
-
processed_source.start_with?('#!')
|
57
|
+
return if bad_filename_allowed?
|
61
58
|
|
62
59
|
other_message(basename)
|
63
60
|
end
|
@@ -65,6 +62,16 @@ module RuboCop
|
|
65
62
|
yield source_range(processed_source.buffer, 1, 0), msg
|
66
63
|
end
|
67
64
|
|
65
|
+
def matching_definition?(file_path)
|
66
|
+
return true unless expect_matching_definition?
|
67
|
+
|
68
|
+
find_class_or_module(processed_source.ast, to_namespace(file_path))
|
69
|
+
end
|
70
|
+
|
71
|
+
def bad_filename_allowed?
|
72
|
+
ignore_executable_scripts? && processed_source.start_with?('#!')
|
73
|
+
end
|
74
|
+
|
68
75
|
def no_definition_message(basename, file_path)
|
69
76
|
format(MSG_NO_DEFINITION,
|
70
77
|
basename: basename,
|