rubocop 0.75.0 → 0.79.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.
Files changed (192) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/config/default.yml +341 -316
  4. data/lib/rubocop.rb +48 -31
  5. data/lib/rubocop/ast/builder.rb +43 -41
  6. data/lib/rubocop/ast/node.rb +5 -1
  7. data/lib/rubocop/ast/node/block_node.rb +2 -0
  8. data/lib/rubocop/ast/node/def_node.rb +11 -0
  9. data/lib/rubocop/ast/node/forward_args_node.rb +18 -0
  10. data/lib/rubocop/ast/node/return_node.rb +24 -0
  11. data/lib/rubocop/ast/traversal.rb +11 -3
  12. data/lib/rubocop/cli.rb +11 -227
  13. data/lib/rubocop/cli/command.rb +21 -0
  14. data/lib/rubocop/cli/command/auto_genenerate_config.rb +105 -0
  15. data/lib/rubocop/cli/command/base.rb +33 -0
  16. data/lib/rubocop/cli/command/execute_runner.rb +76 -0
  17. data/lib/rubocop/cli/command/init_dotfile.rb +45 -0
  18. data/lib/rubocop/cli/command/show_cops.rb +80 -0
  19. data/lib/rubocop/cli/command/version.rb +17 -0
  20. data/lib/rubocop/cli/environment.rb +21 -0
  21. data/lib/rubocop/comment_config.rb +2 -2
  22. data/lib/rubocop/config.rb +8 -1
  23. data/lib/rubocop/config_loader.rb +20 -20
  24. data/lib/rubocop/config_loader_resolver.rb +2 -1
  25. data/lib/rubocop/config_obsoletion.rb +73 -11
  26. data/lib/rubocop/config_validator.rb +77 -110
  27. data/lib/rubocop/cop/autocorrect_logic.rb +7 -4
  28. data/lib/rubocop/cop/bundler/gem_comment.rb +4 -4
  29. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +2 -2
  30. data/lib/rubocop/cop/commissioner.rb +15 -7
  31. data/lib/rubocop/cop/cop.rb +31 -6
  32. data/lib/rubocop/cop/corrector.rb +8 -7
  33. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
  34. data/lib/rubocop/cop/correctors/space_corrector.rb +1 -2
  35. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
  36. data/lib/rubocop/cop/generator.rb +3 -4
  37. data/lib/rubocop/cop/generator/configuration_injector.rb +2 -2
  38. data/lib/rubocop/cop/internal_affairs.rb +1 -0
  39. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +59 -0
  40. data/lib/rubocop/cop/layout/{align_arguments.rb → argument_alignment.rb} +1 -1
  41. data/lib/rubocop/cop/layout/{align_array.rb → array_alignment.rb} +1 -1
  42. data/lib/rubocop/cop/layout/{indent_assignment.rb → assignment_indentation.rb} +3 -2
  43. data/lib/rubocop/cop/layout/comment_indentation.rb +10 -13
  44. data/lib/rubocop/cop/layout/empty_comment.rb +7 -16
  45. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +22 -7
  46. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +2 -2
  47. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -2
  48. data/lib/rubocop/cop/layout/end_of_line.rb +8 -3
  49. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
  50. data/lib/rubocop/cop/layout/{indent_first_argument.rb → first_argument_indentation.rb} +14 -12
  51. data/lib/rubocop/cop/layout/{indent_first_array_element.rb → first_array_element_indentation.rb} +4 -4
  52. data/lib/rubocop/cop/layout/{indent_first_hash_element.rb → first_hash_element_indentation.rb} +4 -4
  53. data/lib/rubocop/cop/layout/{indent_first_parameter.rb → first_parameter_indentation.rb} +3 -3
  54. data/lib/rubocop/cop/layout/{align_hash.rb → hash_alignment.rb} +16 -8
  55. data/lib/rubocop/cop/layout/{indent_heredoc.rb → heredoc_indentation.rb} +5 -5
  56. data/lib/rubocop/cop/layout/{leading_blank_lines.rb → leading_empty_lines.rb} +1 -1
  57. data/lib/rubocop/cop/{metrics → layout}/line_length.rb +41 -114
  58. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +1 -1
  59. data/lib/rubocop/cop/layout/multiline_block_layout.rb +14 -5
  60. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
  61. data/lib/rubocop/cop/layout/{align_parameters.rb → parameter_alignment.rb} +1 -1
  62. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +2 -0
  63. data/lib/rubocop/cop/layout/space_around_keyword.rb +12 -0
  64. data/lib/rubocop/cop/layout/space_around_operators.rb +32 -7
  65. data/lib/rubocop/cop/layout/space_before_block_braces.rb +17 -0
  66. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -7
  67. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +7 -4
  68. data/lib/rubocop/cop/layout/space_inside_parens.rb +6 -6
  69. data/lib/rubocop/cop/layout/{trailing_blank_lines.rb → trailing_empty_lines.rb} +1 -1
  70. data/lib/rubocop/cop/layout/trailing_whitespace.rb +18 -2
  71. data/lib/rubocop/cop/lint/debugger.rb +2 -2
  72. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +1 -1
  73. data/lib/rubocop/cop/lint/{duplicated_key.rb → duplicate_hash_key.rb} +1 -1
  74. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  75. data/lib/rubocop/cop/lint/erb_new_arguments.rb +9 -8
  76. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
  77. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +2 -2
  78. data/lib/rubocop/cop/lint/{multiple_compare.rb → multiple_comparison.rb} +1 -1
  79. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +89 -0
  80. data/lib/rubocop/cop/lint/{unneeded_cop_disable_directive.rb → redundant_cop_disable_directive.rb} +26 -26
  81. data/lib/rubocop/cop/lint/{unneeded_cop_enable_directive.rb → redundant_cop_enable_directive.rb} +10 -12
  82. data/lib/rubocop/cop/lint/{unneeded_require_statement.rb → redundant_require_statement.rb} +1 -1
  83. data/lib/rubocop/cop/lint/{unneeded_splat_expansion.rb → redundant_splat_expansion.rb} +6 -6
  84. data/lib/rubocop/cop/lint/{string_conversion_in_interpolation.rb → redundant_string_coercion.rb} +1 -1
  85. data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -2
  86. data/lib/rubocop/cop/lint/redundant_with_object.rb +2 -2
  87. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +5 -6
  88. data/lib/rubocop/cop/lint/{handle_exceptions.rb → suppressed_exception.rb} +1 -1
  89. data/lib/rubocop/cop/lint/unused_block_argument.rb +22 -6
  90. data/lib/rubocop/cop/lint/unused_method_argument.rb +23 -5
  91. data/lib/rubocop/cop/lint/useless_access_modifier.rb +57 -23
  92. data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
  93. data/lib/rubocop/cop/lint/void.rb +7 -26
  94. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  95. data/lib/rubocop/cop/metrics/method_length.rb +1 -1
  96. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +23 -6
  97. data/lib/rubocop/cop/migration/department_name.rb +16 -1
  98. data/lib/rubocop/cop/mixin/alignment.rb +1 -1
  99. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -7
  100. data/lib/rubocop/cop/mixin/{hash_alignment.rb → hash_alignment_styles.rb} +1 -1
  101. data/lib/rubocop/cop/mixin/line_length_help.rb +88 -0
  102. data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
  103. data/lib/rubocop/cop/mixin/nil_methods.rb +4 -4
  104. data/lib/rubocop/cop/mixin/rational_literal.rb +18 -0
  105. data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -4
  106. data/lib/rubocop/cop/mixin/trailing_comma.rb +14 -9
  107. data/lib/rubocop/cop/naming/{uncommunicative_block_param_name.rb → block_parameter_name.rb} +3 -3
  108. data/lib/rubocop/cop/naming/file_name.rb +12 -5
  109. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +5 -5
  110. data/lib/rubocop/cop/naming/{uncommunicative_method_param_name.rb → method_parameter_name.rb} +4 -4
  111. data/lib/rubocop/cop/naming/predicate_name.rb +6 -6
  112. data/lib/rubocop/cop/offense.rb +11 -0
  113. data/lib/rubocop/cop/registry.rb +8 -3
  114. data/lib/rubocop/cop/style/alias.rb +1 -1
  115. data/lib/rubocop/cop/style/array_join.rb +1 -1
  116. data/lib/rubocop/cop/style/attr.rb +10 -2
  117. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +6 -6
  118. data/lib/rubocop/cop/style/comment_annotation.rb +5 -5
  119. data/lib/rubocop/cop/style/conditional_assignment.rb +2 -2
  120. data/lib/rubocop/cop/style/copyright.rb +11 -7
  121. data/lib/rubocop/cop/style/documentation_method.rb +44 -0
  122. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +2 -2
  123. data/lib/rubocop/cop/style/empty_case_condition.rb +2 -2
  124. data/lib/rubocop/cop/style/empty_literal.rb +2 -2
  125. data/lib/rubocop/cop/style/empty_method.rb +5 -5
  126. data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
  127. data/lib/rubocop/cop/style/even_odd.rb +1 -1
  128. data/lib/rubocop/cop/style/expand_path_arguments.rb +1 -1
  129. data/lib/rubocop/cop/style/format_string.rb +10 -7
  130. data/lib/rubocop/cop/style/format_string_token.rb +15 -34
  131. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +10 -0
  132. data/lib/rubocop/cop/style/guard_clause.rb +3 -2
  133. data/lib/rubocop/cop/style/hash_syntax.rb +2 -2
  134. data/lib/rubocop/cop/style/if_unless_modifier.rb +45 -3
  135. data/lib/rubocop/cop/style/infinite_loop.rb +5 -4
  136. data/lib/rubocop/cop/style/inverse_methods.rb +19 -13
  137. data/lib/rubocop/cop/style/ip_addresses.rb +4 -4
  138. data/lib/rubocop/cop/style/line_end_concatenation.rb +14 -10
  139. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +24 -227
  140. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +168 -0
  141. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +54 -0
  142. data/lib/rubocop/cop/style/method_def_parentheses.rb +17 -9
  143. data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
  144. data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -1
  145. data/lib/rubocop/cop/style/multiline_when_then.rb +6 -2
  146. data/lib/rubocop/cop/style/nested_modifier.rb +4 -2
  147. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +5 -5
  148. data/lib/rubocop/cop/style/next.rb +5 -5
  149. data/lib/rubocop/cop/style/non_nil_check.rb +21 -9
  150. data/lib/rubocop/cop/style/numeric_literals.rb +7 -3
  151. data/lib/rubocop/cop/style/numeric_predicate.rb +4 -3
  152. data/lib/rubocop/cop/style/option_hash.rb +3 -3
  153. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +7 -7
  154. data/lib/rubocop/cop/style/{unneeded_capital_w.rb → redundant_capital_w.rb} +1 -1
  155. data/lib/rubocop/cop/style/{unneeded_condition.rb → redundant_condition.rb} +3 -3
  156. data/lib/rubocop/cop/style/{unneeded_interpolation.rb → redundant_interpolation.rb} +1 -1
  157. data/lib/rubocop/cop/style/redundant_parentheses.rb +3 -3
  158. data/lib/rubocop/cop/style/{unneeded_percent_q.rb → redundant_percent_q.rb} +1 -1
  159. data/lib/rubocop/cop/style/redundant_return.rb +39 -29
  160. data/lib/rubocop/cop/style/{unneeded_sort.rb → redundant_sort.rb} +5 -5
  161. data/lib/rubocop/cop/style/safe_navigation.rb +19 -8
  162. data/lib/rubocop/cop/style/semicolon.rb +13 -2
  163. data/lib/rubocop/cop/style/special_global_vars.rb +5 -7
  164. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +7 -1
  165. data/lib/rubocop/cop/style/trivial_accessors.rb +5 -5
  166. data/lib/rubocop/cop/style/while_until_modifier.rb +1 -1
  167. data/lib/rubocop/cop/style/yoda_condition.rb +16 -1
  168. data/lib/rubocop/cop/team.rb +5 -0
  169. data/lib/rubocop/cop/util.rb +1 -1
  170. data/lib/rubocop/cop/utils/format_string.rb +10 -18
  171. data/lib/rubocop/cop/variable_force.rb +7 -5
  172. data/lib/rubocop/formatter/base_formatter.rb +2 -2
  173. data/lib/rubocop/formatter/clang_style_formatter.rb +9 -6
  174. data/lib/rubocop/formatter/emacs_style_formatter.rb +22 -12
  175. data/lib/rubocop/formatter/file_list_formatter.rb +1 -1
  176. data/lib/rubocop/formatter/formatter_set.rb +16 -16
  177. data/lib/rubocop/formatter/json_formatter.rb +6 -5
  178. data/lib/rubocop/formatter/pacman_formatter.rb +3 -3
  179. data/lib/rubocop/formatter/simple_text_formatter.rb +7 -3
  180. data/lib/rubocop/formatter/tap_formatter.rb +9 -6
  181. data/lib/rubocop/node_pattern.rb +4 -2
  182. data/lib/rubocop/options.rb +20 -26
  183. data/lib/rubocop/processed_source.rb +1 -1
  184. data/lib/rubocop/rake_task.rb +1 -0
  185. data/lib/rubocop/result_cache.rb +24 -8
  186. data/lib/rubocop/rspec/shared_contexts.rb +5 -0
  187. data/lib/rubocop/runner.rb +50 -29
  188. data/lib/rubocop/target_finder.rb +12 -6
  189. data/lib/rubocop/target_ruby.rb +151 -0
  190. data/lib/rubocop/version.rb +1 -1
  191. metadata +50 -34
  192. data/lib/rubocop/cop/mixin/safe_mode.rb +0 -24
@@ -6,20 +6,38 @@ module RuboCop
6
6
  # This cop checks for unused method arguments.
7
7
  #
8
8
  # @example
9
- #
10
9
  # # bad
11
- #
12
10
  # def some_method(used, unused, _unused_but_allowed)
13
11
  # puts used
14
12
  # end
15
13
  #
16
- # @example
17
- #
18
14
  # # good
19
- #
20
15
  # def some_method(used, _unused, _unused_but_allowed)
21
16
  # puts used
22
17
  # end
18
+ #
19
+ # @example AllowUnusedKeywordArguments: false (default)
20
+ # # bad
21
+ # def do_something(used, unused: 42)
22
+ # used
23
+ # end
24
+ #
25
+ # @example AllowUnusedKeywordArguments: true
26
+ # # good
27
+ # def do_something(used, unused: 42)
28
+ # used
29
+ # end
30
+ #
31
+ # @example IgnoreEmptyMethods: true (default)
32
+ # # good
33
+ # def do_something(unused)
34
+ # end
35
+ #
36
+ # @example IgnoreEmptyMethods: false
37
+ # # bad
38
+ # def do_something(unused)
39
+ # end
40
+ #
23
41
  class UnusedMethodArgument < Cop
24
42
  include UnusedArgument
25
43
 
@@ -9,23 +9,64 @@ module RuboCop
9
9
  # always being defined, and thus access modifiers guarding such methods
10
10
  # are not redundant.
11
11
  #
12
- # @example
12
+ # This cop has `ContextCreatingMethods` option. The default setting value
13
+ # is an empty array that means no method is specified.
14
+ # This setting is an array of methods which, when called, are known to
15
+ # create its own context in the module's current access context.
16
+ #
17
+ # It also has `MethodCreatingMethods` option. The default setting value
18
+ # is an empty array that means no method is specified.
19
+ # This setting is an array of methods which, when called, are known to
20
+ # create other methods in the module's current access context.
13
21
  #
22
+ # @example
23
+ # # bad
14
24
  # class Foo
15
25
  # public # this is redundant (default access is public)
16
26
  #
17
27
  # def method
18
28
  # end
29
+ # end
19
30
  #
20
- # private # this is not redundant (a method is defined)
21
- # def method2
31
+ # # bad
32
+ # class Foo
33
+ # # The following is redundant (methods defined on the class'
34
+ # # singleton class are not affected by the public modifier)
35
+ # public
36
+ #
37
+ # def self.method3
22
38
  # end
39
+ # end
23
40
  #
41
+ # # bad
42
+ # class Foo
43
+ # protected
44
+ #
45
+ # define_method(:method2) do
46
+ # end
47
+ #
48
+ # protected # this is redundant (repeated from previous modifier)
49
+ #
50
+ # [1,2,3].each do |i|
51
+ # define_method("foo#{i}") do
52
+ # end
53
+ # end
54
+ # end
55
+ #
56
+ # # bad
57
+ # class Foo
24
58
  # private # this is redundant (no following methods are defined)
25
59
  # end
26
60
  #
27
- # @example
61
+ # # good
62
+ # class Foo
63
+ # private # this is not redundant (a method is defined)
64
+ #
65
+ # def method2
66
+ # end
67
+ # end
28
68
  #
69
+ # # good
29
70
  # class Foo
30
71
  # # The following is not redundant (conditionally defined methods are
31
72
  # # considered as always defining a method)
@@ -35,31 +76,22 @@ module RuboCop
35
76
  # def method
36
77
  # end
37
78
  # end
79
+ # end
38
80
  #
39
- # protected # this is not redundant (method is defined)
81
+ # # good
82
+ # class Foo
83
+ # protected # this is not redundant (a method is defined)
40
84
  #
41
85
  # define_method(:method2) do
42
86
  # end
43
- #
44
- # protected # this is redundant (repeated from previous modifier)
45
- #
46
- # [1,2,3].each do |i|
47
- # define_method("foo#{i}") do
48
- # end
49
- # end
50
- #
51
- # # The following is redundant (methods defined on the class'
52
- # # singleton class are not affected by the public modifier)
53
- # public
54
- #
55
- # def self.method3
56
- # end
57
87
  # end
58
88
  #
59
- # @example
89
+ # @example ContextCreatingMethods: concerning
60
90
  # # Lint/UselessAccessModifier:
61
91
  # # ContextCreatingMethods:
62
92
  # # - concerning
93
+ #
94
+ # # good
63
95
  # require 'active_support/concern'
64
96
  # class Foo
65
97
  # concerning :Bar do
@@ -79,10 +111,12 @@ module RuboCop
79
111
  # end
80
112
  # end
81
113
  #
82
- # @example
114
+ # @example MethodCreatingMethods: delegate
83
115
  # # Lint/UselessAccessModifier:
84
116
  # # MethodCreatingMethods:
85
117
  # # - delegate
118
+ #
119
+ # # good
86
120
  # require 'active_support/core_ext/module/delegation'
87
121
  # class Foo
88
122
  # # this is not redundant because `delegate` creates methods
@@ -141,7 +175,7 @@ module RuboCop
141
175
 
142
176
  def access_modifier?(node)
143
177
  node.bare_access_modifier? ||
144
- node.method_name == :private_class_method
178
+ node.method?(:private_class_method)
145
179
  end
146
180
 
147
181
  def check_scope(node)
@@ -169,7 +203,7 @@ module RuboCop
169
203
  def check_send_node(node, cur_vis, unused)
170
204
  if node.bare_access_modifier?
171
205
  check_new_visibility(node, unused, node.method_name, cur_vis)
172
- elsif node.method_name == :private_class_method && !node.arguments?
206
+ elsif node.method?(:private_class_method) && !node.arguments?
173
207
  add_offense(node, message: format(MSG, current: node.method_name))
174
208
  [cur_vis, unused]
175
209
  end
@@ -155,7 +155,7 @@ module RuboCop
155
155
  return true if node.literal?
156
156
  return false unless node.send_type?
157
157
 
158
- node.method_name == :new
158
+ node.method?(:new)
159
159
  end
160
160
  end
161
161
  end
@@ -6,55 +6,36 @@ module RuboCop
6
6
  # This cop checks for operators, variables, literals, and nonmutating
7
7
  # methods used in void context.
8
8
  #
9
- # @example
10
- #
9
+ # @example CheckForMethodsWithNoSideEffects: false (default)
11
10
  # # bad
12
- #
13
11
  # def some_method
14
12
  # some_num * 10
15
13
  # do_something
16
14
  # end
17
15
  #
18
- # @example
19
- #
20
- # # bad
21
- #
22
16
  # def some_method(some_var)
23
17
  # some_var
24
18
  # do_something
25
19
  # end
26
20
  #
27
- # @example
28
- #
29
- # # bad, when CheckForMethodsWithNoSideEffects is set true
30
- #
21
+ # @example CheckForMethodsWithNoSideEffects: true
22
+ # # bad
31
23
  # def some_method(some_array)
32
24
  # some_array.sort
33
25
  # do_something(some_array)
34
26
  # end
35
27
  #
36
- # @example
37
- #
38
28
  # # good
39
- #
40
29
  # def some_method
41
30
  # do_something
42
31
  # some_num * 10
43
32
  # end
44
33
  #
45
- # @example
46
- #
47
- # # good
48
- #
49
34
  # def some_method(some_var)
50
35
  # do_something
51
36
  # some_var
52
37
  # end
53
38
  #
54
- # @example
55
- #
56
- # # good, when CheckForMethodsWithNoSideEffects is set true
57
- #
58
39
  # def some_method(some_array)
59
40
  # some_array.sort!
60
41
  # do_something(some_array)
@@ -74,10 +55,10 @@ module RuboCop
74
55
  VOID_CONTEXT_TYPES = %i[def for block].freeze
75
56
  NONMUTATING_METHODS = %i[capitalize chomp chop collect compact
76
57
  delete_prefix delete_suffix downcase
77
- encode flatten gsub lstrip map next reject
78
- reverse rotate rstrip scrub select shuffle
79
- slice sort sort_by squeeze strip sub succ
80
- swapcase tr tr_s transform_values
58
+ encode flatten gsub lstrip map merge next
59
+ reject reverse rotate rstrip scrub select
60
+ shuffle slice sort sort_by squeeze strip sub
61
+ succ swapcase tr tr_s transform_values
81
62
  unicode_normalize uniq upcase].freeze
82
63
 
83
64
  def on_block(node)
@@ -11,7 +11,7 @@ module RuboCop
11
11
  include MethodComplexity
12
12
 
13
13
  MSG = 'Assignment Branch Condition size for %<method>s is too high. ' \
14
- '[%<complexity>.4g/%<max>.4g]'
14
+ '[%<abc_vector>s %<complexity>.4g/%<max>.4g]'
15
15
 
16
16
  private
17
17
 
@@ -20,7 +20,7 @@ module RuboCop
20
20
  alias on_defs on_def
21
21
 
22
22
  def on_block(node)
23
- return unless node.send_node.method_name == :define_method
23
+ return unless node.send_node.method?(:define_method)
24
24
 
25
25
  check_code_length(node)
26
26
  end
@@ -36,15 +36,17 @@ module RuboCop
36
36
  @node.each_node do |child|
37
37
  if child.assignment?
38
38
  @assignment += 1
39
- elsif BRANCH_NODES.include?(child.type)
39
+ elsif branch?(child)
40
40
  evaluate_branch_nodes(child)
41
- elsif CONDITION_NODES.include?(child.type)
42
- @condition += 1 if node_has_else_branch?(child)
43
- @condition += 1
41
+ elsif condition?(child)
42
+ evaluate_condition_node(child)
44
43
  end
45
44
  end
46
45
 
47
- Math.sqrt(@assignment**2 + @branch**2 + @condition**2).round(2)
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 node_has_else_branch?(node)
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
@@ -10,13 +10,24 @@ module RuboCop
10
10
 
11
11
  MSG = 'Department name is missing.'
12
12
 
13
+ DISABLE_COMMENT_FORMAT =
14
+ /\A(# *rubocop *: *((dis|en)able|todo) +)(.*)/.freeze
15
+
16
+ # The token that makes up a disable comment.
17
+ # The token used after `# rubocop: disable` are `A-z`, `/`, and `,`.
18
+ # Also `A-z` includes `all`.
19
+ DISABLING_COPS_CONTENT_TOKEN = %r{[A-z/,]+}.freeze
20
+
13
21
  def investigate(processed_source)
14
22
  processed_source.each_comment do |comment|
15
- next if comment.text !~ /\A(# *rubocop:((dis|en)able|todo) +)(.*)/
23
+ next if comment.text !~ DISABLE_COMMENT_FORMAT
16
24
 
17
25
  offset = Regexp.last_match(1).length
18
26
  Regexp.last_match(4).scan(%r{[\w/]+|\W+}) do |name|
27
+ break unless valid_content_token?(name.strip)
28
+
19
29
  check_cop_name(name, comment, offset)
30
+
20
31
  offset += name.length
21
32
  end
22
33
  end
@@ -38,6 +49,10 @@ module RuboCop
38
49
  range = range_between(start, start + name.length)
39
50
  add_offense(range, location: range)
40
51
  end
52
+
53
+ def valid_content_token?(content_token)
54
+ !DISABLING_COPS_CONTENT_TOKEN.match(content_token).nil?
55
+ end
41
56
  end
42
57
  end
43
58
  end
@@ -35,7 +35,7 @@ module RuboCop
35
35
  # If this offense is within a line range that is already being
36
36
  # realigned by autocorrect, we report the offense without
37
37
  # autocorrecting it. Two rewrites in the same area by the same
38
- # cop can not be handled. The next iteration will find the
38
+ # cop cannot be handled. The next iteration will find the
39
39
  # offense again and correct it.
40
40
  add_offense(nil, location: expr)
41
41
  else
@@ -40,13 +40,7 @@ module RuboCop
40
40
  end
41
41
 
42
42
  def leading_comment_lines
43
- comments = processed_source.comments
44
-
45
- comments.each_with_object([]) do |comment, leading_comments|
46
- next if comment.loc.line > 3
47
-
48
- leading_comments << comment.text
49
- end
43
+ processed_source.comments.first(3).map(&:text)
50
44
  end
51
45
  end
52
46
  end
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  # Common functionality for checking hash alignment.
6
- module HashAlignment
6
+ module HashAlignmentStyles
7
7
  # Handles calculation of deltas when the enforced style is 'key'.
8
8
  class KeyAlignment
9
9
  def checkable_layout?(_node)
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ # Help methods for determining if a line is too long.
6
+ module LineLengthHelp
7
+ private
8
+
9
+ def ignore_cop_directives?
10
+ config.for_cop('Layout/LineLength')['IgnoreCopDirectives']
11
+ end
12
+
13
+ def directive_on_source_line?(line_index)
14
+ source_line_number = line_index + processed_source.buffer.first_line
15
+ comment =
16
+ processed_source.comments
17
+ .detect { |e| e.location.line == source_line_number }
18
+
19
+ return false unless comment
20
+
21
+ comment.text.match(CommentConfig::COMMENT_DIRECTIVE_REGEXP)
22
+ end
23
+
24
+ def allow_uri?
25
+ config.for_cop('Layout/LineLength')['AllowURI']
26
+ end
27
+
28
+ def allowed_uri_position?(line, uri_range)
29
+ uri_range.begin < max_line_length &&
30
+ (uri_range.end == line_length(line) ||
31
+ uri_range.end == line_length(line) - 1)
32
+ end
33
+
34
+ def line_length(line)
35
+ line.length + indentation_difference(line)
36
+ end
37
+
38
+ def find_excessive_uri_range(line)
39
+ last_uri_match = match_uris(line).last
40
+ return nil unless last_uri_match
41
+
42
+ begin_position, end_position = last_uri_match.offset(0).map do |pos|
43
+ pos + indentation_difference(line)
44
+ end
45
+ return nil if begin_position < max_line_length &&
46
+ end_position < max_line_length
47
+
48
+ begin_position...end_position
49
+ end
50
+
51
+ def match_uris(string)
52
+ matches = []
53
+ string.scan(uri_regexp) do
54
+ matches << $LAST_MATCH_INFO if valid_uri?($LAST_MATCH_INFO[0])
55
+ end
56
+ matches
57
+ end
58
+
59
+ def indentation_difference(line)
60
+ return 0 unless tab_indentation_width
61
+
62
+ line.match(/^\t*/)[0].size * (tab_indentation_width - 1)
63
+ end
64
+
65
+ def tab_indentation_width
66
+ config.for_cop('Layout/Tab')['IndentationWidth']
67
+ end
68
+
69
+ def uri_regexp
70
+ @uri_regexp ||=
71
+ URI::DEFAULT_PARSER
72
+ .make_regexp(config.for_cop('Layout/LineLength')['URISchemes'])
73
+ end
74
+
75
+ def valid_uri?(uri_ish_string)
76
+ URI.parse(uri_ish_string)
77
+ true
78
+ rescue URI::InvalidURIError, NoMethodError
79
+ false
80
+ end
81
+
82
+ def line_length_without_directive(line)
83
+ before_comment, = line.split(CommentConfig::COMMENT_DIRECTIVE_REGEXP)
84
+ before_comment.rstrip.length
85
+ end
86
+ end
87
+ end
88
+ end