rubocop 0.87.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 (593) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +20 -0
  3. data/README.md +225 -0
  4. data/assets/logo.png +0 -0
  5. data/assets/output.html.erb +261 -0
  6. data/bin/console +10 -0
  7. data/bin/setup +7 -0
  8. data/config/default.yml +4203 -0
  9. data/exe/rubocop +17 -0
  10. data/lib/rubocop.rb +598 -0
  11. data/lib/rubocop/ast_aliases.rb +8 -0
  12. data/lib/rubocop/cached_data.rb +58 -0
  13. data/lib/rubocop/cli.rb +131 -0
  14. data/lib/rubocop/cli/command.rb +21 -0
  15. data/lib/rubocop/cli/command/auto_genenerate_config.rb +140 -0
  16. data/lib/rubocop/cli/command/base.rb +33 -0
  17. data/lib/rubocop/cli/command/execute_runner.rb +76 -0
  18. data/lib/rubocop/cli/command/init_dotfile.rb +45 -0
  19. data/lib/rubocop/cli/command/show_cops.rb +76 -0
  20. data/lib/rubocop/cli/command/version.rb +17 -0
  21. data/lib/rubocop/cli/environment.rb +21 -0
  22. data/lib/rubocop/comment_config.rb +206 -0
  23. data/lib/rubocop/config.rb +281 -0
  24. data/lib/rubocop/config_loader.rb +236 -0
  25. data/lib/rubocop/config_loader_resolver.rb +234 -0
  26. data/lib/rubocop/config_obsoletion.rb +277 -0
  27. data/lib/rubocop/config_store.rb +58 -0
  28. data/lib/rubocop/config_validator.rb +223 -0
  29. data/lib/rubocop/cop/autocorrect_logic.rb +95 -0
  30. data/lib/rubocop/cop/badge.rb +73 -0
  31. data/lib/rubocop/cop/base.rb +399 -0
  32. data/lib/rubocop/cop/bundler/duplicated_gem.rb +73 -0
  33. data/lib/rubocop/cop/bundler/gem_comment.rb +133 -0
  34. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +59 -0
  35. data/lib/rubocop/cop/bundler/ordered_gems.rb +73 -0
  36. data/lib/rubocop/cop/commissioner.rb +122 -0
  37. data/lib/rubocop/cop/cop.rb +160 -0
  38. data/lib/rubocop/cop/corrector.rb +119 -0
  39. data/lib/rubocop/cop/correctors/alignment_corrector.rb +142 -0
  40. data/lib/rubocop/cop/correctors/condition_corrector.rb +27 -0
  41. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +53 -0
  42. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +26 -0
  43. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +73 -0
  44. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +136 -0
  45. data/lib/rubocop/cop/correctors/line_break_corrector.rb +61 -0
  46. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +68 -0
  47. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +44 -0
  48. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +31 -0
  49. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +117 -0
  50. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +29 -0
  51. data/lib/rubocop/cop/correctors/space_corrector.rb +46 -0
  52. data/lib/rubocop/cop/correctors/string_literal_corrector.rb +25 -0
  53. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +43 -0
  54. data/lib/rubocop/cop/force.rb +42 -0
  55. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +104 -0
  56. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +104 -0
  57. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +85 -0
  58. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +55 -0
  59. data/lib/rubocop/cop/generator.rb +223 -0
  60. data/lib/rubocop/cop/generator/configuration_injector.rb +66 -0
  61. data/lib/rubocop/cop/generator/require_file_injector.rb +78 -0
  62. data/lib/rubocop/cop/ignored_node.rb +36 -0
  63. data/lib/rubocop/cop/internal_affairs.rb +9 -0
  64. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +59 -0
  65. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +44 -0
  66. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +41 -0
  67. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +54 -0
  68. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +48 -0
  69. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +73 -0
  70. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +52 -0
  71. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +98 -0
  72. data/lib/rubocop/cop/layout/argument_alignment.rb +93 -0
  73. data/lib/rubocop/cop/layout/array_alignment.rb +82 -0
  74. data/lib/rubocop/cop/layout/assignment_indentation.rb +55 -0
  75. data/lib/rubocop/cop/layout/block_alignment.rb +244 -0
  76. data/lib/rubocop/cop/layout/block_end_newline.rb +64 -0
  77. data/lib/rubocop/cop/layout/case_indentation.rb +160 -0
  78. data/lib/rubocop/cop/layout/class_structure.rb +308 -0
  79. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +126 -0
  80. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +203 -0
  81. data/lib/rubocop/cop/layout/comment_indentation.rb +141 -0
  82. data/lib/rubocop/cop/layout/condition_position.rb +66 -0
  83. data/lib/rubocop/cop/layout/def_end_alignment.rb +74 -0
  84. data/lib/rubocop/cop/layout/dot_position.rb +105 -0
  85. data/lib/rubocop/cop/layout/else_alignment.rb +142 -0
  86. data/lib/rubocop/cop/layout/empty_comment.rb +151 -0
  87. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +157 -0
  88. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +64 -0
  89. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +152 -0
  90. data/lib/rubocop/cop/layout/empty_lines.rb +76 -0
  91. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +211 -0
  92. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +99 -0
  93. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +121 -0
  94. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +45 -0
  95. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +41 -0
  96. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +88 -0
  97. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +136 -0
  98. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +45 -0
  99. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +62 -0
  100. data/lib/rubocop/cop/layout/end_alignment.rb +189 -0
  101. data/lib/rubocop/cop/layout/end_of_line.rb +92 -0
  102. data/lib/rubocop/cop/layout/extra_spacing.rb +201 -0
  103. data/lib/rubocop/cop/layout/first_argument_indentation.rb +251 -0
  104. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +171 -0
  105. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +45 -0
  106. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +184 -0
  107. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +37 -0
  108. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +53 -0
  109. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +46 -0
  110. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +100 -0
  111. data/lib/rubocop/cop/layout/hash_alignment.rb +365 -0
  112. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +285 -0
  113. data/lib/rubocop/cop/layout/heredoc_indentation.rb +173 -0
  114. data/lib/rubocop/cop/layout/indentation_consistency.rb +202 -0
  115. data/lib/rubocop/cop/layout/indentation_style.rb +117 -0
  116. data/lib/rubocop/cop/layout/indentation_width.rb +362 -0
  117. data/lib/rubocop/cop/layout/initial_indentation.rb +59 -0
  118. data/lib/rubocop/cop/layout/leading_comment_space.rb +119 -0
  119. data/lib/rubocop/cop/layout/leading_empty_lines.rb +53 -0
  120. data/lib/rubocop/cop/layout/line_length.rb +280 -0
  121. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +118 -0
  122. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +39 -0
  123. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +95 -0
  124. data/lib/rubocop/cop/layout/multiline_block_layout.rb +154 -0
  125. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +118 -0
  126. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +50 -0
  127. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +52 -0
  128. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +134 -0
  129. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +220 -0
  130. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +131 -0
  131. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +123 -0
  132. data/lib/rubocop/cop/layout/parameter_alignment.rb +118 -0
  133. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +191 -0
  134. data/lib/rubocop/cop/layout/space_after_colon.rb +47 -0
  135. data/lib/rubocop/cop/layout/space_after_comma.rb +35 -0
  136. data/lib/rubocop/cop/layout/space_after_method_name.rb +42 -0
  137. data/lib/rubocop/cop/layout/space_after_not.rb +40 -0
  138. data/lib/rubocop/cop/layout/space_after_semicolon.rb +32 -0
  139. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +163 -0
  140. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +92 -0
  141. data/lib/rubocop/cop/layout/space_around_keyword.rb +244 -0
  142. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +131 -0
  143. data/lib/rubocop/cop/layout/space_around_operators.rb +242 -0
  144. data/lib/rubocop/cop/layout/space_before_block_braces.rb +150 -0
  145. data/lib/rubocop/cop/layout/space_before_comma.rb +31 -0
  146. data/lib/rubocop/cop/layout/space_before_comment.rb +33 -0
  147. data/lib/rubocop/cop/layout/space_before_first_arg.rb +75 -0
  148. data/lib/rubocop/cop/layout/space_before_semicolon.rb +27 -0
  149. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +82 -0
  150. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +229 -0
  151. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +53 -0
  152. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +248 -0
  153. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +200 -0
  154. data/lib/rubocop/cop/layout/space_inside_parens.rb +113 -0
  155. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +65 -0
  156. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +63 -0
  157. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +148 -0
  158. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +65 -0
  159. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +113 -0
  160. data/lib/rubocop/cop/layout/trailing_whitespace.rb +77 -0
  161. data/lib/rubocop/cop/legacy/corrections_proxy.rb +49 -0
  162. data/lib/rubocop/cop/legacy/corrector.rb +29 -0
  163. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +62 -0
  164. data/lib/rubocop/cop/lint/ambiguous_operator.rb +96 -0
  165. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +57 -0
  166. data/lib/rubocop/cop/lint/assignment_in_condition.rb +97 -0
  167. data/lib/rubocop/cop/lint/big_decimal_new.rb +44 -0
  168. data/lib/rubocop/cop/lint/boolean_symbol.rb +50 -0
  169. data/lib/rubocop/cop/lint/circular_argument_reference.rb +72 -0
  170. data/lib/rubocop/cop/lint/constant_resolution.rb +89 -0
  171. data/lib/rubocop/cop/lint/debugger.rb +77 -0
  172. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +111 -0
  173. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +137 -0
  174. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +81 -0
  175. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +53 -0
  176. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +38 -0
  177. data/lib/rubocop/cop/lint/duplicate_methods.rb +235 -0
  178. data/lib/rubocop/cop/lint/each_with_object_argument.rb +42 -0
  179. data/lib/rubocop/cop/lint/else_layout.rb +66 -0
  180. data/lib/rubocop/cop/lint/empty_ensure.rb +60 -0
  181. data/lib/rubocop/cop/lint/empty_expression.rb +42 -0
  182. data/lib/rubocop/cop/lint/empty_interpolation.rb +36 -0
  183. data/lib/rubocop/cop/lint/empty_when.rb +61 -0
  184. data/lib/rubocop/cop/lint/ensure_return.rb +63 -0
  185. data/lib/rubocop/cop/lint/erb_new_arguments.rb +162 -0
  186. data/lib/rubocop/cop/lint/flip_flop.rb +32 -0
  187. data/lib/rubocop/cop/lint/float_out_of_range.rb +35 -0
  188. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +195 -0
  189. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +156 -0
  190. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +101 -0
  191. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +127 -0
  192. data/lib/rubocop/cop/lint/inherit_exception.rb +100 -0
  193. data/lib/rubocop/cop/lint/interpolation_check.rb +53 -0
  194. data/lib/rubocop/cop/lint/literal_as_condition.rb +135 -0
  195. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +98 -0
  196. data/lib/rubocop/cop/lint/loop.rb +65 -0
  197. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +84 -0
  198. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +69 -0
  199. data/lib/rubocop/cop/lint/multiple_comparison.rb +48 -0
  200. data/lib/rubocop/cop/lint/nested_method_definition.rb +104 -0
  201. data/lib/rubocop/cop/lint/nested_percent_literal.rb +51 -0
  202. data/lib/rubocop/cop/lint/next_without_accumulator.rb +50 -0
  203. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +89 -0
  204. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +83 -0
  205. data/lib/rubocop/cop/lint/number_conversion.rb +81 -0
  206. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +86 -0
  207. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +91 -0
  208. data/lib/rubocop/cop/lint/percent_string_array.rb +71 -0
  209. data/lib/rubocop/cop/lint/percent_symbol_array.rb +69 -0
  210. data/lib/rubocop/cop/lint/raise_exception.rb +83 -0
  211. data/lib/rubocop/cop/lint/rand_one.rb +45 -0
  212. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +264 -0
  213. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +119 -0
  214. data/lib/rubocop/cop/lint/redundant_require_statement.rb +50 -0
  215. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +172 -0
  216. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +59 -0
  217. data/lib/rubocop/cop/lint/redundant_with_index.rb +82 -0
  218. data/lib/rubocop/cop/lint/redundant_with_object.rb +83 -0
  219. data/lib/rubocop/cop/lint/regexp_as_condition.rb +35 -0
  220. data/lib/rubocop/cop/lint/require_parentheses.rb +66 -0
  221. data/lib/rubocop/cop/lint/rescue_exception.rb +46 -0
  222. data/lib/rubocop/cop/lint/rescue_type.rb +94 -0
  223. data/lib/rubocop/cop/lint/return_in_void_context.rb +74 -0
  224. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +65 -0
  225. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +94 -0
  226. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +46 -0
  227. data/lib/rubocop/cop/lint/script_permission.rb +70 -0
  228. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +91 -0
  229. data/lib/rubocop/cop/lint/shadowed_argument.rb +182 -0
  230. data/lib/rubocop/cop/lint/shadowed_exception.rb +178 -0
  231. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +53 -0
  232. data/lib/rubocop/cop/lint/struct_new_override.rb +58 -0
  233. data/lib/rubocop/cop/lint/suppressed_exception.rb +92 -0
  234. data/lib/rubocop/cop/lint/syntax.rb +42 -0
  235. data/lib/rubocop/cop/lint/to_json.rb +41 -0
  236. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +82 -0
  237. data/lib/rubocop/cop/lint/unified_integer.rb +43 -0
  238. data/lib/rubocop/cop/lint/unreachable_code.rb +99 -0
  239. data/lib/rubocop/cop/lint/unused_block_argument.rb +165 -0
  240. data/lib/rubocop/cop/lint/unused_method_argument.rb +112 -0
  241. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +76 -0
  242. data/lib/rubocop/cop/lint/uri_regexp.rb +73 -0
  243. data/lib/rubocop/cop/lint/useless_access_modifier.rb +284 -0
  244. data/lib/rubocop/cop/lint/useless_assignment.rb +130 -0
  245. data/lib/rubocop/cop/lint/useless_comparison.rb +28 -0
  246. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +54 -0
  247. data/lib/rubocop/cop/lint/useless_setter_call.rb +168 -0
  248. data/lib/rubocop/cop/lint/void.rb +151 -0
  249. data/lib/rubocop/cop/message_annotator.rb +129 -0
  250. data/lib/rubocop/cop/metrics/abc_size.rb +24 -0
  251. data/lib/rubocop/cop/metrics/block_length.rb +72 -0
  252. data/lib/rubocop/cop/metrics/block_nesting.rb +65 -0
  253. data/lib/rubocop/cop/metrics/class_length.rb +59 -0
  254. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +64 -0
  255. data/lib/rubocop/cop/metrics/method_length.rb +59 -0
  256. data/lib/rubocop/cop/metrics/module_length.rb +59 -0
  257. data/lib/rubocop/cop/metrics/parameter_lists.rb +54 -0
  258. data/lib/rubocop/cop/metrics/perceived_complexity.rb +61 -0
  259. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +84 -0
  260. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +129 -0
  261. data/lib/rubocop/cop/metrics/utils/iterating_block.rb +61 -0
  262. data/lib/rubocop/cop/migration/department_name.rb +85 -0
  263. data/lib/rubocop/cop/mixin/alignment.rb +72 -0
  264. data/lib/rubocop/cop/mixin/allowed_methods.rb +19 -0
  265. data/lib/rubocop/cop/mixin/annotation_comment.rb +37 -0
  266. data/lib/rubocop/cop/mixin/array_min_size.rb +57 -0
  267. data/lib/rubocop/cop/mixin/array_syntax.rb +17 -0
  268. data/lib/rubocop/cop/mixin/auto_corrector.rb +12 -0
  269. data/lib/rubocop/cop/mixin/check_assignment.rb +44 -0
  270. data/lib/rubocop/cop/mixin/check_line_breakable.rb +184 -0
  271. data/lib/rubocop/cop/mixin/code_length.rb +42 -0
  272. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +100 -0
  273. data/lib/rubocop/cop/mixin/configurable_formatting.rb +45 -0
  274. data/lib/rubocop/cop/mixin/configurable_max.rb +23 -0
  275. data/lib/rubocop/cop/mixin/configurable_naming.rb +16 -0
  276. data/lib/rubocop/cop/mixin/configurable_numbering.rb +17 -0
  277. data/lib/rubocop/cop/mixin/def_node.rb +33 -0
  278. data/lib/rubocop/cop/mixin/documentation_comment.rb +52 -0
  279. data/lib/rubocop/cop/mixin/duplication.rb +46 -0
  280. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +172 -0
  281. data/lib/rubocop/cop/mixin/empty_parameter.rb +24 -0
  282. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +72 -0
  283. data/lib/rubocop/cop/mixin/enforce_superclass.rb +32 -0
  284. data/lib/rubocop/cop/mixin/first_element_line_break.rb +46 -0
  285. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +62 -0
  286. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +147 -0
  287. data/lib/rubocop/cop/mixin/hash_transform_method.rb +178 -0
  288. data/lib/rubocop/cop/mixin/heredoc.rb +32 -0
  289. data/lib/rubocop/cop/mixin/ignored_methods.rb +19 -0
  290. data/lib/rubocop/cop/mixin/ignored_pattern.rb +29 -0
  291. data/lib/rubocop/cop/mixin/integer_node.rb +14 -0
  292. data/lib/rubocop/cop/mixin/interpolation.rb +27 -0
  293. data/lib/rubocop/cop/mixin/line_length_help.rb +89 -0
  294. data/lib/rubocop/cop/mixin/match_range.rb +26 -0
  295. data/lib/rubocop/cop/mixin/method_complexity.rb +62 -0
  296. data/lib/rubocop/cop/mixin/method_preference.rb +31 -0
  297. data/lib/rubocop/cop/mixin/min_body_length.rb +21 -0
  298. data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +86 -0
  299. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +33 -0
  300. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +255 -0
  301. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +141 -0
  302. data/lib/rubocop/cop/mixin/negative_conditional.rb +32 -0
  303. data/lib/rubocop/cop/mixin/nil_methods.rb +23 -0
  304. data/lib/rubocop/cop/mixin/on_normal_if_unless.rb +14 -0
  305. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +61 -0
  306. data/lib/rubocop/cop/mixin/parentheses.rb +16 -0
  307. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +37 -0
  308. data/lib/rubocop/cop/mixin/percent_array.rb +52 -0
  309. data/lib/rubocop/cop/mixin/percent_literal.rb +38 -0
  310. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +181 -0
  311. data/lib/rubocop/cop/mixin/preferred_delimiters.rb +53 -0
  312. data/lib/rubocop/cop/mixin/range_help.rb +117 -0
  313. data/lib/rubocop/cop/mixin/rational_literal.rb +18 -0
  314. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +43 -0
  315. data/lib/rubocop/cop/mixin/rescue_node.rb +22 -0
  316. data/lib/rubocop/cop/mixin/safe_assignment.rb +23 -0
  317. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +55 -0
  318. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +49 -0
  319. data/lib/rubocop/cop/mixin/statement_modifier.rb +56 -0
  320. data/lib/rubocop/cop/mixin/string_help.rb +35 -0
  321. data/lib/rubocop/cop/mixin/string_literals_help.rb +23 -0
  322. data/lib/rubocop/cop/mixin/surrounding_space.rb +151 -0
  323. data/lib/rubocop/cop/mixin/target_ruby_version.rb +20 -0
  324. data/lib/rubocop/cop/mixin/too_many_lines.rb +25 -0
  325. data/lib/rubocop/cop/mixin/trailing_body.rb +26 -0
  326. data/lib/rubocop/cop/mixin/trailing_comma.rb +212 -0
  327. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +113 -0
  328. data/lib/rubocop/cop/mixin/unused_argument.rb +33 -0
  329. data/lib/rubocop/cop/mixin/visibility_help.rb +50 -0
  330. data/lib/rubocop/cop/naming/accessor_method_name.rb +55 -0
  331. data/lib/rubocop/cop/naming/ascii_identifiers.rb +95 -0
  332. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +43 -0
  333. data/lib/rubocop/cop/naming/block_parameter_name.rb +49 -0
  334. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +43 -0
  335. data/lib/rubocop/cop/naming/constant_name.rb +82 -0
  336. data/lib/rubocop/cop/naming/file_name.rb +223 -0
  337. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +62 -0
  338. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +55 -0
  339. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +171 -0
  340. data/lib/rubocop/cop/naming/method_name.rb +79 -0
  341. data/lib/rubocop/cop/naming/method_parameter_name.rb +58 -0
  342. data/lib/rubocop/cop/naming/predicate_name.rb +106 -0
  343. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +112 -0
  344. data/lib/rubocop/cop/naming/variable_name.rb +52 -0
  345. data/lib/rubocop/cop/naming/variable_number.rb +61 -0
  346. data/lib/rubocop/cop/offense.rb +230 -0
  347. data/lib/rubocop/cop/registry.rb +276 -0
  348. data/lib/rubocop/cop/security/eval.rb +31 -0
  349. data/lib/rubocop/cop/security/json_load.rb +46 -0
  350. data/lib/rubocop/cop/security/marshal_load.rb +39 -0
  351. data/lib/rubocop/cop/security/open.rb +71 -0
  352. data/lib/rubocop/cop/security/yaml_load.rb +37 -0
  353. data/lib/rubocop/cop/severity.rb +75 -0
  354. data/lib/rubocop/cop/style/access_modifier_declarations.rb +132 -0
  355. data/lib/rubocop/cop/style/accessor_grouping.rb +140 -0
  356. data/lib/rubocop/cop/style/alias.rb +147 -0
  357. data/lib/rubocop/cop/style/and_or.rb +145 -0
  358. data/lib/rubocop/cop/style/array_join.rb +39 -0
  359. data/lib/rubocop/cop/style/ascii_comments.rb +61 -0
  360. data/lib/rubocop/cop/style/attr.rb +68 -0
  361. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +51 -0
  362. data/lib/rubocop/cop/style/bare_percent_literals.rb +78 -0
  363. data/lib/rubocop/cop/style/begin_block.rb +22 -0
  364. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +145 -0
  365. data/lib/rubocop/cop/style/block_comments.rb +70 -0
  366. data/lib/rubocop/cop/style/block_delimiters.rb +382 -0
  367. data/lib/rubocop/cop/style/case_equality.rb +53 -0
  368. data/lib/rubocop/cop/style/character_literal.rb +53 -0
  369. data/lib/rubocop/cop/style/class_and_module_children.rb +151 -0
  370. data/lib/rubocop/cop/style/class_check.rb +59 -0
  371. data/lib/rubocop/cop/style/class_methods.rb +60 -0
  372. data/lib/rubocop/cop/style/class_vars.rb +69 -0
  373. data/lib/rubocop/cop/style/collection_methods.rb +79 -0
  374. data/lib/rubocop/cop/style/colon_method_call.rb +48 -0
  375. data/lib/rubocop/cop/style/colon_method_definition.rb +37 -0
  376. data/lib/rubocop/cop/style/command_literal.rb +187 -0
  377. data/lib/rubocop/cop/style/comment_annotation.rb +97 -0
  378. data/lib/rubocop/cop/style/commented_keyword.rb +73 -0
  379. data/lib/rubocop/cop/style/conditional_assignment.rb +666 -0
  380. data/lib/rubocop/cop/style/constant_visibility.rb +77 -0
  381. data/lib/rubocop/cop/style/copyright.rb +99 -0
  382. data/lib/rubocop/cop/style/date_time.rb +77 -0
  383. data/lib/rubocop/cop/style/def_with_parentheses.rb +57 -0
  384. data/lib/rubocop/cop/style/dir.rb +48 -0
  385. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +49 -0
  386. data/lib/rubocop/cop/style/documentation.rb +135 -0
  387. data/lib/rubocop/cop/style/documentation_method.rb +125 -0
  388. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +55 -0
  389. data/lib/rubocop/cop/style/double_negation.rb +72 -0
  390. data/lib/rubocop/cop/style/each_for_simple_loop.rb +58 -0
  391. data/lib/rubocop/cop/style/each_with_object.rb +110 -0
  392. data/lib/rubocop/cop/style/empty_block_parameter.rb +48 -0
  393. data/lib/rubocop/cop/style/empty_case_condition.rb +109 -0
  394. data/lib/rubocop/cop/style/empty_else.rb +175 -0
  395. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +45 -0
  396. data/lib/rubocop/cop/style/empty_literal.rb +121 -0
  397. data/lib/rubocop/cop/style/empty_method.rb +111 -0
  398. data/lib/rubocop/cop/style/encoding.rb +56 -0
  399. data/lib/rubocop/cop/style/end_block.rb +31 -0
  400. data/lib/rubocop/cop/style/eval_with_location.rb +148 -0
  401. data/lib/rubocop/cop/style/even_odd.rb +58 -0
  402. data/lib/rubocop/cop/style/expand_path_arguments.rb +194 -0
  403. data/lib/rubocop/cop/style/exponential_notation.rb +119 -0
  404. data/lib/rubocop/cop/style/float_division.rb +94 -0
  405. data/lib/rubocop/cop/style/for.rb +88 -0
  406. data/lib/rubocop/cop/style/format_string.rb +127 -0
  407. data/lib/rubocop/cop/style/format_string_token.rb +120 -0
  408. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +234 -0
  409. data/lib/rubocop/cop/style/global_vars.rb +80 -0
  410. data/lib/rubocop/cop/style/guard_clause.rb +145 -0
  411. data/lib/rubocop/cop/style/hash_each_methods.rb +89 -0
  412. data/lib/rubocop/cop/style/hash_syntax.rb +221 -0
  413. data/lib/rubocop/cop/style/hash_transform_keys.rb +83 -0
  414. data/lib/rubocop/cop/style/hash_transform_values.rb +80 -0
  415. data/lib/rubocop/cop/style/identical_conditional_branches.rb +130 -0
  416. data/lib/rubocop/cop/style/if_inside_else.rb +87 -0
  417. data/lib/rubocop/cop/style/if_unless_modifier.rb +189 -0
  418. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +51 -0
  419. data/lib/rubocop/cop/style/if_with_semicolon.rb +46 -0
  420. data/lib/rubocop/cop/style/implicit_runtime_error.rb +32 -0
  421. data/lib/rubocop/cop/style/infinite_loop.rb +128 -0
  422. data/lib/rubocop/cop/style/inline_comment.rb +34 -0
  423. data/lib/rubocop/cop/style/inverse_methods.rb +197 -0
  424. data/lib/rubocop/cop/style/ip_addresses.rb +76 -0
  425. data/lib/rubocop/cop/style/lambda.rb +132 -0
  426. data/lib/rubocop/cop/style/lambda_call.rb +73 -0
  427. data/lib/rubocop/cop/style/line_end_concatenation.rb +125 -0
  428. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +190 -0
  429. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +169 -0
  430. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +52 -0
  431. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +75 -0
  432. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +46 -0
  433. data/lib/rubocop/cop/style/method_def_parentheses.rb +166 -0
  434. data/lib/rubocop/cop/style/method_missing_super.rb +34 -0
  435. data/lib/rubocop/cop/style/min_max.rb +68 -0
  436. data/lib/rubocop/cop/style/missing_else.rb +180 -0
  437. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +46 -0
  438. data/lib/rubocop/cop/style/mixin_grouping.rb +148 -0
  439. data/lib/rubocop/cop/style/mixin_usage.rb +90 -0
  440. data/lib/rubocop/cop/style/module_function.rb +150 -0
  441. data/lib/rubocop/cop/style/multiline_block_chain.rb +49 -0
  442. data/lib/rubocop/cop/style/multiline_if_modifier.rb +67 -0
  443. data/lib/rubocop/cop/style/multiline_if_then.rb +50 -0
  444. data/lib/rubocop/cop/style/multiline_memoization.rb +94 -0
  445. data/lib/rubocop/cop/style/multiline_method_signature.rb +61 -0
  446. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +49 -0
  447. data/lib/rubocop/cop/style/multiline_when_then.rb +74 -0
  448. data/lib/rubocop/cop/style/multiple_comparison.rb +92 -0
  449. data/lib/rubocop/cop/style/mutable_constant.rb +172 -0
  450. data/lib/rubocop/cop/style/negated_if.rb +99 -0
  451. data/lib/rubocop/cop/style/negated_unless.rb +89 -0
  452. data/lib/rubocop/cop/style/negated_while.rb +48 -0
  453. data/lib/rubocop/cop/style/nested_modifier.rb +107 -0
  454. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +64 -0
  455. data/lib/rubocop/cop/style/nested_ternary_operator.rb +59 -0
  456. data/lib/rubocop/cop/style/next.rb +244 -0
  457. data/lib/rubocop/cop/style/nil_comparison.rb +75 -0
  458. data/lib/rubocop/cop/style/non_nil_check.rb +136 -0
  459. data/lib/rubocop/cop/style/not.rb +82 -0
  460. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +124 -0
  461. data/lib/rubocop/cop/style/numeric_literals.rb +114 -0
  462. data/lib/rubocop/cop/style/numeric_predicate.rb +138 -0
  463. data/lib/rubocop/cop/style/one_line_conditional.rb +98 -0
  464. data/lib/rubocop/cop/style/option_hash.rb +55 -0
  465. data/lib/rubocop/cop/style/optional_arguments.rb +58 -0
  466. data/lib/rubocop/cop/style/or_assignment.rb +96 -0
  467. data/lib/rubocop/cop/style/parallel_assignment.rb +287 -0
  468. data/lib/rubocop/cop/style/parentheses_around_condition.rb +117 -0
  469. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +127 -0
  470. data/lib/rubocop/cop/style/percent_q_literals.rb +73 -0
  471. data/lib/rubocop/cop/style/perl_backrefs.rb +38 -0
  472. data/lib/rubocop/cop/style/preferred_hash_methods.rb +75 -0
  473. data/lib/rubocop/cop/style/proc.rb +34 -0
  474. data/lib/rubocop/cop/style/raise_args.rb +145 -0
  475. data/lib/rubocop/cop/style/random_with_offset.rb +152 -0
  476. data/lib/rubocop/cop/style/redundant_assignment.rb +117 -0
  477. data/lib/rubocop/cop/style/redundant_begin.rb +91 -0
  478. data/lib/rubocop/cop/style/redundant_capital_w.rb +51 -0
  479. data/lib/rubocop/cop/style/redundant_condition.rb +124 -0
  480. data/lib/rubocop/cop/style/redundant_conditional.rb +98 -0
  481. data/lib/rubocop/cop/style/redundant_exception.rb +64 -0
  482. data/lib/rubocop/cop/style/redundant_fetch_block.rb +122 -0
  483. data/lib/rubocop/cop/style/redundant_freeze.rb +67 -0
  484. data/lib/rubocop/cop/style/redundant_interpolation.rb +98 -0
  485. data/lib/rubocop/cop/style/redundant_parentheses.rb +233 -0
  486. data/lib/rubocop/cop/style/redundant_percent_q.rb +112 -0
  487. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +90 -0
  488. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +121 -0
  489. data/lib/rubocop/cop/style/redundant_return.rb +169 -0
  490. data/lib/rubocop/cop/style/redundant_self.rb +168 -0
  491. data/lib/rubocop/cop/style/redundant_sort.rb +165 -0
  492. data/lib/rubocop/cop/style/redundant_sort_by.rb +50 -0
  493. data/lib/rubocop/cop/style/regexp_literal.rb +228 -0
  494. data/lib/rubocop/cop/style/rescue_modifier.rb +73 -0
  495. data/lib/rubocop/cop/style/rescue_standard_error.rb +124 -0
  496. data/lib/rubocop/cop/style/return_nil.rb +89 -0
  497. data/lib/rubocop/cop/style/safe_navigation.rb +271 -0
  498. data/lib/rubocop/cop/style/sample.rb +144 -0
  499. data/lib/rubocop/cop/style/self_assignment.rb +97 -0
  500. data/lib/rubocop/cop/style/semicolon.rb +101 -0
  501. data/lib/rubocop/cop/style/send.rb +31 -0
  502. data/lib/rubocop/cop/style/signal_exception.rb +211 -0
  503. data/lib/rubocop/cop/style/single_line_block_params.rb +95 -0
  504. data/lib/rubocop/cop/style/single_line_methods.rb +83 -0
  505. data/lib/rubocop/cop/style/slicing_with_range.rb +39 -0
  506. data/lib/rubocop/cop/style/special_global_vars.rb +207 -0
  507. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +83 -0
  508. data/lib/rubocop/cop/style/stderr_puts.rb +61 -0
  509. data/lib/rubocop/cop/style/string_hash_keys.rb +50 -0
  510. data/lib/rubocop/cop/style/string_literals.rb +129 -0
  511. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +49 -0
  512. data/lib/rubocop/cop/style/string_methods.rb +46 -0
  513. data/lib/rubocop/cop/style/strip.rb +46 -0
  514. data/lib/rubocop/cop/style/struct_inheritance.rb +60 -0
  515. data/lib/rubocop/cop/style/symbol_array.rb +119 -0
  516. data/lib/rubocop/cop/style/symbol_literal.rb +32 -0
  517. data/lib/rubocop/cop/style/symbol_proc.rb +110 -0
  518. data/lib/rubocop/cop/style/ternary_parentheses.rb +220 -0
  519. data/lib/rubocop/cop/style/trailing_body_on_class.rb +43 -0
  520. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +54 -0
  521. data/lib/rubocop/cop/style/trailing_body_on_module.rb +43 -0
  522. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +109 -0
  523. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +99 -0
  524. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +88 -0
  525. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +100 -0
  526. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +91 -0
  527. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +165 -0
  528. data/lib/rubocop/cop/style/trivial_accessors.rb +192 -0
  529. data/lib/rubocop/cop/style/unless_else.rb +55 -0
  530. data/lib/rubocop/cop/style/unpack_first.rb +61 -0
  531. data/lib/rubocop/cop/style/variable_interpolation.rb +48 -0
  532. data/lib/rubocop/cop/style/when_then.rb +37 -0
  533. data/lib/rubocop/cop/style/while_until_do.rb +59 -0
  534. data/lib/rubocop/cop/style/while_until_modifier.rb +61 -0
  535. data/lib/rubocop/cop/style/word_array.rb +102 -0
  536. data/lib/rubocop/cop/style/yoda_condition.rb +173 -0
  537. data/lib/rubocop/cop/style/zero_length_predicate.rb +117 -0
  538. data/lib/rubocop/cop/team.rb +256 -0
  539. data/lib/rubocop/cop/util.rb +151 -0
  540. data/lib/rubocop/cop/utils/format_string.rb +137 -0
  541. data/lib/rubocop/cop/variable_force.rb +463 -0
  542. data/lib/rubocop/cop/variable_force/assignment.rb +97 -0
  543. data/lib/rubocop/cop/variable_force/branch.rb +320 -0
  544. data/lib/rubocop/cop/variable_force/branchable.rb +23 -0
  545. data/lib/rubocop/cop/variable_force/reference.rb +49 -0
  546. data/lib/rubocop/cop/variable_force/scope.rb +110 -0
  547. data/lib/rubocop/cop/variable_force/variable.rb +114 -0
  548. data/lib/rubocop/cop/variable_force/variable_table.rb +129 -0
  549. data/lib/rubocop/core_ext/string.rb +23 -0
  550. data/lib/rubocop/error.rb +34 -0
  551. data/lib/rubocop/ext/processed_source.rb +18 -0
  552. data/lib/rubocop/file_finder.rb +42 -0
  553. data/lib/rubocop/formatter/auto_gen_config_formatter.rb +16 -0
  554. data/lib/rubocop/formatter/base_formatter.rb +119 -0
  555. data/lib/rubocop/formatter/clang_style_formatter.rb +57 -0
  556. data/lib/rubocop/formatter/colorizable.rb +41 -0
  557. data/lib/rubocop/formatter/disabled_config_formatter.rb +216 -0
  558. data/lib/rubocop/formatter/emacs_style_formatter.rb +37 -0
  559. data/lib/rubocop/formatter/file_list_formatter.rb +20 -0
  560. data/lib/rubocop/formatter/formatter_set.rb +104 -0
  561. data/lib/rubocop/formatter/fuubar_style_formatter.rb +80 -0
  562. data/lib/rubocop/formatter/html_formatter.rb +141 -0
  563. data/lib/rubocop/formatter/json_formatter.rb +81 -0
  564. data/lib/rubocop/formatter/junit_formatter.rb +84 -0
  565. data/lib/rubocop/formatter/offense_count_formatter.rb +74 -0
  566. data/lib/rubocop/formatter/pacman_formatter.rb +80 -0
  567. data/lib/rubocop/formatter/progress_formatter.rb +63 -0
  568. data/lib/rubocop/formatter/quiet_formatter.rb +13 -0
  569. data/lib/rubocop/formatter/simple_text_formatter.rb +138 -0
  570. data/lib/rubocop/formatter/tap_formatter.rb +82 -0
  571. data/lib/rubocop/formatter/text_util.rb +20 -0
  572. data/lib/rubocop/formatter/worst_offenders_formatter.rb +62 -0
  573. data/lib/rubocop/magic_comment.rb +214 -0
  574. data/lib/rubocop/name_similarity.rb +28 -0
  575. data/lib/rubocop/options.rb +488 -0
  576. data/lib/rubocop/path_util.rb +85 -0
  577. data/lib/rubocop/platform.rb +11 -0
  578. data/lib/rubocop/rake_task.rb +77 -0
  579. data/lib/rubocop/remote_config.rb +104 -0
  580. data/lib/rubocop/result_cache.rb +205 -0
  581. data/lib/rubocop/rspec/cop_helper.rb +71 -0
  582. data/lib/rubocop/rspec/expect_offense.rb +288 -0
  583. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +28 -0
  584. data/lib/rubocop/rspec/shared_contexts.rb +129 -0
  585. data/lib/rubocop/rspec/support.rb +13 -0
  586. data/lib/rubocop/runner.rb +388 -0
  587. data/lib/rubocop/string_interpreter.rb +57 -0
  588. data/lib/rubocop/target_finder.rb +196 -0
  589. data/lib/rubocop/target_ruby.rb +154 -0
  590. data/lib/rubocop/version.rb +23 -0
  591. data/lib/rubocop/warning.rb +11 -0
  592. data/lib/rubocop/yaml_duplication_checker.rb +39 -0
  593. metadata +795 -0
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Formatter
5
+ # This formatter formats report data using the Test Anything Protocol.
6
+ # TAP allows for to communicate tests results in a language agnostics way.
7
+ class TapFormatter < ClangStyleFormatter
8
+ def started(target_files)
9
+ super
10
+ @progress_count = 1
11
+ output.puts "1..#{target_files.size}"
12
+ end
13
+
14
+ def file_finished(file, offenses)
15
+ if offenses.empty?
16
+ output.puts "ok #{@progress_count} - #{smart_path(file)}"
17
+ else
18
+ output.puts "not ok #{@progress_count} - #{smart_path(file)}"
19
+
20
+ count_stats(offenses)
21
+ report_file(file, offenses)
22
+ end
23
+
24
+ @progress_count += 1
25
+ end
26
+
27
+ private
28
+
29
+ def report_line(location)
30
+ source_line = location.source_line
31
+
32
+ if location.first_line == location.last_line
33
+ output.puts("# #{source_line}")
34
+ else
35
+ output.puts("# #{source_line} #{yellow(ELLIPSES)}")
36
+ end
37
+ end
38
+
39
+ def report_highlighted_area(highlighted_area)
40
+ output.puts("# #{' ' * highlighted_area.begin_pos}" \
41
+ "#{'^' * highlighted_area.size}")
42
+ end
43
+
44
+ def report_offense(file, offense)
45
+ output.printf(
46
+ "# %<path>s:%<line>d:%<column>d: %<severity>s: %<message>s\n",
47
+ path: cyan(smart_path(file)),
48
+ line: offense.line,
49
+ column: offense.real_column,
50
+ severity: colored_severity_code(offense),
51
+ message: message(offense)
52
+ )
53
+
54
+ begin
55
+ return unless valid_line?(offense)
56
+
57
+ report_line(offense.location)
58
+ report_highlighted_area(offense.highlighted_area)
59
+ rescue IndexError
60
+ # range is not on a valid line; perhaps the source file is empty
61
+ end
62
+ end
63
+
64
+ def annotate_message(msg)
65
+ msg.gsub(/`(.*?)`/, '\1')
66
+ end
67
+
68
+ def message(offense)
69
+ message =
70
+ if offense.corrected_with_todo?
71
+ '[Todo] '
72
+ elsif offense.corrected?
73
+ '[Corrected] '
74
+ else
75
+ ''
76
+ end
77
+
78
+ "#{message}#{annotate_message(offense.message)}"
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Formatter
5
+ # Common logic for UI texts.
6
+ module TextUtil
7
+ module_function
8
+
9
+ def pluralize(number, thing, options = {})
10
+ if number.zero? && options[:no_for_zero]
11
+ "no #{thing}s"
12
+ elsif number == 1
13
+ "1 #{thing}"
14
+ else
15
+ "#{number} #{thing}s"
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'pathname'
4
+
5
+ module RuboCop
6
+ module Formatter
7
+ # This formatter displays the list of offensive files, sorted by number of
8
+ # offenses with the worst offenders first.
9
+ #
10
+ # Here's the format:
11
+ #
12
+ # 26 this/file/is/really/bad.rb
13
+ # 3 just/ok.rb
14
+ # --
15
+ # 29 Total
16
+ class WorstOffendersFormatter < BaseFormatter
17
+ attr_reader :offense_counts
18
+
19
+ def started(target_files)
20
+ super
21
+ @offense_counts = {}
22
+ end
23
+
24
+ def file_finished(file, offenses)
25
+ return if offenses.empty?
26
+
27
+ path = Pathname.new(file).relative_path_from(Pathname.new(Dir.pwd))
28
+ @offense_counts[path] = offenses.size
29
+ end
30
+
31
+ def finished(_inspected_files)
32
+ report_summary(@offense_counts)
33
+ end
34
+
35
+ # rubocop:disable Metrics/AbcSize
36
+ def report_summary(offense_counts)
37
+ per_file_counts = ordered_offense_counts(offense_counts)
38
+ total_count = total_offense_count(offense_counts)
39
+
40
+ output.puts
41
+
42
+ per_file_counts.each do |file_name, count|
43
+ output.puts "#{count.to_s.ljust(total_count.to_s.length + 2)}" \
44
+ "#{file_name}\n"
45
+ end
46
+ output.puts '--'
47
+ output.puts "#{total_count} Total"
48
+
49
+ output.puts
50
+ end
51
+ # rubocop:enable Metrics/AbcSize
52
+
53
+ def ordered_offense_counts(offense_counts)
54
+ Hash[offense_counts.sort_by { |k, v| [-v, k] }]
55
+ end
56
+
57
+ def total_offense_count(offense_counts)
58
+ offense_counts.values.inject(0, :+)
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,214 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ # Parse different formats of magic comments.
5
+ #
6
+ # @abstract parent of three different magic comment handlers
7
+ class MagicComment
8
+ # @see https://git.io/vMC1C IRB's pattern for matching magic comment tokens
9
+ TOKEN = /[[:alnum:]\-_]+/.freeze
10
+
11
+ # Detect magic comment format and pass it to the appropriate wrapper.
12
+ #
13
+ # @param comment [String]
14
+ #
15
+ # @return [RuboCop::MagicComment]
16
+ def self.parse(comment)
17
+ case comment
18
+ when EmacsComment::FORMAT then EmacsComment.new(comment)
19
+ when VimComment::FORMAT then VimComment.new(comment)
20
+ else
21
+ SimpleComment.new(comment)
22
+ end
23
+ end
24
+
25
+ def initialize(comment)
26
+ @comment = comment
27
+ end
28
+
29
+ def any?
30
+ frozen_string_literal_specified? || encoding_specified?
31
+ end
32
+
33
+ # Does the magic comment enable the frozen string literal feature.
34
+ #
35
+ # Test whether the frozen string literal value is `true`. Cannot
36
+ # just return `frozen_string_literal` since an invalid magic comment
37
+ # like `# frozen_string_literal: yes` is possible and the truthy value
38
+ # `'yes'` does not actually enable the feature
39
+ #
40
+ # @return [Boolean]
41
+ def frozen_string_literal?
42
+ frozen_string_literal == true
43
+ end
44
+
45
+ def valid_literal_value?
46
+ [true, false].include?(frozen_string_literal)
47
+ end
48
+
49
+ # Was a magic comment for the frozen string literal found?
50
+ #
51
+ # @return [Boolean]
52
+ def frozen_string_literal_specified?
53
+ specified?(frozen_string_literal)
54
+ end
55
+
56
+ # Expose the `frozen_string_literal` value coerced to a boolean if possible.
57
+ #
58
+ # @return [Boolean] if value is `true` or `false`
59
+ # @return [nil] if frozen_string_literal comment isn't found
60
+ # @return [String] if comment is found but isn't true or false
61
+ def frozen_string_literal
62
+ return unless (setting = extract_frozen_string_literal)
63
+
64
+ case setting
65
+ when 'true' then true
66
+ when 'false' then false
67
+ else
68
+ setting
69
+ end
70
+ end
71
+
72
+ def encoding_specified?
73
+ specified?(encoding)
74
+ end
75
+
76
+ private
77
+
78
+ def specified?(value)
79
+ !value.nil?
80
+ end
81
+
82
+ # Match the entire comment string with a pattern and take the first capture.
83
+ #
84
+ # @param pattern [Regexp]
85
+ #
86
+ # @return [String] if pattern matched
87
+ # @return [nil] otherwise
88
+ def extract(pattern)
89
+ @comment[pattern, 1]
90
+ end
91
+
92
+ # Parent to Vim and Emacs magic comment handling.
93
+ #
94
+ # @abstract
95
+ class EditorComment < MagicComment
96
+ private
97
+
98
+ # Find a token starting with the provided keyword and extract its value.
99
+ #
100
+ # @param keyword [String]
101
+ #
102
+ # @return [String] extracted value if it is found
103
+ # @return [nil] otherwise
104
+ def match(keyword)
105
+ pattern = /\A#{keyword}\s*#{self.class::OPERATOR}\s*(#{TOKEN})\z/
106
+
107
+ tokens.each do |token|
108
+ next unless (value = token[pattern, 1])
109
+
110
+ return value.downcase
111
+ end
112
+
113
+ nil
114
+ end
115
+
116
+ # Individual tokens composing an editor specific comment string.
117
+ #
118
+ # @return [Array<String>]
119
+ def tokens
120
+ extract(self.class::FORMAT).split(self.class::SEPARATOR).map(&:strip)
121
+ end
122
+ end
123
+
124
+ # Wrapper for Emacs style magic comments.
125
+ #
126
+ # @example Emacs style comment
127
+ # comment = RuboCop::MagicComment.parse(
128
+ # '# -*- encoding: ASCII-8BIT -*-'
129
+ # )
130
+ #
131
+ # comment.encoding # => 'ascii-8bit'
132
+ #
133
+ # @see https://www.gnu.org/software/emacs/manual/html_node/emacs/Specify-Coding.html
134
+ # @see https://git.io/vMCXh Emacs handling in Ruby's parse.y
135
+ class EmacsComment < EditorComment
136
+ FORMAT = /-\*-(.+)-\*-/.freeze
137
+ SEPARATOR = ';'
138
+ OPERATOR = ':'
139
+
140
+ def encoding
141
+ match('(?:en)?coding')
142
+ end
143
+
144
+ private
145
+
146
+ def extract_frozen_string_literal
147
+ match('frozen[_-]string[_-]literal')
148
+ end
149
+ end
150
+
151
+ # Wrapper for Vim style magic comments.
152
+ #
153
+ # @example Vim style comment
154
+ # comment = RuboCop::MagicComment.parse(
155
+ # '# vim: filetype=ruby, fileencoding=ascii-8bit'
156
+ # )
157
+ #
158
+ # comment.encoding # => 'ascii-8bit'
159
+ class VimComment < EditorComment
160
+ FORMAT = /#\s*vim:\s*(.+)/.freeze
161
+ SEPARATOR = ', '
162
+ OPERATOR = '='
163
+
164
+ # For some reason the fileencoding keyword only works if there
165
+ # is at least one other token included in the string. For example
166
+ #
167
+ # # works
168
+ # # vim: foo=bar, fileencoding=ascii-8bit
169
+ #
170
+ # # does nothing
171
+ # # vim: foo=bar, fileencoding=ascii-8bit
172
+ #
173
+ def encoding
174
+ match('fileencoding') if tokens.size > 1
175
+ end
176
+
177
+ # Vim comments cannot specify frozen string literal behavior.
178
+ def frozen_string_literal; end
179
+ end
180
+
181
+ # Wrapper for regular magic comments not bound to an editor.
182
+ #
183
+ # Simple comments can only specify one setting per comment.
184
+ #
185
+ # @example frozen string literal comments
186
+ # comment1 = RuboCop::MagicComment.parse('# frozen_string_literal: true')
187
+ # comment1.frozen_string_literal # => true
188
+ # comment1.encoding # => nil
189
+ #
190
+ # @example encoding comments
191
+ # comment2 = RuboCop::MagicComment.parse('# encoding: utf-8')
192
+ # comment2.frozen_string_literal # => nil
193
+ # comment2.encoding # => 'utf-8'
194
+ class SimpleComment < MagicComment
195
+ # Match `encoding` or `coding`
196
+ def encoding
197
+ extract(/\A\s*\#.*\b(?:en)?coding: (#{TOKEN})/i)
198
+ end
199
+
200
+ private
201
+
202
+ # Extract `frozen_string_literal`.
203
+ #
204
+ # The `frozen_string_literal` magic comment only works if it
205
+ # is the only text in the comment.
206
+ #
207
+ # Case-insensitive and dashes/underscores are acceptable.
208
+ # @see https://git.io/vM7Mg
209
+ def extract_frozen_string_literal
210
+ extract(/\A\s*#\s*frozen[_-]string[_-]literal:\s*(#{TOKEN})\s*\z/i)
211
+ end
212
+ end
213
+ end
214
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ # Common functionality for finding names that are similar to a given name.
5
+ module NameSimilarity
6
+ module_function
7
+
8
+ def find_similar_name(target_name, names)
9
+ similar_names = find_similar_names(target_name, names)
10
+
11
+ similar_names.first
12
+ end
13
+
14
+ def find_similar_names(target_name, names)
15
+ # DidYouMean::SpellChecker is not available in all versions of Ruby, and
16
+ # even on versions where it *is* available (>= 2.3), it is not always
17
+ # required correctly. So we do a feature check first.
18
+ # See: https://github.com/rubocop-hq/rubocop/issues/7979
19
+ return [] unless defined?(DidYouMean::SpellChecker)
20
+
21
+ names = names.dup
22
+ names.delete(target_name)
23
+
24
+ spell_checker = DidYouMean::SpellChecker.new(dictionary: names)
25
+ spell_checker.correct(target_name)
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,488 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'optparse'
4
+ require 'shellwords'
5
+
6
+ module RuboCop
7
+ class IncorrectCopNameError < StandardError; end
8
+ class OptionArgumentError < StandardError; end
9
+
10
+ # This class handles command line options.
11
+ class Options
12
+ E_STDIN_NO_PATH = '-s/--stdin requires exactly one path, relative to the ' \
13
+ 'root of the project. RuboCop will use this path to determine which ' \
14
+ 'cops are enabled (via eg. Include/Exclude), and so that certain cops ' \
15
+ 'like Naming/FileName can be checked.'
16
+ EXITING_OPTIONS = %i[version verbose_version show_cops].freeze
17
+ DEFAULT_MAXIMUM_EXCLUSION_ITEMS = 15
18
+
19
+ def initialize
20
+ @options = {}
21
+ @validator = OptionsValidator.new(@options)
22
+ end
23
+
24
+ def parse(command_line_args)
25
+ args = args_from_file.concat(args_from_env).concat(command_line_args)
26
+ define_options.parse!(args)
27
+
28
+ @validator.validate_compatibility
29
+
30
+ if @options[:stdin]
31
+ # The parser will put the file name given after --stdin into
32
+ # @options[:stdin]. If it did, then the args array should be empty.
33
+ raise OptionArgumentError, E_STDIN_NO_PATH if args.any?
34
+
35
+ # We want the STDIN contents in @options[:stdin] and the file name in
36
+ # args to simplify the rest of the processing.
37
+ args = [@options[:stdin]]
38
+ @options[:stdin] = $stdin.binmode.read
39
+ end
40
+
41
+ [@options, args]
42
+ end
43
+
44
+ private
45
+
46
+ def args_from_file
47
+ if File.exist?('.rubocop') && !File.directory?('.rubocop')
48
+ File.read('.rubocop').shellsplit
49
+ else
50
+ []
51
+ end
52
+ end
53
+
54
+ def args_from_env
55
+ Shellwords.split(ENV.fetch('RUBOCOP_OPTS', ''))
56
+ end
57
+
58
+ def define_options
59
+ OptionParser.new do |opts|
60
+ opts.banner = 'Usage: rubocop [options] [file1, file2, ...]'
61
+
62
+ add_list_options(opts)
63
+ add_only_options(opts)
64
+ add_configuration_options(opts)
65
+ add_formatting_options(opts)
66
+
67
+ option(opts, '-r', '--require FILE') { |f| require f }
68
+
69
+ add_severity_option(opts)
70
+ add_flags_with_optional_args(opts)
71
+ add_boolean_flags(opts)
72
+ add_aliases(opts)
73
+
74
+ option(opts, '-s', '--stdin FILE')
75
+ end
76
+ end
77
+
78
+ def add_only_options(opts)
79
+ add_cop_selection_csv_option('except', opts)
80
+ add_cop_selection_csv_option('only', opts)
81
+ option(opts, '--only-guide-cops')
82
+ end
83
+
84
+ def add_cop_selection_csv_option(option, opts)
85
+ option(opts, "--#{option} [COP1,COP2,...]") do |list|
86
+ unless list
87
+ message = "--#{option} argument should be [COP1,COP2,...]."
88
+
89
+ raise OptionArgumentError, message
90
+ end
91
+
92
+ @options[:"#{option}"] =
93
+ if list.empty?
94
+ ['']
95
+ else
96
+ list.split(',').map do |c|
97
+ Cop::Cop.qualified_cop_name(c, "--#{option} option")
98
+ end
99
+ end
100
+ end
101
+ end
102
+
103
+ def add_configuration_options(opts)
104
+ option(opts, '-c', '--config FILE')
105
+ option(opts, '--force-exclusion')
106
+ option(opts, '--only-recognized-file-types')
107
+ option(opts, '--ignore-parent-exclusion')
108
+ option(opts, '--force-default-config')
109
+ add_auto_gen_options(opts)
110
+ end
111
+
112
+ def add_auto_gen_options(opts)
113
+ option(opts, '--auto-gen-config')
114
+
115
+ option(opts, '--exclude-limit COUNT') do
116
+ @validator.validate_exclude_limit_option
117
+ end
118
+
119
+ option(opts, '--disable-uncorrectable')
120
+
121
+ option(opts, '--no-offense-counts') do
122
+ @options[:no_offense_counts] = true
123
+ end
124
+
125
+ option(opts, '--auto-gen-only-exclude')
126
+ option(opts, '--no-auto-gen-timestamp') do
127
+ @options[:no_auto_gen_timestamp] = true
128
+ end
129
+
130
+ option(opts, '--init')
131
+ end
132
+
133
+ def add_formatting_options(opts)
134
+ option(opts, '-f', '--format FORMATTER') do |key|
135
+ @options[:formatters] ||= []
136
+ @options[:formatters] << [key]
137
+ end
138
+
139
+ option(opts, '-o', '--out FILE') do |path|
140
+ if @options[:formatters]
141
+ @options[:formatters].last << path
142
+ else
143
+ @options[:output_path] = path
144
+ end
145
+ end
146
+
147
+ option(opts, '--display-only-failed')
148
+ end
149
+
150
+ def add_severity_option(opts)
151
+ table = RuboCop::Cop::Severity::CODE_TABLE.merge(A: :autocorrect)
152
+ option(opts, '--fail-level SEVERITY',
153
+ RuboCop::Cop::Severity::NAMES + [:autocorrect],
154
+ table) do |severity|
155
+ @options[:fail_level] = severity
156
+ end
157
+ option(opts, '--display-only-fail-level-offenses')
158
+ end
159
+
160
+ def add_flags_with_optional_args(opts)
161
+ option(opts, '--show-cops [COP1,COP2,...]') do |list|
162
+ @options[:show_cops] = list.nil? ? [] : list.split(',')
163
+ end
164
+ end
165
+
166
+ # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
167
+ def add_boolean_flags(opts)
168
+ option(opts, '-F', '--fail-fast')
169
+ option(opts, '-C', '--cache FLAG')
170
+ option(opts, '-d', '--debug')
171
+ option(opts, '-D', '--[no-]display-cop-names')
172
+ option(opts, '-E', '--extra-details')
173
+ option(opts, '-S', '--display-style-guide')
174
+ option(opts, '-a', '--auto-correct') do
175
+ @options[:safe_auto_correct] = true
176
+ end
177
+ option(opts, '--safe-auto-correct') do
178
+ warn '--safe-auto-correct is deprecated; use --auto-correct'
179
+ @options[:safe_auto_correct] = @options[:auto_correct] = true
180
+ end
181
+ option(opts, '-A', '--auto-correct-all') do
182
+ @options[:auto_correct] = true
183
+ end
184
+ option(opts, '--disable-pending-cops')
185
+ option(opts, '--enable-pending-cops')
186
+ option(opts, '--ignore-disable-comments')
187
+
188
+ option(opts, '--safe')
189
+
190
+ option(opts, '--[no-]color')
191
+
192
+ option(opts, '-v', '--version')
193
+ option(opts, '-V', '--verbose-version')
194
+ option(opts, '-P', '--parallel')
195
+ end
196
+ # rubocop:enable Metrics/MethodLength, Metrics/AbcSize
197
+
198
+ def add_aliases(opts)
199
+ option(opts, '-l', '--lint') do
200
+ @options[:only] ||= []
201
+ @options[:only] << 'Lint'
202
+ end
203
+ option(opts, '-x', '--fix-layout') do
204
+ @options[:only] ||= []
205
+ @options[:only] << 'Layout'
206
+ @options[:auto_correct] = true
207
+ end
208
+ end
209
+
210
+ def add_list_options(opts)
211
+ option(opts, '-L', '--list-target-files')
212
+ end
213
+
214
+ # Sets a value in the @options hash, based on the given long option and its
215
+ # value, in addition to calling the block if a block is given.
216
+ def option(opts, *args)
217
+ long_opt_symbol = long_opt_symbol(args)
218
+ args += Array(OptionsHelp::TEXT[long_opt_symbol])
219
+ opts.on(*args) do |arg|
220
+ @options[long_opt_symbol] = arg
221
+ yield arg if block_given?
222
+ end
223
+ end
224
+
225
+ # Finds the option in `args` starting with -- and converts it to a symbol,
226
+ # e.g. [..., '--auto-correct', ...] to :auto_correct.
227
+ def long_opt_symbol(args)
228
+ long_opt = args.find { |arg| arg.start_with?('--') }
229
+ long_opt[2..-1].sub('[no-]', '').sub(/ .*/, '')
230
+ .tr('-', '_').gsub(/[\[\]]/, '').to_sym
231
+ end
232
+ end
233
+
234
+ # Validates option arguments and the options' compatibility with each other.
235
+ class OptionsValidator
236
+ class << self
237
+ # Cop name validation must be done later than option parsing, so it's not
238
+ # called from within Options.
239
+ def validate_cop_list(names)
240
+ return unless names
241
+
242
+ cop_names = Cop::Cop.registry.names
243
+ departments = Cop::Cop.registry.departments.map(&:to_s)
244
+
245
+ names.each do |name|
246
+ next if cop_names.include?(name)
247
+ next if departments.include?(name)
248
+ next if %w[Syntax Lint/Syntax].include?(name)
249
+
250
+ raise IncorrectCopNameError, format_message_from(name, cop_names)
251
+ end
252
+ end
253
+
254
+ private
255
+
256
+ def format_message_from(name, cop_names)
257
+ message = 'Unrecognized cop or department: %<name>s.'
258
+ message_with_candidate = "%<message>s\nDid you mean? %<candidate>s"
259
+ corrections = NameSimilarity.find_similar_names(name, cop_names)
260
+
261
+ if corrections.empty?
262
+ format(message, name: name)
263
+ else
264
+ format(message_with_candidate, message: format(message, name: name),
265
+ candidate: corrections.join(', '))
266
+ end
267
+ end
268
+ end
269
+
270
+ def initialize(options)
271
+ @options = options
272
+ end
273
+
274
+ def validate_cop_options
275
+ %i[only except].each do |opt|
276
+ OptionsValidator.validate_cop_list(@options[opt])
277
+ end
278
+ end
279
+
280
+ # rubocop:disable Metrics/AbcSize
281
+ def validate_compatibility # rubocop:disable Metrics/MethodLength
282
+ if only_includes_redundant_disable?
283
+ raise OptionArgumentError, 'Lint/RedundantCopDisableDirective cannot ' \
284
+ 'be used with --only.'
285
+ end
286
+ raise OptionArgumentError, 'Syntax checking cannot be turned off.' if except_syntax?
287
+ unless boolean_or_empty_cache?
288
+ raise OptionArgumentError, '-C/--cache argument must be true or false'
289
+ end
290
+
291
+ if display_only_fail_level_offenses_with_autocorrect?
292
+ raise OptionArgumentError, '--autocorrect cannot be used with ' \
293
+ '--display-only-fail-level-offenses'
294
+ end
295
+ validate_auto_gen_config
296
+ validate_auto_correct
297
+ validate_display_only_failed
298
+ validate_parallel
299
+
300
+ return if incompatible_options.size <= 1
301
+
302
+ raise OptionArgumentError, 'Incompatible cli options: ' \
303
+ "#{incompatible_options.inspect}"
304
+ end
305
+ # rubocop:enable Metrics/AbcSize
306
+
307
+ def validate_auto_gen_config
308
+ return if @options.key?(:auto_gen_config)
309
+
310
+ message = '--%<flag>s can only be used together with --auto-gen-config.'
311
+
312
+ %i[exclude_limit no_offense_counts no_auto_gen_timestamp
313
+ auto_gen_only_exclude].each do |option|
314
+ if @options.key?(option)
315
+ raise OptionArgumentError,
316
+ format(message, flag: option.to_s.tr('_', '-'))
317
+ end
318
+ end
319
+ end
320
+
321
+ def validate_display_only_failed
322
+ return unless @options.key?(:display_only_failed)
323
+ return if @options[:format] == 'junit'
324
+
325
+ raise OptionArgumentError,
326
+ format('--display-only-failed can only be used together with --format junit.')
327
+ end
328
+
329
+ def validate_auto_correct
330
+ return if @options.key?(:auto_correct)
331
+ return unless @options.key?(:disable_uncorrectable)
332
+
333
+ raise OptionArgumentError,
334
+ format('--disable-uncorrectable can only be used together with --auto-correct.')
335
+ end
336
+
337
+ def validate_parallel
338
+ return unless @options.key?(:parallel)
339
+
340
+ if @options[:cache] == 'false'
341
+ raise OptionArgumentError, '-P/--parallel uses caching to speed up ' \
342
+ 'execution, so combining with --cache ' \
343
+ 'false is not allowed.'
344
+ end
345
+
346
+ validate_parallel_with_combo_option
347
+ end
348
+
349
+ def validate_parallel_with_combo_option
350
+ combos = {
351
+ auto_gen_config: '-P/--parallel uses caching to speed up execution, ' \
352
+ 'while --auto-gen-config needs a non-cached run, ' \
353
+ 'so they cannot be combined.',
354
+ fail_fast: '-P/--parallel cannot be combined with -F/--fail-fast.',
355
+ auto_correct: '-P/--parallel cannot be combined with --auto-correct.'
356
+ }
357
+
358
+ combos.each do |key, msg|
359
+ raise OptionArgumentError, msg if @options.key?(key)
360
+ end
361
+ end
362
+
363
+ def only_includes_redundant_disable?
364
+ @options.key?(:only) &&
365
+ (@options[:only] & %w[Lint/RedundantCopDisableDirective
366
+ RedundantCopDisableDirective]).any?
367
+ end
368
+
369
+ def display_only_fail_level_offenses_with_autocorrect?
370
+ @options[:display_only_fail_level_offenses] && @options[:autocorrect]
371
+ end
372
+
373
+ def except_syntax?
374
+ @options.key?(:except) &&
375
+ (@options[:except] & %w[Lint/Syntax Syntax]).any?
376
+ end
377
+
378
+ def boolean_or_empty_cache?
379
+ !@options.key?(:cache) || %w[true false].include?(@options[:cache])
380
+ end
381
+
382
+ def incompatible_options
383
+ @incompatible_options ||= @options.keys & Options::EXITING_OPTIONS
384
+ end
385
+
386
+ def validate_exclude_limit_option
387
+ return if /^\d+$/.match?(@options[:exclude_limit])
388
+
389
+ # Emulate OptionParser's behavior to make failures consistent regardless
390
+ # of option order.
391
+ raise OptionParser::MissingArgument
392
+ end
393
+ end
394
+
395
+ # This module contains help texts for command line options.
396
+ module OptionsHelp
397
+ MAX_EXCL = RuboCop::Options::DEFAULT_MAXIMUM_EXCLUSION_ITEMS.to_s
398
+ FORMATTER_OPTION_LIST = RuboCop::Formatter::FormatterSet::BUILTIN_FORMATTERS_FOR_KEYS.keys
399
+
400
+ TEXT = {
401
+ only: 'Run only the given cop(s).',
402
+ only_guide_cops: ['Run only cops for rules that link to a',
403
+ 'style guide.'],
404
+ except: 'Disable the given cop(s).',
405
+ require: 'Require Ruby file.',
406
+ config: 'Specify configuration file.',
407
+ auto_gen_config: ['Generate a configuration file acting as a',
408
+ 'TODO list.'],
409
+ no_offense_counts: ['Do not include offense counts in configuration',
410
+ 'file generated by --auto-gen-config.'],
411
+ no_auto_gen_timestamp:
412
+ ['Do not include the date and time when',
413
+ 'the --auto-gen-config was run in the file it',
414
+ 'generates.'],
415
+ auto_gen_only_exclude:
416
+ ['Generate only Exclude parameters and not Max',
417
+ 'when running --auto-gen-config, except if the',
418
+ 'number of files with offenses is bigger than',
419
+ 'exclude-limit.'],
420
+ exclude_limit: ['Used together with --auto-gen-config to',
421
+ 'set the limit for how many Exclude',
422
+ "properties to generate. Default is #{MAX_EXCL}."],
423
+ disable_uncorrectable: ['Used with --auto-correct to annotate any',
424
+ 'offenses that do not support autocorrect',
425
+ 'with `rubocop:todo` comments.'],
426
+ force_exclusion: ['Force excluding files specified in the',
427
+ 'configuration `Exclude` even if they are',
428
+ 'explicitly passed as arguments.'],
429
+ only_recognized_file_types: ['Inspect files given on the command line only if',
430
+ 'they are listed in AllCops/Include parameters',
431
+ 'of user configuration or default configuration.'],
432
+ ignore_disable_comments: ['Run cops even when they are disabled locally',
433
+ 'with a comment.'],
434
+ ignore_parent_exclusion: ['Prevent from inheriting AllCops/Exclude from',
435
+ 'parent folders.'],
436
+ force_default_config: ['Use default configuration even if configuration',
437
+ 'files are present in the directory tree.'],
438
+ format: ['Choose an output formatter. This option',
439
+ 'can be specified multiple times to enable',
440
+ 'multiple formatters at the same time.',
441
+ '[p]rogress is used by default',
442
+ *FORMATTER_OPTION_LIST.map { |item| " #{item}" },
443
+ ' custom formatter class name'],
444
+ out: ['Write output to a file instead of STDOUT.',
445
+ 'This option applies to the previously',
446
+ 'specified --format, or the default format',
447
+ 'if no format is specified.'],
448
+ fail_level: ['Minimum severity (A/R/C/W/E/F) for exit',
449
+ 'with error code.'],
450
+ display_only_failed: ['Only output offense messages. Omit passing',
451
+ 'cops. Only valid for --format junit.'],
452
+ display_only_fail_level_offenses:
453
+ ['Only output offense messages at',
454
+ 'the specified --fail-level or above'],
455
+ show_cops: ['Shows the given cops, or all cops by',
456
+ 'default, and their configurations for the',
457
+ 'current directory.'],
458
+ fail_fast: ['Inspect files in order of modification',
459
+ 'time and stop after the first file',
460
+ 'containing offenses.'],
461
+ cache: ["Use result caching (FLAG=true) or don't",
462
+ '(FLAG=false), default determined by',
463
+ 'configuration parameter AllCops: UseCache.'],
464
+ debug: 'Display debug info.',
465
+ display_cop_names: ['Display cop names in offense messages.',
466
+ 'Default is true.'],
467
+ disable_pending_cops: 'Run without pending cops.',
468
+ display_style_guide: 'Display style guide URLs in offense messages.',
469
+ enable_pending_cops: 'Run with pending cops.',
470
+ extra_details: 'Display extra details in offense messages.',
471
+ lint: 'Run only lint cops.',
472
+ safe: 'Run only safe cops.',
473
+ list_target_files: 'List all files RuboCop will inspect.',
474
+ auto_correct: 'Auto-correct offenses (only when it\'s safe).',
475
+ safe_auto_correct: '(same, deprecated)',
476
+ auto_correct_all: 'Auto-correct offenses (safe and unsafe)',
477
+ fix_layout: 'Run only layout cops, with auto-correct on.',
478
+ color: 'Force color output on or off.',
479
+ version: 'Display version.',
480
+ verbose_version: 'Display verbose version.',
481
+ parallel: ['Use available CPUs to execute inspection in',
482
+ 'parallel.'],
483
+ stdin: ['Pipe source from STDIN, using FILE in offense',
484
+ 'reports. This is useful for editor integration.'],
485
+ init: 'Generate a .rubocop.yml file in the current directory.'
486
+ }.freeze
487
+ end
488
+ end