rubocop 0.89.1 → 0.93.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 (365) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/config/default.yml +160 -14
  4. data/lib/rubocop.rb +33 -5
  5. data/lib/rubocop/cached_data.rb +3 -1
  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 +9 -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 +14 -5
  15. data/lib/rubocop/config_loader.rb +20 -9
  16. data/lib/rubocop/config_loader_resolver.rb +1 -0
  17. data/lib/rubocop/config_obsoletion.rb +1 -0
  18. data/lib/rubocop/config_regeneration.rb +33 -0
  19. data/lib/rubocop/config_store.rb +3 -3
  20. data/lib/rubocop/config_validator.rb +3 -0
  21. data/lib/rubocop/cop/base.rb +23 -0
  22. data/lib/rubocop/cop/bundler/duplicated_gem.rb +5 -1
  23. data/lib/rubocop/cop/bundler/gem_comment.rb +8 -3
  24. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +2 -0
  25. data/lib/rubocop/cop/commissioner.rb +47 -7
  26. data/lib/rubocop/cop/correctors/alignment_corrector.rb +4 -4
  27. data/lib/rubocop/cop/correctors/condition_corrector.rb +3 -5
  28. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +9 -10
  29. data/lib/rubocop/cop/correctors/line_break_corrector.rb +4 -4
  30. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +8 -3
  31. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -8
  32. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +4 -9
  33. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +8 -10
  34. data/lib/rubocop/cop/documentation.rb +22 -0
  35. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +10 -10
  36. data/lib/rubocop/cop/generator.rb +2 -1
  37. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +1 -0
  38. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -0
  39. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +1 -0
  40. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -0
  41. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +1 -0
  42. data/lib/rubocop/cop/layout/array_alignment.rb +1 -0
  43. data/lib/rubocop/cop/layout/begin_end_alignment.rb +77 -0
  44. data/lib/rubocop/cop/layout/block_alignment.rb +23 -19
  45. data/lib/rubocop/cop/layout/case_indentation.rb +4 -7
  46. data/lib/rubocop/cop/layout/class_structure.rb +11 -10
  47. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +4 -6
  48. data/lib/rubocop/cop/layout/condition_position.rb +13 -15
  49. data/lib/rubocop/cop/layout/def_end_alignment.rb +8 -5
  50. data/lib/rubocop/cop/layout/dot_position.rb +21 -20
  51. data/lib/rubocop/cop/layout/empty_comment.rb +30 -23
  52. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +21 -18
  53. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +13 -13
  54. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +136 -0
  55. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +21 -23
  56. data/lib/rubocop/cop/layout/empty_lines.rb +6 -7
  57. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +17 -14
  58. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +7 -8
  59. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +5 -8
  60. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -5
  61. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +2 -5
  62. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -5
  63. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +3 -7
  64. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -5
  65. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +2 -5
  66. data/lib/rubocop/cop/layout/end_alignment.rb +11 -17
  67. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +2 -5
  68. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +2 -5
  69. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +4 -8
  70. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +2 -5
  71. data/lib/rubocop/cop/layout/hash_alignment.rb +17 -20
  72. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +15 -14
  73. data/lib/rubocop/cop/layout/heredoc_indentation.rb +14 -11
  74. data/lib/rubocop/cop/layout/initial_indentation.rb +6 -7
  75. data/lib/rubocop/cop/layout/leading_comment_space.rb +11 -9
  76. data/lib/rubocop/cop/layout/leading_empty_lines.rb +6 -11
  77. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +2 -5
  78. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +2 -5
  79. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +10 -14
  80. data/lib/rubocop/cop/layout/multiline_block_layout.rb +21 -19
  81. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +2 -5
  82. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +2 -5
  83. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +5 -9
  84. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -5
  85. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +2 -5
  86. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +41 -22
  87. data/lib/rubocop/cop/layout/space_after_colon.rb +11 -7
  88. data/lib/rubocop/cop/layout/space_after_comma.rb +2 -5
  89. data/lib/rubocop/cop/layout/space_after_method_name.rb +5 -6
  90. data/lib/rubocop/cop/layout/space_after_not.rb +9 -11
  91. data/lib/rubocop/cop/layout/space_after_semicolon.rb +2 -5
  92. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +17 -21
  93. data/lib/rubocop/cop/layout/space_around_keyword.rb +17 -18
  94. data/lib/rubocop/cop/layout/space_around_operators.rb +17 -16
  95. data/lib/rubocop/cop/layout/space_before_block_braces.rb +23 -22
  96. data/lib/rubocop/cop/layout/space_before_comma.rb +3 -5
  97. data/lib/rubocop/cop/layout/space_before_comment.rb +10 -7
  98. data/lib/rubocop/cop/layout/space_before_first_arg.rb +7 -7
  99. data/lib/rubocop/cop/layout/space_before_semicolon.rb +2 -5
  100. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -17
  101. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +20 -23
  102. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -8
  103. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +13 -16
  104. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +19 -37
  105. data/lib/rubocop/cop/layout/space_inside_parens.rb +9 -14
  106. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +5 -10
  107. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +8 -17
  108. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +16 -24
  109. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +12 -13
  110. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +10 -15
  111. data/lib/rubocop/cop/layout/trailing_whitespace.rb +11 -11
  112. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +2 -0
  113. data/lib/rubocop/cop/lint/ambiguous_operator.rb +2 -0
  114. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +15 -1
  115. data/lib/rubocop/cop/lint/big_decimal_new.rb +1 -2
  116. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +1 -1
  117. data/lib/rubocop/cop/lint/boolean_symbol.rb +3 -0
  118. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +74 -0
  119. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
  120. data/lib/rubocop/cop/lint/debugger.rb +2 -3
  121. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -3
  122. data/lib/rubocop/cop/lint/duplicate_methods.rb +2 -4
  123. data/lib/rubocop/cop/lint/duplicate_require.rb +46 -0
  124. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +2 -15
  125. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -0
  126. data/lib/rubocop/cop/lint/empty_file.rb +50 -0
  127. data/lib/rubocop/cop/lint/erb_new_arguments.rb +2 -0
  128. data/lib/rubocop/cop/lint/float_comparison.rb +2 -2
  129. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
  130. data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +37 -0
  131. data/lib/rubocop/cop/lint/identity_comparison.rb +51 -0
  132. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +2 -5
  133. data/lib/rubocop/cop/lint/inherit_exception.rb +2 -2
  134. data/lib/rubocop/cop/lint/missing_super.rb +2 -2
  135. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +3 -35
  136. data/lib/rubocop/cop/lint/multiple_comparison.rb +3 -1
  137. data/lib/rubocop/cop/lint/number_conversion.rb +1 -0
  138. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +9 -20
  139. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -1
  140. data/lib/rubocop/cop/lint/percent_string_array.rb +8 -12
  141. data/lib/rubocop/cop/lint/raise_exception.rb +1 -0
  142. data/lib/rubocop/cop/lint/rand_one.rb +2 -1
  143. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +22 -12
  144. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +14 -4
  145. data/lib/rubocop/cop/lint/redundant_require_statement.rb +1 -0
  146. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +45 -0
  147. data/lib/rubocop/cop/lint/rescue_type.rb +0 -1
  148. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +3 -1
  149. data/lib/rubocop/cop/lint/shadowed_exception.rb +6 -6
  150. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +4 -4
  151. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -0
  152. data/lib/rubocop/cop/lint/to_json.rb +16 -5
  153. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
  154. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +57 -0
  155. data/lib/rubocop/cop/lint/unreachable_loop.rb +3 -6
  156. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +3 -1
  157. data/lib/rubocop/cop/lint/uri_regexp.rb +2 -1
  158. data/lib/rubocop/cop/lint/useless_access_modifier.rb +3 -9
  159. data/lib/rubocop/cop/lint/useless_method_definition.rb +70 -0
  160. data/lib/rubocop/cop/lint/useless_times.rb +106 -0
  161. data/lib/rubocop/cop/metrics/block_length.rb +3 -1
  162. data/lib/rubocop/cop/metrics/class_length.rb +8 -6
  163. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +27 -16
  164. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -0
  165. data/lib/rubocop/cop/mixin/alignment.rb +3 -0
  166. data/lib/rubocop/cop/mixin/allowed_methods.rb +2 -0
  167. data/lib/rubocop/cop/mixin/annotation_comment.rb +5 -0
  168. data/lib/rubocop/cop/mixin/check_line_breakable.rb +16 -7
  169. data/lib/rubocop/cop/mixin/comments_help.rb +48 -0
  170. data/lib/rubocop/cop/mixin/configurable_naming.rb +2 -2
  171. data/lib/rubocop/cop/mixin/configurable_numbering.rb +3 -3
  172. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +8 -7
  173. data/lib/rubocop/cop/mixin/empty_parameter.rb +3 -1
  174. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +12 -1
  175. data/lib/rubocop/cop/mixin/first_element_line_break.rb +3 -1
  176. data/lib/rubocop/cop/mixin/hash_transform_method.rb +27 -2
  177. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +3 -1
  178. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +12 -10
  179. data/lib/rubocop/cop/mixin/negative_conditional.rb +2 -2
  180. data/lib/rubocop/cop/mixin/percent_array.rb +14 -3
  181. data/lib/rubocop/cop/mixin/rescue_node.rb +11 -1
  182. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +4 -3
  183. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +4 -3
  184. data/lib/rubocop/cop/mixin/statement_modifier.rb +9 -3
  185. data/lib/rubocop/cop/mixin/surrounding_space.rb +8 -4
  186. data/lib/rubocop/cop/mixin/trailing_comma.rb +7 -7
  187. data/lib/rubocop/cop/mixin/visibility_help.rb +4 -16
  188. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
  189. data/lib/rubocop/cop/naming/file_name.rb +1 -1
  190. data/lib/rubocop/cop/offense.rb +16 -2
  191. data/lib/rubocop/cop/security/eval.rb +1 -0
  192. data/lib/rubocop/cop/security/json_load.rb +1 -0
  193. data/lib/rubocop/cop/security/marshal_load.rb +1 -0
  194. data/lib/rubocop/cop/security/open.rb +1 -0
  195. data/lib/rubocop/cop/security/yaml_load.rb +1 -0
  196. data/lib/rubocop/cop/severity.rb +0 -8
  197. data/lib/rubocop/cop/style/access_modifier_declarations.rb +7 -11
  198. data/lib/rubocop/cop/style/accessor_grouping.rb +3 -0
  199. data/lib/rubocop/cop/style/alias.rb +2 -0
  200. data/lib/rubocop/cop/style/array_coercion.rb +4 -0
  201. data/lib/rubocop/cop/style/array_join.rb +1 -0
  202. data/lib/rubocop/cop/style/attr.rb +1 -0
  203. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +2 -0
  204. data/lib/rubocop/cop/style/case_equality.rb +11 -3
  205. data/lib/rubocop/cop/style/case_like_if.rb +40 -8
  206. data/lib/rubocop/cop/style/class_and_module_children.rb +2 -0
  207. data/lib/rubocop/cop/style/class_check.rb +6 -9
  208. data/lib/rubocop/cop/style/class_equality_comparison.rb +49 -0
  209. data/lib/rubocop/cop/style/class_methods_definitions.rb +157 -0
  210. data/lib/rubocop/cop/style/class_vars.rb +1 -2
  211. data/lib/rubocop/cop/style/combinable_loops.rb +91 -0
  212. data/lib/rubocop/cop/style/comment_annotation.rb +6 -0
  213. data/lib/rubocop/cop/style/commented_keyword.rb +7 -8
  214. data/lib/rubocop/cop/style/conditional_assignment.rb +49 -60
  215. data/lib/rubocop/cop/style/date_time.rb +12 -1
  216. data/lib/rubocop/cop/style/dir.rb +1 -0
  217. data/lib/rubocop/cop/style/double_negation.rb +1 -0
  218. data/lib/rubocop/cop/style/empty_block_parameter.rb +9 -10
  219. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +9 -10
  220. data/lib/rubocop/cop/style/empty_literal.rb +3 -1
  221. data/lib/rubocop/cop/style/eval_with_location.rb +1 -3
  222. data/lib/rubocop/cop/style/even_odd.rb +1 -0
  223. data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -2
  224. data/lib/rubocop/cop/style/explicit_block_argument.rb +7 -3
  225. data/lib/rubocop/cop/style/float_division.rb +2 -0
  226. data/lib/rubocop/cop/style/for.rb +0 -4
  227. data/lib/rubocop/cop/style/format_string.rb +1 -4
  228. data/lib/rubocop/cop/style/format_string_token.rb +1 -1
  229. data/lib/rubocop/cop/style/guard_clause.rb +1 -0
  230. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +24 -5
  231. data/lib/rubocop/cop/style/hash_syntax.rb +6 -5
  232. data/lib/rubocop/cop/style/hash_transform_keys.rb +16 -9
  233. data/lib/rubocop/cop/style/hash_transform_values.rb +16 -9
  234. data/lib/rubocop/cop/style/if_unless_modifier.rb +2 -6
  235. data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -0
  236. data/lib/rubocop/cop/style/keyword_parameters_order.rb +53 -0
  237. data/lib/rubocop/cop/style/lambda_call.rb +3 -1
  238. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +10 -1
  239. data/lib/rubocop/cop/style/method_def_parentheses.rb +0 -4
  240. data/lib/rubocop/cop/style/mixin_usage.rb +8 -27
  241. data/lib/rubocop/cop/style/multiline_block_chain.rb +2 -2
  242. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +14 -1
  243. data/lib/rubocop/cop/style/multiline_when_then.rb +3 -2
  244. data/lib/rubocop/cop/style/negated_if.rb +6 -6
  245. data/lib/rubocop/cop/style/negated_unless.rb +6 -6
  246. data/lib/rubocop/cop/style/negated_while.rb +7 -15
  247. data/lib/rubocop/cop/style/nested_modifier.rb +10 -13
  248. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +11 -11
  249. data/lib/rubocop/cop/style/nested_ternary_operator.rb +16 -16
  250. data/lib/rubocop/cop/style/next.rb +10 -14
  251. data/lib/rubocop/cop/style/nil_comparison.rb +13 -11
  252. data/lib/rubocop/cop/style/non_nil_check.rb +34 -26
  253. data/lib/rubocop/cop/style/not.rb +20 -26
  254. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +4 -9
  255. data/lib/rubocop/cop/style/numeric_predicate.rb +5 -14
  256. data/lib/rubocop/cop/style/one_line_conditional.rb +73 -23
  257. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  258. data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
  259. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +12 -1
  260. data/lib/rubocop/cop/style/or_assignment.rb +13 -10
  261. data/lib/rubocop/cop/style/parallel_assignment.rb +14 -14
  262. data/lib/rubocop/cop/style/parentheses_around_condition.rb +6 -6
  263. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +13 -19
  264. data/lib/rubocop/cop/style/percent_q_literals.rb +8 -10
  265. data/lib/rubocop/cop/style/perl_backrefs.rb +8 -10
  266. data/lib/rubocop/cop/style/preferred_hash_methods.rb +11 -14
  267. data/lib/rubocop/cop/style/proc.rb +6 -6
  268. data/lib/rubocop/cop/style/raise_args.rb +12 -24
  269. data/lib/rubocop/cop/style/random_with_offset.rb +19 -19
  270. data/lib/rubocop/cop/style/redundant_assignment.rb +8 -18
  271. data/lib/rubocop/cop/style/redundant_begin.rb +28 -12
  272. data/lib/rubocop/cop/style/redundant_capital_w.rb +6 -9
  273. data/lib/rubocop/cop/style/redundant_condition.rb +10 -7
  274. data/lib/rubocop/cop/style/redundant_conditional.rb +4 -5
  275. data/lib/rubocop/cop/style/redundant_exception.rb +1 -3
  276. data/lib/rubocop/cop/style/redundant_fetch_block.rb +3 -12
  277. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +9 -8
  278. data/lib/rubocop/cop/style/redundant_freeze.rb +5 -7
  279. data/lib/rubocop/cop/style/redundant_interpolation.rb +31 -25
  280. data/lib/rubocop/cop/style/redundant_parentheses.rb +21 -15
  281. data/lib/rubocop/cop/style/redundant_percent_q.rb +9 -11
  282. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +44 -36
  283. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +13 -29
  284. data/lib/rubocop/cop/style/redundant_return.rb +17 -17
  285. data/lib/rubocop/cop/style/redundant_self.rb +9 -11
  286. data/lib/rubocop/cop/style/redundant_self_assignment.rb +116 -0
  287. data/lib/rubocop/cop/style/redundant_sort.rb +12 -29
  288. data/lib/rubocop/cop/style/redundant_sort_by.rb +5 -9
  289. data/lib/rubocop/cop/style/regexp_literal.rb +10 -21
  290. data/lib/rubocop/cop/style/rescue_modifier.rb +29 -9
  291. data/lib/rubocop/cop/style/rescue_standard_error.rb +20 -16
  292. data/lib/rubocop/cop/style/return_nil.rb +5 -5
  293. data/lib/rubocop/cop/style/safe_navigation.rb +18 -12
  294. data/lib/rubocop/cop/style/sample.rb +12 -14
  295. data/lib/rubocop/cop/style/self_assignment.rb +26 -22
  296. data/lib/rubocop/cop/style/semicolon.rb +6 -9
  297. data/lib/rubocop/cop/style/send.rb +4 -5
  298. data/lib/rubocop/cop/style/signal_exception.rb +23 -19
  299. data/lib/rubocop/cop/style/single_argument_dig.rb +1 -0
  300. data/lib/rubocop/cop/style/single_line_block_params.rb +4 -2
  301. data/lib/rubocop/cop/style/single_line_methods.rb +17 -16
  302. data/lib/rubocop/cop/style/slicing_with_range.rb +6 -8
  303. data/lib/rubocop/cop/style/sole_nested_conditional.rb +66 -0
  304. data/lib/rubocop/cop/style/special_global_vars.rb +10 -15
  305. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +17 -21
  306. data/lib/rubocop/cop/style/stderr_puts.rb +5 -6
  307. data/lib/rubocop/cop/style/string_concatenation.rb +17 -3
  308. data/lib/rubocop/cop/style/string_hash_keys.rb +6 -7
  309. data/lib/rubocop/cop/style/string_methods.rb +7 -17
  310. data/lib/rubocop/cop/style/strip.rb +9 -14
  311. data/lib/rubocop/cop/style/struct_inheritance.rb +3 -6
  312. data/lib/rubocop/cop/style/symbol_array.rb +5 -16
  313. data/lib/rubocop/cop/style/symbol_literal.rb +4 -6
  314. data/lib/rubocop/cop/style/symbol_proc.rb +14 -18
  315. data/lib/rubocop/cop/style/ternary_parentheses.rb +22 -22
  316. data/lib/rubocop/cop/style/trailing_body_on_class.rb +3 -6
  317. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +4 -7
  318. data/lib/rubocop/cop/style/trailing_body_on_module.rb +3 -6
  319. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +2 -5
  320. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +2 -5
  321. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +11 -9
  322. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +2 -5
  323. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +8 -17
  324. data/lib/rubocop/cop/style/trivial_accessors.rb +26 -30
  325. data/lib/rubocop/cop/style/unless_else.rb +5 -8
  326. data/lib/rubocop/cop/style/unpack_first.rb +5 -8
  327. data/lib/rubocop/cop/style/variable_interpolation.rb +7 -10
  328. data/lib/rubocop/cop/style/when_then.rb +4 -6
  329. data/lib/rubocop/cop/style/while_until_do.rb +6 -16
  330. data/lib/rubocop/cop/style/while_until_modifier.rb +6 -20
  331. data/lib/rubocop/cop/style/word_array.rb +5 -23
  332. data/lib/rubocop/cop/style/yoda_condition.rb +4 -15
  333. data/lib/rubocop/cop/style/zero_length_predicate.rb +12 -18
  334. data/lib/rubocop/cop/team.rb +1 -0
  335. data/lib/rubocop/cop/util.rb +1 -2
  336. data/lib/rubocop/cop/utils/format_string.rb +3 -5
  337. data/lib/rubocop/cop/variable_force.rb +2 -0
  338. data/lib/rubocop/cop/variable_force/branch.rb +0 -4
  339. data/lib/rubocop/cops_documentation_generator.rb +4 -2
  340. data/lib/rubocop/core_ext/string.rb +2 -2
  341. data/lib/rubocop/directive_comment.rb +32 -0
  342. data/lib/rubocop/ext/regexp_node.rb +62 -0
  343. data/lib/rubocop/file_finder.rb +1 -0
  344. data/lib/rubocop/formatter/auto_gen_config_formatter.rb +2 -1
  345. data/lib/rubocop/formatter/disabled_config_formatter.rb +12 -5
  346. data/lib/rubocop/formatter/html_formatter.rb +2 -0
  347. data/lib/rubocop/formatter/progress_formatter.rb +2 -1
  348. data/lib/rubocop/formatter/quiet_formatter.rb +1 -1
  349. data/lib/rubocop/formatter/simple_text_formatter.rb +36 -6
  350. data/lib/rubocop/name_similarity.rb +1 -0
  351. data/lib/rubocop/options.rb +40 -17
  352. data/lib/rubocop/remote_config.rb +1 -0
  353. data/lib/rubocop/result_cache.rb +39 -15
  354. data/lib/rubocop/rspec/cop_helper.rb +5 -2
  355. data/lib/rubocop/rspec/expect_offense.rb +14 -9
  356. data/lib/rubocop/rspec/shared_contexts.rb +12 -0
  357. data/lib/rubocop/runner.rb +38 -18
  358. data/lib/rubocop/string_interpreter.rb +3 -0
  359. data/lib/rubocop/target_finder.rb +28 -26
  360. data/lib/rubocop/target_ruby.rb +7 -1
  361. data/lib/rubocop/version.rb +7 -1
  362. data/lib/rubocop/yaml_duplication_checker.rb +1 -0
  363. metadata +31 -17
  364. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +0 -43
  365. data/lib/rubocop/cop/tokens_util.rb +0 -84
@@ -11,12 +11,9 @@ module RuboCop
11
11
  #
12
12
  # # good
13
13
  # x = 1; y = 2
14
- class SpaceBeforeSemicolon < Cop
14
+ class SpaceBeforeSemicolon < Base
15
15
  include SpaceBeforePunctuation
16
-
17
- def autocorrect(space)
18
- PunctuationCorrector.remove_space(space)
19
- end
16
+ extend AutoCorrector
20
17
 
21
18
  def kind(token)
22
19
  'semicolon' if token.semicolon?
@@ -19,9 +19,10 @@ module RuboCop
19
19
  #
20
20
  # # good
21
21
  # a = -> (x, y) { x + y }
22
- class SpaceInLambdaLiteral < Cop
22
+ class SpaceInLambdaLiteral < Base
23
23
  include ConfigurableEnforcedStyle
24
24
  include RangeHelp
25
+ extend AutoCorrector
25
26
 
26
27
  MSG_REQUIRE_SPACE = 'Use a space between `->` and ' \
27
28
  '`(` in lambda literals.'
@@ -31,24 +32,15 @@ module RuboCop
31
32
  def on_send(node)
32
33
  return unless arrow_lambda_with_args?(node)
33
34
 
35
+ lambda_node = range_of_offense(node)
36
+
34
37
  if style == :require_space && !space_after_arrow?(node)
35
- add_offense(node,
36
- location: range_of_offense(node),
37
- message: MSG_REQUIRE_SPACE)
38
+ add_offense(lambda_node, message: MSG_REQUIRE_SPACE) do |corrector|
39
+ corrector.insert_before(node.parent.children[1], ' ')
40
+ end
38
41
  elsif style == :require_no_space && space_after_arrow?(node)
39
- add_offense(node,
40
- location: range_of_offense(node),
41
- message: MSG_REQUIRE_NO_SPACE)
42
- end
43
- end
44
-
45
- def autocorrect(lambda_node)
46
- children = lambda_node.parent.children
47
- lambda do |corrector|
48
- if style == :require_space
49
- corrector.insert_before(children[1], ' ')
50
- else
51
- corrector.remove(space_after_arrow(lambda_node))
42
+ add_offense(lambda_node, message: MSG_REQUIRE_NO_SPACE) do |corrector|
43
+ corrector.remove(space_after_arrow(node))
52
44
  end
53
45
  end
54
46
  end
@@ -67,9 +67,10 @@ module RuboCop
67
67
  # foo = [ ]
68
68
  # bar = [ ]
69
69
  #
70
- class SpaceInsideArrayLiteralBrackets < Cop
70
+ class SpaceInsideArrayLiteralBrackets < Base
71
71
  include SurroundingSpace
72
72
  include ConfigurableEnforcedStyle
73
+ extend AutoCorrector
73
74
 
74
75
  MSG = '%<command>s space inside array brackets.'
75
76
  EMPTY_MSG = '%<command>s space inside empty array brackets.'
@@ -86,36 +87,32 @@ module RuboCop
86
87
  issue_offenses(node, left, right, start_ok, end_ok)
87
88
  end
88
89
 
89
- def autocorrect(node)
90
+ private
91
+
92
+ def autocorrect(corrector, node)
90
93
  left, right = array_brackets(node)
91
94
 
92
- lambda do |corrector|
93
- if empty_brackets?(left, right)
94
- SpaceCorrector.empty_corrections(processed_source, corrector,
95
- empty_config, left, right)
96
- elsif style == :no_space
97
- SpaceCorrector.remove_space(processed_source, corrector,
98
- left, right)
99
- elsif style == :space
100
- SpaceCorrector.add_space(processed_source, corrector, left, right)
101
- else
102
- compact_corrections(corrector, node, left, right)
103
- end
95
+ if empty_brackets?(left, right)
96
+ SpaceCorrector.empty_corrections(processed_source, corrector, empty_config, left, right)
97
+ elsif style == :no_space
98
+ SpaceCorrector.remove_space(processed_source, corrector, left, right)
99
+ elsif style == :space
100
+ SpaceCorrector.add_space(processed_source, corrector, left, right)
101
+ else
102
+ compact_corrections(corrector, node, left, right)
104
103
  end
105
104
  end
106
105
 
107
- private
108
-
109
106
  def array_brackets(node)
110
107
  [left_array_bracket(node), right_array_bracket(node)]
111
108
  end
112
109
 
113
110
  def left_array_bracket(node)
114
- tokens(node).find(&:left_array_bracket?)
111
+ processed_source.tokens_within(node).find(&:left_array_bracket?)
115
112
  end
116
113
 
117
114
  def right_array_bracket(node)
118
- tokens(node).reverse.find(&:right_bracket?)
115
+ processed_source.tokens_within(node).reverse.find(&:right_bracket?)
119
116
  end
120
117
 
121
118
  def empty_config
@@ -123,7 +120,7 @@ module RuboCop
123
120
  end
124
121
 
125
122
  def next_to_newline?(node, token)
126
- tokens(node)[index_for(node, token) + 1].line != token.line
123
+ processed_source.tokens_within(node)[index_for(node, token) + 1].line != token.line
127
124
  end
128
125
 
129
126
  def end_has_own_line?(token)
@@ -134,7 +131,7 @@ module RuboCop
134
131
  end
135
132
 
136
133
  def index_for(node, token)
137
- tokens(node).index(token)
134
+ processed_source.tokens_within(node).index(token)
138
135
  end
139
136
 
140
137
  def line_and_column_for(token)
@@ -156,7 +153,7 @@ module RuboCop
156
153
  end
157
154
 
158
155
  def next_to_comment?(node, token)
159
- tokens(node)[index_for(node, token) + 1].comment?
156
+ processed_source.tokens_within(node)[index_for(node, token) + 1].comment?
160
157
  end
161
158
 
162
159
  def compact_offenses(node, left, right, start_ok, end_ok)
@@ -187,9 +184,9 @@ module RuboCop
187
184
  def multi_dimensional_array?(node, token, side: :right)
188
185
  i = index_for(node, token)
189
186
  if side == :right
190
- tokens(node)[i - 1].right_bracket?
187
+ processed_source.tokens_within(node)[i - 1].right_bracket?
191
188
  else
192
- tokens(node)[i + 1].left_array_bracket?
189
+ processed_source.tokens_within(node)[i + 1].left_array_bracket?
193
190
  end
194
191
  end
195
192
 
@@ -12,9 +12,10 @@ module RuboCop
12
12
  # %w(foo bar baz)
13
13
  # # good
14
14
  # %i(foo bar baz)
15
- class SpaceInsideArrayPercentLiteral < Cop
15
+ class SpaceInsideArrayPercentLiteral < Base
16
16
  include MatchRange
17
17
  include PercentLiteral
18
+ extend AutoCorrector
18
19
 
19
20
  MSG = 'Use only a single space inside array percent literal.'
20
21
  MULTIPLE_SPACES_BETWEEN_ITEMS_REGEX =
@@ -26,13 +27,7 @@ module RuboCop
26
27
 
27
28
  def on_percent_literal(node)
28
29
  each_unnecessary_space_match(node) do |range|
29
- add_offense(node, location: range)
30
- end
31
- end
32
-
33
- def autocorrect(node)
34
- lambda do |corrector|
35
- each_unnecessary_space_match(node) do |range|
30
+ add_offense(range) do |corrector|
36
31
  corrector.replace(range, ' ')
37
32
  end
38
33
  end
@@ -76,10 +76,11 @@ module RuboCop
76
76
  # # good
77
77
  # [1, 2, 3].each {|n| n * 2 }
78
78
  #
79
- class SpaceInsideBlockBraces < Cop
79
+ class SpaceInsideBlockBraces < Base
80
80
  include ConfigurableEnforcedStyle
81
81
  include SurroundingSpace
82
82
  include RangeHelp
83
+ extend AutoCorrector
83
84
 
84
85
  def on_block(node)
85
86
  return if node.keywords?
@@ -97,17 +98,6 @@ module RuboCop
97
98
  check_inside(node, left_brace, right_brace)
98
99
  end
99
100
 
100
- def autocorrect(range)
101
- lambda do |corrector|
102
- case range.source
103
- when /\s/ then corrector.remove(range)
104
- when '{}' then corrector.replace(range, '{ }')
105
- when '{|' then corrector.replace(range, '{ |')
106
- else corrector.insert_before(range, ' ')
107
- end
108
- end
109
- end
110
-
111
101
  private
112
102
 
113
103
  def check_inside(node, left_brace, right_brace)
@@ -216,7 +206,7 @@ module RuboCop
216
206
 
217
207
  def no_space(begin_pos, end_pos, msg)
218
208
  if style == :space
219
- offense(begin_pos, end_pos, msg) { opposite_style_detected }
209
+ offense(begin_pos, end_pos, msg)
220
210
  else
221
211
  correct_style_detected
222
212
  end
@@ -224,15 +214,22 @@ module RuboCop
224
214
 
225
215
  def space(begin_pos, end_pos, msg)
226
216
  if style == :no_space
227
- offense(begin_pos, end_pos, msg) { opposite_style_detected }
217
+ offense(begin_pos, end_pos, msg)
228
218
  else
229
219
  correct_style_detected
230
220
  end
231
221
  end
232
222
 
233
- def offense(begin_pos, end_pos, msg, &block)
223
+ def offense(begin_pos, end_pos, msg)
234
224
  range = range_between(begin_pos, end_pos)
235
- add_offense(range, location: range, message: msg, &block)
225
+ add_offense(range, message: msg) do |corrector|
226
+ case range.source
227
+ when /\s/ then corrector.remove(range)
228
+ when '{}' then corrector.replace(range, '{ }')
229
+ when '{|' then corrector.replace(range, '{ |')
230
+ else corrector.insert_before(range, ' ')
231
+ end
232
+ end
236
233
  end
237
234
 
238
235
  def style_for_empty_braces
@@ -63,47 +63,24 @@ module RuboCop
63
63
  # foo = { }
64
64
  # foo = { }
65
65
  #
66
- class SpaceInsideHashLiteralBraces < Cop
66
+ class SpaceInsideHashLiteralBraces < Base
67
67
  include SurroundingSpace
68
68
  include ConfigurableEnforcedStyle
69
69
  include RangeHelp
70
+ extend AutoCorrector
70
71
 
71
72
  MSG = 'Space inside %<problem>s.'
72
73
 
73
74
  def on_hash(node)
74
- tokens = processed_source.tokens
75
+ tokens = processed_source.tokens_within(node)
76
+ return unless tokens.first.left_brace? && tokens.last.right_curly_brace?
75
77
 
76
- hash_literal_with_braces(node) do |begin_index, end_index|
77
- check(tokens[begin_index], tokens[begin_index + 1])
78
- return if begin_index == end_index - 1
79
-
80
- check(tokens[end_index - 1], tokens[end_index])
81
- end
82
- end
83
-
84
- def autocorrect(range)
85
- lambda do |corrector|
86
- case range.source
87
- when /\s/ then corrector.remove(range)
88
- when '{' then corrector.insert_after(range, ' ')
89
- else corrector.insert_before(range, ' ')
90
- end
91
- end
78
+ check(tokens[0], tokens[1])
79
+ check(tokens[-2], tokens[-1]) if tokens.size > 2
92
80
  end
93
81
 
94
82
  private
95
83
 
96
- def hash_literal_with_braces(node)
97
- tokens = processed_source.tokens
98
- begin_index = index_of_first_token(node)
99
- return unless tokens[begin_index].left_brace?
100
-
101
- end_index = index_of_last_token(node)
102
- return unless tokens[end_index].right_curly_brace?
103
-
104
- yield begin_index, end_index
105
- end
106
-
107
84
  def check(token1, token2)
108
85
  # No offense if line break inside.
109
86
  return if token1.line < token2.line
@@ -135,16 +112,21 @@ module RuboCop
135
112
 
136
113
  def incorrect_style_detected(token1, token2,
137
114
  expect_space, is_empty_braces)
115
+ return unless ambiguous_or_unexpected_style_detected(style, token1.text == token2.text)
116
+
138
117
  brace = (token1.text == '{' ? token1 : token2).pos
139
118
  range = expect_space ? brace : space_range(brace)
140
- add_offense(
141
- range,
142
- location: range,
143
- message: message(brace, is_empty_braces, expect_space)
144
- ) do
145
- style = expect_space ? :no_space : :space
146
- ambiguous_or_unexpected_style_detected(style,
147
- token1.text == token2.text)
119
+
120
+ add_offense(range, message: message(brace, is_empty_braces, expect_space)) do |corrector|
121
+ autocorrect(corrector, range)
122
+ end
123
+ end
124
+
125
+ def autocorrect(corrector, range)
126
+ case range.source
127
+ when /\s/ then corrector.remove(range)
128
+ when '{' then corrector.insert_after(range, ' ')
129
+ else corrector.insert_before(range, ' ')
148
130
  end
149
131
  end
150
132
 
@@ -31,34 +31,29 @@ module RuboCop
31
31
  # g = ( a + 3 )
32
32
  # y()
33
33
  #
34
- class SpaceInsideParens < Cop
34
+ class SpaceInsideParens < Base
35
35
  include SurroundingSpace
36
36
  include RangeHelp
37
37
  include ConfigurableEnforcedStyle
38
+ extend AutoCorrector
38
39
 
39
40
  MSG = 'Space inside parentheses detected.'
40
41
  MSG_SPACE = 'No space inside parentheses detected.'
41
42
 
42
- def investigate(processed_source)
43
+ def on_new_investigation
43
44
  @processed_source = processed_source
44
45
 
45
46
  if style == :space
46
47
  each_missing_space(processed_source.tokens) do |range|
47
- add_offense(range, location: range, message: MSG_SPACE)
48
+ add_offense(range, message: MSG_SPACE) do |corrector|
49
+ corrector.insert_before(range, ' ')
50
+ end
48
51
  end
49
52
  else
50
53
  each_extraneous_space(processed_source.tokens) do |range|
51
- add_offense(range, location: range)
52
- end
53
- end
54
- end
55
-
56
- def autocorrect(range)
57
- lambda do |corrector|
58
- if style == :space
59
- corrector.insert_before(range, ' ')
60
- else
61
- corrector.remove(range)
54
+ add_offense(range) do |corrector|
55
+ corrector.remove(range)
56
+ end
62
57
  end
63
58
  end
64
59
  end
@@ -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