rubocop 0.42.0 → 0.52.1

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 (627) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +106 -20
  4. data/assets/output.html.erb +21 -10
  5. data/bin/rubocop +1 -2
  6. data/config/default.yml +914 -483
  7. data/config/disabled.yml +61 -41
  8. data/config/enabled.yml +1396 -878
  9. data/lib/rubocop/ast/builder.rb +72 -0
  10. data/lib/rubocop/ast/node/and_node.rb +37 -0
  11. data/lib/rubocop/ast/node/args_node.rb +29 -0
  12. data/lib/rubocop/ast/node/array_node.rb +57 -0
  13. data/lib/rubocop/ast/node/block_node.rb +116 -0
  14. data/lib/rubocop/ast/node/case_node.rb +64 -0
  15. data/lib/rubocop/ast/node/def_node.rb +71 -0
  16. data/lib/rubocop/ast/node/ensure_node.rb +25 -0
  17. data/lib/rubocop/ast/node/for_node.rb +61 -0
  18. data/lib/rubocop/ast/node/hash_node.rb +109 -0
  19. data/lib/rubocop/ast/node/if_node.rb +146 -0
  20. data/lib/rubocop/ast/node/keyword_splat_node.rb +45 -0
  21. data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +16 -0
  22. data/lib/rubocop/ast/node/mixin/binary_operator_node.rb +23 -0
  23. data/lib/rubocop/ast/node/mixin/collection_node.rb +15 -0
  24. data/lib/rubocop/ast/node/mixin/conditional_node.rb +45 -0
  25. data/lib/rubocop/ast/node/mixin/hash_element_node.rb +125 -0
  26. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +174 -0
  27. data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +89 -0
  28. data/lib/rubocop/ast/node/mixin/modifier_node.rb +17 -0
  29. data/lib/rubocop/ast/node/mixin/parameterized_node.rb +61 -0
  30. data/lib/rubocop/ast/node/mixin/predicate_operator_node.rb +35 -0
  31. data/lib/rubocop/ast/node/or_node.rb +37 -0
  32. data/lib/rubocop/ast/node/pair_node.rb +64 -0
  33. data/lib/rubocop/ast/node/regexp_node.rb +35 -0
  34. data/lib/rubocop/ast/node/resbody_node.rb +25 -0
  35. data/lib/rubocop/ast/node/send_node.rb +45 -0
  36. data/lib/rubocop/ast/node/str_node.rb +14 -0
  37. data/lib/rubocop/ast/node/super_node.rb +21 -0
  38. data/lib/rubocop/ast/node/symbol_node.rb +20 -0
  39. data/lib/rubocop/ast/node/until_node.rb +43 -0
  40. data/lib/rubocop/ast/node/when_node.rb +61 -0
  41. data/lib/rubocop/ast/node/while_node.rb +43 -0
  42. data/lib/rubocop/ast/node/yield_node.rb +21 -0
  43. data/lib/rubocop/ast/node.rb +634 -0
  44. data/lib/rubocop/ast/sexp.rb +16 -0
  45. data/lib/rubocop/{ast_node → ast}/traversal.rb +23 -24
  46. data/lib/rubocop/cached_data.rb +11 -31
  47. data/lib/rubocop/cli.rb +116 -33
  48. data/lib/rubocop/comment_config.rb +4 -10
  49. data/lib/rubocop/config.rb +355 -102
  50. data/lib/rubocop/config_loader.rb +93 -78
  51. data/lib/rubocop/config_loader_resolver.rb +106 -7
  52. data/lib/rubocop/config_store.rb +4 -1
  53. data/lib/rubocop/cop/autocorrect_logic.rb +1 -2
  54. data/lib/rubocop/cop/badge.rb +73 -0
  55. data/lib/rubocop/cop/bundler/duplicated_gem.rb +71 -0
  56. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +67 -0
  57. data/lib/rubocop/cop/bundler/ordered_gems.rb +71 -0
  58. data/lib/rubocop/cop/commissioner.rb +27 -10
  59. data/lib/rubocop/cop/cop.rb +62 -107
  60. data/lib/rubocop/cop/corrector.rb +0 -1
  61. data/lib/rubocop/cop/correctors/alignment_corrector.rb +121 -0
  62. data/lib/rubocop/cop/correctors/condition_corrector.rb +28 -0
  63. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +26 -0
  64. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +62 -0
  65. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +44 -0
  66. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +31 -0
  67. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +29 -0
  68. data/lib/rubocop/cop/correctors/space_corrector.rb +34 -0
  69. data/lib/rubocop/cop/correctors/string_literal_corrector.rb +25 -0
  70. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +31 -0
  71. data/lib/rubocop/cop/force.rb +0 -1
  72. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +102 -0
  73. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +106 -0
  74. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +87 -0
  75. data/lib/rubocop/cop/generator/require_file_injector.rb +78 -0
  76. data/lib/rubocop/cop/generator.rb +191 -0
  77. data/lib/rubocop/cop/ignored_node.rb +0 -1
  78. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +46 -0
  79. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +44 -0
  80. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +54 -0
  81. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +59 -0
  82. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +71 -0
  83. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +52 -0
  84. data/lib/rubocop/cop/internal_affairs.rb +8 -0
  85. data/lib/rubocop/cop/{style → layout}/access_modifier_indentation.rb +39 -10
  86. data/lib/rubocop/cop/layout/align_array.rb +39 -0
  87. data/lib/rubocop/cop/layout/align_hash.rb +235 -0
  88. data/lib/rubocop/cop/{style → layout}/align_parameters.rb +38 -19
  89. data/lib/rubocop/cop/{style → layout}/block_end_newline.rb +26 -8
  90. data/lib/rubocop/cop/layout/case_indentation.rb +160 -0
  91. data/lib/rubocop/cop/layout/class_structure.rb +306 -0
  92. data/lib/rubocop/cop/{style → layout}/closing_parenthesis_indentation.rb +18 -13
  93. data/lib/rubocop/cop/{style → layout}/comment_indentation.rb +48 -6
  94. data/lib/rubocop/cop/{style → layout}/dot_position.rb +34 -21
  95. data/lib/rubocop/cop/{style → layout}/else_alignment.rb +55 -37
  96. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +63 -0
  97. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +147 -0
  98. data/lib/rubocop/cop/{style → layout}/empty_lines.rb +17 -4
  99. data/lib/rubocop/cop/{style → layout}/empty_lines_around_access_modifier.rb +40 -24
  100. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +87 -0
  101. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +46 -0
  102. data/lib/rubocop/cop/{style → layout}/empty_lines_around_block_body.rb +9 -12
  103. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +68 -0
  104. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +135 -0
  105. data/lib/rubocop/cop/{style → layout}/empty_lines_around_method_body.rb +10 -7
  106. data/lib/rubocop/cop/{style → layout}/empty_lines_around_module_body.rb +27 -9
  107. data/lib/rubocop/cop/layout/end_of_line.rb +52 -0
  108. data/lib/rubocop/cop/{style → layout}/extra_spacing.rb +63 -53
  109. data/lib/rubocop/cop/{style → layout}/first_array_element_line_break.rb +5 -2
  110. data/lib/rubocop/cop/{style → layout}/first_hash_element_line_break.rb +5 -2
  111. data/lib/rubocop/cop/{style → layout}/first_method_argument_line_break.rb +7 -4
  112. data/lib/rubocop/cop/{style → layout}/first_method_parameter_line_break.rb +8 -5
  113. data/lib/rubocop/cop/{style → layout}/first_parameter_indentation.rb +32 -26
  114. data/lib/rubocop/cop/{style → layout}/indent_array.rb +75 -25
  115. data/lib/rubocop/cop/{style → layout}/indent_assignment.rb +9 -6
  116. data/lib/rubocop/cop/{style → layout}/indent_hash.rb +80 -31
  117. data/lib/rubocop/cop/layout/indent_heredoc.rb +208 -0
  118. data/lib/rubocop/cop/{style → layout}/indentation_consistency.rb +7 -5
  119. data/lib/rubocop/cop/{style → layout}/indentation_width.rb +151 -117
  120. data/lib/rubocop/cop/layout/initial_indentation.rb +45 -0
  121. data/lib/rubocop/cop/layout/leading_comment_space.rb +58 -0
  122. data/lib/rubocop/cop/{style → layout}/multiline_array_brace_layout.rb +52 -16
  123. data/lib/rubocop/cop/{style → layout}/multiline_assignment_layout.rb +18 -21
  124. data/lib/rubocop/cop/{style → layout}/multiline_block_layout.rb +37 -43
  125. data/lib/rubocop/cop/{style → layout}/multiline_hash_brace_layout.rb +55 -15
  126. data/lib/rubocop/cop/{style → layout}/multiline_method_call_brace_layout.rb +15 -4
  127. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +221 -0
  128. data/lib/rubocop/cop/{style → layout}/multiline_method_definition_brace_layout.rb +12 -5
  129. data/lib/rubocop/cop/{style → layout}/multiline_operation_indentation.rb +23 -13
  130. data/lib/rubocop/cop/{style → layout}/rescue_ensure_alignment.rb +24 -13
  131. data/lib/rubocop/cop/{style → layout}/space_after_colon.rb +17 -13
  132. data/lib/rubocop/cop/layout/space_after_comma.rb +35 -0
  133. data/lib/rubocop/cop/{style → layout}/space_after_method_name.rb +11 -11
  134. data/lib/rubocop/cop/layout/space_after_not.rb +38 -0
  135. data/lib/rubocop/cop/{style → layout}/space_after_semicolon.rb +14 -4
  136. data/lib/rubocop/cop/{style → layout}/space_around_block_parameters.rb +52 -28
  137. data/lib/rubocop/cop/{style → layout}/space_around_equals_in_parameter_default.rb +29 -21
  138. data/lib/rubocop/cop/{style → layout}/space_around_keyword.rb +33 -29
  139. data/lib/rubocop/cop/layout/space_around_operators.rb +159 -0
  140. data/lib/rubocop/cop/layout/space_before_block_braces.rb +107 -0
  141. data/lib/rubocop/cop/layout/space_before_comma.rb +31 -0
  142. data/lib/rubocop/cop/{style → layout}/space_before_comment.rb +11 -7
  143. data/lib/rubocop/cop/{style → layout}/space_before_first_arg.rb +23 -20
  144. data/lib/rubocop/cop/layout/space_before_semicolon.rb +27 -0
  145. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +85 -0
  146. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +236 -0
  147. data/lib/rubocop/cop/{style → layout}/space_inside_array_percent_literal.rb +8 -8
  148. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +228 -0
  149. data/lib/rubocop/cop/{style → layout}/space_inside_hash_literal_braces.rb +91 -51
  150. data/lib/rubocop/cop/layout/space_inside_parens.rb +53 -0
  151. data/lib/rubocop/cop/{style → layout}/space_inside_percent_literal_delimiters.rb +14 -13
  152. data/lib/rubocop/cop/{style → layout}/space_inside_range_literal.rb +16 -17
  153. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +90 -0
  154. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +80 -0
  155. data/lib/rubocop/cop/{style → layout}/tab.rb +8 -6
  156. data/lib/rubocop/cop/{style → layout}/trailing_blank_lines.rb +14 -15
  157. data/lib/rubocop/cop/{style → layout}/trailing_whitespace.rb +3 -4
  158. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +59 -0
  159. data/lib/rubocop/cop/lint/ambiguous_operator.rb +13 -9
  160. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +7 -1
  161. data/lib/rubocop/cop/lint/assignment_in_condition.rb +55 -25
  162. data/lib/rubocop/cop/lint/block_alignment.rb +75 -34
  163. data/lib/rubocop/cop/lint/boolean_symbol.rb +38 -0
  164. data/lib/rubocop/cop/lint/circular_argument_reference.rb +17 -15
  165. data/lib/rubocop/cop/lint/condition_position.rb +16 -15
  166. data/lib/rubocop/cop/lint/debugger.rb +57 -23
  167. data/lib/rubocop/cop/lint/def_end_alignment.rb +28 -14
  168. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +19 -10
  169. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +53 -0
  170. data/lib/rubocop/cop/lint/duplicate_methods.rb +108 -14
  171. data/lib/rubocop/cop/lint/duplicated_key.rb +16 -9
  172. data/lib/rubocop/cop/lint/each_with_object_argument.rb +15 -6
  173. data/lib/rubocop/cop/lint/else_layout.rb +27 -31
  174. data/lib/rubocop/cop/lint/empty_ensure.rb +44 -3
  175. data/lib/rubocop/cop/lint/empty_expression.rb +42 -0
  176. data/lib/rubocop/cop/lint/empty_interpolation.rb +16 -3
  177. data/lib/rubocop/cop/lint/empty_when.rb +38 -0
  178. data/lib/rubocop/cop/lint/end_alignment.rb +57 -39
  179. data/lib/rubocop/cop/lint/end_in_method.rb +24 -2
  180. data/lib/rubocop/cop/lint/ensure_return.rb +23 -3
  181. data/lib/rubocop/cop/lint/float_out_of_range.rb +10 -6
  182. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +67 -46
  183. data/lib/rubocop/cop/lint/handle_exceptions.rb +41 -4
  184. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +9 -5
  185. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +42 -29
  186. data/lib/rubocop/cop/lint/inherit_exception.rb +34 -23
  187. data/lib/rubocop/cop/lint/interpolation_check.rb +37 -0
  188. data/lib/rubocop/cop/lint/{literal_in_condition.rb → literal_as_condition.rb} +51 -40
  189. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +13 -8
  190. data/lib/rubocop/cop/lint/loop.rb +37 -2
  191. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +81 -0
  192. data/lib/rubocop/cop/lint/multiple_compare.rb +48 -0
  193. data/lib/rubocop/cop/lint/nested_method_definition.rb +54 -12
  194. data/lib/rubocop/cop/lint/nested_percent_literal.rb +58 -0
  195. data/lib/rubocop/cop/lint/next_without_accumulator.rb +7 -3
  196. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +32 -23
  197. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +22 -14
  198. data/lib/rubocop/cop/lint/percent_string_array.rb +42 -27
  199. data/lib/rubocop/cop/lint/percent_symbol_array.rb +28 -19
  200. data/lib/rubocop/cop/lint/rand_one.rb +17 -8
  201. data/lib/rubocop/cop/lint/redundant_with_index.rb +80 -0
  202. data/lib/rubocop/cop/lint/redundant_with_object.rb +81 -0
  203. data/lib/rubocop/cop/lint/regexp_as_condition.rb +29 -0
  204. data/lib/rubocop/cop/lint/require_parentheses.rb +24 -30
  205. data/lib/rubocop/cop/lint/rescue_exception.rb +21 -2
  206. data/lib/rubocop/cop/lint/rescue_type.rb +90 -0
  207. data/lib/rubocop/cop/lint/return_in_void_context.rb +74 -0
  208. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +70 -0
  209. data/lib/rubocop/cop/lint/script_permission.rb +49 -0
  210. data/lib/rubocop/cop/lint/shadowed_argument.rb +146 -0
  211. data/lib/rubocop/cop/lint/shadowed_exception.rb +78 -57
  212. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +25 -2
  213. data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +18 -12
  214. data/lib/rubocop/cop/lint/syntax.rb +23 -21
  215. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +26 -4
  216. data/lib/rubocop/cop/lint/unified_integer.rb +43 -0
  217. data/lib/rubocop/cop/lint/unneeded_disable.rb +117 -56
  218. data/lib/rubocop/cop/lint/unneeded_require_statement.rb +51 -0
  219. data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +167 -0
  220. data/lib/rubocop/cop/lint/unreachable_code.rb +72 -8
  221. data/lib/rubocop/cop/lint/unused_block_argument.rb +87 -27
  222. data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
  223. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +75 -0
  224. data/lib/rubocop/cop/lint/uri_regexp.rb +73 -0
  225. data/lib/rubocop/cop/lint/useless_access_modifier.rb +40 -18
  226. data/lib/rubocop/cop/lint/useless_assignment.rb +45 -14
  227. data/lib/rubocop/cop/lint/useless_comparison.rb +8 -10
  228. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +16 -2
  229. data/lib/rubocop/cop/lint/useless_setter_call.rb +57 -43
  230. data/lib/rubocop/cop/lint/void.rb +83 -23
  231. data/lib/rubocop/cop/message_annotator.rb +118 -0
  232. data/lib/rubocop/cop/metrics/abc_size.rb +3 -4
  233. data/lib/rubocop/cop/metrics/block_length.rb +32 -0
  234. data/lib/rubocop/cop/metrics/block_nesting.rb +21 -10
  235. data/lib/rubocop/cop/metrics/class_length.rb +3 -2
  236. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +4 -4
  237. data/lib/rubocop/cop/metrics/line_length.rb +67 -14
  238. data/lib/rubocop/cop/metrics/method_length.rb +10 -10
  239. data/lib/rubocop/cop/metrics/module_length.rb +3 -2
  240. data/lib/rubocop/cop/metrics/parameter_lists.rb +15 -6
  241. data/lib/rubocop/cop/metrics/perceived_complexity.rb +5 -6
  242. data/lib/rubocop/cop/mixin/alignment.rb +70 -0
  243. data/lib/rubocop/cop/mixin/annotation_comment.rb +0 -1
  244. data/lib/rubocop/cop/mixin/array_hash_indentation.rb +26 -22
  245. data/lib/rubocop/cop/mixin/array_min_size.rb +59 -0
  246. data/lib/rubocop/cop/mixin/array_syntax.rb +4 -12
  247. data/lib/rubocop/cop/mixin/check_assignment.rb +6 -7
  248. data/lib/rubocop/cop/mixin/classish_length.rb +0 -1
  249. data/lib/rubocop/cop/mixin/code_length.rb +4 -3
  250. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +21 -16
  251. data/lib/rubocop/cop/mixin/configurable_formatting.rb +48 -0
  252. data/lib/rubocop/cop/mixin/configurable_max.rb +5 -4
  253. data/lib/rubocop/cop/mixin/configurable_naming.rb +5 -35
  254. data/lib/rubocop/cop/mixin/configurable_numbering.rb +17 -0
  255. data/lib/rubocop/cop/mixin/def_node.rb +29 -0
  256. data/lib/rubocop/cop/mixin/documentation_comment.rb +46 -0
  257. data/lib/rubocop/cop/mixin/duplication.rb +46 -0
  258. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +119 -27
  259. data/lib/rubocop/cop/mixin/empty_parameter.rb +23 -0
  260. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +11 -27
  261. data/lib/rubocop/cop/mixin/enforce_superclass.rb +30 -0
  262. data/lib/rubocop/cop/mixin/first_element_line_break.rb +15 -11
  263. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +15 -13
  264. data/lib/rubocop/cop/mixin/hash_alignment.rb +116 -0
  265. data/lib/rubocop/cop/mixin/heredoc.rb +28 -0
  266. data/lib/rubocop/cop/mixin/ignored_pattern.rb +29 -0
  267. data/lib/rubocop/cop/mixin/integer_node.rb +2 -1
  268. data/lib/rubocop/cop/mixin/match_range.rb +4 -6
  269. data/lib/rubocop/cop/mixin/method_complexity.rb +33 -8
  270. data/lib/rubocop/cop/mixin/method_preference.rb +2 -1
  271. data/lib/rubocop/cop/mixin/min_body_length.rb +2 -1
  272. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +100 -66
  273. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +49 -51
  274. data/lib/rubocop/cop/mixin/negative_conditional.rb +18 -13
  275. data/lib/rubocop/cop/mixin/on_normal_if_unless.rb +1 -25
  276. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +48 -0
  277. data/lib/rubocop/cop/mixin/parentheses.rb +2 -8
  278. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +4 -2
  279. data/lib/rubocop/cop/mixin/percent_array.rb +52 -0
  280. data/lib/rubocop/cop/mixin/percent_literal.rb +69 -6
  281. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +16 -5
  282. data/lib/rubocop/cop/mixin/rescue_node.rb +23 -0
  283. data/lib/rubocop/cop/mixin/safe_assignment.rb +3 -1
  284. data/lib/rubocop/cop/mixin/safe_mode.rb +22 -0
  285. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +8 -10
  286. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +10 -14
  287. data/lib/rubocop/cop/mixin/statement_modifier.rb +29 -32
  288. data/lib/rubocop/cop/mixin/string_help.rb +3 -2
  289. data/lib/rubocop/cop/mixin/string_literals_help.rb +3 -15
  290. data/lib/rubocop/cop/mixin/surrounding_space.rb +78 -9
  291. data/lib/rubocop/cop/mixin/target_rails_version.rb +16 -0
  292. data/lib/rubocop/cop/mixin/target_ruby_version.rb +16 -0
  293. data/lib/rubocop/cop/mixin/too_many_lines.rb +39 -0
  294. data/lib/rubocop/cop/mixin/trailing_comma.rb +37 -38
  295. data/lib/rubocop/cop/mixin/unused_argument.rb +6 -16
  296. data/lib/rubocop/cop/naming/accessor_method_name.rb +55 -0
  297. data/lib/rubocop/cop/{style → naming}/ascii_identifiers.rb +36 -5
  298. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +42 -0
  299. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +33 -0
  300. data/lib/rubocop/cop/naming/constant_name.rb +58 -0
  301. data/lib/rubocop/cop/{style → naming}/file_name.rb +72 -29
  302. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +62 -0
  303. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +59 -0
  304. data/lib/rubocop/cop/naming/method_name.rb +40 -0
  305. data/lib/rubocop/cop/naming/predicate_name.rb +101 -0
  306. data/lib/rubocop/cop/naming/variable_name.rb +50 -0
  307. data/lib/rubocop/cop/naming/variable_number.rb +61 -0
  308. data/lib/rubocop/cop/offense.rb +9 -5
  309. data/lib/rubocop/cop/performance/caller.rb +69 -0
  310. data/lib/rubocop/cop/performance/case_when_splat.rb +65 -89
  311. data/lib/rubocop/cop/performance/casecmp.rb +37 -25
  312. data/lib/rubocop/cop/performance/compare_with_block.rb +117 -0
  313. data/lib/rubocop/cop/performance/count.rb +33 -43
  314. data/lib/rubocop/cop/performance/detect.rb +30 -31
  315. data/lib/rubocop/cop/performance/double_start_end_with.rb +55 -26
  316. data/lib/rubocop/cop/performance/end_with.rb +9 -9
  317. data/lib/rubocop/cop/performance/fixed_size.rb +21 -17
  318. data/lib/rubocop/cop/performance/flat_map.rb +30 -33
  319. data/lib/rubocop/cop/performance/hash_each_methods.rb +129 -0
  320. data/lib/rubocop/cop/performance/lstrip_rstrip.rb +14 -14
  321. data/lib/rubocop/cop/performance/range_include.rb +5 -4
  322. data/lib/rubocop/cop/performance/redundant_block_call.rb +28 -29
  323. data/lib/rubocop/cop/performance/redundant_match.rb +19 -15
  324. data/lib/rubocop/cop/performance/redundant_merge.rb +100 -52
  325. data/lib/rubocop/cop/performance/redundant_sort_by.rb +17 -14
  326. data/lib/rubocop/cop/performance/regexp_match.rb +224 -0
  327. data/lib/rubocop/cop/performance/reverse_each.rb +3 -6
  328. data/lib/rubocop/cop/performance/sample.rb +84 -83
  329. data/lib/rubocop/cop/performance/size.rb +22 -15
  330. data/lib/rubocop/cop/performance/start_with.rb +9 -9
  331. data/lib/rubocop/cop/performance/string_replacement.rb +35 -70
  332. data/lib/rubocop/cop/performance/times_map.rb +33 -24
  333. data/lib/rubocop/cop/performance/unfreeze_string.rb +50 -0
  334. data/lib/rubocop/cop/performance/uri_default_parser.rb +47 -0
  335. data/lib/rubocop/cop/rails/action_filter.rb +67 -47
  336. data/lib/rubocop/cop/rails/active_support_aliases.rb +68 -0
  337. data/lib/rubocop/cop/rails/application_job.rb +40 -0
  338. data/lib/rubocop/cop/rails/application_record.rb +40 -0
  339. data/lib/rubocop/cop/rails/blank.rb +142 -0
  340. data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +82 -0
  341. data/lib/rubocop/cop/rails/date.rb +47 -42
  342. data/lib/rubocop/cop/rails/delegate.rb +55 -33
  343. data/lib/rubocop/cop/rails/delegate_allow_blank.rb +51 -0
  344. data/lib/rubocop/cop/rails/dynamic_find_by.rb +82 -0
  345. data/lib/rubocop/cop/rails/enum_uniqueness.rb +45 -0
  346. data/lib/rubocop/cop/rails/environment_comparison.rb +66 -0
  347. data/lib/rubocop/cop/rails/exit.rb +17 -11
  348. data/lib/rubocop/cop/rails/file_path.rb +72 -0
  349. data/lib/rubocop/cop/rails/find_by.rb +14 -20
  350. data/lib/rubocop/cop/rails/find_each.rb +8 -21
  351. data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +9 -2
  352. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +84 -0
  353. data/lib/rubocop/cop/rails/http_positional_arguments.rb +102 -0
  354. data/lib/rubocop/cop/rails/inverse_of.rb +218 -0
  355. data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +112 -0
  356. data/lib/rubocop/cop/rails/not_null_column.rb +67 -0
  357. data/lib/rubocop/cop/rails/output.rb +15 -13
  358. data/lib/rubocop/cop/rails/output_safety.rb +65 -17
  359. data/lib/rubocop/cop/rails/pluralization_grammar.rb +30 -29
  360. data/lib/rubocop/cop/rails/presence.rb +118 -0
  361. data/lib/rubocop/cop/rails/present.rb +143 -0
  362. data/lib/rubocop/cop/rails/read_write_attribute.rb +20 -26
  363. data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +133 -0
  364. data/lib/rubocop/cop/rails/relative_date_constant.rb +88 -0
  365. data/lib/rubocop/cop/rails/request_referer.rb +28 -13
  366. data/lib/rubocop/cop/rails/reversible_migration.rb +281 -0
  367. data/lib/rubocop/cop/rails/safe_navigation.rb +90 -0
  368. data/lib/rubocop/cop/rails/save_bang.rb +104 -19
  369. data/lib/rubocop/cop/rails/scope_args.rb +5 -10
  370. data/lib/rubocop/cop/rails/skips_model_validations.rb +70 -0
  371. data/lib/rubocop/cop/rails/time_zone.rb +34 -21
  372. data/lib/rubocop/cop/rails/uniq_before_pluck.rb +17 -14
  373. data/lib/rubocop/cop/rails/unknown_env.rb +63 -0
  374. data/lib/rubocop/cop/rails/validation.rb +16 -20
  375. data/lib/rubocop/cop/registry.rb +172 -0
  376. data/lib/rubocop/cop/security/eval.rb +30 -0
  377. data/lib/rubocop/cop/security/json_load.rb +46 -0
  378. data/lib/rubocop/cop/security/marshal_load.rb +39 -0
  379. data/lib/rubocop/cop/security/yaml_load.rb +37 -0
  380. data/lib/rubocop/cop/severity.rb +1 -2
  381. data/lib/rubocop/cop/style/alias.rb +54 -33
  382. data/lib/rubocop/cop/style/and_or.rb +77 -63
  383. data/lib/rubocop/cop/style/array_join.rb +13 -9
  384. data/lib/rubocop/cop/style/ascii_comments.rb +25 -7
  385. data/lib/rubocop/cop/style/attr.rb +24 -11
  386. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +21 -16
  387. data/lib/rubocop/cop/style/bare_percent_literals.rb +31 -11
  388. data/lib/rubocop/cop/style/begin_block.rb +1 -2
  389. data/lib/rubocop/cop/style/block_comments.rb +20 -11
  390. data/lib/rubocop/cop/style/block_delimiters.rb +122 -51
  391. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +142 -54
  392. data/lib/rubocop/cop/style/case_equality.rb +15 -4
  393. data/lib/rubocop/cop/style/character_literal.rb +12 -5
  394. data/lib/rubocop/cop/style/class_and_module_children.rb +85 -6
  395. data/lib/rubocop/cop/style/class_check.rb +35 -19
  396. data/lib/rubocop/cop/style/class_methods.rb +13 -14
  397. data/lib/rubocop/cop/style/class_vars.rb +5 -5
  398. data/lib/rubocop/cop/style/collection_methods.rb +12 -13
  399. data/lib/rubocop/cop/style/colon_method_call.rb +24 -16
  400. data/lib/rubocop/cop/style/colon_method_definition.rb +36 -0
  401. data/lib/rubocop/cop/style/command_literal.rb +98 -32
  402. data/lib/rubocop/cop/style/comment_annotation.rb +41 -15
  403. data/lib/rubocop/cop/style/commented_keyword.rb +84 -0
  404. data/lib/rubocop/cop/style/conditional_assignment.rb +161 -112
  405. data/lib/rubocop/cop/style/copyright.rb +32 -34
  406. data/lib/rubocop/cop/style/date_time.rb +44 -0
  407. data/lib/rubocop/cop/style/def_with_parentheses.rb +32 -9
  408. data/lib/rubocop/cop/style/dir.rb +48 -0
  409. data/lib/rubocop/cop/style/documentation.rb +44 -58
  410. data/lib/rubocop/cop/style/documentation_method.rb +76 -0
  411. data/lib/rubocop/cop/style/double_negation.rb +3 -3
  412. data/lib/rubocop/cop/style/each_for_simple_loop.rb +14 -13
  413. data/lib/rubocop/cop/style/each_with_object.rb +28 -25
  414. data/lib/rubocop/cop/style/empty_block_parameter.rb +47 -0
  415. data/lib/rubocop/cop/style/empty_case_condition.rb +18 -30
  416. data/lib/rubocop/cop/style/empty_else.rb +82 -51
  417. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +43 -0
  418. data/lib/rubocop/cop/style/empty_literal.rb +76 -48
  419. data/lib/rubocop/cop/style/empty_method.rb +112 -0
  420. data/lib/rubocop/cop/style/encoding.rb +10 -40
  421. data/lib/rubocop/cop/style/end_block.rb +1 -2
  422. data/lib/rubocop/cop/style/eval_with_location.rb +146 -0
  423. data/lib/rubocop/cop/style/even_odd.rb +25 -44
  424. data/lib/rubocop/cop/style/flip_flop.rb +13 -3
  425. data/lib/rubocop/cop/style/for.rb +19 -15
  426. data/lib/rubocop/cop/style/format_string.rb +88 -42
  427. data/lib/rubocop/cop/style/format_string_token.rb +163 -0
  428. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +90 -15
  429. data/lib/rubocop/cop/style/global_vars.rb +14 -5
  430. data/lib/rubocop/cop/style/guard_clause.rb +22 -62
  431. data/lib/rubocop/cop/style/hash_syntax.rb +109 -59
  432. data/lib/rubocop/cop/style/identical_conditional_branches.rb +73 -32
  433. data/lib/rubocop/cop/style/if_inside_else.rb +16 -20
  434. data/lib/rubocop/cop/style/if_unless_modifier.rb +48 -39
  435. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +6 -12
  436. data/lib/rubocop/cop/style/if_with_semicolon.rb +10 -2
  437. data/lib/rubocop/cop/style/implicit_runtime_error.rb +7 -7
  438. data/lib/rubocop/cop/style/infinite_loop.rb +33 -32
  439. data/lib/rubocop/cop/style/inline_comment.rb +17 -5
  440. data/lib/rubocop/cop/style/inverse_methods.rb +149 -0
  441. data/lib/rubocop/cop/style/lambda.rb +66 -63
  442. data/lib/rubocop/cop/style/lambda_call.rb +50 -20
  443. data/lib/rubocop/cop/style/line_end_concatenation.rb +38 -17
  444. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +90 -0
  445. data/lib/rubocop/cop/style/{method_call_parentheses.rb → method_call_without_args_parentheses.rb} +32 -25
  446. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +9 -9
  447. data/lib/rubocop/cop/style/method_def_parentheses.rb +101 -29
  448. data/lib/rubocop/cop/style/method_missing.rb +14 -20
  449. data/lib/rubocop/cop/style/min_max.rb +68 -0
  450. data/lib/rubocop/cop/style/missing_else.rb +61 -21
  451. data/lib/rubocop/cop/style/mixin_grouping.rb +145 -0
  452. data/lib/rubocop/cop/style/mixin_usage.rb +82 -0
  453. data/lib/rubocop/cop/style/module_function.rb +44 -18
  454. data/lib/rubocop/cop/style/multiline_block_chain.rb +8 -15
  455. data/lib/rubocop/cop/style/multiline_if_modifier.rb +67 -0
  456. data/lib/rubocop/cop/style/multiline_if_then.rb +21 -14
  457. data/lib/rubocop/cop/style/multiline_memoization.rb +93 -0
  458. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +21 -9
  459. data/lib/rubocop/cop/style/multiple_comparison.rb +77 -0
  460. data/lib/rubocop/cop/style/mutable_constant.rb +17 -9
  461. data/lib/rubocop/cop/style/negated_if.rb +76 -25
  462. data/lib/rubocop/cop/style/negated_while.rb +4 -22
  463. data/lib/rubocop/cop/style/nested_modifier.rb +17 -47
  464. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +32 -28
  465. data/lib/rubocop/cop/style/nested_ternary_operator.rb +3 -6
  466. data/lib/rubocop/cop/style/next.rb +72 -53
  467. data/lib/rubocop/cop/style/nil_comparison.rb +10 -14
  468. data/lib/rubocop/cop/style/non_nil_check.rb +69 -62
  469. data/lib/rubocop/cop/style/not.rb +19 -13
  470. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +16 -7
  471. data/lib/rubocop/cop/style/numeric_literals.rb +33 -12
  472. data/lib/rubocop/cop/style/numeric_predicate.rb +30 -32
  473. data/lib/rubocop/cop/style/one_line_conditional.rb +21 -17
  474. data/lib/rubocop/cop/style/option_hash.rb +11 -37
  475. data/lib/rubocop/cop/style/optional_arguments.rb +20 -9
  476. data/lib/rubocop/cop/style/or_assignment.rb +88 -0
  477. data/lib/rubocop/cop/style/parallel_assignment.rb +83 -64
  478. data/lib/rubocop/cop/style/parentheses_around_condition.rb +37 -19
  479. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +50 -15
  480. data/lib/rubocop/cop/style/percent_q_literals.rb +40 -17
  481. data/lib/rubocop/cop/style/perl_backrefs.rb +9 -3
  482. data/lib/rubocop/cop/style/preferred_hash_methods.rb +48 -14
  483. data/lib/rubocop/cop/style/proc.rb +13 -10
  484. data/lib/rubocop/cop/style/raise_args.rb +46 -50
  485. data/lib/rubocop/cop/style/random_with_offset.rb +160 -0
  486. data/lib/rubocop/cop/style/redundant_begin.rb +16 -6
  487. data/lib/rubocop/cop/style/redundant_conditional.rb +96 -0
  488. data/lib/rubocop/cop/style/redundant_exception.rb +4 -5
  489. data/lib/rubocop/cop/style/redundant_freeze.rb +7 -10
  490. data/lib/rubocop/cop/style/redundant_parentheses.rb +70 -31
  491. data/lib/rubocop/cop/style/redundant_return.rb +61 -23
  492. data/lib/rubocop/cop/style/redundant_self.rb +62 -60
  493. data/lib/rubocop/cop/style/regexp_literal.rb +100 -34
  494. data/lib/rubocop/cop/style/rescue_modifier.rb +15 -17
  495. data/lib/rubocop/cop/style/rescue_standard_error.rb +122 -0
  496. data/lib/rubocop/cop/style/return_nil.rb +89 -0
  497. data/lib/rubocop/cop/style/safe_navigation.rb +197 -0
  498. data/lib/rubocop/cop/style/self_assignment.rb +20 -17
  499. data/lib/rubocop/cop/style/semicolon.rb +25 -17
  500. data/lib/rubocop/cop/style/send.rb +14 -4
  501. data/lib/rubocop/cop/style/signal_exception.rb +105 -7
  502. data/lib/rubocop/cop/style/single_line_block_params.rb +27 -21
  503. data/lib/rubocop/cop/style/single_line_methods.rb +45 -31
  504. data/lib/rubocop/cop/style/special_global_vars.rb +32 -28
  505. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +24 -53
  506. data/lib/rubocop/cop/style/stderr_puts.rb +54 -0
  507. data/lib/rubocop/cop/style/string_hash_keys.rb +36 -0
  508. data/lib/rubocop/cop/style/string_literals.rb +31 -5
  509. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +20 -2
  510. data/lib/rubocop/cop/style/string_methods.rb +22 -9
  511. data/lib/rubocop/cop/style/struct_inheritance.rb +5 -17
  512. data/lib/rubocop/cop/style/symbol_array.rb +39 -65
  513. data/lib/rubocop/cop/style/symbol_literal.rb +1 -2
  514. data/lib/rubocop/cop/style/symbol_proc.rb +35 -52
  515. data/lib/rubocop/cop/style/ternary_parentheses.rb +143 -42
  516. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +101 -0
  517. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +31 -20
  518. data/lib/rubocop/cop/style/trailing_comma_in_literal.rb +26 -8
  519. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +95 -0
  520. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +97 -37
  521. data/lib/rubocop/cop/style/trivial_accessors.rb +72 -66
  522. data/lib/rubocop/cop/style/unless_else.rb +19 -13
  523. data/lib/rubocop/cop/style/unneeded_capital_w.rb +24 -10
  524. data/lib/rubocop/cop/style/unneeded_interpolation.rb +22 -24
  525. data/lib/rubocop/cop/style/unneeded_percent_q.rb +28 -22
  526. data/lib/rubocop/cop/style/variable_interpolation.rb +23 -10
  527. data/lib/rubocop/cop/style/when_then.rb +18 -4
  528. data/lib/rubocop/cop/style/while_until_do.rb +34 -16
  529. data/lib/rubocop/cop/style/while_until_modifier.rb +32 -12
  530. data/lib/rubocop/cop/style/word_array.rb +45 -102
  531. data/lib/rubocop/cop/style/yoda_condition.rb +107 -0
  532. data/lib/rubocop/cop/style/zero_length_predicate.rb +55 -32
  533. data/lib/rubocop/cop/team.rb +33 -35
  534. data/lib/rubocop/cop/util.rb +120 -54
  535. data/lib/rubocop/cop/variable_force/assignment.rb +5 -9
  536. data/lib/rubocop/cop/variable_force/branch.rb +318 -0
  537. data/lib/rubocop/cop/variable_force/branchable.rb +21 -0
  538. data/lib/rubocop/cop/variable_force/reference.rb +1 -2
  539. data/lib/rubocop/cop/variable_force/scope.rb +37 -26
  540. data/lib/rubocop/cop/variable_force/variable.rb +12 -12
  541. data/lib/rubocop/cop/variable_force/variable_table.rb +3 -4
  542. data/lib/rubocop/cop/variable_force.rb +72 -39
  543. data/lib/rubocop/error.rb +0 -1
  544. data/lib/rubocop/formatter/base_formatter.rb +4 -9
  545. data/lib/rubocop/formatter/clang_style_formatter.rb +2 -3
  546. data/lib/rubocop/formatter/colorizable.rb +9 -10
  547. data/lib/rubocop/formatter/disabled_config_formatter.rb +48 -35
  548. data/lib/rubocop/formatter/disabled_lines_formatter.rb +0 -1
  549. data/lib/rubocop/formatter/emacs_style_formatter.rb +0 -1
  550. data/lib/rubocop/formatter/file_list_formatter.rb +0 -1
  551. data/lib/rubocop/formatter/formatter_set.rb +16 -13
  552. data/lib/rubocop/formatter/fuubar_style_formatter.rb +6 -1
  553. data/lib/rubocop/formatter/html_formatter.rb +5 -5
  554. data/lib/rubocop/formatter/json_formatter.rb +9 -4
  555. data/lib/rubocop/formatter/offense_count_formatter.rb +2 -1
  556. data/lib/rubocop/formatter/progress_formatter.rb +0 -1
  557. data/lib/rubocop/formatter/quiet_formatter.rb +13 -0
  558. data/lib/rubocop/formatter/simple_text_formatter.rb +7 -17
  559. data/lib/rubocop/formatter/tap_formatter.rb +71 -0
  560. data/lib/rubocop/formatter/text_util.rb +0 -1
  561. data/lib/rubocop/formatter/worst_offenders_formatter.rb +6 -5
  562. data/lib/rubocop/magic_comment.rb +210 -0
  563. data/lib/rubocop/name_similarity.rb +0 -1
  564. data/lib/rubocop/node_pattern.rb +181 -118
  565. data/lib/rubocop/options.rb +154 -88
  566. data/lib/rubocop/path_util.rb +38 -4
  567. data/lib/rubocop/platform.rb +11 -0
  568. data/lib/rubocop/processed_source.rb +23 -20
  569. data/lib/rubocop/rake_task.rb +16 -24
  570. data/lib/rubocop/remote_config.rb +40 -13
  571. data/lib/rubocop/result_cache.rb +33 -24
  572. data/lib/rubocop/rspec/cop_helper.rb +21 -7
  573. data/lib/rubocop/rspec/expect_offense.rb +165 -0
  574. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +1 -2
  575. data/lib/rubocop/rspec/shared_contexts.rb +24 -9
  576. data/lib/rubocop/rspec/shared_examples.rb +10 -19
  577. data/lib/rubocop/rspec/support.rb +5 -5
  578. data/lib/rubocop/runner.rb +74 -39
  579. data/lib/rubocop/string_interpreter.rb +0 -1
  580. data/lib/rubocop/string_util.rb +11 -6
  581. data/lib/rubocop/target_finder.rb +70 -8
  582. data/lib/rubocop/token.rb +79 -2
  583. data/lib/rubocop/version.rb +2 -5
  584. data/lib/rubocop/warning.rb +0 -1
  585. data/lib/rubocop.rb +569 -398
  586. metadata +301 -112
  587. data/lib/rubocop/ast_node/builder.rb +0 -31
  588. data/lib/rubocop/ast_node/sexp.rb +0 -14
  589. data/lib/rubocop/ast_node.rb +0 -623
  590. data/lib/rubocop/cop/lint/eval.rb +0 -23
  591. data/lib/rubocop/cop/lint/invalid_character_literal.rb +0 -39
  592. data/lib/rubocop/cop/lint/useless_array_splat.rb +0 -56
  593. data/lib/rubocop/cop/mixin/access_modifier_node.rb +0 -42
  594. data/lib/rubocop/cop/mixin/autocorrect_alignment.rb +0 -152
  595. data/lib/rubocop/cop/mixin/hash_node.rb +0 -15
  596. data/lib/rubocop/cop/mixin/if_node.rb +0 -37
  597. data/lib/rubocop/cop/mixin/on_method_def.rb +0 -31
  598. data/lib/rubocop/cop/mixin/space_inside.rb +0 -79
  599. data/lib/rubocop/cop/performance/hash_each.rb +0 -86
  600. data/lib/rubocop/cop/performance/push_splat.rb +0 -47
  601. data/lib/rubocop/cop/style/accessor_method_name.rb +0 -46
  602. data/lib/rubocop/cop/style/align_array.rb +0 -21
  603. data/lib/rubocop/cop/style/align_hash.rb +0 -256
  604. data/lib/rubocop/cop/style/case_indentation.rb +0 -92
  605. data/lib/rubocop/cop/style/class_and_module_camel_case.rb +0 -30
  606. data/lib/rubocop/cop/style/constant_name.rb +0 -30
  607. data/lib/rubocop/cop/style/empty_line_between_defs.rb +0 -76
  608. data/lib/rubocop/cop/style/empty_lines_around_class_body.rb +0 -40
  609. data/lib/rubocop/cop/style/end_of_line.rb +0 -31
  610. data/lib/rubocop/cop/style/initial_indentation.rb +0 -38
  611. data/lib/rubocop/cop/style/leading_comment_space.rb +0 -33
  612. data/lib/rubocop/cop/style/method_name.rb +0 -29
  613. data/lib/rubocop/cop/style/multiline_method_call_indentation.rb +0 -176
  614. data/lib/rubocop/cop/style/op_method.rb +0 -44
  615. data/lib/rubocop/cop/style/predicate_name.rb +0 -68
  616. data/lib/rubocop/cop/style/space_after_comma.rb +0 -22
  617. data/lib/rubocop/cop/style/space_after_not.rb +0 -42
  618. data/lib/rubocop/cop/style/space_around_operators.rb +0 -132
  619. data/lib/rubocop/cop/style/space_before_block_braces.rb +0 -65
  620. data/lib/rubocop/cop/style/space_before_comma.rb +0 -17
  621. data/lib/rubocop/cop/style/space_before_semicolon.rb +0 -17
  622. data/lib/rubocop/cop/style/space_inside_block_braces.rb +0 -166
  623. data/lib/rubocop/cop/style/space_inside_brackets.rb +0 -21
  624. data/lib/rubocop/cop/style/space_inside_parens.rb +0 -17
  625. data/lib/rubocop/cop/style/space_inside_string_interpolation.rb +0 -52
  626. data/lib/rubocop/cop/style/variable_name.rb +0 -40
  627. data/lib/rubocop/cop/variable_force/locatable.rb +0 -197
@@ -1,13 +1,14 @@
1
- # encoding: utf-8
2
1
  # frozen_string_literal: true
3
2
 
4
3
  require 'optparse'
5
4
  require 'shellwords'
6
5
 
7
6
  module RuboCop
7
+ class IncorrectCopNameError < StandardError; end
8
+
8
9
  # This class handles command line options.
9
10
  class Options
10
- EXITING_OPTIONS = [:version, :verbose_version, :show_cops].freeze
11
+ EXITING_OPTIONS = %i[version verbose_version show_cops].freeze
11
12
  DEFAULT_MAXIMUM_EXCLUSION_ITEMS = 15
12
13
 
13
14
  def initialize
@@ -18,14 +19,19 @@ module RuboCop
18
19
  def parse(command_line_args)
19
20
  args = args_from_file.concat(args_from_env).concat(command_line_args)
20
21
  define_options(args).parse!(args)
21
- # The --no-color CLI option sets `color: false` so we don't want the
22
- # `no_color` key, which is created automatically.
23
- @options.delete(:no_color)
24
22
 
25
23
  @validator.validate_compatibility
26
24
 
27
- if @options[:stdin] && !args.one?
28
- raise ArgumentError, '-s/--stdin requires exactly one path.'
25
+ if @options[:stdin]
26
+ # The parser has put the file name given after --stdin into
27
+ # @options[:stdin]. The args array should be empty.
28
+ if args.any?
29
+ raise ArgumentError, '-s/--stdin requires exactly one path.'
30
+ end
31
+ # We want the STDIN contents in @options[:stdin] and the file name in
32
+ # args to simplify the rest of the processing.
33
+ args = [@options[:stdin]]
34
+ @options[:stdin] = $stdin.binmode.read
29
35
  end
30
36
 
31
37
  [@options, args]
@@ -34,7 +40,7 @@ module RuboCop
34
40
  private
35
41
 
36
42
  def args_from_file
37
- if File.exist?('.rubocop')
43
+ if File.exist?('.rubocop') && !File.directory?('.rubocop')
38
44
  IO.readlines('.rubocop').map(&:strip)
39
45
  else
40
46
  []
@@ -59,6 +65,8 @@ module RuboCop
59
65
  add_severity_option(opts)
60
66
  add_flags_with_optional_args(opts)
61
67
  add_boolean_flags(opts)
68
+
69
+ option(opts, '-s', '--stdin FILE')
62
70
  end
63
71
  end
64
72
 
@@ -91,6 +99,9 @@ module RuboCop
91
99
  end
92
100
 
93
101
  option(opts, '--force-exclusion')
102
+ option(opts, '--ignore-parent-exclusion')
103
+
104
+ option(opts, '--force-default-config')
94
105
 
95
106
  option(opts, '--no-offense-counts') do
96
107
  @options[:no_offense_counts] = true
@@ -127,11 +138,11 @@ module RuboCop
127
138
  end
128
139
  end
129
140
 
130
- def add_boolean_flags(opts)
141
+ def add_boolean_flags(opts) # rubocop:disable Metrics/MethodLength
131
142
  option(opts, '-F', '--fail-fast')
132
143
  option(opts, '-C', '--cache FLAG')
133
144
  option(opts, '-d', '--debug')
134
- option(opts, '-D', '--display-cop-names')
145
+ option(opts, '-D', '--[no-]display-cop-names')
135
146
  option(opts, '-E', '--extra-details')
136
147
  option(opts, '-S', '--display-style-guide')
137
148
  option(opts, '-R', '--rails')
@@ -141,11 +152,11 @@ module RuboCop
141
152
  end
142
153
  option(opts, '-a', '--auto-correct')
143
154
 
144
- option(opts, '-n', '--[no-]color') { |c| @options[:color] = c }
155
+ option(opts, '--[no-]color')
145
156
 
146
157
  option(opts, '-v', '--version')
147
158
  option(opts, '-V', '--verbose-version')
148
- option(opts, '-s', '--stdin') { @options[:stdin] = $stdin.read }
159
+ option(opts, '-P', '--parallel')
149
160
  end
150
161
 
151
162
  def add_list_options(opts)
@@ -167,24 +178,47 @@ module RuboCop
167
178
  # e.g. [..., '--auto-correct', ...] to :auto_correct.
168
179
  def long_opt_symbol(args)
169
180
  long_opt = args.find { |arg| arg.start_with?('--') }
170
- long_opt[2..-1].sub(/ .*/, '').tr('-', '_').gsub(/[\[\]]/, '').to_sym
181
+ long_opt[2..-1].sub('[no-]', '').sub(/ .*/, '')
182
+ .tr('-', '_').gsub(/[\[\]]/, '').to_sym
171
183
  end
172
184
  end
173
185
 
174
186
  # Validates option arguments and the options' compatibility with each other.
175
187
  class OptionsValidator
176
- # Cop name validation must be done later than option parsing, so it's not
177
- # called from within Options.
178
- def self.validate_cop_list(names)
179
- return unless names
180
-
181
- namespaces = Cop::Cop.all.types.map { |t| t.to_s.capitalize }
182
- names.each do |name|
183
- next if Cop::Cop.all.any? { |c| c.cop_name == name }
184
- next if namespaces.include?(name)
185
- next if %w(Syntax Lint/Syntax).include?(name)
186
-
187
- raise ArgumentError, "Unrecognized cop or namespace: #{name}."
188
+ class << self
189
+ # Cop name validation must be done later than option parsing, so it's not
190
+ # called from within Options.
191
+ def validate_cop_list(names)
192
+ return unless names
193
+
194
+ cop_names = Cop::Cop.registry.names
195
+ departments = Cop::Cop.registry.departments.map(&:to_s)
196
+
197
+ names.each do |name|
198
+ next if cop_names.include?(name)
199
+ next if departments.include?(name)
200
+ next if %w[Syntax Lint/Syntax].include?(name)
201
+
202
+ raise IncorrectCopNameError, format_message_from(name, cop_names)
203
+ end
204
+ end
205
+
206
+ private
207
+
208
+ def format_message_from(name, cop_names)
209
+ message = 'Unrecognized cop or department: %{name}.'
210
+ message_with_candidate = "#{message}\nDid you mean? %{candidate}"
211
+ corrections = cop_names.select do |cn|
212
+ score = StringUtil.similarity(cn, name)
213
+ score >= NameSimilarity::MINIMUM_SIMILARITY_TO_SUGGEST
214
+ end.sort
215
+
216
+ if corrections.empty?
217
+ format message, name: name
218
+ else
219
+ format message_with_candidate, name: name,
220
+ candidate: corrections.join(', ')
221
+ end
188
222
  end
189
223
  end
190
224
 
@@ -192,7 +226,7 @@ module RuboCop
192
226
  @options = options
193
227
  end
194
228
 
195
- def validate_compatibility
229
+ def validate_compatibility # rubocop:disable Metrics/MethodLength
196
230
  if only_includes_unneeded_disable?
197
231
  raise ArgumentError, 'Lint/UnneededDisable can not be used with --only.'
198
232
  end
@@ -206,23 +240,45 @@ module RuboCop
206
240
  raise ArgumentError, '--no-offense-counts can only be used together ' \
207
241
  'with --auto-gen-config.'
208
242
  end
243
+ validate_parallel
244
+
209
245
  return if incompatible_options.size <= 1
210
246
  raise ArgumentError, 'Incompatible cli options: ' \
211
247
  "#{incompatible_options.inspect}"
212
248
  end
213
249
 
250
+ def validate_parallel
251
+ return unless @options.key?(:parallel)
252
+
253
+ if @options[:cache] == 'false'
254
+ raise ArgumentError, '-P/--parallel uses caching to speed up ' \
255
+ 'execution, so combining with --cache false is ' \
256
+ 'not allowed.'
257
+ end
258
+
259
+ combos = {
260
+ auto_gen_config: '-P/--parallel uses caching to speed up execution, ' \
261
+ 'while --auto-gen-config needs a non-cached run, ' \
262
+ 'so they cannot be combined.',
263
+ fail_fast: '-P/--parallel can not be combined with -F/--fail-fast.',
264
+ auto_correct: '-P/--parallel can not be combined with --auto-correct.'
265
+ }
266
+
267
+ combos.each { |key, msg| raise ArgumentError, msg if @options.key?(key) }
268
+ end
269
+
214
270
  def only_includes_unneeded_disable?
215
271
  @options.key?(:only) &&
216
- (@options[:only] & %w(Lint/UnneededDisable UnneededDisable)).any?
272
+ (@options[:only] & %w[Lint/UnneededDisable UnneededDisable]).any?
217
273
  end
218
274
 
219
275
  def except_syntax?
220
276
  @options.key?(:except) &&
221
- (@options[:except] & %w(Lint/Syntax Syntax)).any?
277
+ (@options[:except] & %w[Lint/Syntax Syntax]).any?
222
278
  end
223
279
 
224
280
  def boolean_or_empty_cache?
225
- !@options.key?(:cache) || %w(true false).include?(@options[:cache])
281
+ !@options.key?(:cache) || %w[true false].include?(@options[:cache])
226
282
  end
227
283
 
228
284
  def no_offense_counts_without_auto_gen_config?
@@ -253,65 +309,75 @@ module RuboCop
253
309
  module OptionsHelp
254
310
  MAX_EXCL = RuboCop::Options::DEFAULT_MAXIMUM_EXCLUSION_ITEMS.to_s
255
311
  TEXT = {
256
- only: 'Run only the given cop(s).',
257
- only_guide_cops: ['Run only cops for rules that link to a',
258
- 'style guide.'],
259
- except: 'Disable the given cop(s).',
260
- require: 'Require Ruby file.',
261
- config: 'Specify configuration file.',
262
- auto_gen_config: ['Generate a configuration file acting as a',
263
- 'TODO list.'],
264
- no_offense_counts: ['Do not include offense counts in configuration',
265
- 'file generated by --auto-gen-config.'],
266
- exclude_limit: ['Used together with --auto-gen-config to',
267
- 'set the limit for how many Exclude',
268
- "properties to generate. Default is #{MAX_EXCL}."],
269
- force_exclusion: ['Force excluding files specified in the',
270
- 'configuration `Exclude` even if they are',
271
- 'explicitly passed as arguments.'],
272
- format: ['Choose an output formatter. This option',
273
- 'can be specified multiple times to enable',
274
- 'multiple formatters at the same time.',
275
- ' [p]rogress (default)',
276
- ' [s]imple',
277
- ' [c]lang',
278
- ' [d]isabled cops via inline comments',
279
- ' [fu]ubar',
280
- ' [e]macs',
281
- ' [j]son',
282
- ' [h]tml',
283
- ' [fi]les',
284
- ' [o]ffenses',
285
- ' [w]orst',
286
- ' custom formatter class name'],
287
- out: ['Write output to a file instead of STDOUT.',
288
- 'This option applies to the previously',
289
- 'specified --format, or the default format',
290
- 'if no format is specified.'],
291
- fail_level: ['Minimum severity (A/R/C/W/E/F) for exit',
292
- 'with error code.'],
293
- show_cops: ['Shows the given cops, or all cops by',
294
- 'default, and their configurations for the',
295
- 'current directory.'],
296
- fail_fast: ['Inspect files in order of modification',
297
- 'time and stop after the first file',
298
- 'containing offenses.'],
299
- cache: ["Use result caching (FLAG=true) or don't",
300
- '(FLAG=false), default determined by',
301
- 'configuration parameter AllCops: UseCache.'],
302
- debug: 'Display debug info.',
303
- display_cop_names: 'Display cop names in offense messages.',
304
- display_style_guide: 'Display style guide URLs in offense messages.',
305
- extra_details: 'Display extra details in offense messages.',
306
- rails: 'Run extra Rails cops.',
307
- lint: 'Run only lint cops.',
308
- list_target_files: 'List all files RuboCop will inspect.',
309
- auto_correct: 'Auto-correct offenses.',
310
- no_color: 'Force color output on or off.',
311
- version: 'Display version.',
312
- verbose_version: 'Display verbose version.',
313
- stdin: ['Pipe source from STDIN.',
314
- 'This is useful for editor integration.']
312
+ only: 'Run only the given cop(s).',
313
+ only_guide_cops: ['Run only cops for rules that link to a',
314
+ 'style guide.'],
315
+ except: 'Disable the given cop(s).',
316
+ require: 'Require Ruby file.',
317
+ config: 'Specify configuration file.',
318
+ auto_gen_config: ['Generate a configuration file acting as a',
319
+ 'TODO list.'],
320
+ no_offense_counts: ['Do not include offense counts in configuration',
321
+ 'file generated by --auto-gen-config.'],
322
+ exclude_limit: ['Used together with --auto-gen-config to',
323
+ 'set the limit for how many Exclude',
324
+ "properties to generate. Default is #{MAX_EXCL}."],
325
+ force_exclusion: ['Force excluding files specified in the',
326
+ 'configuration `Exclude` even if they are',
327
+ 'explicitly passed as arguments.'],
328
+ ignore_parent_exclusion:
329
+ ['Prevent from inheriting AllCops/Exclude from',
330
+ 'parent folders.'],
331
+ force_default_config: ['Use default configuration even if configuration',
332
+ 'files are present in the directory tree.'],
333
+ format: ['Choose an output formatter. This option',
334
+ 'can be specified multiple times to enable',
335
+ 'multiple formatters at the same time.',
336
+ ' [p]rogress (default)',
337
+ ' [s]imple',
338
+ ' [c]lang',
339
+ ' [d]isabled cops via inline comments',
340
+ ' [fu]ubar',
341
+ ' [e]macs',
342
+ ' [j]son',
343
+ ' [h]tml',
344
+ ' [fi]les',
345
+ ' [o]ffenses',
346
+ ' [w]orst',
347
+ ' [t]ap',
348
+ ' [q]uiet',
349
+ ' custom formatter class name'],
350
+ out: ['Write output to a file instead of STDOUT.',
351
+ 'This option applies to the previously',
352
+ 'specified --format, or the default format',
353
+ 'if no format is specified.'],
354
+ fail_level: ['Minimum severity (A/R/C/W/E/F) for exit',
355
+ 'with error code.'],
356
+ show_cops: ['Shows the given cops, or all cops by',
357
+ 'default, and their configurations for the',
358
+ 'current directory.'],
359
+ fail_fast: ['Inspect files in order of modification',
360
+ 'time and stop after the first file',
361
+ 'containing offenses.'],
362
+ cache: ["Use result caching (FLAG=true) or don't",
363
+ '(FLAG=false), default determined by',
364
+ 'configuration parameter AllCops: UseCache.'],
365
+ debug: 'Display debug info.',
366
+ display_cop_names: ['Display cop names in offense messages.',
367
+ 'Default is true.'],
368
+ display_style_guide: 'Display style guide URLs in offense messages.',
369
+ extra_details: 'Display extra details in offense messages.',
370
+ rails: 'Run extra Rails cops.',
371
+ lint: 'Run only lint cops.',
372
+ list_target_files: 'List all files RuboCop will inspect.',
373
+ auto_correct: 'Auto-correct offenses.',
374
+ color: 'Force color output on or off.',
375
+ version: 'Display version.',
376
+ verbose_version: 'Display verbose version.',
377
+ parallel: ['Use available CPUs to execute inspection in',
378
+ 'parallel.'],
379
+ stdin: ['Pipe source from STDIN, using FILE in offense',
380
+ 'reports. This is useful for editor integration.']
315
381
  }.freeze
316
382
  end
317
383
  end
@@ -1,4 +1,3 @@
1
- # encoding: utf-8
2
1
  # frozen_string_literal: true
3
2
 
4
3
  module RuboCop
@@ -6,21 +5,48 @@ module RuboCop
6
5
  module PathUtil
7
6
  module_function
8
7
 
9
- def relative_path(path, base_dir = Dir.pwd)
8
+ def relative_path(path, base_dir = PathUtil.pwd)
10
9
  # Optimization for the common case where path begins with the base
11
10
  # dir. Just cut off the first part.
12
- return path[(base_dir.length + 1)..-1] if path.start_with?(base_dir)
11
+ if path.start_with?(base_dir)
12
+ base_dir_length = base_dir.length
13
+ result_length = path.length - base_dir_length - 1
14
+ return path[base_dir_length + 1, result_length]
15
+ end
13
16
 
14
17
  path_name = Pathname.new(File.expand_path(path))
15
18
  path_name.relative_path_from(Pathname.new(base_dir)).to_s
16
19
  end
17
20
 
21
+ def smart_path(path)
22
+ # Ideally, we calculate this relative to the project root.
23
+ base_dir = PathUtil.pwd
24
+
25
+ if path.start_with? base_dir
26
+ relative_path(path, base_dir)
27
+ else
28
+ path
29
+ end
30
+ end
31
+
18
32
  def match_path?(pattern, path)
19
33
  case pattern
20
34
  when String
21
35
  File.fnmatch?(pattern, path, File::FNM_PATHNAME)
22
36
  when Regexp
23
- path =~ pattern
37
+ begin
38
+ path =~ pattern
39
+ rescue ArgumentError => e
40
+ return false if e.message.start_with?('invalid byte sequence')
41
+ raise e
42
+ end
43
+ end
44
+ end
45
+
46
+ def find_file_upwards(filename, start_dir = PathUtil.pwd)
47
+ Pathname(File.expand_path(start_dir)).ascend do |dir|
48
+ file = File.join(dir, filename)
49
+ return file if File.exist?(file)
24
50
  end
25
51
  end
26
52
 
@@ -28,5 +54,13 @@ module RuboCop
28
54
  def absolute?(path)
29
55
  path =~ %r{\A([A-Z]:)?/}
30
56
  end
57
+
58
+ def self.pwd
59
+ @pwd ||= Dir.pwd
60
+ end
61
+
62
+ def self.reset_pwd
63
+ @pwd = nil
64
+ end
31
65
  end
32
66
  end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ # This module provides information on the platform that RuboCop is being run
5
+ # on.
6
+ module Platform
7
+ def self.windows?
8
+ RUBY_PLATFORM =~ /cygwin|mswin|mingw|bccwin|wince|emx/
9
+ end
10
+ end
11
+ end
@@ -1,4 +1,3 @@
1
- # encoding: utf-8
2
1
  # frozen_string_literal: true
3
2
 
4
3
  require 'digest/md5'
@@ -14,16 +13,16 @@ module RuboCop
14
13
  :parser_error, :raw_source, :ruby_version
15
14
 
16
15
  def self.from_file(path, ruby_version)
17
- file = File.read(path)
16
+ file = File.read(path, mode: 'rb')
18
17
  new(file, ruby_version, path)
19
18
  rescue Errno::ENOENT
20
19
  raise RuboCop::Error, "No such file or directory: #{path}"
21
20
  end
22
21
 
23
22
  def initialize(source, ruby_version, path = nil)
24
- # In Ruby 2, source code encoding defaults to UTF-8. We follow the same
25
- # principle regardless of which Ruby version we're running under.
26
- # Encoding comments will override this setting.
23
+ # Defaults source encoding to UTF-8, regardless of the encoding it has
24
+ # been read with, which could be non-utf8 depending on the default
25
+ # external encoding.
27
26
  unless source.encoding == Encoding::UTF_8
28
27
  source.force_encoding(Encoding::UTF_8)
29
28
  end
@@ -32,6 +31,7 @@ module RuboCop
32
31
  @path = path
33
32
  @diagnostics = []
34
33
  @ruby_version = ruby_version
34
+ @parser_error = nil
35
35
 
36
36
  parse(source, ruby_version)
37
37
  end
@@ -54,7 +54,7 @@ module RuboCop
54
54
  def lines
55
55
  @lines ||= begin
56
56
  all_lines = @buffer.source_lines
57
- last_token_line = tokens.any? ? tokens.last.pos.line : all_lines.size
57
+ last_token_line = tokens.any? ? tokens.last.line : all_lines.size
58
58
  result = []
59
59
  all_lines.each_with_index do |line, ix|
60
60
  break if ix >= last_token_line && line == '__END__'
@@ -70,7 +70,7 @@ module RuboCop
70
70
 
71
71
  def valid_syntax?
72
72
  return false if @parser_error
73
- @diagnostics.none? { |d| [:error, :fatal].include?(d.level) }
73
+ @diagnostics.none? { |d| %i[error fatal].include?(d.level) }
74
74
  end
75
75
 
76
76
  # Raw source checksum for tracking infinite loops.
@@ -91,26 +91,25 @@ module RuboCop
91
91
  return
92
92
  end
93
93
 
94
- parser = create_parser(ruby_version)
94
+ @ast, @comments, @tokens = tokenize(create_parser(ruby_version))
95
+ end
95
96
 
97
+ def tokenize(parser)
96
98
  begin
97
- @ast, @comments, tokens = parser.tokenize(@buffer)
98
- @ast.complete! if @ast
99
+ ast, comments, tokens = parser.tokenize(@buffer)
100
+ ast.complete! if ast
99
101
  rescue Parser::SyntaxError # rubocop:disable Lint/HandleExceptions
100
102
  # All errors are in diagnostics. No need to handle exception.
101
103
  end
102
104
 
103
- @tokens = tokens.map { |t| Token.from_parser_token(t) } if tokens
105
+ tokens = tokens.map { |t| Token.from_parser_token(t) } if tokens
106
+
107
+ [ast, comments, tokens]
104
108
  end
105
109
 
106
- def parser_class(ruby_version) # rubocop:disable Metrics/MethodLength
110
+ # rubocop:disable Metrics/MethodLength
111
+ def parser_class(ruby_version)
107
112
  case ruby_version
108
- when 1.9
109
- require 'parser/ruby19'
110
- Parser::Ruby19
111
- when 2.0
112
- require 'parser/ruby20'
113
- Parser::Ruby20
114
113
  when 2.1
115
114
  require 'parser/ruby21'
116
115
  Parser::Ruby21
@@ -123,16 +122,20 @@ module RuboCop
123
122
  when 2.4
124
123
  require 'parser/ruby24'
125
124
  Parser::Ruby24
125
+ when 2.5
126
+ require 'parser/ruby25'
127
+ Parser::Ruby25
126
128
  else
127
129
  raise ArgumentError, "Unknown Ruby version: #{ruby_version.inspect}"
128
130
  end
129
131
  end
132
+ # rubocop:enable Metrics/MethodLength
130
133
 
131
134
  def create_parser(ruby_version)
132
- builder = RuboCop::Node::Builder.new
135
+ builder = RuboCop::AST::Builder.new
133
136
 
134
137
  parser_class(ruby_version).new(builder).tap do |parser|
135
- # On JRuby and Rubinius, there's a risk that we hang in tokenize() if we
138
+ # On JRuby there's a risk that we hang in tokenize() if we
136
139
  # don't set the all errors as fatal flag. The problem is caused by a bug
137
140
  # in Racc that is discussed in issue #93 of the whitequark/parser
138
141
  # project on GitHub.
@@ -1,4 +1,3 @@
1
- # encoding: utf-8
2
1
  # frozen_string_literal: true
3
2
 
4
3
  require 'rake'
@@ -18,25 +17,21 @@ module RuboCop
18
17
  attr_accessor :requires
19
18
  attr_accessor :options
20
19
 
21
- def initialize(*args, &task_block)
22
- setup_ivars(args)
20
+ def initialize(name = :rubocop, *args, &task_block)
21
+ setup_ivars(name)
23
22
 
24
23
  desc 'Run RuboCop' unless ::Rake.application.last_description
25
24
 
26
25
  task(name, *args) do |_, task_args|
27
- RakeFileUtils.send(:verbose, verbose) do
26
+ RakeFileUtils.verbose(verbose) do
28
27
  yield(*[self, task_args].slice(0, task_block.arity)) if block_given?
29
- run_main_task(verbose)
28
+ run_cli(verbose, full_options)
30
29
  end
31
30
  end
32
31
 
33
32
  setup_subtasks(name, *args, &task_block)
34
33
  end
35
34
 
36
- def run_main_task(verbose)
37
- run_cli(verbose, full_options)
38
- end
39
-
40
35
  private
41
36
 
42
37
  def run_cli(verbose, options)
@@ -51,19 +46,14 @@ module RuboCop
51
46
  end
52
47
 
53
48
  def full_options
54
- [].tap do |result|
55
- result.concat(formatters.map { |f| ['--format', f] }.flatten)
56
- result.concat(requires.map { |r| ['--require', r] }.flatten)
57
- result.concat(options.flatten)
58
- result.concat(patterns)
59
- end
49
+ formatters.map { |f| ['--format', f] }.flatten
50
+ .concat(requires.map { |r| ['--require', r] }.flatten)
51
+ .concat(options.flatten)
52
+ .concat(patterns)
60
53
  end
61
54
 
62
- def setup_ivars(args)
63
- # More lazy-loading to keep load time down.
64
- require 'rubocop/options'
65
-
66
- @name = args.shift || :rubocop
55
+ def setup_ivars(name)
56
+ @name = name
67
57
  @verbose = true
68
58
  @fail_on_error = true
69
59
  @patterns = []
@@ -73,13 +63,15 @@ module RuboCop
73
63
  end
74
64
 
75
65
  def setup_subtasks(name, *args, &task_block)
76
- namespace name do
66
+ namespace(name) do
77
67
  desc 'Auto-correct RuboCop offenses'
78
68
 
79
69
  task(:auto_correct, *args) do |_, task_args|
80
- yield(*[self, task_args].slice(0, task_block.arity)) if block_given?
81
- options = full_options.unshift('--auto-correct')
82
- run_cli(verbose, options)
70
+ RakeFileUtils.verbose(verbose) do
71
+ yield(*[self, task_args].slice(0, task_block.arity)) if block_given?
72
+ options = full_options.unshift('--auto-correct')
73
+ run_cli(verbose, options)
74
+ end
83
75
  end
84
76
  end
85
77
  end