rubocop 0.74.0 → 0.78.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 (213) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -2
  3. data/config/default.yml +366 -318
  4. data/lib/rubocop.rb +48 -32
  5. data/lib/rubocop/ast/builder.rb +1 -0
  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/mixin/method_dispatch_node.rb +1 -12
  9. data/lib/rubocop/ast/node/return_node.rb +24 -0
  10. data/lib/rubocop/cli.rb +11 -227
  11. data/lib/rubocop/cli/command.rb +21 -0
  12. data/lib/rubocop/cli/command/auto_genenerate_config.rb +105 -0
  13. data/lib/rubocop/cli/command/base.rb +33 -0
  14. data/lib/rubocop/cli/command/execute_runner.rb +76 -0
  15. data/lib/rubocop/cli/command/init_dotfile.rb +45 -0
  16. data/lib/rubocop/cli/command/show_cops.rb +73 -0
  17. data/lib/rubocop/cli/command/version.rb +17 -0
  18. data/lib/rubocop/cli/environment.rb +21 -0
  19. data/lib/rubocop/comment_config.rb +5 -4
  20. data/lib/rubocop/config.rb +12 -1
  21. data/lib/rubocop/config_loader.rb +21 -3
  22. data/lib/rubocop/config_loader_resolver.rb +4 -3
  23. data/lib/rubocop/config_obsoletion.rb +85 -11
  24. data/lib/rubocop/config_validator.rb +28 -19
  25. data/lib/rubocop/cop/autocorrect_logic.rb +3 -3
  26. data/lib/rubocop/cop/bundler/gem_comment.rb +4 -4
  27. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +2 -2
  28. data/lib/rubocop/cop/commissioner.rb +15 -7
  29. data/lib/rubocop/cop/cop.rb +35 -9
  30. data/lib/rubocop/cop/corrector.rb +8 -7
  31. data/lib/rubocop/cop/correctors/alignment_corrector.rb +43 -17
  32. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +2 -2
  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/generator.rb +3 -3
  36. data/lib/rubocop/cop/generator/configuration_injector.rb +9 -4
  37. data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
  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} +11 -2
  43. data/lib/rubocop/cop/layout/block_alignment.rb +2 -2
  44. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +1 -1
  45. data/lib/rubocop/cop/layout/comment_indentation.rb +10 -13
  46. data/lib/rubocop/cop/layout/empty_comment.rb +7 -16
  47. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +22 -7
  48. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +2 -2
  49. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -2
  50. data/lib/rubocop/cop/layout/end_of_line.rb +8 -3
  51. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -7
  52. data/lib/rubocop/cop/layout/{indent_first_argument.rb → first_argument_indentation.rb} +14 -12
  53. data/lib/rubocop/cop/layout/{indent_first_array_element.rb → first_array_element_indentation.rb} +4 -4
  54. data/lib/rubocop/cop/layout/{indent_first_hash_element.rb → first_hash_element_indentation.rb} +4 -4
  55. data/lib/rubocop/cop/layout/{indent_first_parameter.rb → first_parameter_indentation.rb} +3 -3
  56. data/lib/rubocop/cop/layout/{align_hash.rb → hash_alignment.rb} +8 -4
  57. data/lib/rubocop/cop/layout/{indent_heredoc.rb → heredoc_indentation.rb} +6 -6
  58. data/lib/rubocop/cop/layout/{leading_blank_lines.rb → leading_empty_lines.rb} +1 -1
  59. data/lib/rubocop/cop/{metrics → layout}/line_length.rb +41 -114
  60. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +1 -1
  61. data/lib/rubocop/cop/layout/multiline_block_layout.rb +24 -2
  62. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
  63. data/lib/rubocop/cop/layout/{align_parameters.rb → parameter_alignment.rb} +1 -1
  64. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +2 -0
  65. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +5 -1
  66. data/lib/rubocop/cop/layout/space_around_keyword.rb +12 -0
  67. data/lib/rubocop/cop/layout/space_around_operators.rb +32 -7
  68. data/lib/rubocop/cop/layout/space_before_block_braces.rb +17 -0
  69. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -7
  70. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +8 -5
  71. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +7 -0
  72. data/lib/rubocop/cop/layout/space_inside_parens.rb +6 -6
  73. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +2 -0
  74. data/lib/rubocop/cop/layout/{trailing_blank_lines.rb → trailing_empty_lines.rb} +1 -1
  75. data/lib/rubocop/cop/layout/trailing_whitespace.rb +18 -2
  76. data/lib/rubocop/cop/lint/assignment_in_condition.rb +17 -4
  77. data/lib/rubocop/cop/lint/debugger.rb +1 -1
  78. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +1 -1
  79. data/lib/rubocop/cop/lint/{duplicated_key.rb → duplicate_hash_key.rb} +1 -1
  80. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  81. data/lib/rubocop/cop/lint/erb_new_arguments.rb +9 -8
  82. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +10 -36
  83. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
  84. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +2 -2
  85. data/lib/rubocop/cop/lint/{multiple_compare.rb → multiple_comparison.rb} +1 -1
  86. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +89 -0
  87. data/lib/rubocop/cop/lint/number_conversion.rb +1 -1
  88. data/lib/rubocop/cop/lint/{unneeded_cop_disable_directive.rb → redundant_cop_disable_directive.rb} +26 -26
  89. data/lib/rubocop/cop/lint/{unneeded_cop_enable_directive.rb → redundant_cop_enable_directive.rb} +10 -12
  90. data/lib/rubocop/cop/lint/{unneeded_require_statement.rb → redundant_require_statement.rb} +1 -1
  91. data/lib/rubocop/cop/lint/{unneeded_splat_expansion.rb → redundant_splat_expansion.rb} +6 -6
  92. data/lib/rubocop/cop/lint/{string_conversion_in_interpolation.rb → redundant_string_coercion.rb} +1 -1
  93. data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -2
  94. data/lib/rubocop/cop/lint/redundant_with_object.rb +2 -2
  95. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +5 -6
  96. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +91 -0
  97. data/lib/rubocop/cop/lint/{handle_exceptions.rb → suppressed_exception.rb} +1 -1
  98. data/lib/rubocop/cop/lint/unused_block_argument.rb +22 -6
  99. data/lib/rubocop/cop/lint/unused_method_argument.rb +23 -5
  100. data/lib/rubocop/cop/lint/useless_access_modifier.rb +57 -23
  101. data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
  102. data/lib/rubocop/cop/lint/void.rb +7 -26
  103. data/lib/rubocop/cop/message_annotator.rb +16 -7
  104. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  105. data/lib/rubocop/cop/metrics/method_length.rb +1 -1
  106. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +23 -6
  107. data/lib/rubocop/cop/migration/department_name.rb +44 -0
  108. data/lib/rubocop/cop/mixin/alignment.rb +2 -2
  109. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -1
  110. data/lib/rubocop/cop/mixin/{hash_alignment.rb → hash_alignment_styles.rb} +1 -1
  111. data/lib/rubocop/cop/mixin/line_length_help.rb +88 -0
  112. data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
  113. data/lib/rubocop/cop/mixin/nil_methods.rb +4 -4
  114. data/lib/rubocop/cop/mixin/rational_literal.rb +18 -0
  115. data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -4
  116. data/lib/rubocop/cop/mixin/trailing_comma.rb +14 -9
  117. data/lib/rubocop/cop/naming/{uncommunicative_block_param_name.rb → block_parameter_name.rb} +3 -3
  118. data/lib/rubocop/cop/naming/file_name.rb +12 -5
  119. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +5 -5
  120. data/lib/rubocop/cop/naming/method_name.rb +12 -1
  121. data/lib/rubocop/cop/naming/{uncommunicative_method_param_name.rb → method_parameter_name.rb} +3 -3
  122. data/lib/rubocop/cop/naming/predicate_name.rb +6 -6
  123. data/lib/rubocop/cop/naming/variable_name.rb +1 -0
  124. data/lib/rubocop/cop/offense.rb +29 -7
  125. data/lib/rubocop/cop/registry.rb +22 -1
  126. data/lib/rubocop/cop/style/access_modifier_declarations.rb +1 -0
  127. data/lib/rubocop/cop/style/alias.rb +1 -1
  128. data/lib/rubocop/cop/style/array_join.rb +1 -1
  129. data/lib/rubocop/cop/style/attr.rb +10 -2
  130. data/lib/rubocop/cop/style/block_delimiters.rb +2 -1
  131. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +35 -16
  132. data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
  133. data/lib/rubocop/cop/style/comment_annotation.rb +5 -5
  134. data/lib/rubocop/cop/style/commented_keyword.rb +8 -2
  135. data/lib/rubocop/cop/style/conditional_assignment.rb +6 -6
  136. data/lib/rubocop/cop/style/copyright.rb +11 -7
  137. data/lib/rubocop/cop/style/documentation_method.rb +44 -0
  138. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +10 -4
  139. data/lib/rubocop/cop/style/empty_case_condition.rb +2 -2
  140. data/lib/rubocop/cop/style/empty_literal.rb +2 -2
  141. data/lib/rubocop/cop/style/empty_method.rb +5 -5
  142. data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
  143. data/lib/rubocop/cop/style/even_odd.rb +1 -1
  144. data/lib/rubocop/cop/style/expand_path_arguments.rb +1 -1
  145. data/lib/rubocop/cop/style/format_string.rb +10 -7
  146. data/lib/rubocop/cop/style/format_string_token.rb +19 -68
  147. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +28 -33
  148. data/lib/rubocop/cop/style/guard_clause.rb +3 -2
  149. data/lib/rubocop/cop/style/hash_syntax.rb +2 -2
  150. data/lib/rubocop/cop/style/if_unless_modifier.rb +93 -15
  151. data/lib/rubocop/cop/style/infinite_loop.rb +6 -5
  152. data/lib/rubocop/cop/style/inverse_methods.rb +19 -13
  153. data/lib/rubocop/cop/style/ip_addresses.rb +4 -4
  154. data/lib/rubocop/cop/style/line_end_concatenation.rb +14 -10
  155. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +25 -25
  156. data/lib/rubocop/cop/style/method_def_parentheses.rb +17 -9
  157. data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
  158. data/lib/rubocop/cop/style/mixin_usage.rb +11 -1
  159. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  160. data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -1
  161. data/lib/rubocop/cop/style/multiline_when_then.rb +1 -1
  162. data/lib/rubocop/cop/style/nested_modifier.rb +22 -4
  163. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +5 -5
  164. data/lib/rubocop/cop/style/next.rb +5 -5
  165. data/lib/rubocop/cop/style/non_nil_check.rb +21 -9
  166. data/lib/rubocop/cop/style/numeric_literals.rb +7 -3
  167. data/lib/rubocop/cop/style/option_hash.rb +3 -3
  168. data/lib/rubocop/cop/style/or_assignment.rb +6 -1
  169. data/lib/rubocop/cop/style/parentheses_around_condition.rb +14 -0
  170. data/lib/rubocop/cop/style/{unneeded_capital_w.rb → redundant_capital_w.rb} +1 -1
  171. data/lib/rubocop/cop/style/{unneeded_condition.rb → redundant_condition.rb} +3 -3
  172. data/lib/rubocop/cop/style/{unneeded_interpolation.rb → redundant_interpolation.rb} +1 -1
  173. data/lib/rubocop/cop/style/redundant_parentheses.rb +16 -7
  174. data/lib/rubocop/cop/style/{unneeded_percent_q.rb → redundant_percent_q.rb} +1 -1
  175. data/lib/rubocop/cop/style/redundant_return.rb +39 -29
  176. data/lib/rubocop/cop/style/redundant_self.rb +18 -1
  177. data/lib/rubocop/cop/style/{unneeded_sort.rb → redundant_sort.rb} +5 -5
  178. data/lib/rubocop/cop/style/rescue_modifier.rb +24 -0
  179. data/lib/rubocop/cop/style/safe_navigation.rb +23 -3
  180. data/lib/rubocop/cop/style/semicolon.rb +13 -2
  181. data/lib/rubocop/cop/style/single_line_methods.rb +8 -1
  182. data/lib/rubocop/cop/style/special_global_vars.rb +5 -7
  183. data/lib/rubocop/cop/style/ternary_parentheses.rb +19 -0
  184. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +7 -1
  185. data/lib/rubocop/cop/style/trivial_accessors.rb +5 -5
  186. data/lib/rubocop/cop/style/while_until_modifier.rb +1 -1
  187. data/lib/rubocop/cop/team.rb +5 -0
  188. data/lib/rubocop/cop/util.rb +1 -1
  189. data/lib/rubocop/cop/utils/format_string.rb +120 -0
  190. data/lib/rubocop/cop/variable_force.rb +7 -5
  191. data/lib/rubocop/cop/variable_force/variable.rb +15 -2
  192. data/lib/rubocop/core_ext/string.rb +0 -24
  193. data/lib/rubocop/formatter/base_formatter.rb +2 -2
  194. data/lib/rubocop/formatter/clang_style_formatter.rb +9 -6
  195. data/lib/rubocop/formatter/emacs_style_formatter.rb +22 -9
  196. data/lib/rubocop/formatter/file_list_formatter.rb +1 -1
  197. data/lib/rubocop/formatter/formatter_set.rb +16 -15
  198. data/lib/rubocop/formatter/json_formatter.rb +6 -5
  199. data/lib/rubocop/formatter/pacman_formatter.rb +80 -0
  200. data/lib/rubocop/formatter/simple_text_formatter.rb +16 -4
  201. data/lib/rubocop/formatter/tap_formatter.rb +18 -7
  202. data/lib/rubocop/magic_comment.rb +4 -0
  203. data/lib/rubocop/node_pattern.rb +4 -2
  204. data/lib/rubocop/options.rb +21 -26
  205. data/lib/rubocop/processed_source.rb +1 -1
  206. data/lib/rubocop/rake_task.rb +1 -0
  207. data/lib/rubocop/result_cache.rb +24 -8
  208. data/lib/rubocop/runner.rb +60 -33
  209. data/lib/rubocop/target_finder.rb +12 -6
  210. data/lib/rubocop/version.rb +1 -1
  211. metadata +48 -33
  212. data/lib/rubocop/cop/mixin/ignored_method_patterns.rb +0 -19
  213. data/lib/rubocop/cop/mixin/safe_mode.rb +0 -22
@@ -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)
@@ -9,11 +9,11 @@ module RuboCop
9
9
  #
10
10
  # @example
11
11
  # RuboCop::Cop::MessageAnnotator.new(
12
- # config, cop_config, @options
13
- # ).annotate('message', 'Cop/CopName')
12
+ # config, cop_name, cop_config, @options
13
+ # ).annotate('message')
14
14
  # #=> 'Cop/CopName: message (http://example.org/styleguide)'
15
15
  class MessageAnnotator
16
- attr_reader :options, :config, :cop_config
16
+ attr_reader :options, :config, :cop_name, :cop_config
17
17
 
18
18
  @style_guide_urls = {}
19
19
 
@@ -29,6 +29,7 @@ module RuboCop
29
29
  # :ExtraDetails [Boolean] Include cop details
30
30
  # :DisplayCopNames [Boolean] Include cop name
31
31
  #
32
+ # @param [String] cop_name for specific cop name
32
33
  # @param [Hash] cop_config configs for specific cop, from config#for_cop
33
34
  # @option cop_config [String] :StyleGuide Extension of base styleguide URL
34
35
  # @option cop_config [String] :Reference Full reference URL
@@ -43,8 +44,9 @@ module RuboCop
43
44
  # Include debug output
44
45
  # @option options [Boolean] :display_cop_names
45
46
  # Include cop name
46
- def initialize(config, cop_config, options)
47
+ def initialize(config, cop_name, cop_config, options)
47
48
  @config = config
49
+ @cop_name = cop_name
48
50
  @cop_config = cop_config || {}
49
51
  @options = options
50
52
  end
@@ -53,8 +55,8 @@ module RuboCop
53
55
  # based on params passed into initializer
54
56
  #
55
57
  # @return [String] annotated message
56
- def annotate(message, name)
57
- message = "#{name}: #{message}" if display_cop_names?
58
+ def annotate(message)
59
+ message = "#{cop_name}: #{message}" if display_cop_names?
58
60
  message += " #{details}" if extra_details? && details
59
61
  if display_style_guide?
60
62
  links = urls.join(', ')
@@ -74,7 +76,7 @@ module RuboCop
74
76
  return nil if url.nil? || url.empty?
75
77
 
76
78
  self.class.style_guide_urls[url] ||= begin
77
- base_url = config.for_all_cops['StyleGuideBaseURL']
79
+ base_url = style_guide_base_url
78
80
  if base_url.nil? || base_url.empty?
79
81
  url
80
82
  else
@@ -83,6 +85,13 @@ module RuboCop
83
85
  end
84
86
  end
85
87
 
88
+ def style_guide_base_url
89
+ department_name = cop_name.split('/').first
90
+
91
+ config.for_department(department_name)['StyleGuideBaseURL'] ||
92
+ config.for_all_cops['StyleGuideBaseURL']
93
+ end
94
+
86
95
  def display_style_guide?
87
96
  (options[:display_style_guide] ||
88
97
  config.for_all_cops['DisplayStyleGuide']) &&
@@ -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
@@ -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
@@ -13,7 +13,7 @@ module RuboCop
13
13
 
14
14
  def configured_indentation_width
15
15
  cop_config['IndentationWidth'] ||
16
- config.for_cop('IndentationWidth')['Width']
16
+ config.for_cop('Layout/IndentationWidth')['Width']
17
17
  end
18
18
 
19
19
  def indentation(node)
@@ -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
@@ -12,7 +12,7 @@ module RuboCop
12
12
 
13
13
  def frozen_string_literal_comment_exists?
14
14
  leading_comment_lines.any? do |line|
15
- MagicComment.parse(line).frozen_string_literal_specified?
15
+ MagicComment.parse(line).valid_literal_value?
16
16
  end
17
17
  end
18
18
 
@@ -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
@@ -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 Whitelist.
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 + whitelist
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 whitelist
21
- cop_config['Whitelist'].map(&:to_sym)
20
+ def allowed_methods
21
+ cop_config['AllowedMethods'].map(&:to_sym)
22
22
  end
23
23
  end
24
24
  end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ # Common functionality for handling Rational literals.
6
+ module RationalLiteral
7
+ extend NodePattern::Macros
8
+
9
+ private
10
+
11
+ def_node_matcher :rational_literal?, <<~PATTERN
12
+ (send
13
+ (int _) :/
14
+ (rational _))
15
+ PATTERN
16
+ end
17
+ end
18
+ end