rubocop 0.58.2 → 0.59.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 (211) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/config/default.yml +22 -7
  4. data/config/disabled.yml +33 -4
  5. data/config/enabled.yml +4 -11
  6. data/lib/rubocop.rb +5 -0
  7. data/lib/rubocop/ast/builder.rb +1 -0
  8. data/lib/rubocop/ast/node.rb +11 -33
  9. data/lib/rubocop/ast/node/block_node.rb +8 -1
  10. data/lib/rubocop/ast/node/defined_node.rb +13 -0
  11. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +16 -5
  12. data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +21 -0
  13. data/lib/rubocop/ast/node/send_node.rb +3 -12
  14. data/lib/rubocop/ast/traversal.rb +10 -0
  15. data/lib/rubocop/cli.rb +4 -1
  16. data/lib/rubocop/config.rb +21 -5
  17. data/lib/rubocop/config_loader.rb +2 -0
  18. data/lib/rubocop/config_loader_resolver.rb +3 -1
  19. data/lib/rubocop/cop/autocorrect_logic.rb +1 -0
  20. data/lib/rubocop/cop/bundler/gem_comment.rb +64 -0
  21. data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -0
  22. data/lib/rubocop/cop/commissioner.rb +2 -0
  23. data/lib/rubocop/cop/cop.rb +3 -0
  24. data/lib/rubocop/cop/corrector.rb +2 -0
  25. data/lib/rubocop/cop/correctors/alignment_corrector.rb +1 -0
  26. data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -0
  27. data/lib/rubocop/cop/correctors/space_corrector.rb +2 -0
  28. data/lib/rubocop/cop/force.rb +1 -0
  29. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -0
  30. data/lib/rubocop/cop/generator.rb +1 -0
  31. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -0
  32. data/lib/rubocop/cop/layout/class_structure.rb +4 -0
  33. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +5 -4
  34. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +35 -0
  35. data/lib/rubocop/cop/layout/else_alignment.rb +1 -0
  36. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +2 -0
  37. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +1 -0
  38. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +5 -2
  39. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +1 -0
  40. data/lib/rubocop/cop/layout/end_of_line.rb +1 -0
  41. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -0
  42. data/lib/rubocop/cop/layout/indent_array.rb +1 -0
  43. data/lib/rubocop/cop/layout/indent_heredoc.rb +3 -0
  44. data/lib/rubocop/cop/layout/indentation_width.rb +2 -0
  45. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +1 -0
  46. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +2 -1
  47. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +34 -11
  48. data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -0
  49. data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
  50. data/lib/rubocop/cop/layout/space_around_keyword.rb +3 -1
  51. data/lib/rubocop/cop/layout/space_around_operators.rb +1 -0
  52. data/lib/rubocop/cop/layout/space_before_comment.rb +1 -0
  53. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +16 -8
  54. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +2 -0
  55. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +1 -1
  56. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +2 -0
  57. data/lib/rubocop/cop/layout/tab.rb +1 -0
  58. data/lib/rubocop/cop/layout/trailing_whitespace.rb +1 -0
  59. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -0
  60. data/lib/rubocop/cop/lint/duplicate_methods.rb +9 -1
  61. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +1 -0
  62. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -0
  63. data/lib/rubocop/cop/lint/interpolation_check.rb +2 -0
  64. data/lib/rubocop/cop/lint/literal_as_condition.rb +3 -6
  65. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +1 -0
  66. data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -0
  67. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -0
  68. data/lib/rubocop/cop/lint/rescue_type.rb +1 -0
  69. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +2 -2
  70. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +2 -0
  71. data/lib/rubocop/cop/lint/script_permission.rb +1 -0
  72. data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -0
  73. data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -0
  74. data/lib/rubocop/cop/lint/unneeded_cop_disable_directive.rb +1 -0
  75. data/lib/rubocop/cop/lint/unneeded_cop_enable_directive.rb +1 -0
  76. data/lib/rubocop/cop/lint/unneeded_require_statement.rb +1 -0
  77. data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +1 -1
  78. data/lib/rubocop/cop/lint/unreachable_code.rb +2 -0
  79. data/lib/rubocop/cop/lint/useless_assignment.rb +1 -0
  80. data/lib/rubocop/cop/lint/useless_setter_call.rb +3 -0
  81. data/lib/rubocop/cop/lint/void.rb +1 -0
  82. data/lib/rubocop/cop/message_annotator.rb +1 -0
  83. data/lib/rubocop/cop/metrics/block_length.rb +1 -0
  84. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -0
  85. data/lib/rubocop/cop/metrics/line_length.rb +6 -1
  86. data/lib/rubocop/cop/metrics/method_length.rb +1 -0
  87. data/lib/rubocop/cop/mixin/annotation_comment.rb +1 -0
  88. data/lib/rubocop/cop/mixin/classish_length.rb +1 -0
  89. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -0
  90. data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -0
  91. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +12 -6
  92. data/lib/rubocop/cop/mixin/empty_parameter.rb +1 -0
  93. data/lib/rubocop/cop/mixin/ignored_methods.rb +19 -0
  94. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +25 -1
  95. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +5 -3
  96. data/lib/rubocop/cop/mixin/percent_literal.rb +2 -0
  97. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +2 -0
  98. data/lib/rubocop/cop/mixin/safe_assignment.rb +2 -1
  99. data/lib/rubocop/cop/mixin/statement_modifier.rb +6 -1
  100. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -0
  101. data/lib/rubocop/cop/mixin/surrounding_space.rb +4 -0
  102. data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -0
  103. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +2 -0
  104. data/lib/rubocop/cop/naming/ascii_identifiers.rb +1 -0
  105. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -0
  106. data/lib/rubocop/cop/naming/file_name.rb +4 -1
  107. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -0
  108. data/lib/rubocop/cop/naming/predicate_name.rb +1 -0
  109. data/lib/rubocop/cop/naming/uncommunicative_block_param_name.rb +1 -0
  110. data/lib/rubocop/cop/naming/uncommunicative_method_param_name.rb +1 -0
  111. data/lib/rubocop/cop/naming/variable_name.rb +1 -0
  112. data/lib/rubocop/cop/performance/case_when_splat.rb +11 -7
  113. data/lib/rubocop/cop/performance/casecmp.rb +33 -42
  114. data/lib/rubocop/cop/performance/chain_array_allocation.rb +77 -0
  115. data/lib/rubocop/cop/performance/compare_with_block.rb +3 -0
  116. data/lib/rubocop/cop/performance/regexp_match.rb +1 -0
  117. data/lib/rubocop/cop/performance/sample.rb +2 -0
  118. data/lib/rubocop/cop/performance/size.rb +8 -2
  119. data/lib/rubocop/cop/performance/string_replacement.rb +1 -0
  120. data/lib/rubocop/cop/rails/active_support_aliases.rb +1 -0
  121. data/lib/rubocop/cop/rails/bulk_change_table.rb +9 -2
  122. data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +1 -0
  123. data/lib/rubocop/cop/rails/delegate.rb +7 -2
  124. data/lib/rubocop/cop/rails/dynamic_find_by.rb +1 -0
  125. data/lib/rubocop/cop/rails/find_each.rb +7 -2
  126. data/lib/rubocop/cop/rails/http_positional_arguments.rb +1 -1
  127. data/lib/rubocop/cop/rails/http_status.rb +2 -0
  128. data/lib/rubocop/cop/rails/inverse_of.rb +4 -0
  129. data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +1 -0
  130. data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +1 -0
  131. data/lib/rubocop/cop/rails/reversible_migration.rb +1 -0
  132. data/lib/rubocop/cop/rails/save_bang.rb +189 -38
  133. data/lib/rubocop/cop/rails/time_zone.rb +1 -0
  134. data/lib/rubocop/cop/security/eval.rb +1 -0
  135. data/lib/rubocop/cop/security/json_load.rb +2 -2
  136. data/lib/rubocop/cop/security/open.rb +6 -3
  137. data/lib/rubocop/cop/severity.rb +1 -0
  138. data/lib/rubocop/cop/style/and_or.rb +3 -3
  139. data/lib/rubocop/cop/style/ascii_comments.rb +1 -0
  140. data/lib/rubocop/cop/style/block_delimiters.rb +2 -4
  141. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +2 -3
  142. data/lib/rubocop/cop/style/class_and_module_children.rb +3 -0
  143. data/lib/rubocop/cop/style/class_vars.rb +1 -1
  144. data/lib/rubocop/cop/style/colon_method_definition.rb +1 -0
  145. data/lib/rubocop/cop/style/commented_keyword.rb +2 -0
  146. data/lib/rubocop/cop/style/conditional_assignment.rb +2 -0
  147. data/lib/rubocop/cop/style/copyright.rb +7 -2
  148. data/lib/rubocop/cop/style/date_time.rb +40 -7
  149. data/lib/rubocop/cop/style/double_negation.rb +1 -1
  150. data/lib/rubocop/cop/style/empty_case_condition.rb +8 -0
  151. data/lib/rubocop/cop/style/empty_else.rb +2 -0
  152. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -0
  153. data/lib/rubocop/cop/style/eval_with_location.rb +2 -0
  154. data/lib/rubocop/cop/style/for.rb +56 -10
  155. data/lib/rubocop/cop/style/format_string_token.rb +1 -1
  156. data/lib/rubocop/cop/style/if_with_semicolon.rb +1 -0
  157. data/lib/rubocop/cop/style/inverse_methods.rb +1 -0
  158. data/lib/rubocop/cop/style/lambda.rb +1 -0
  159. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +3 -5
  160. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +3 -5
  161. data/lib/rubocop/cop/style/method_def_parentheses.rb +2 -2
  162. data/lib/rubocop/cop/style/missing_else.rb +1 -0
  163. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -0
  164. data/lib/rubocop/cop/style/multiline_method_signature.rb +65 -0
  165. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -0
  166. data/lib/rubocop/cop/style/nil_comparison.rb +45 -5
  167. data/lib/rubocop/cop/style/not.rb +1 -1
  168. data/lib/rubocop/cop/style/numeric_predicate.rb +5 -0
  169. data/lib/rubocop/cop/style/one_line_conditional.rb +1 -1
  170. data/lib/rubocop/cop/style/or_assignment.rb +2 -0
  171. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
  172. data/lib/rubocop/cop/style/random_with_offset.rb +1 -0
  173. data/lib/rubocop/cop/style/redundant_begin.rb +13 -0
  174. data/lib/rubocop/cop/style/redundant_conditional.rb +1 -0
  175. data/lib/rubocop/cop/style/redundant_parentheses.rb +6 -1
  176. data/lib/rubocop/cop/style/redundant_return.rb +1 -0
  177. data/lib/rubocop/cop/style/rescue_modifier.rb +1 -0
  178. data/lib/rubocop/cop/style/rescue_standard_error.rb +1 -0
  179. data/lib/rubocop/cop/style/safe_navigation.rb +4 -0
  180. data/lib/rubocop/cop/style/semicolon.rb +4 -0
  181. data/lib/rubocop/cop/style/signal_exception.rb +1 -0
  182. data/lib/rubocop/cop/style/string_hash_keys.rb +1 -0
  183. data/lib/rubocop/cop/style/symbol_proc.rb +1 -8
  184. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +1 -0
  185. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -0
  186. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +1 -0
  187. data/lib/rubocop/cop/style/unneeded_condition.rb +13 -2
  188. data/lib/rubocop/cop/style/unneeded_percent_q.rb +2 -0
  189. data/lib/rubocop/cop/style/word_array.rb +13 -1
  190. data/lib/rubocop/cop/team.rb +1 -0
  191. data/lib/rubocop/cop/variable_force.rb +5 -0
  192. data/lib/rubocop/cop/variable_force/assignment.rb +4 -0
  193. data/lib/rubocop/cop/variable_force/branch.rb +4 -0
  194. data/lib/rubocop/cop/variable_force/branchable.rb +2 -0
  195. data/lib/rubocop/cop/variable_force/scope.rb +6 -0
  196. data/lib/rubocop/cop/variable_force/variable_table.rb +1 -0
  197. data/lib/rubocop/file_finder.rb +2 -0
  198. data/lib/rubocop/formatter/disabled_config_formatter.rb +4 -4
  199. data/lib/rubocop/formatter/file_list_formatter.rb +1 -0
  200. data/lib/rubocop/formatter/simple_text_formatter.rb +1 -0
  201. data/lib/rubocop/options.rb +16 -0
  202. data/lib/rubocop/path_util.rb +16 -1
  203. data/lib/rubocop/processed_source.rb +4 -0
  204. data/lib/rubocop/remote_config.rb +6 -1
  205. data/lib/rubocop/result_cache.rb +1 -0
  206. data/lib/rubocop/rspec/cop_helper.rb +3 -5
  207. data/lib/rubocop/rspec/shared_examples.rb +1 -9
  208. data/lib/rubocop/runner.rb +4 -0
  209. data/lib/rubocop/target_finder.rb +2 -0
  210. data/lib/rubocop/version.rb +1 -1
  211. metadata +7 -2
@@ -84,6 +84,27 @@ module RuboCop
84
84
  def const_receiver?
85
85
  receiver && receiver.const_type?
86
86
  end
87
+
88
+ # Checks whether this is a negation method, i.e. `!` or keyword `not`.
89
+ #
90
+ # @return [Boolean] whether this method is a negation method
91
+ def negation_method?
92
+ receiver && method_name == :!
93
+ end
94
+
95
+ # Checks whether this is a prefix not method, e.g. `not foo`.
96
+ #
97
+ # @return [Boolean] whether this method is a prefix not
98
+ def prefix_not?
99
+ negation_method? && loc.selector.is?('not')
100
+ end
101
+
102
+ # Checks whether this is a prefix bang method, e.g. `!foo`.
103
+ #
104
+ # @return [Boolean] whether this method is a prefix bang
105
+ def prefix_bang?
106
+ negation_method? && loc.selector.is?('!')
107
+ end
87
108
  end
88
109
  end
89
110
  end
@@ -8,29 +8,20 @@ module RuboCop
8
8
  class SendNode < Node
9
9
  include ParameterizedNode
10
10
  include MethodDispatchNode
11
- ARROW = '->'.freeze
12
-
13
- # Checks whether this is a negation method, i.e. `!` or keyword `not`.
14
- #
15
- # @return [Boolean] whether this method is a negation method
16
- def negation_method?
17
- keyword_bang? || keyword_not?
18
- end
19
11
 
20
12
  # Checks whether this is a lambda. Some versions of parser parses
21
13
  # non-literal lambdas as a method send.
22
14
  #
23
15
  # @return [Boolean] whether this method is a lambda
24
16
  def lambda?
25
- parent && parent.block_type? && method?(:lambda)
17
+ block_literal? && method?(:lambda)
26
18
  end
27
19
 
28
20
  # Checks whether this is a stabby lambda. e.g. `-> () {}`
29
21
  #
30
- # @return [Boolean] whether this method is a staby lambda
22
+ # @return [Boolean] whether this method is a stabby lambda
31
23
  def stabby_lambda?
32
- selector = loc.selector
33
- selector && selector.source == ARROW
24
+ loc.selector && loc.selector.source == '->'
34
25
  end
35
26
  end
36
27
  end
@@ -9,6 +9,7 @@ module RuboCop
9
9
  module Traversal
10
10
  def walk(node)
11
11
  return if node.nil?
12
+
12
13
  send(:"on_#{node.type}", node)
13
14
  nil
14
15
  end
@@ -65,6 +66,7 @@ module RuboCop
65
66
 
66
67
  def on_const(node)
67
68
  return unless (child = node.children[0])
69
+
68
70
  send(:"on_#{child.type}", child)
69
71
  end
70
72
 
@@ -74,6 +76,7 @@ module RuboCop
74
76
  send(:"on_#{child.type}", child)
75
77
  end
76
78
  return unless (child = children[2])
79
+
77
80
  send(:"on_#{child.type}", child)
78
81
  end
79
82
 
@@ -85,6 +88,7 @@ module RuboCop
85
88
  send(:"on_#{child.type}", child)
86
89
  end
87
90
  return unless (child = children[2])
91
+
88
92
  send(:"on_#{child.type}", child)
89
93
  end
90
94
 
@@ -92,12 +96,14 @@ module RuboCop
92
96
  children = node.children
93
97
  on_args(children[1])
94
98
  return unless (child = children[2])
99
+
95
100
  send(:"on_#{child.type}", child)
96
101
  end
97
102
 
98
103
  def on_send(node)
99
104
  node.children.each_with_index do |child, i|
100
105
  next if i == 1
106
+
101
107
  send(:"on_#{child.type}", child) if child
102
108
  end
103
109
  nil
@@ -119,6 +125,7 @@ module RuboCop
119
125
  send(:"on_#{child.type}", child)
120
126
  on_args(children[2])
121
127
  return unless (child = children[3])
128
+
122
129
  send(:"on_#{child.type}", child)
123
130
  end
124
131
 
@@ -130,6 +137,7 @@ module RuboCop
130
137
  send(:"on_#{child.type}", child)
131
138
  end
132
139
  return unless (child = children[2])
140
+
133
141
  send(:"on_#{child.type}", child)
134
142
  end
135
143
 
@@ -138,6 +146,7 @@ module RuboCop
138
146
  child = children[0]
139
147
  send(:"on_#{child.type}", child)
140
148
  return unless (child = children[1])
149
+
141
150
  send(:"on_#{child.type}", child)
142
151
  end
143
152
 
@@ -151,6 +160,7 @@ module RuboCop
151
160
  send(:"on_#{child.type}", child) # can be send, zsuper...
152
161
  on_args(children[1])
153
162
  return unless (child = children[2])
163
+
154
164
  send(:"on_#{child.type}", child)
155
165
  end
156
166
 
@@ -159,7 +159,9 @@ module RuboCop
159
159
  display_error_summary(runner.errors)
160
160
  maybe_print_corrected_source
161
161
 
162
- if all_passed && !runner.aborting? && runner.errors.empty?
162
+ all_pass_or_excluded = all_passed || @options[:auto_gen_config]
163
+
164
+ if all_pass_or_excluded && !runner.aborting? && runner.errors.empty?
163
165
  STATUS_SUCCESS
164
166
  else
165
167
  STATUS_OFFENSES
@@ -277,6 +279,7 @@ module RuboCop
277
279
  # So a delimiter is needed for tools to easily identify where the
278
280
  # autocorrected source begins
279
281
  return unless @options[:stdin] && @options[:auto_correct]
282
+
280
283
  puts '=' * 20
281
284
  print @options[:stdin]
282
285
  end
@@ -373,8 +373,20 @@ module RuboCop
373
373
  absolute_file_path = File.expand_path(file)
374
374
 
375
375
  patterns_to_include.any? do |pattern|
376
- match_path?(pattern, relative_file_path) ||
377
- match_path?(pattern, absolute_file_path)
376
+ if block_given?
377
+ yield pattern, relative_file_path, absolute_file_path
378
+ else
379
+ match_path?(pattern, relative_file_path) ||
380
+ match_path?(pattern, absolute_file_path)
381
+ end
382
+ end
383
+ end
384
+
385
+ def allowed_camel_case_file?(file)
386
+ file_to_include?(file) do |pattern, relative_path, absolute_path|
387
+ pattern.to_s =~ /[A-Z]/ &&
388
+ (match_path?(pattern, relative_path) ||
389
+ match_path?(pattern, absolute_path))
378
390
  end
379
391
  end
380
392
 
@@ -396,11 +408,11 @@ module RuboCop
396
408
  end
397
409
 
398
410
  def patterns_to_include
399
- for_all_cops['Include']
411
+ for_all_cops['Include'] || []
400
412
  end
401
413
 
402
414
  def patterns_to_exclude
403
- for_all_cops['Exclude']
415
+ for_all_cops['Exclude'] || []
404
416
  end
405
417
 
406
418
  def path_relative_to_config(path)
@@ -483,6 +495,7 @@ module RuboCop
483
495
 
484
496
  def validate_section_presence(name)
485
497
  return unless key?(name) && self[name].nil?
498
+
486
499
  raise ValidationError,
487
500
  "empty section #{name} found in #{smart_loaded_path}"
488
501
  end
@@ -546,6 +559,7 @@ module RuboCop
546
559
  def obsolete_cops
547
560
  OBSOLETE_COPS.map do |cop_name, message|
548
561
  next unless key?(cop_name) || key?(Cop::Badge.parse(cop_name).cop_name)
562
+
549
563
  message + "\n(obsolete configuration found in #{smart_loaded_path}," \
550
564
  ' please update it)'
551
565
  end
@@ -615,7 +629,8 @@ module RuboCop
615
629
  # "RUBY VERSION" line.
616
630
  in_ruby_section ||= line.match(/^\s*RUBY\s*VERSION\s*$/)
617
631
  next unless in_ruby_section
618
- # We currently only allow this feature to work with MRI ruby. If jruby
632
+
633
+ # We currently only allow this feature to work with MRI ruby. If jruby
619
634
  # (or something else) is used by the project, it's lock file will have a
620
635
  # line that looks like:
621
636
  # RUBY VERSION
@@ -645,6 +660,7 @@ module RuboCop
645
660
 
646
661
  def bundler_lock_file_path
647
662
  return nil unless loaded_path
663
+
648
664
  base_path = base_dir_for_path_parameters
649
665
  ['gems.locked', 'Gemfile.lock'].each do |file_name|
650
666
  path = find_file_upwards(file_name, base_path)
@@ -95,6 +95,7 @@ module RuboCop
95
95
  return if found_files.empty?
96
96
  return if PathUtil.relative_path(found_files.last) ==
97
97
  PathUtil.relative_path(config_file)
98
+
98
99
  print 'AllCops/Exclude ' if debug?
99
100
  config.add_excludes_from_higher_level(load_file(found_files.last))
100
101
  end
@@ -129,6 +130,7 @@ module RuboCop
129
130
  if File.exist?(DOTFILE)
130
131
  files = Array(load_yaml_configuration(DOTFILE)['inherit_from'])
131
132
  return if files.include?(AUTO_GENERATED_FILE)
133
+
132
134
  files.unshift(AUTO_GENERATED_FILE)
133
135
  file_string = "\n - " + files.join("\n - ") if files.size > 1
134
136
  rubocop_yml_contents = IO.read(DOTFILE, encoding: Encoding::UTF_8)
@@ -23,6 +23,7 @@ module RuboCop
23
23
  .reverse.each_with_index do |base_config, index|
24
24
  base_config.each do |k, v|
25
25
  next unless v.is_a?(Hash)
26
+
26
27
  if hash.key?(k)
27
28
  v = merge(v, hash[k],
28
29
  cop_name: k, file: file, debug: debug,
@@ -51,7 +52,7 @@ module RuboCop
51
52
 
52
53
  # Merges the given configuration with the default one. If
53
54
  # AllCops:DisabledByDefault is true, it changes the Enabled params so that
54
- # only cops from user configuration are enabled. If
55
+ # only cops from user configuration are enabled. If
55
56
  # AllCops::EnabledByDefault is true, it changes the Enabled params so that
56
57
  # only cops explicitly disabled in user configuration are disabled.
57
58
  def merge_with_default(config, config_file)
@@ -102,6 +103,7 @@ module RuboCop
102
103
  return false if inherited_file.start_with?('..') # Legitimate override
103
104
  return false if base_hash[key] == derived_hash[key] # Same value
104
105
  return false if remote_file?(inherited_file) # Can't change
106
+
105
107
  Gem.path.none? { |dir| inherited_file.start_with?(dir) } # Can change?
106
108
  end
107
109
 
@@ -19,6 +19,7 @@ module RuboCop
19
19
  def autocorrect_enabled?
20
20
  # allow turning off autocorrect on a cop by cop basis
21
21
  return true unless cop_config
22
+
22
23
  cop_config['AutoCorrect'] != false
23
24
  end
24
25
  end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Bundler
6
+ # Add a comment describing each gem in your Gemfile.
7
+ #
8
+ # @example
9
+ # # bad
10
+ #
11
+ # gem 'foo'
12
+ #
13
+ # # good
14
+ #
15
+ # # Helpers for the foo things.
16
+ # gem 'foo'
17
+ #
18
+ class GemComment < Cop
19
+ include DefNode
20
+
21
+ MSG = 'Missing gem description comment.'.freeze
22
+
23
+ def_node_matcher :gem_declaration?, '(send nil? :gem str ...)'
24
+
25
+ def on_send(node)
26
+ return unless gem_declaration?(node)
27
+ return if whitelisted_gem?(node)
28
+ return if commented?(node)
29
+
30
+ add_offense(node)
31
+ end
32
+
33
+ private
34
+
35
+ def commented?(node)
36
+ preceding_lines = preceding_lines(node)
37
+ preceding_comment?(node, preceding_lines.last)
38
+ end
39
+
40
+ # The args node1 & node2 may represent a RuboCop::AST::Node
41
+ # or a Parser::Source::Comment. Both respond to #loc.
42
+ def precede?(node1, node2)
43
+ node2.loc.line - node1.loc.line == 1
44
+ end
45
+
46
+ def preceding_lines(node)
47
+ processed_source.ast_with_comments[node].select do |line|
48
+ line.loc.line < node.loc.line
49
+ end
50
+ end
51
+
52
+ def preceding_comment?(node1, node2)
53
+ node1 && node2 && precede?(node2, node1) &&
54
+ comment_line?(node2.loc.expression.source)
55
+ end
56
+
57
+ def whitelisted_gem?(node)
58
+ whitelist = Array(cop_config['Whitelist'])
59
+ whitelist.include?(node.first_argument.value)
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -34,6 +34,7 @@ module RuboCop
34
34
 
35
35
  def investigate(processed_source)
36
36
  return if processed_source.blank?
37
+
37
38
  gem_declarations(processed_source.ast)
38
39
  .each_cons(2) do |previous, current|
39
40
  next unless consecutive_lines(previous, current)
@@ -41,6 +42,7 @@ module RuboCop
41
42
  gem_name(current),
42
43
  gem_name(previous)
43
44
  )
45
+
44
46
  register_offense(previous, current)
45
47
  end
46
48
  end
@@ -29,6 +29,7 @@ module RuboCop
29
29
  Parser::Meta::NODE_TYPES.each do |node_type|
30
30
  method_name = :"on_#{node_type}"
31
31
  next unless method_defined?(method_name)
32
+
32
33
  define_method(method_name) do |node|
33
34
  trigger_responding_cops(method_name, node)
34
35
  super(node) unless NO_CHILD_NODES.include?(node_type)
@@ -105,6 +106,7 @@ module RuboCop
105
106
  yield
106
107
  rescue StandardError => e
107
108
  raise e if @options[:raise_error]
109
+
108
110
  if node
109
111
  line = node.first_line
110
112
  column = node.loc.column
@@ -152,6 +152,7 @@ module RuboCop
152
152
  @corrected_nodes[node] = true
153
153
  correction = autocorrect(node)
154
154
  return :uncorrected unless correction
155
+
155
156
  @corrections << correction
156
157
  :corrected
157
158
  end
@@ -204,6 +205,7 @@ module RuboCop
204
205
  def file_name_matches_any?(file, parameter, default_result)
205
206
  patterns = cop_config[parameter]
206
207
  return default_result unless patterns
208
+
207
209
  path = nil
208
210
  patterns.any? do |pattern|
209
211
  # Try to match the absolute path, as Exclude properties are absolute.
@@ -217,6 +219,7 @@ module RuboCop
217
219
 
218
220
  def enabled_line?(line_number)
219
221
  return true unless @processed_source
222
+
220
223
  @processed_source.comment_config.cop_enabled_at_line?(self, line_number)
221
224
  end
222
225
 
@@ -34,6 +34,7 @@ module RuboCop
34
34
  @source_buffer = source_buffer
35
35
  raise 'source_buffer should be a Parser::Source::Buffer' unless \
36
36
  source_buffer.is_a? Parser::Source::Buffer
37
+
37
38
  @corrections = corrections
38
39
  @source_rewriter = Parser::Source::TreeRewriter.new(
39
40
  source_buffer,
@@ -155,6 +156,7 @@ module RuboCop
155
156
  # :nodoc:
156
157
  def validate_range(range)
157
158
  return if range.source_buffer == @source_buffer
159
+
158
160
  unless range.source_buffer.is_a?(Parser::Source::Buffer)
159
161
  # actually this should be enforced by parser gem
160
162
  raise 'Corrector expected range source buffer to be a '\
@@ -14,6 +14,7 @@ module RuboCop
14
14
 
15
15
  def correct(processed_source, node, column_delta)
16
16
  return unless node
17
+
17
18
  @processed_source = processed_source
18
19
  expr = node.respond_to?(:loc) ? node.loc.expression : node
19
20
  return if block_comment_within?(expr)
@@ -36,6 +36,7 @@ module RuboCop
36
36
 
37
37
  def move_comment(eol_comment:, node:, corrector:)
38
38
  return unless eol_comment
39
+
39
40
  text = eol_comment.loc.expression.source
40
41
  corrector.insert_before(node.source_range,
41
42
  text + "\n" + (' ' * node.loc.keyword.column))
@@ -46,6 +47,7 @@ module RuboCop
46
47
 
47
48
  def remove_semicolon(node, corrector)
48
49
  return unless semicolon(node)
50
+
49
51
  corrector.remove(semicolon(node).pos)
50
52
  end
51
53
 
@@ -29,6 +29,7 @@ module RuboCop
29
29
  corrector.remove(range)
30
30
  end
31
31
  return unless right_token.space_before?
32
+
32
33
  range = side_space_range(range: right_token.pos, side: :left)
33
34
  corrector.remove(range)
34
35
  end
@@ -39,6 +40,7 @@ module RuboCop
39
40
  corrector.insert_after(left_token.pos, ' ')
40
41
  end
41
42
  return if right_token.space_before?
43
+
42
44
  corrector.insert_before(right_token.pos, ' ')
43
45
  end
44
46
  end