rubocop 0.89.1 → 0.90.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 (256) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/config/default.yml +79 -11
  4. data/lib/rubocop.rb +13 -0
  5. data/lib/rubocop/cached_data.rb +1 -0
  6. data/lib/rubocop/cli/command.rb +1 -0
  7. data/lib/rubocop/cli/command/auto_genenerate_config.rb +1 -0
  8. data/lib/rubocop/cli/command/base.rb +1 -0
  9. data/lib/rubocop/cli/command/execute_runner.rb +1 -0
  10. data/lib/rubocop/cli/command/init_dotfile.rb +1 -0
  11. data/lib/rubocop/cli/command/show_cops.rb +1 -0
  12. data/lib/rubocop/cli/command/version.rb +1 -0
  13. data/lib/rubocop/cli/environment.rb +1 -0
  14. data/lib/rubocop/comment_config.rb +5 -0
  15. data/lib/rubocop/config_loader.rb +17 -6
  16. data/lib/rubocop/config_loader_resolver.rb +1 -0
  17. data/lib/rubocop/config_obsoletion.rb +1 -0
  18. data/lib/rubocop/config_validator.rb +3 -0
  19. data/lib/rubocop/cop/base.rb +23 -0
  20. data/lib/rubocop/cop/bundler/gem_comment.rb +7 -3
  21. data/lib/rubocop/cop/commissioner.rb +47 -7
  22. data/lib/rubocop/cop/correctors/alignment_corrector.rb +4 -4
  23. data/lib/rubocop/cop/correctors/condition_corrector.rb +3 -5
  24. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +9 -10
  25. data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -2
  26. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +8 -3
  27. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -8
  28. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +4 -9
  29. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +8 -10
  30. data/lib/rubocop/cop/documentation.rb +22 -0
  31. data/lib/rubocop/cop/generator.rb +1 -0
  32. data/lib/rubocop/cop/layout/block_alignment.rb +23 -19
  33. data/lib/rubocop/cop/layout/class_structure.rb +10 -9
  34. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +4 -6
  35. data/lib/rubocop/cop/layout/condition_position.rb +13 -15
  36. data/lib/rubocop/cop/layout/def_end_alignment.rb +7 -4
  37. data/lib/rubocop/cop/layout/dot_position.rb +21 -17
  38. data/lib/rubocop/cop/layout/empty_comment.rb +30 -23
  39. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +19 -16
  40. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +13 -13
  41. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +144 -0
  42. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +21 -23
  43. data/lib/rubocop/cop/layout/empty_lines.rb +6 -7
  44. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +4 -6
  45. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +7 -8
  46. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +3 -6
  47. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -5
  48. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +2 -5
  49. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -5
  50. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +2 -5
  51. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -5
  52. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +2 -5
  53. data/lib/rubocop/cop/layout/end_alignment.rb +6 -7
  54. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +2 -5
  55. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +2 -5
  56. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +4 -8
  57. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +2 -5
  58. data/lib/rubocop/cop/layout/hash_alignment.rb +17 -20
  59. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +15 -14
  60. data/lib/rubocop/cop/layout/heredoc_indentation.rb +14 -11
  61. data/lib/rubocop/cop/layout/initial_indentation.rb +6 -7
  62. data/lib/rubocop/cop/layout/leading_comment_space.rb +11 -9
  63. data/lib/rubocop/cop/layout/leading_empty_lines.rb +6 -11
  64. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +2 -5
  65. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +2 -5
  66. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +10 -14
  67. data/lib/rubocop/cop/layout/multiline_block_layout.rb +21 -19
  68. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +2 -5
  69. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +2 -5
  70. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +5 -9
  71. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -5
  72. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +2 -5
  73. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +18 -21
  74. data/lib/rubocop/cop/layout/space_after_colon.rb +11 -7
  75. data/lib/rubocop/cop/layout/space_after_comma.rb +2 -5
  76. data/lib/rubocop/cop/layout/space_after_method_name.rb +5 -6
  77. data/lib/rubocop/cop/layout/space_after_not.rb +9 -11
  78. data/lib/rubocop/cop/layout/space_after_semicolon.rb +2 -5
  79. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +20 -15
  80. data/lib/rubocop/cop/layout/space_around_keyword.rb +17 -18
  81. data/lib/rubocop/cop/layout/space_around_operators.rb +17 -16
  82. data/lib/rubocop/cop/layout/space_before_block_braces.rb +23 -22
  83. data/lib/rubocop/cop/layout/space_before_comma.rb +3 -5
  84. data/lib/rubocop/cop/layout/space_before_comment.rb +10 -7
  85. data/lib/rubocop/cop/layout/space_before_first_arg.rb +7 -7
  86. data/lib/rubocop/cop/layout/space_before_semicolon.rb +2 -5
  87. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -17
  88. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +13 -16
  89. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -8
  90. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +17 -16
  91. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +16 -19
  92. data/lib/rubocop/cop/layout/space_inside_parens.rb +9 -14
  93. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +5 -10
  94. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +8 -17
  95. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +13 -16
  96. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +10 -11
  97. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +10 -15
  98. data/lib/rubocop/cop/layout/trailing_whitespace.rb +11 -11
  99. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +1 -1
  100. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
  101. data/lib/rubocop/cop/lint/duplicate_require.rb +41 -0
  102. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +0 -11
  103. data/lib/rubocop/cop/lint/empty_file.rb +53 -0
  104. data/lib/rubocop/cop/lint/missing_super.rb +2 -2
  105. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +2 -35
  106. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +9 -19
  107. data/lib/rubocop/cop/lint/percent_string_array.rb +8 -12
  108. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +4 -4
  109. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
  110. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +57 -0
  111. data/lib/rubocop/cop/lint/useless_method_definition.rb +77 -0
  112. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +2 -0
  113. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -0
  114. data/lib/rubocop/cop/mixin/alignment.rb +3 -0
  115. data/lib/rubocop/cop/mixin/allowed_methods.rb +2 -0
  116. data/lib/rubocop/cop/mixin/annotation_comment.rb +5 -0
  117. data/lib/rubocop/cop/mixin/check_line_breakable.rb +16 -7
  118. data/lib/rubocop/cop/mixin/comments_help.rb +54 -0
  119. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +8 -7
  120. data/lib/rubocop/cop/mixin/empty_parameter.rb +3 -1
  121. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +3 -1
  122. data/lib/rubocop/cop/mixin/first_element_line_break.rb +3 -1
  123. data/lib/rubocop/cop/mixin/hash_transform_method.rb +17 -0
  124. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +3 -1
  125. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +12 -10
  126. data/lib/rubocop/cop/mixin/negative_conditional.rb +2 -2
  127. data/lib/rubocop/cop/mixin/percent_array.rb +14 -3
  128. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +1 -1
  129. data/lib/rubocop/cop/mixin/rescue_node.rb +10 -1
  130. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +4 -3
  131. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +4 -3
  132. data/lib/rubocop/cop/mixin/surrounding_space.rb +8 -4
  133. data/lib/rubocop/cop/mixin/trailing_comma.rb +7 -7
  134. data/lib/rubocop/cop/offense.rb +1 -0
  135. data/lib/rubocop/cop/severity.rb +0 -8
  136. data/lib/rubocop/cop/style/case_equality.rb +8 -3
  137. data/lib/rubocop/cop/style/case_like_if.rb +20 -4
  138. data/lib/rubocop/cop/style/class_methods_definitions.rb +131 -0
  139. data/lib/rubocop/cop/style/combinable_loops.rb +89 -0
  140. data/lib/rubocop/cop/style/empty_block_parameter.rb +9 -10
  141. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +9 -10
  142. data/lib/rubocop/cop/style/guard_clause.rb +1 -0
  143. data/lib/rubocop/cop/style/hash_syntax.rb +6 -5
  144. data/lib/rubocop/cop/style/hash_transform_keys.rb +14 -1
  145. data/lib/rubocop/cop/style/hash_transform_values.rb +14 -1
  146. data/lib/rubocop/cop/style/if_unless_modifier.rb +2 -2
  147. data/lib/rubocop/cop/style/keyword_parameters_order.rb +58 -0
  148. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +10 -1
  149. data/lib/rubocop/cop/style/multiline_when_then.rb +2 -2
  150. data/lib/rubocop/cop/style/negated_if.rb +6 -6
  151. data/lib/rubocop/cop/style/negated_unless.rb +6 -6
  152. data/lib/rubocop/cop/style/negated_while.rb +7 -15
  153. data/lib/rubocop/cop/style/nested_modifier.rb +10 -13
  154. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +11 -11
  155. data/lib/rubocop/cop/style/nested_ternary_operator.rb +14 -16
  156. data/lib/rubocop/cop/style/next.rb +10 -14
  157. data/lib/rubocop/cop/style/nil_comparison.rb +11 -11
  158. data/lib/rubocop/cop/style/non_nil_check.rb +32 -26
  159. data/lib/rubocop/cop/style/not.rb +19 -26
  160. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +4 -9
  161. data/lib/rubocop/cop/style/numeric_predicate.rb +4 -11
  162. data/lib/rubocop/cop/style/one_line_conditional.rb +71 -23
  163. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  164. data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
  165. data/lib/rubocop/cop/style/or_assignment.rb +13 -10
  166. data/lib/rubocop/cop/style/parallel_assignment.rb +14 -14
  167. data/lib/rubocop/cop/style/parentheses_around_condition.rb +6 -6
  168. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +13 -19
  169. data/lib/rubocop/cop/style/percent_q_literals.rb +8 -10
  170. data/lib/rubocop/cop/style/perl_backrefs.rb +8 -10
  171. data/lib/rubocop/cop/style/preferred_hash_methods.rb +9 -14
  172. data/lib/rubocop/cop/style/proc.rb +6 -6
  173. data/lib/rubocop/cop/style/raise_args.rb +13 -24
  174. data/lib/rubocop/cop/style/random_with_offset.rb +15 -16
  175. data/lib/rubocop/cop/style/redundant_assignment.rb +8 -10
  176. data/lib/rubocop/cop/style/redundant_begin.rb +7 -9
  177. data/lib/rubocop/cop/style/redundant_capital_w.rb +6 -9
  178. data/lib/rubocop/cop/style/redundant_condition.rb +5 -6
  179. data/lib/rubocop/cop/style/redundant_fetch_block.rb +3 -12
  180. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +8 -8
  181. data/lib/rubocop/cop/style/redundant_freeze.rb +3 -6
  182. data/lib/rubocop/cop/style/redundant_interpolation.rb +25 -24
  183. data/lib/rubocop/cop/style/redundant_parentheses.rb +7 -9
  184. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -13
  185. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +5 -14
  186. data/lib/rubocop/cop/style/redundant_self.rb +2 -2
  187. data/lib/rubocop/cop/style/redundant_self_assignment.rb +116 -0
  188. data/lib/rubocop/cop/style/regexp_literal.rb +10 -21
  189. data/lib/rubocop/cop/style/rescue_modifier.rb +29 -9
  190. data/lib/rubocop/cop/style/return_nil.rb +5 -5
  191. data/lib/rubocop/cop/style/safe_navigation.rb +13 -12
  192. data/lib/rubocop/cop/style/sample.rb +10 -13
  193. data/lib/rubocop/cop/style/self_assignment.rb +26 -22
  194. data/lib/rubocop/cop/style/semicolon.rb +6 -9
  195. data/lib/rubocop/cop/style/send.rb +2 -2
  196. data/lib/rubocop/cop/style/signal_exception.rb +21 -19
  197. data/lib/rubocop/cop/style/single_line_block_params.rb +4 -2
  198. data/lib/rubocop/cop/style/single_line_methods.rb +17 -16
  199. data/lib/rubocop/cop/style/slicing_with_range.rb +4 -7
  200. data/lib/rubocop/cop/style/sole_nested_conditional.rb +66 -0
  201. data/lib/rubocop/cop/style/special_global_vars.rb +10 -15
  202. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +17 -21
  203. data/lib/rubocop/cop/style/stderr_puts.rb +4 -6
  204. data/lib/rubocop/cop/style/string_hash_keys.rb +6 -7
  205. data/lib/rubocop/cop/style/string_methods.rb +7 -17
  206. data/lib/rubocop/cop/style/strip.rb +8 -14
  207. data/lib/rubocop/cop/style/struct_inheritance.rb +3 -6
  208. data/lib/rubocop/cop/style/symbol_array.rb +5 -16
  209. data/lib/rubocop/cop/style/symbol_literal.rb +4 -6
  210. data/lib/rubocop/cop/style/symbol_proc.rb +14 -18
  211. data/lib/rubocop/cop/style/ternary_parentheses.rb +21 -20
  212. data/lib/rubocop/cop/style/trailing_body_on_class.rb +3 -6
  213. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +4 -7
  214. data/lib/rubocop/cop/style/trailing_body_on_module.rb +3 -6
  215. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +2 -5
  216. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +2 -5
  217. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +7 -6
  218. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +2 -5
  219. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +8 -17
  220. data/lib/rubocop/cop/style/trivial_accessors.rb +26 -30
  221. data/lib/rubocop/cop/style/unless_else.rb +5 -8
  222. data/lib/rubocop/cop/style/unpack_first.rb +4 -8
  223. data/lib/rubocop/cop/style/variable_interpolation.rb +7 -10
  224. data/lib/rubocop/cop/style/when_then.rb +4 -6
  225. data/lib/rubocop/cop/style/while_until_do.rb +6 -16
  226. data/lib/rubocop/cop/style/while_until_modifier.rb +6 -20
  227. data/lib/rubocop/cop/style/word_array.rb +5 -23
  228. data/lib/rubocop/cop/style/yoda_condition.rb +4 -15
  229. data/lib/rubocop/cop/style/zero_length_predicate.rb +11 -13
  230. data/lib/rubocop/cop/team.rb +1 -0
  231. data/lib/rubocop/cop/util.rb +1 -1
  232. data/lib/rubocop/cop/utils/format_string.rb +3 -5
  233. data/lib/rubocop/cop/variable_force.rb +2 -0
  234. data/lib/rubocop/cops_documentation_generator.rb +4 -2
  235. data/lib/rubocop/core_ext/string.rb +1 -1
  236. data/lib/rubocop/ext/regexp_node.rb +46 -0
  237. data/lib/rubocop/file_finder.rb +1 -0
  238. data/lib/rubocop/formatter/auto_gen_config_formatter.rb +2 -1
  239. data/lib/rubocop/formatter/html_formatter.rb +2 -0
  240. data/lib/rubocop/formatter/progress_formatter.rb +2 -1
  241. data/lib/rubocop/formatter/quiet_formatter.rb +1 -1
  242. data/lib/rubocop/formatter/simple_text_formatter.rb +36 -6
  243. data/lib/rubocop/name_similarity.rb +1 -0
  244. data/lib/rubocop/options.rb +3 -0
  245. data/lib/rubocop/remote_config.rb +1 -0
  246. data/lib/rubocop/result_cache.rb +1 -0
  247. data/lib/rubocop/rspec/cop_helper.rb +4 -1
  248. data/lib/rubocop/rspec/expect_offense.rb +10 -5
  249. data/lib/rubocop/rspec/shared_contexts.rb +12 -0
  250. data/lib/rubocop/runner.rb +1 -0
  251. data/lib/rubocop/string_interpreter.rb +3 -0
  252. data/lib/rubocop/target_finder.rb +1 -0
  253. data/lib/rubocop/target_ruby.rb +6 -0
  254. data/lib/rubocop/version.rb +2 -1
  255. data/lib/rubocop/yaml_duplication_checker.rb +1 -0
  256. metadata +15 -2
@@ -16,9 +16,10 @@ module RuboCop
16
16
  #
17
17
  # # bad
18
18
  # %x( ls -l )
19
- class SpaceInsidePercentLiteralDelimiters < Cop
19
+ class SpaceInsidePercentLiteralDelimiters < Base
20
20
  include MatchRange
21
21
  include PercentLiteral
22
+ extend AutoCorrector
22
23
 
23
24
  MSG = 'Do not use spaces inside percent literal delimiters.'
24
25
  BEGIN_REGEX = /\A( +)/.freeze
@@ -36,21 +37,15 @@ module RuboCop
36
37
  add_offenses_for_unnecessary_spaces(node)
37
38
  end
38
39
 
39
- def autocorrect(node)
40
- lambda do |corrector|
41
- regex_matches(node) do |match_range|
42
- corrector.remove(match_range)
43
- end
44
- end
45
- end
46
-
47
40
  private
48
41
 
49
42
  def add_offenses_for_unnecessary_spaces(node)
50
43
  return unless node.single_line?
51
44
 
52
45
  regex_matches(node) do |match_range|
53
- add_offense(node, location: match_range)
46
+ add_offense(match_range) do |corrector|
47
+ corrector.remove(match_range)
48
+ end
54
49
  end
55
50
  end
56
51
 
@@ -17,7 +17,9 @@ module RuboCop
17
17
  #
18
18
  # # good
19
19
  # 'a'..'z'
20
- class SpaceInsideRangeLiteral < Cop
20
+ class SpaceInsideRangeLiteral < Base
21
+ extend AutoCorrector
22
+
21
23
  MSG = 'Space inside range literal.'
22
24
 
23
25
  def on_irange(node)
@@ -28,21 +30,6 @@ module RuboCop
28
30
  check(node)
29
31
  end
30
32
 
31
- def autocorrect(node)
32
- expression = node.source
33
- operator = node.loc.operator.source
34
- operator_escaped = operator.gsub(/\./, '\.')
35
-
36
- lambda do |corrector|
37
- corrector.replace(
38
- node,
39
- expression
40
- .sub(/\s+#{operator_escaped}/, operator)
41
- .sub(/#{operator_escaped}\s+/, operator)
42
- )
43
- end
44
- end
45
-
46
33
  private
47
34
 
48
35
  def check(node)
@@ -55,7 +42,11 @@ module RuboCop
55
42
 
56
43
  return unless /(\s#{escaped_op})|(#{escaped_op}\s)/.match?(expression)
57
44
 
58
- add_offense(node)
45
+ add_offense(node) do |corrector|
46
+ corrector.replace(
47
+ node, expression.sub(/\s+#{escaped_op}/, op).sub(/#{escaped_op}\s+/, op)
48
+ )
49
+ end
59
50
  end
60
51
  end
61
52
  end
@@ -53,9 +53,10 @@ module RuboCop
53
53
  # # good
54
54
  # foo[ ]
55
55
  #
56
- class SpaceInsideReferenceBrackets < Cop
56
+ class SpaceInsideReferenceBrackets < Base
57
57
  include SurroundingSpace
58
58
  include ConfigurableEnforcedStyle
59
+ extend AutoCorrector
59
60
 
60
61
  MSG = '%<command>s space inside reference brackets.'
61
62
  EMPTY_MSG = '%<command>s space inside empty reference brackets.'
@@ -83,24 +84,20 @@ module RuboCop
83
84
  end
84
85
  end
85
86
 
86
- def autocorrect(node)
87
- lambda do |corrector|
88
- left, right = reference_brackets(node)
89
-
90
- if empty_brackets?(left, right)
91
- SpaceCorrector.empty_corrections(processed_source, corrector,
92
- empty_config, left, right)
93
- elsif style == :no_space
94
- SpaceCorrector.remove_space(processed_source, corrector,
95
- left, right)
96
- else
97
- SpaceCorrector.add_space(processed_source, corrector, left, right)
98
- end
87
+ private
88
+
89
+ def autocorrect(corrector, node)
90
+ left, right = reference_brackets(node)
91
+
92
+ if empty_brackets?(left, right)
93
+ SpaceCorrector.empty_corrections(processed_source, corrector, empty_config, left, right)
94
+ elsif style == :no_space
95
+ SpaceCorrector.remove_space(processed_source, corrector, left, right)
96
+ else
97
+ SpaceCorrector.add_space(processed_source, corrector, left, right)
99
98
  end
100
99
  end
101
100
 
102
- private
103
-
104
101
  def reference_brackets(node)
105
102
  tokens = tokens(node)
106
103
  left = left_ref_bracket(node, tokens)
@@ -18,11 +18,12 @@ module RuboCop
18
18
  #
19
19
  # # good
20
20
  # var = "This is the #{ space } example"
21
- class SpaceInsideStringInterpolation < Cop
21
+ class SpaceInsideStringInterpolation < Base
22
22
  include Interpolation
23
23
  include SurroundingSpace
24
24
  include ConfigurableEnforcedStyle
25
25
  include RangeHelp
26
+ extend AutoCorrector
26
27
 
27
28
  NO_SPACE_MSG = 'Space inside string interpolation detected.'
28
29
  SPACE_MSG = 'Missing space inside string interpolation detected.'
@@ -40,20 +41,18 @@ module RuboCop
40
41
  end
41
42
  end
42
43
 
43
- def autocorrect(begin_node)
44
- lambda do |corrector|
45
- delims = delimiters(begin_node)
44
+ private
45
+
46
+ def autocorrect(corrector, begin_node)
47
+ delims = delimiters(begin_node)
46
48
 
47
- if style == :no_space
48
- SpaceCorrector.remove_space(processed_source, corrector, *delims)
49
- else
50
- SpaceCorrector.add_space(processed_source, corrector, *delims)
51
- end
49
+ if style == :no_space
50
+ SpaceCorrector.remove_space(processed_source, corrector, *delims)
51
+ else
52
+ SpaceCorrector.add_space(processed_source, corrector, *delims)
52
53
  end
53
54
  end
54
55
 
55
- private
56
-
57
56
  def delimiters(begin_node)
58
57
  left = processed_source.tokens[index_of_first_token(begin_node)]
59
58
  right = processed_source.tokens[index_of_last_token(begin_node)]
@@ -37,11 +37,12 @@ module RuboCop
37
37
  # class Foo; end
38
38
  # # EOF
39
39
  #
40
- class TrailingEmptyLines < Cop
40
+ class TrailingEmptyLines < Base
41
41
  include ConfigurableEnforcedStyle
42
42
  include RangeHelp
43
+ extend AutoCorrector
43
44
 
44
- def investigate(processed_source)
45
+ def on_new_investigation
45
46
  buffer = processed_source.buffer
46
47
  return if buffer.source.empty?
47
48
 
@@ -57,28 +58,22 @@ module RuboCop
57
58
 
58
59
  return unless blank_lines != wanted_blank_lines
59
60
 
60
- offense_detected(buffer, wanted_blank_lines, blank_lines,
61
- whitespace_at_end)
62
- end
63
-
64
- def autocorrect(range)
65
- lambda do |corrector|
66
- corrector.replace(range, style == :final_newline ? "\n" : "\n\n")
67
- end
61
+ offense_detected(buffer, wanted_blank_lines, blank_lines, whitespace_at_end)
68
62
  end
69
63
 
70
64
  private
71
65
 
72
- def offense_detected(buffer, wanted_blank_lines, blank_lines,
73
- whitespace_at_end)
66
+ def offense_detected(buffer, wanted_blank_lines, blank_lines, whitespace_at_end)
74
67
  begin_pos = buffer.source.length - whitespace_at_end.length
75
68
  autocorrect_range = range_between(begin_pos, buffer.source.length)
76
69
  begin_pos += 1 unless whitespace_at_end.empty?
77
70
  report_range = range_between(begin_pos, buffer.source.length)
78
71
 
79
- add_offense(autocorrect_range,
80
- location: report_range,
81
- message: message(wanted_blank_lines, blank_lines))
72
+ add_offense(
73
+ report_range, message: message(wanted_blank_lines, blank_lines)
74
+ ) do |corrector|
75
+ corrector.replace(autocorrect_range, style == :final_newline ? "\n" : "\n\n")
76
+ end
82
77
  end
83
78
 
84
79
  def ends_in_end?(processed_source)
@@ -28,12 +28,13 @@ module RuboCop
28
28
  # x = 0
29
29
  # RUBY
30
30
  #
31
- class TrailingWhitespace < Cop
31
+ class TrailingWhitespace < Base
32
32
  include RangeHelp
33
+ extend AutoCorrector
33
34
 
34
35
  MSG = 'Trailing whitespace detected.'
35
36
 
36
- def investigate(processed_source)
37
+ def on_new_investigation
37
38
  heredoc_ranges = extract_heredoc_ranges(processed_source.ast)
38
39
  processed_source.lines.each_with_index do |line, index|
39
40
  lineno = index + 1
@@ -41,18 +42,13 @@ module RuboCop
41
42
  next unless line.end_with?(' ', "\t")
42
43
  next if skip_heredoc? && inside_heredoc?(heredoc_ranges, lineno)
43
44
 
44
- range = source_range(processed_source.buffer,
45
- lineno,
46
- (line.rstrip.length)...(line.length))
47
-
48
- add_offense(range, location: range)
45
+ range = offense_range(lineno, line)
46
+ add_offense(range) do |corrector|
47
+ corrector.remove(range)
48
+ end
49
49
  end
50
50
  end
51
51
 
52
- def autocorrect(range)
53
- ->(corrector) { corrector.remove(range) }
54
- end
55
-
56
52
  private
57
53
 
58
54
  def skip_heredoc?
@@ -71,6 +67,10 @@ module RuboCop
71
67
  (body.first_line...body.last_line)
72
68
  end
73
69
  end
70
+
71
+ def offense_range(lineno, line)
72
+ source_range(processed_source.buffer, lineno, (line.rstrip.length)...(line.length))
73
+ end
74
74
  end
75
75
  end
76
76
  end
@@ -35,7 +35,7 @@ module RuboCop
35
35
  return unless node.binary_operation?
36
36
 
37
37
  lhs, operation, rhs = *node
38
- return if MATH_OPERATORS.include?(node.method_name) && rhs.basic_literal?
38
+ return if MATH_OPERATORS.include?(node.method_name) && lhs.basic_literal?
39
39
 
40
40
  add_offense(node, message: format(MSG, op: operation)) if lhs == rhs
41
41
  end
@@ -63,7 +63,7 @@ module RuboCop
63
63
  PATTERN
64
64
 
65
65
  def on_const(node)
66
- return unless unqualified_const?(node)
66
+ return if !unqualified_const?(node) || node.parent&.defined_module
67
67
 
68
68
  add_offense(node)
69
69
  end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ # This cop checks for duplicate `require`s and `require_relative`s.
7
+ #
8
+ # @example
9
+ # # bad
10
+ # require 'foo'
11
+ # require 'bar'
12
+ # require 'foo'
13
+ #
14
+ # # good
15
+ # require 'foo'
16
+ # require 'bar'
17
+ #
18
+ class DuplicateRequire < Base
19
+ MSG = 'Duplicate `%<method>s` detected.'
20
+ REQUIRE_METHODS = %i[require require_relative].freeze
21
+
22
+ def_node_matcher :require_call?, <<~PATTERN
23
+ (send {nil? (const _ :Kernel)} {:#{REQUIRE_METHODS.join(' :')}} _)
24
+ PATTERN
25
+
26
+ def on_new_investigation
27
+ # Holds the known required files for a given parent node (used as key)
28
+ @required = Hash.new { |h, k| h[k] = Set.new }.compare_by_identity
29
+ super
30
+ end
31
+
32
+ def on_send(node)
33
+ return unless REQUIRE_METHODS.include?(node.method_name) && require_call?(node)
34
+ return if @required[node.parent].add?(node.first_argument)
35
+
36
+ add_offense(node, message: format(MSG, method: node.method_name))
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -43,17 +43,6 @@ module RuboCop
43
43
  end
44
44
  end
45
45
  end
46
-
47
- private
48
-
49
- def rescued_exceptions(resbody)
50
- rescue_group, = *resbody
51
- if rescue_group
52
- rescue_group.values
53
- else
54
- []
55
- end
56
- end
57
46
  end
58
47
  end
59
48
  end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ # This cop enforces that Ruby source files are not empty.
7
+ #
8
+ # @example
9
+ # # bad
10
+ # # Empty file
11
+ #
12
+ # # good
13
+ # # File containing non commented source lines
14
+ #
15
+ # @example AllowComments: true (default)
16
+ # # good
17
+ # # File consisting only of comments
18
+ #
19
+ # @example AllowComments: false
20
+ # # bad
21
+ # # File consisting only of comments
22
+ #
23
+ class EmptyFile < Base
24
+ include RangeHelp
25
+
26
+ MSG = 'Empty file detected.'
27
+
28
+ def on_new_investigation
29
+ return unless offending?
30
+
31
+ range = source_range(processed_source.buffer, 1, 0)
32
+ add_offense(range)
33
+ end
34
+
35
+ private
36
+
37
+ def offending?
38
+ empty_file? || (!cop_config['AllowComments'] && contains_only_comments?)
39
+ end
40
+
41
+ def empty_file?
42
+ processed_source.buffer.source.empty?
43
+ end
44
+
45
+ def contains_only_comments?
46
+ processed_source.lines.all? do |line|
47
+ line.blank? || comment_line?(line)
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -56,8 +56,8 @@ module RuboCop
56
56
  def on_def(node)
57
57
  return unless offender?(node)
58
58
 
59
- if node.method?(:initialize)
60
- add_offense(node, message: CONSTRUCTOR_MSG) if inside_class_with_stateful_parent?(node)
59
+ if node.method?(:initialize) && inside_class_with_stateful_parent?(node)
60
+ add_offense(node, message: CONSTRUCTOR_MSG)
61
61
  elsif callback_method_def?(node)
62
62
  add_offense(node, message: CALLBACK_MSG)
63
63
  end
@@ -25,44 +25,11 @@ module RuboCop
25
25
  'in a Regexp literal.'
26
26
 
27
27
  def on_regexp(node)
28
- return if contain_non_literal?(node)
29
-
30
- begin
31
- tree = Regexp::Parser.parse(node.content)
32
- # Returns if a regular expression that cannot be processed by regexp_parser gem.
33
- # https://github.com/rubocop-hq/rubocop/issues/8083
34
- rescue Regexp::Scanner::ScannerError
35
- return
36
- end
37
-
38
- return unless named_capture?(tree)
39
- return unless numbered_capture?(tree)
28
+ return if node.each_capture(named: false).none?
29
+ return if node.each_capture(named: true).none?
40
30
 
41
31
  add_offense(node)
42
32
  end
43
-
44
- private
45
-
46
- def contain_non_literal?(node)
47
- if node.respond_to?(:type) && (node.variable? || node.send_type? || node.const_type?)
48
- return true
49
- end
50
- return false unless node.respond_to?(:children)
51
-
52
- node.children.any? { |child| contain_non_literal?(child) }
53
- end
54
-
55
- def named_capture?(tree)
56
- tree.each_expression.any? do |e|
57
- e.instance_of?(Regexp::Expression::Group::Capture)
58
- end
59
- end
60
-
61
- def numbered_capture?(tree)
62
- tree.each_expression.any? do |e|
63
- e.instance_of?(Regexp::Expression::Group::Named)
64
- end
65
- end
66
33
  end
67
34
  end
68
35
  end