rubocop 0.51.0 → 0.87.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (702) hide show
  1. checksums.yaml +5 -5
  2. data/LICENSE.txt +1 -1
  3. data/README.md +53 -42
  4. data/assets/output.html.erb +1 -1
  5. data/bin/console +10 -0
  6. data/bin/setup +7 -0
  7. data/config/default.yml +3137 -552
  8. data/lib/rubocop/ast_aliases.rb +8 -0
  9. data/lib/rubocop/cached_data.rb +2 -2
  10. data/lib/rubocop/cli/command/auto_genenerate_config.rb +140 -0
  11. data/lib/rubocop/cli/command/base.rb +33 -0
  12. data/lib/rubocop/cli/command/execute_runner.rb +76 -0
  13. data/lib/rubocop/cli/command/init_dotfile.rb +45 -0
  14. data/lib/rubocop/cli/command/show_cops.rb +76 -0
  15. data/lib/rubocop/cli/command/version.rb +17 -0
  16. data/lib/rubocop/cli/command.rb +21 -0
  17. data/lib/rubocop/cli/environment.rb +21 -0
  18. data/lib/rubocop/cli.rb +58 -131
  19. data/lib/rubocop/comment_config.rb +65 -14
  20. data/lib/rubocop/config.rb +106 -342
  21. data/lib/rubocop/config_loader.rb +122 -153
  22. data/lib/rubocop/config_loader_resolver.rb +198 -8
  23. data/lib/rubocop/config_obsoletion.rb +277 -0
  24. data/lib/rubocop/config_store.rb +12 -2
  25. data/lib/rubocop/config_validator.rb +223 -0
  26. data/lib/rubocop/cop/autocorrect_logic.rb +73 -4
  27. data/lib/rubocop/cop/badge.rb +6 -6
  28. data/lib/rubocop/cop/base.rb +399 -0
  29. data/lib/rubocop/cop/bundler/duplicated_gem.rb +12 -10
  30. data/lib/rubocop/cop/bundler/gem_comment.rb +133 -0
  31. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +21 -28
  32. data/lib/rubocop/cop/bundler/ordered_gems.rb +16 -5
  33. data/lib/rubocop/cop/commissioner.rb +68 -67
  34. data/lib/rubocop/cop/cop.rb +101 -208
  35. data/lib/rubocop/cop/corrector.rb +82 -98
  36. data/lib/rubocop/cop/correctors/alignment_corrector.rb +142 -0
  37. data/lib/rubocop/cop/correctors/condition_corrector.rb +27 -0
  38. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +53 -0
  39. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +26 -0
  40. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +73 -0
  41. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +136 -0
  42. data/lib/rubocop/cop/correctors/line_break_corrector.rb +61 -0
  43. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +68 -0
  44. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +44 -0
  45. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +31 -0
  46. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +117 -0
  47. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +29 -0
  48. data/lib/rubocop/cop/correctors/space_corrector.rb +46 -0
  49. data/lib/rubocop/cop/correctors/string_literal_corrector.rb +25 -0
  50. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +43 -0
  51. data/lib/rubocop/cop/force.rb +1 -0
  52. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +104 -0
  53. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +16 -8
  54. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +85 -0
  55. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +55 -0
  56. data/lib/rubocop/cop/generator/configuration_injector.rb +66 -0
  57. data/lib/rubocop/cop/generator/require_file_injector.rb +78 -0
  58. data/lib/rubocop/cop/generator.rb +81 -99
  59. data/lib/rubocop/cop/ignored_node.rb +1 -3
  60. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +59 -0
  61. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +44 -0
  62. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +13 -16
  63. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +11 -10
  64. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +7 -18
  65. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +6 -4
  66. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +3 -3
  67. data/lib/rubocop/cop/internal_affairs.rb +2 -1
  68. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +22 -33
  69. data/lib/rubocop/cop/layout/{align_parameters.rb → argument_alignment.rb} +26 -24
  70. data/lib/rubocop/cop/layout/array_alignment.rb +82 -0
  71. data/lib/rubocop/cop/layout/{indent_assignment.rb → assignment_indentation.rb} +18 -5
  72. data/lib/rubocop/cop/{lint → layout}/block_alignment.rb +38 -32
  73. data/lib/rubocop/cop/layout/block_end_newline.rb +16 -13
  74. data/lib/rubocop/cop/layout/case_indentation.rb +26 -29
  75. data/lib/rubocop/cop/layout/class_structure.rb +343 -0
  76. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +126 -0
  77. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +145 -30
  78. data/lib/rubocop/cop/layout/comment_indentation.rb +76 -8
  79. data/lib/rubocop/cop/{lint → layout}/condition_position.rb +15 -5
  80. data/lib/rubocop/cop/{lint → layout}/def_end_alignment.rb +10 -14
  81. data/lib/rubocop/cop/layout/dot_position.rb +34 -22
  82. data/lib/rubocop/cop/layout/else_alignment.rb +37 -20
  83. data/lib/rubocop/cop/layout/empty_comment.rb +151 -0
  84. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +157 -0
  85. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +6 -5
  86. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +30 -25
  87. data/lib/rubocop/cop/layout/empty_lines.rb +20 -4
  88. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +138 -33
  89. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +99 -0
  90. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +121 -0
  91. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +8 -5
  92. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +13 -11
  93. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +60 -11
  94. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +13 -4
  95. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +8 -4
  96. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +29 -11
  97. data/lib/rubocop/cop/{lint → layout}/end_alignment.rb +53 -21
  98. data/lib/rubocop/cop/layout/end_of_line.rb +48 -8
  99. data/lib/rubocop/cop/layout/extra_spacing.rb +66 -102
  100. data/lib/rubocop/cop/layout/first_argument_indentation.rb +251 -0
  101. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +171 -0
  102. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +6 -2
  103. data/lib/rubocop/cop/layout/{indent_hash.rb → first_hash_element_indentation.rb} +83 -33
  104. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +5 -1
  105. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +8 -4
  106. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +5 -1
  107. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +61 -73
  108. data/lib/rubocop/cop/layout/hash_alignment.rb +365 -0
  109. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +285 -0
  110. data/lib/rubocop/cop/layout/heredoc_indentation.rb +173 -0
  111. data/lib/rubocop/cop/layout/indentation_consistency.rb +160 -8
  112. data/lib/rubocop/cop/layout/indentation_style.rb +117 -0
  113. data/lib/rubocop/cop/layout/indentation_width.rb +100 -45
  114. data/lib/rubocop/cop/layout/initial_indentation.rb +24 -8
  115. data/lib/rubocop/cop/layout/leading_comment_space.rb +67 -6
  116. data/lib/rubocop/cop/layout/leading_empty_lines.rb +53 -0
  117. data/lib/rubocop/cop/layout/line_length.rb +280 -0
  118. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +61 -24
  119. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +39 -0
  120. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +21 -14
  121. data/lib/rubocop/cop/layout/multiline_block_layout.rb +63 -28
  122. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +54 -21
  123. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +50 -0
  124. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +52 -0
  125. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +70 -33
  126. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +20 -18
  127. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +82 -33
  128. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +34 -6
  129. data/lib/rubocop/cop/layout/parameter_alignment.rb +118 -0
  130. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +125 -22
  131. data/lib/rubocop/cop/layout/space_after_colon.rb +6 -6
  132. data/lib/rubocop/cop/layout/space_after_comma.rb +7 -3
  133. data/lib/rubocop/cop/layout/space_after_method_name.rb +10 -7
  134. data/lib/rubocop/cop/layout/space_after_not.rb +4 -2
  135. data/lib/rubocop/cop/layout/space_after_semicolon.rb +12 -1
  136. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +74 -49
  137. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +41 -17
  138. data/lib/rubocop/cop/layout/space_around_keyword.rb +36 -20
  139. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +131 -0
  140. data/lib/rubocop/cop/layout/space_around_operators.rb +142 -46
  141. data/lib/rubocop/cop/layout/space_before_block_braces.rb +54 -11
  142. data/lib/rubocop/cop/layout/space_before_comma.rb +16 -1
  143. data/lib/rubocop/cop/layout/space_before_comment.rb +6 -7
  144. data/lib/rubocop/cop/layout/space_before_first_arg.rb +15 -4
  145. data/lib/rubocop/cop/layout/space_before_semicolon.rb +5 -1
  146. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +30 -39
  147. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +229 -0
  148. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +5 -5
  149. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +110 -19
  150. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +93 -46
  151. data/lib/rubocop/cop/layout/space_inside_parens.rb +92 -4
  152. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +3 -3
  153. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +17 -17
  154. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +148 -0
  155. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +37 -41
  156. data/lib/rubocop/cop/layout/{trailing_blank_lines.rb → trailing_empty_lines.rb} +54 -21
  157. data/lib/rubocop/cop/layout/trailing_whitespace.rb +51 -2
  158. data/lib/rubocop/cop/legacy/corrections_proxy.rb +49 -0
  159. data/lib/rubocop/cop/legacy/corrector.rb +29 -0
  160. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +16 -22
  161. data/lib/rubocop/cop/lint/ambiguous_operator.rb +42 -1
  162. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +15 -1
  163. data/lib/rubocop/cop/lint/assignment_in_condition.rb +29 -26
  164. data/lib/rubocop/cop/lint/big_decimal_new.rb +44 -0
  165. data/lib/rubocop/cop/lint/boolean_symbol.rb +14 -2
  166. data/lib/rubocop/cop/lint/circular_argument_reference.rb +2 -2
  167. data/lib/rubocop/cop/lint/constant_resolution.rb +89 -0
  168. data/lib/rubocop/cop/lint/debugger.rb +8 -10
  169. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +34 -13
  170. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +137 -0
  171. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +81 -0
  172. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  173. data/lib/rubocop/cop/lint/{duplicated_key.rb → duplicate_hash_key.rb} +2 -2
  174. data/lib/rubocop/cop/lint/duplicate_methods.rb +38 -25
  175. data/lib/rubocop/cop/lint/each_with_object_argument.rb +5 -2
  176. data/lib/rubocop/cop/lint/else_layout.rb +4 -3
  177. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
  178. data/lib/rubocop/cop/lint/empty_expression.rb +1 -1
  179. data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -5
  180. data/lib/rubocop/cop/lint/empty_when.rb +30 -7
  181. data/lib/rubocop/cop/lint/ensure_return.rb +23 -3
  182. data/lib/rubocop/cop/lint/erb_new_arguments.rb +162 -0
  183. data/lib/rubocop/cop/lint/flip_flop.rb +32 -0
  184. data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -2
  185. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +62 -44
  186. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +156 -0
  187. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +21 -15
  188. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +37 -59
  189. data/lib/rubocop/cop/lint/inherit_exception.rb +32 -16
  190. data/lib/rubocop/cop/lint/interpolation_check.rb +19 -3
  191. data/lib/rubocop/cop/lint/literal_as_condition.rb +16 -22
  192. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +33 -11
  193. data/lib/rubocop/cop/lint/loop.rb +8 -6
  194. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +84 -0
  195. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +69 -0
  196. data/lib/rubocop/cop/lint/{multiple_compare.rb → multiple_comparison.rb} +4 -4
  197. data/lib/rubocop/cop/lint/nested_method_definition.rb +8 -7
  198. data/lib/rubocop/cop/lint/nested_percent_literal.rb +51 -0
  199. data/lib/rubocop/cop/lint/next_without_accumulator.rb +2 -2
  200. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +89 -0
  201. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +14 -16
  202. data/lib/rubocop/cop/lint/number_conversion.rb +81 -0
  203. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +86 -0
  204. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +45 -15
  205. data/lib/rubocop/cop/lint/percent_string_array.rb +18 -22
  206. data/lib/rubocop/cop/lint/percent_symbol_array.rb +18 -15
  207. data/lib/rubocop/cop/lint/raise_exception.rb +83 -0
  208. data/lib/rubocop/cop/lint/rand_one.rb +5 -5
  209. data/lib/rubocop/cop/lint/{unneeded_disable.rb → redundant_cop_disable_directive.rb} +87 -61
  210. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +119 -0
  211. data/lib/rubocop/cop/lint/{unneeded_require_statement.rb → redundant_require_statement.rb} +10 -10
  212. data/lib/rubocop/cop/lint/{unneeded_splat_expansion.rb → redundant_splat_expansion.rb} +58 -27
  213. data/lib/rubocop/cop/lint/{string_conversion_in_interpolation.rb → redundant_string_coercion.rb} +18 -17
  214. data/lib/rubocop/cop/lint/redundant_with_index.rb +13 -8
  215. data/lib/rubocop/cop/lint/redundant_with_object.rb +9 -7
  216. data/lib/rubocop/cop/lint/regexp_as_condition.rb +7 -1
  217. data/lib/rubocop/cop/lint/require_parentheses.rb +7 -2
  218. data/lib/rubocop/cop/lint/rescue_exception.rb +3 -2
  219. data/lib/rubocop/cop/lint/rescue_type.rb +10 -6
  220. data/lib/rubocop/cop/lint/return_in_void_context.rb +3 -3
  221. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +23 -28
  222. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +94 -0
  223. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +46 -0
  224. data/lib/rubocop/cop/lint/script_permission.rb +33 -11
  225. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +91 -0
  226. data/lib/rubocop/cop/lint/shadowed_argument.rb +182 -0
  227. data/lib/rubocop/cop/lint/shadowed_exception.rb +42 -23
  228. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +2 -2
  229. data/lib/rubocop/cop/lint/struct_new_override.rb +58 -0
  230. data/lib/rubocop/cop/lint/suppressed_exception.rb +92 -0
  231. data/lib/rubocop/cop/lint/syntax.rb +12 -28
  232. data/lib/rubocop/cop/lint/to_json.rb +41 -0
  233. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +26 -6
  234. data/lib/rubocop/cop/lint/unified_integer.rb +3 -3
  235. data/lib/rubocop/cop/lint/unreachable_code.rb +9 -7
  236. data/lib/rubocop/cop/lint/unused_block_argument.rb +26 -6
  237. data/lib/rubocop/cop/lint/unused_method_argument.rb +62 -12
  238. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +17 -15
  239. data/lib/rubocop/cop/lint/uri_regexp.rb +7 -7
  240. data/lib/rubocop/cop/lint/useless_access_modifier.rb +96 -37
  241. data/lib/rubocop/cop/lint/useless_assignment.rb +8 -10
  242. data/lib/rubocop/cop/lint/useless_comparison.rb +1 -1
  243. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +9 -1
  244. data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -11
  245. data/lib/rubocop/cop/lint/void.rb +62 -30
  246. data/lib/rubocop/cop/message_annotator.rb +26 -13
  247. data/lib/rubocop/cop/metrics/abc_size.rb +4 -19
  248. data/lib/rubocop/cop/metrics/block_length.rb +42 -2
  249. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -1
  250. data/lib/rubocop/cop/metrics/class_length.rb +37 -2
  251. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +37 -4
  252. data/lib/rubocop/cop/metrics/method_length.rb +29 -2
  253. data/lib/rubocop/cop/metrics/module_length.rb +37 -2
  254. data/lib/rubocop/cop/metrics/parameter_lists.rb +9 -2
  255. data/lib/rubocop/cop/metrics/perceived_complexity.rb +5 -5
  256. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +84 -0
  257. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +129 -0
  258. data/lib/rubocop/cop/metrics/utils/iterating_block.rb +61 -0
  259. data/lib/rubocop/cop/migration/department_name.rb +85 -0
  260. data/lib/rubocop/cop/mixin/alignment.rb +72 -0
  261. data/lib/rubocop/cop/mixin/allowed_methods.rb +19 -0
  262. data/lib/rubocop/cop/mixin/annotation_comment.rb +1 -0
  263. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -3
  264. data/lib/rubocop/cop/mixin/array_syntax.rb +3 -1
  265. data/lib/rubocop/cop/mixin/auto_corrector.rb +12 -0
  266. data/lib/rubocop/cop/mixin/check_assignment.rb +13 -9
  267. data/lib/rubocop/cop/mixin/check_line_breakable.rb +184 -0
  268. data/lib/rubocop/cop/mixin/code_length.rb +11 -1
  269. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +8 -5
  270. data/lib/rubocop/cop/mixin/configurable_formatting.rb +4 -7
  271. data/lib/rubocop/cop/mixin/configurable_max.rb +6 -2
  272. data/lib/rubocop/cop/mixin/configurable_naming.rb +1 -1
  273. data/lib/rubocop/cop/mixin/def_node.rb +8 -2
  274. data/lib/rubocop/cop/mixin/documentation_comment.rb +13 -7
  275. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +34 -28
  276. data/lib/rubocop/cop/mixin/empty_parameter.rb +24 -0
  277. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +19 -32
  278. data/lib/rubocop/cop/mixin/enforce_superclass.rb +6 -10
  279. data/lib/rubocop/cop/mixin/first_element_line_break.rb +6 -10
  280. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +32 -7
  281. data/lib/rubocop/cop/mixin/{hash_alignment.rb → hash_alignment_styles.rb} +38 -7
  282. data/lib/rubocop/cop/mixin/hash_transform_method.rb +178 -0
  283. data/lib/rubocop/cop/mixin/heredoc.rb +22 -18
  284. data/lib/rubocop/cop/mixin/ignored_methods.rb +19 -0
  285. data/lib/rubocop/cop/mixin/ignored_pattern.rb +3 -1
  286. data/lib/rubocop/cop/mixin/integer_node.rb +3 -1
  287. data/lib/rubocop/cop/mixin/interpolation.rb +27 -0
  288. data/lib/rubocop/cop/mixin/line_length_help.rb +89 -0
  289. data/lib/rubocop/cop/mixin/match_range.rb +4 -0
  290. data/lib/rubocop/cop/mixin/method_complexity.rb +38 -8
  291. data/lib/rubocop/cop/mixin/method_preference.rb +2 -1
  292. data/lib/rubocop/cop/mixin/min_body_length.rb +3 -1
  293. data/lib/rubocop/cop/mixin/{array_hash_indentation.rb → multiline_element_indentation.rb} +5 -2
  294. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +33 -0
  295. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +50 -15
  296. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +15 -50
  297. data/lib/rubocop/cop/mixin/negative_conditional.rb +5 -16
  298. data/lib/rubocop/cop/mixin/nil_methods.rb +23 -0
  299. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +30 -32
  300. data/lib/rubocop/cop/mixin/parentheses.rb +3 -9
  301. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +1 -1
  302. data/lib/rubocop/cop/mixin/percent_array.rb +2 -2
  303. data/lib/rubocop/cop/mixin/percent_literal.rb +3 -65
  304. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +98 -6
  305. data/lib/rubocop/cop/mixin/preferred_delimiters.rb +53 -0
  306. data/lib/rubocop/cop/mixin/range_help.rb +117 -0
  307. data/lib/rubocop/cop/mixin/rational_literal.rb +18 -0
  308. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +43 -0
  309. data/lib/rubocop/cop/mixin/rescue_node.rb +4 -3
  310. data/lib/rubocop/cop/mixin/safe_assignment.rb +4 -1
  311. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +13 -14
  312. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +16 -16
  313. data/lib/rubocop/cop/mixin/statement_modifier.rb +20 -33
  314. data/lib/rubocop/cop/mixin/string_help.rb +2 -0
  315. data/lib/rubocop/cop/mixin/string_literals_help.rb +4 -14
  316. data/lib/rubocop/cop/mixin/surrounding_space.rb +120 -9
  317. data/lib/rubocop/cop/mixin/target_ruby_version.rb +5 -1
  318. data/lib/rubocop/cop/mixin/too_many_lines.rb +5 -19
  319. data/lib/rubocop/cop/mixin/trailing_body.rb +26 -0
  320. data/lib/rubocop/cop/mixin/trailing_comma.rb +96 -45
  321. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +113 -0
  322. data/lib/rubocop/cop/mixin/unused_argument.rb +3 -53
  323. data/lib/rubocop/cop/naming/accessor_method_name.rb +20 -10
  324. data/lib/rubocop/cop/naming/ascii_identifiers.rb +64 -5
  325. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +11 -9
  326. data/lib/rubocop/cop/naming/block_parameter_name.rb +49 -0
  327. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +28 -14
  328. data/lib/rubocop/cop/naming/constant_name.rb +59 -6
  329. data/lib/rubocop/cop/naming/file_name.rb +72 -36
  330. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +10 -16
  331. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +8 -12
  332. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +171 -0
  333. data/lib/rubocop/cop/naming/method_name.rb +58 -13
  334. data/lib/rubocop/cop/naming/method_parameter_name.rb +58 -0
  335. data/lib/rubocop/cop/naming/predicate_name.rb +22 -13
  336. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +112 -0
  337. data/lib/rubocop/cop/naming/variable_name.rb +20 -3
  338. data/lib/rubocop/cop/naming/variable_number.rb +12 -29
  339. data/lib/rubocop/cop/offense.rb +55 -13
  340. data/lib/rubocop/cop/registry.rb +118 -14
  341. data/lib/rubocop/cop/security/eval.rb +3 -2
  342. data/lib/rubocop/cop/security/json_load.rb +7 -5
  343. data/lib/rubocop/cop/security/marshal_load.rb +5 -3
  344. data/lib/rubocop/cop/security/open.rb +71 -0
  345. data/lib/rubocop/cop/security/yaml_load.rb +2 -2
  346. data/lib/rubocop/cop/severity.rb +2 -3
  347. data/lib/rubocop/cop/style/access_modifier_declarations.rb +132 -0
  348. data/lib/rubocop/cop/style/accessor_grouping.rb +136 -0
  349. data/lib/rubocop/cop/style/alias.rb +41 -37
  350. data/lib/rubocop/cop/style/and_or.rb +44 -38
  351. data/lib/rubocop/cop/style/array_join.rb +12 -3
  352. data/lib/rubocop/cop/style/ascii_comments.rb +29 -6
  353. data/lib/rubocop/cop/style/attr.rb +26 -8
  354. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +14 -5
  355. data/lib/rubocop/cop/style/bare_percent_literals.rb +34 -13
  356. data/lib/rubocop/cop/style/begin_block.rb +7 -1
  357. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +121 -0
  358. data/lib/rubocop/cop/style/block_comments.rb +27 -5
  359. data/lib/rubocop/cop/style/block_delimiters.rb +189 -30
  360. data/lib/rubocop/cop/style/case_equality.rb +37 -2
  361. data/lib/rubocop/cop/style/character_literal.rb +13 -3
  362. data/lib/rubocop/cop/style/class_and_module_children.rb +92 -10
  363. data/lib/rubocop/cop/style/class_check.rb +28 -9
  364. data/lib/rubocop/cop/style/class_methods.rb +20 -28
  365. data/lib/rubocop/cop/style/class_vars.rb +49 -3
  366. data/lib/rubocop/cop/style/collection_methods.rb +32 -2
  367. data/lib/rubocop/cop/style/colon_method_call.rb +19 -4
  368. data/lib/rubocop/cop/style/colon_method_definition.rb +37 -0
  369. data/lib/rubocop/cop/style/command_literal.rb +85 -28
  370. data/lib/rubocop/cop/style/comment_annotation.rb +51 -19
  371. data/lib/rubocop/cop/style/commented_keyword.rb +22 -30
  372. data/lib/rubocop/cop/style/conditional_assignment.rb +62 -92
  373. data/lib/rubocop/cop/style/constant_visibility.rb +77 -0
  374. data/lib/rubocop/cop/style/copyright.rb +39 -29
  375. data/lib/rubocop/cop/style/date_time.rb +44 -11
  376. data/lib/rubocop/cop/style/def_with_parentheses.rb +28 -3
  377. data/lib/rubocop/cop/style/dir.rb +7 -7
  378. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +49 -0
  379. data/lib/rubocop/cop/style/documentation.rb +72 -16
  380. data/lib/rubocop/cop/style/documentation_method.rb +51 -2
  381. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +55 -0
  382. data/lib/rubocop/cop/style/double_negation.rb +43 -6
  383. data/lib/rubocop/cop/style/each_for_simple_loop.rb +9 -9
  384. data/lib/rubocop/cop/style/each_with_object.rb +25 -11
  385. data/lib/rubocop/cop/style/empty_block_parameter.rb +48 -0
  386. data/lib/rubocop/cop/style/empty_case_condition.rb +30 -5
  387. data/lib/rubocop/cop/style/empty_else.rb +62 -26
  388. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +45 -0
  389. data/lib/rubocop/cop/style/empty_literal.rb +32 -18
  390. data/lib/rubocop/cop/style/empty_method.rb +14 -21
  391. data/lib/rubocop/cop/style/encoding.rb +13 -5
  392. data/lib/rubocop/cop/style/end_block.rb +15 -1
  393. data/lib/rubocop/cop/style/eval_with_location.rb +148 -0
  394. data/lib/rubocop/cop/style/even_odd.rb +9 -7
  395. data/lib/rubocop/cop/style/expand_path_arguments.rb +194 -0
  396. data/lib/rubocop/cop/style/exponential_notation.rb +119 -0
  397. data/lib/rubocop/cop/style/float_division.rb +94 -0
  398. data/lib/rubocop/cop/style/for.rb +54 -19
  399. data/lib/rubocop/cop/style/format_string.rb +63 -32
  400. data/lib/rubocop/cop/style/format_string_token.rb +45 -67
  401. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +170 -32
  402. data/lib/rubocop/cop/style/global_vars.rb +14 -4
  403. data/lib/rubocop/cop/style/guard_clause.rb +66 -13
  404. data/lib/rubocop/cop/style/hash_each_methods.rb +89 -0
  405. data/lib/rubocop/cop/style/hash_syntax.rb +69 -61
  406. data/lib/rubocop/cop/style/hash_transform_keys.rb +83 -0
  407. data/lib/rubocop/cop/style/hash_transform_values.rb +80 -0
  408. data/lib/rubocop/cop/style/identical_conditional_branches.rb +17 -21
  409. data/lib/rubocop/cop/style/if_inside_else.rb +52 -10
  410. data/lib/rubocop/cop/style/if_unless_modifier.rb +132 -24
  411. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +14 -2
  412. data/lib/rubocop/cop/style/if_with_semicolon.rb +28 -2
  413. data/lib/rubocop/cop/style/implicit_runtime_error.rb +5 -5
  414. data/lib/rubocop/cop/style/infinite_loop.rb +51 -14
  415. data/lib/rubocop/cop/style/inline_comment.rb +5 -3
  416. data/lib/rubocop/cop/style/inverse_methods.rb +70 -22
  417. data/lib/rubocop/cop/style/ip_addresses.rb +76 -0
  418. data/lib/rubocop/cop/style/lambda.rb +25 -112
  419. data/lib/rubocop/cop/style/lambda_call.rb +13 -27
  420. data/lib/rubocop/cop/style/line_end_concatenation.rb +22 -16
  421. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +169 -0
  422. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +52 -0
  423. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +134 -34
  424. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +12 -14
  425. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +5 -2
  426. data/lib/rubocop/cop/style/method_def_parentheses.rb +102 -13
  427. data/lib/rubocop/cop/style/method_missing_super.rb +34 -0
  428. data/lib/rubocop/cop/style/min_max.rb +14 -14
  429. data/lib/rubocop/cop/style/missing_else.rb +79 -12
  430. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +46 -0
  431. data/lib/rubocop/cop/style/mixin_grouping.rb +46 -33
  432. data/lib/rubocop/cop/style/mixin_usage.rb +32 -15
  433. data/lib/rubocop/cop/style/module_function.rb +102 -20
  434. data/lib/rubocop/cop/style/multiline_block_chain.rb +14 -3
  435. data/lib/rubocop/cop/style/multiline_if_modifier.rb +7 -7
  436. data/lib/rubocop/cop/style/multiline_if_then.rb +16 -14
  437. data/lib/rubocop/cop/style/multiline_memoization.rb +12 -17
  438. data/lib/rubocop/cop/style/multiline_method_signature.rb +61 -0
  439. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +31 -1
  440. data/lib/rubocop/cop/style/multiline_when_then.rb +74 -0
  441. data/lib/rubocop/cop/style/multiple_comparison.rb +19 -4
  442. data/lib/rubocop/cop/style/mutable_constant.rb +123 -15
  443. data/lib/rubocop/cop/style/negated_if.rb +26 -34
  444. data/lib/rubocop/cop/style/negated_unless.rb +89 -0
  445. data/lib/rubocop/cop/style/negated_while.rb +22 -6
  446. data/lib/rubocop/cop/style/nested_modifier.rb +28 -8
  447. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +25 -24
  448. data/lib/rubocop/cop/style/nested_ternary_operator.rb +39 -1
  449. data/lib/rubocop/cop/style/next.rb +64 -35
  450. data/lib/rubocop/cop/style/nil_comparison.rb +51 -11
  451. data/lib/rubocop/cop/style/non_nil_check.rb +42 -27
  452. data/lib/rubocop/cop/style/not.rb +21 -8
  453. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +46 -23
  454. data/lib/rubocop/cop/style/numeric_literals.rb +31 -18
  455. data/lib/rubocop/cop/style/numeric_predicate.rb +26 -32
  456. data/lib/rubocop/cop/style/one_line_conditional.rb +36 -18
  457. data/lib/rubocop/cop/style/option_hash.rb +22 -14
  458. data/lib/rubocop/cop/style/optional_arguments.rb +3 -6
  459. data/lib/rubocop/cop/style/or_assignment.rb +17 -9
  460. data/lib/rubocop/cop/style/parallel_assignment.rb +16 -16
  461. data/lib/rubocop/cop/style/parentheses_around_condition.rb +65 -5
  462. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +33 -6
  463. data/lib/rubocop/cop/style/percent_q_literals.rb +29 -8
  464. data/lib/rubocop/cop/style/perl_backrefs.rb +10 -3
  465. data/lib/rubocop/cop/style/preferred_hash_methods.rb +7 -10
  466. data/lib/rubocop/cop/style/proc.rb +12 -4
  467. data/lib/rubocop/cop/style/raise_args.rb +27 -21
  468. data/lib/rubocop/cop/style/random_with_offset.rb +152 -0
  469. data/lib/rubocop/cop/style/redundant_assignment.rb +117 -0
  470. data/lib/rubocop/cop/style/redundant_begin.rb +48 -5
  471. data/lib/rubocop/cop/style/{unneeded_capital_w.rb → redundant_capital_w.rb} +19 -9
  472. data/lib/rubocop/cop/style/redundant_condition.rb +124 -0
  473. data/lib/rubocop/cop/style/redundant_conditional.rb +17 -14
  474. data/lib/rubocop/cop/style/redundant_exception.rb +26 -17
  475. data/lib/rubocop/cop/style/redundant_fetch_block.rb +122 -0
  476. data/lib/rubocop/cop/style/redundant_freeze.rb +24 -2
  477. data/lib/rubocop/cop/style/{unneeded_interpolation.rb → redundant_interpolation.rb} +20 -24
  478. data/lib/rubocop/cop/style/redundant_parentheses.rb +59 -27
  479. data/lib/rubocop/cop/style/{unneeded_percent_q.rb → redundant_percent_q.rb} +40 -24
  480. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +90 -0
  481. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +121 -0
  482. data/lib/rubocop/cop/style/redundant_return.rb +87 -51
  483. data/lib/rubocop/cop/style/redundant_self.rb +56 -41
  484. data/lib/rubocop/cop/style/redundant_sort.rb +165 -0
  485. data/lib/rubocop/cop/{performance → style}/redundant_sort_by.rb +9 -7
  486. data/lib/rubocop/cop/style/regexp_literal.rb +126 -20
  487. data/lib/rubocop/cop/style/rescue_modifier.rb +39 -3
  488. data/lib/rubocop/cop/style/rescue_standard_error.rb +124 -0
  489. data/lib/rubocop/cop/style/return_nil.rb +8 -12
  490. data/lib/rubocop/cop/style/safe_navigation.rb +123 -31
  491. data/lib/rubocop/cop/{performance → style}/sample.rb +17 -13
  492. data/lib/rubocop/cop/style/self_assignment.rb +14 -14
  493. data/lib/rubocop/cop/style/semicolon.rb +45 -14
  494. data/lib/rubocop/cop/style/send.rb +12 -2
  495. data/lib/rubocop/cop/style/signal_exception.rb +104 -3
  496. data/lib/rubocop/cop/style/single_line_block_params.rb +22 -2
  497. data/lib/rubocop/cop/style/single_line_methods.rb +41 -31
  498. data/lib/rubocop/cop/style/slicing_with_range.rb +39 -0
  499. data/lib/rubocop/cop/style/special_global_vars.rb +75 -24
  500. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +13 -21
  501. data/lib/rubocop/cop/style/stderr_puts.rb +14 -5
  502. data/lib/rubocop/cop/style/string_hash_keys.rb +50 -0
  503. data/lib/rubocop/cop/style/string_literals.rb +29 -3
  504. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +7 -9
  505. data/lib/rubocop/cop/style/string_methods.rb +19 -7
  506. data/lib/rubocop/cop/{performance/lstrip_rstrip.rb → style/strip.rb} +10 -7
  507. data/lib/rubocop/cop/style/struct_inheritance.rb +36 -8
  508. data/lib/rubocop/cop/style/symbol_array.rb +51 -17
  509. data/lib/rubocop/cop/style/symbol_literal.rb +3 -3
  510. data/lib/rubocop/cop/style/symbol_proc.rb +32 -54
  511. data/lib/rubocop/cop/style/ternary_parentheses.rb +69 -53
  512. data/lib/rubocop/cop/style/trailing_body_on_class.rb +43 -0
  513. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +54 -0
  514. data/lib/rubocop/cop/style/trailing_body_on_module.rb +43 -0
  515. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +69 -24
  516. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +99 -0
  517. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +88 -0
  518. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +100 -0
  519. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +91 -0
  520. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +19 -9
  521. data/lib/rubocop/cop/style/trivial_accessors.rb +51 -20
  522. data/lib/rubocop/cop/style/unless_else.rb +21 -5
  523. data/lib/rubocop/cop/style/unpack_first.rb +61 -0
  524. data/lib/rubocop/cop/style/variable_interpolation.rb +22 -21
  525. data/lib/rubocop/cop/style/when_then.rb +15 -2
  526. data/lib/rubocop/cop/style/while_until_do.rb +26 -4
  527. data/lib/rubocop/cop/style/while_until_modifier.rb +26 -7
  528. data/lib/rubocop/cop/style/word_array.rb +22 -18
  529. data/lib/rubocop/cop/style/yoda_condition.rb +96 -36
  530. data/lib/rubocop/cop/style/zero_length_predicate.rb +40 -20
  531. data/lib/rubocop/cop/team.rb +159 -91
  532. data/lib/rubocop/cop/util.rb +51 -209
  533. data/lib/rubocop/cop/utils/format_string.rb +137 -0
  534. data/lib/rubocop/cop/variable_force/assignment.rb +9 -2
  535. data/lib/rubocop/cop/variable_force/branch.rb +5 -3
  536. data/lib/rubocop/cop/variable_force/branchable.rb +2 -0
  537. data/lib/rubocop/cop/variable_force/scope.rb +8 -5
  538. data/lib/rubocop/cop/variable_force/variable.rb +21 -10
  539. data/lib/rubocop/cop/variable_force/variable_table.rb +4 -3
  540. data/lib/rubocop/cop/variable_force.rb +41 -36
  541. data/lib/rubocop/core_ext/string.rb +23 -0
  542. data/lib/rubocop/error.rb +23 -0
  543. data/lib/rubocop/ext/processed_source.rb +18 -0
  544. data/lib/rubocop/file_finder.rb +42 -0
  545. data/lib/rubocop/formatter/auto_gen_config_formatter.rb +16 -0
  546. data/lib/rubocop/formatter/base_formatter.rb +3 -7
  547. data/lib/rubocop/formatter/clang_style_formatter.rb +9 -6
  548. data/lib/rubocop/formatter/disabled_config_formatter.rb +84 -49
  549. data/lib/rubocop/formatter/emacs_style_formatter.rb +22 -9
  550. data/lib/rubocop/formatter/file_list_formatter.rb +2 -1
  551. data/lib/rubocop/formatter/formatter_set.rb +17 -16
  552. data/lib/rubocop/formatter/fuubar_style_formatter.rb +2 -2
  553. data/lib/rubocop/formatter/html_formatter.rb +13 -6
  554. data/lib/rubocop/formatter/json_formatter.rb +16 -9
  555. data/lib/rubocop/formatter/junit_formatter.rb +84 -0
  556. data/lib/rubocop/formatter/offense_count_formatter.rb +17 -0
  557. data/lib/rubocop/formatter/pacman_formatter.rb +80 -0
  558. data/lib/rubocop/formatter/progress_formatter.rb +1 -1
  559. data/lib/rubocop/formatter/quiet_formatter.rb +13 -0
  560. data/lib/rubocop/formatter/simple_text_formatter.rb +18 -5
  561. data/lib/rubocop/formatter/tap_formatter.rb +17 -6
  562. data/lib/rubocop/magic_comment.rb +15 -11
  563. data/lib/rubocop/name_similarity.rb +17 -10
  564. data/lib/rubocop/options.rb +267 -139
  565. data/lib/rubocop/path_util.rb +45 -7
  566. data/lib/rubocop/platform.rb +1 -1
  567. data/lib/rubocop/rake_task.rb +7 -9
  568. data/lib/rubocop/remote_config.rb +23 -9
  569. data/lib/rubocop/result_cache.rb +50 -23
  570. data/lib/rubocop/rspec/cop_helper.rb +10 -37
  571. data/lib/rubocop/rspec/expect_offense.rb +124 -12
  572. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +1 -5
  573. data/lib/rubocop/rspec/shared_contexts.rb +78 -39
  574. data/lib/rubocop/rspec/support.rb +5 -1
  575. data/lib/rubocop/runner.rb +109 -59
  576. data/lib/rubocop/string_interpreter.rb +8 -8
  577. data/lib/rubocop/target_finder.rb +62 -68
  578. data/lib/rubocop/target_ruby.rb +154 -0
  579. data/lib/rubocop/version.rb +8 -4
  580. data/lib/rubocop/yaml_duplication_checker.rb +39 -0
  581. data/lib/rubocop.rb +188 -149
  582. metadata +257 -182
  583. data/config/disabled.yml +0 -118
  584. data/config/enabled.yml +0 -1892
  585. data/lib/rubocop/ast/builder.rb +0 -70
  586. data/lib/rubocop/ast/node/and_node.rb +0 -37
  587. data/lib/rubocop/ast/node/args_node.rb +0 -12
  588. data/lib/rubocop/ast/node/array_node.rb +0 -57
  589. data/lib/rubocop/ast/node/block_node.rb +0 -116
  590. data/lib/rubocop/ast/node/case_node.rb +0 -64
  591. data/lib/rubocop/ast/node/def_node.rb +0 -71
  592. data/lib/rubocop/ast/node/ensure_node.rb +0 -25
  593. data/lib/rubocop/ast/node/for_node.rb +0 -61
  594. data/lib/rubocop/ast/node/hash_node.rb +0 -109
  595. data/lib/rubocop/ast/node/if_node.rb +0 -146
  596. data/lib/rubocop/ast/node/keyword_splat_node.rb +0 -45
  597. data/lib/rubocop/ast/node/mixin/binary_operator_node.rb +0 -23
  598. data/lib/rubocop/ast/node/mixin/collection_node.rb +0 -15
  599. data/lib/rubocop/ast/node/mixin/conditional_node.rb +0 -45
  600. data/lib/rubocop/ast/node/mixin/hash_element_node.rb +0 -125
  601. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +0 -174
  602. data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +0 -89
  603. data/lib/rubocop/ast/node/mixin/modifier_node.rb +0 -17
  604. data/lib/rubocop/ast/node/mixin/parameterized_node.rb +0 -61
  605. data/lib/rubocop/ast/node/mixin/predicate_operator_node.rb +0 -35
  606. data/lib/rubocop/ast/node/or_node.rb +0 -37
  607. data/lib/rubocop/ast/node/pair_node.rb +0 -64
  608. data/lib/rubocop/ast/node/regexp_node.rb +0 -35
  609. data/lib/rubocop/ast/node/resbody_node.rb +0 -25
  610. data/lib/rubocop/ast/node/send_node.rb +0 -25
  611. data/lib/rubocop/ast/node/super_node.rb +0 -21
  612. data/lib/rubocop/ast/node/until_node.rb +0 -43
  613. data/lib/rubocop/ast/node/when_node.rb +0 -61
  614. data/lib/rubocop/ast/node/while_node.rb +0 -43
  615. data/lib/rubocop/ast/node/yield_node.rb +0 -21
  616. data/lib/rubocop/ast/node.rb +0 -604
  617. data/lib/rubocop/ast/sexp.rb +0 -16
  618. data/lib/rubocop/ast/traversal.rb +0 -171
  619. data/lib/rubocop/cop/internal_affairs/deprecated_positional_arguments.rb +0 -81
  620. data/lib/rubocop/cop/layout/align_array.rb +0 -35
  621. data/lib/rubocop/cop/layout/align_hash.rb +0 -235
  622. data/lib/rubocop/cop/layout/indent_array.rb +0 -114
  623. data/lib/rubocop/cop/layout/indent_heredoc.rb +0 -168
  624. data/lib/rubocop/cop/layout/space_inside_brackets.rb +0 -20
  625. data/lib/rubocop/cop/layout/tab.rb +0 -60
  626. data/lib/rubocop/cop/lint/end_in_method.rb +0 -40
  627. data/lib/rubocop/cop/lint/handle_exceptions.rb +0 -56
  628. data/lib/rubocop/cop/lint/rescue_without_error_class.rb +0 -41
  629. data/lib/rubocop/cop/metrics/line_length.rb +0 -171
  630. data/lib/rubocop/cop/mixin/autocorrect_alignment.rb +0 -149
  631. data/lib/rubocop/cop/mixin/classish_length.rb +0 -36
  632. data/lib/rubocop/cop/mixin/safe_mode.rb +0 -22
  633. data/lib/rubocop/cop/mixin/space_inside.rb +0 -76
  634. data/lib/rubocop/cop/mixin/target_rails_version.rb +0 -16
  635. data/lib/rubocop/cop/performance/caller.rb +0 -69
  636. data/lib/rubocop/cop/performance/case_when_splat.rb +0 -176
  637. data/lib/rubocop/cop/performance/casecmp.rb +0 -107
  638. data/lib/rubocop/cop/performance/compare_with_block.rb +0 -111
  639. data/lib/rubocop/cop/performance/count.rb +0 -100
  640. data/lib/rubocop/cop/performance/detect.rb +0 -107
  641. data/lib/rubocop/cop/performance/double_start_end_with.rb +0 -99
  642. data/lib/rubocop/cop/performance/end_with.rb +0 -55
  643. data/lib/rubocop/cop/performance/fixed_size.rb +0 -56
  644. data/lib/rubocop/cop/performance/flat_map.rb +0 -75
  645. data/lib/rubocop/cop/performance/hash_each_methods.rb +0 -128
  646. data/lib/rubocop/cop/performance/range_include.rb +0 -41
  647. data/lib/rubocop/cop/performance/redundant_block_call.rb +0 -93
  648. data/lib/rubocop/cop/performance/redundant_match.rb +0 -56
  649. data/lib/rubocop/cop/performance/redundant_merge.rb +0 -167
  650. data/lib/rubocop/cop/performance/regexp_match.rb +0 -223
  651. data/lib/rubocop/cop/performance/reverse_each.rb +0 -40
  652. data/lib/rubocop/cop/performance/size.rb +0 -71
  653. data/lib/rubocop/cop/performance/start_with.rb +0 -58
  654. data/lib/rubocop/cop/performance/string_replacement.rb +0 -170
  655. data/lib/rubocop/cop/performance/times_map.rb +0 -72
  656. data/lib/rubocop/cop/performance/unfreeze_string.rb +0 -50
  657. data/lib/rubocop/cop/performance/uri_default_parser.rb +0 -47
  658. data/lib/rubocop/cop/rails/action_filter.rb +0 -94
  659. data/lib/rubocop/cop/rails/active_support_aliases.rb +0 -67
  660. data/lib/rubocop/cop/rails/application_job.rb +0 -32
  661. data/lib/rubocop/cop/rails/application_record.rb +0 -32
  662. data/lib/rubocop/cop/rails/blank.rb +0 -141
  663. data/lib/rubocop/cop/rails/date.rb +0 -128
  664. data/lib/rubocop/cop/rails/delegate.rb +0 -135
  665. data/lib/rubocop/cop/rails/delegate_allow_blank.rb +0 -51
  666. data/lib/rubocop/cop/rails/dynamic_find_by.rb +0 -81
  667. data/lib/rubocop/cop/rails/enum_uniqueness.rb +0 -43
  668. data/lib/rubocop/cop/rails/exit.rb +0 -61
  669. data/lib/rubocop/cop/rails/file_path.rb +0 -72
  670. data/lib/rubocop/cop/rails/find_by.rb +0 -52
  671. data/lib/rubocop/cop/rails/find_each.rb +0 -47
  672. data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +0 -18
  673. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +0 -72
  674. data/lib/rubocop/cop/rails/http_positional_arguments.rb +0 -107
  675. data/lib/rubocop/cop/rails/not_null_column.rb +0 -67
  676. data/lib/rubocop/cop/rails/output.rb +0 -23
  677. data/lib/rubocop/cop/rails/output_safety.rb +0 -99
  678. data/lib/rubocop/cop/rails/pluralization_grammar.rb +0 -106
  679. data/lib/rubocop/cop/rails/present.rb +0 -140
  680. data/lib/rubocop/cop/rails/read_write_attribute.rb +0 -65
  681. data/lib/rubocop/cop/rails/relative_date_constant.rb +0 -88
  682. data/lib/rubocop/cop/rails/request_referer.rb +0 -56
  683. data/lib/rubocop/cop/rails/reversible_migration.rb +0 -282
  684. data/lib/rubocop/cop/rails/safe_navigation.rb +0 -91
  685. data/lib/rubocop/cop/rails/save_bang.rb +0 -162
  686. data/lib/rubocop/cop/rails/scope_args.rb +0 -29
  687. data/lib/rubocop/cop/rails/skips_model_validations.rb +0 -70
  688. data/lib/rubocop/cop/rails/time_zone.rb +0 -198
  689. data/lib/rubocop/cop/rails/uniq_before_pluck.rb +0 -95
  690. data/lib/rubocop/cop/rails/unknown_env.rb +0 -63
  691. data/lib/rubocop/cop/rails/validation.rb +0 -64
  692. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +0 -141
  693. data/lib/rubocop/cop/style/flip_flop.rb +0 -20
  694. data/lib/rubocop/cop/style/method_missing.rb +0 -68
  695. data/lib/rubocop/cop/style/trailing_comma_in_literal.rb +0 -56
  696. data/lib/rubocop/formatter/disabled_lines_formatter.rb +0 -57
  697. data/lib/rubocop/node_pattern.rb +0 -561
  698. data/lib/rubocop/processed_source.rb +0 -147
  699. data/lib/rubocop/rspec/shared_examples.rb +0 -92
  700. data/lib/rubocop/string_util.rb +0 -158
  701. data/lib/rubocop/token.rb +0 -25
  702. /data/{bin → exe}/rubocop +0 -0
@@ -4,8 +4,15 @@ require 'optparse'
4
4
  require 'shellwords'
5
5
 
6
6
  module RuboCop
7
+ class IncorrectCopNameError < StandardError; end
8
+ class OptionArgumentError < StandardError; end
9
+
7
10
  # This class handles command line options.
8
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.'
9
16
  EXITING_OPTIONS = %i[version verbose_version show_cops].freeze
10
17
  DEFAULT_MAXIMUM_EXCLUSION_ITEMS = 15
11
18
 
@@ -16,19 +23,15 @@ module RuboCop
16
23
 
17
24
  def parse(command_line_args)
18
25
  args = args_from_file.concat(args_from_env).concat(command_line_args)
19
- define_options(args).parse!(args)
20
- # The --no-color CLI option sets `color: false` so we don't want the
21
- # `no_color` key, which is created automatically.
22
- @options.delete(:no_color)
26
+ define_options.parse!(args)
23
27
 
24
28
  @validator.validate_compatibility
25
29
 
26
30
  if @options[:stdin]
27
- # The parser has put the file name given after --stdin into
28
- # @options[:stdin]. The args array should be empty.
29
- if args.any?
30
- raise ArgumentError, '-s/--stdin requires exactly one path.'
31
- end
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
+
32
35
  # We want the STDIN contents in @options[:stdin] and the file name in
33
36
  # args to simplify the rest of the processing.
34
37
  args = [@options[:stdin]]
@@ -42,7 +45,7 @@ module RuboCop
42
45
 
43
46
  def args_from_file
44
47
  if File.exist?('.rubocop') && !File.directory?('.rubocop')
45
- IO.readlines('.rubocop').map(&:strip)
48
+ File.read('.rubocop').shellsplit
46
49
  else
47
50
  []
48
51
  end
@@ -52,13 +55,13 @@ module RuboCop
52
55
  Shellwords.split(ENV.fetch('RUBOCOP_OPTS', ''))
53
56
  end
54
57
 
55
- def define_options(args)
58
+ def define_options
56
59
  OptionParser.new do |opts|
57
60
  opts.banner = 'Usage: rubocop [options] [file1, file2, ...]'
58
61
 
59
62
  add_list_options(opts)
60
63
  add_only_options(opts)
61
- add_configuration_options(opts, args)
64
+ add_configuration_options(opts)
62
65
  add_formatting_options(opts)
63
66
 
64
67
  option(opts, '-r', '--require FILE') { |f| require f }
@@ -66,6 +69,7 @@ module RuboCop
66
69
  add_severity_option(opts)
67
70
  add_flags_with_optional_args(opts)
68
71
  add_boolean_flags(opts)
72
+ add_aliases(opts)
69
73
 
70
74
  option(opts, '-s', '--stdin FILE')
71
75
  end
@@ -79,6 +83,12 @@ module RuboCop
79
83
 
80
84
  def add_cop_selection_csv_option(option, opts)
81
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
+
82
92
  @options[:"#{option}"] =
83
93
  if list.empty?
84
94
  ['']
@@ -90,23 +100,34 @@ module RuboCop
90
100
  end
91
101
  end
92
102
 
93
- def add_configuration_options(opts, args)
103
+ def add_configuration_options(opts)
94
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
95
111
 
112
+ def add_auto_gen_options(opts)
96
113
  option(opts, '--auto-gen-config')
97
114
 
98
115
  option(opts, '--exclude-limit COUNT') do
99
- @validator.validate_exclude_limit_option(args)
116
+ @validator.validate_exclude_limit_option
100
117
  end
101
118
 
102
- option(opts, '--force-exclusion')
103
- option(opts, '--ignore-parent-exclusion')
104
-
105
- option(opts, '--force-default-config')
119
+ option(opts, '--disable-uncorrectable')
106
120
 
107
121
  option(opts, '--no-offense-counts') do
108
122
  @options[:no_offense_counts] = true
109
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')
110
131
  end
111
132
 
112
133
  def add_formatting_options(opts)
@@ -122,6 +143,8 @@ module RuboCop
122
143
  @options[:output_path] = path
123
144
  end
124
145
  end
146
+
147
+ option(opts, '--display-only-failed')
125
148
  end
126
149
 
127
150
  def add_severity_option(opts)
@@ -131,6 +154,7 @@ module RuboCop
131
154
  table) do |severity|
132
155
  @options[:fail_level] = severity
133
156
  end
157
+ option(opts, '--display-only-fail-level-offenses')
134
158
  end
135
159
 
136
160
  def add_flags_with_optional_args(opts)
@@ -139,26 +163,49 @@ module RuboCop
139
163
  end
140
164
  end
141
165
 
142
- def add_boolean_flags(opts) # rubocop:disable Metrics/MethodLength
166
+ # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
167
+ def add_boolean_flags(opts)
143
168
  option(opts, '-F', '--fail-fast')
144
169
  option(opts, '-C', '--cache FLAG')
145
170
  option(opts, '-d', '--debug')
146
- option(opts, '-D', '--display-cop-names')
171
+ option(opts, '-D', '--[no-]display-cop-names')
147
172
  option(opts, '-E', '--extra-details')
148
173
  option(opts, '-S', '--display-style-guide')
149
- option(opts, '-R', '--rails')
150
- option(opts, '-l', '--lint') do
151
- @options[:only] ||= []
152
- @options[:only] << 'Lint'
174
+ option(opts, '-a', '--auto-correct') do
175
+ @options[:safe_auto_correct] = true
176
+ end
177
+ option(opts, '--safe-autocorrect') do
178
+ warn '--safe-autocorrect is deprecated; use --autocorrect'
179
+ @options[:safe_auto_correct] = @options[:auto_correct] = true
153
180
  end
154
- option(opts, '-a', '--auto-correct')
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')
155
189
 
156
- option(opts, '--[no-]color') { |c| @options[:color] = c }
190
+ option(opts, '--[no-]color')
157
191
 
158
192
  option(opts, '-v', '--version')
159
193
  option(opts, '-V', '--verbose-version')
160
194
  option(opts, '-P', '--parallel')
161
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
162
209
 
163
210
  def add_list_options(opts)
164
211
  option(opts, '-L', '--list-target-files')
@@ -179,25 +226,44 @@ module RuboCop
179
226
  # e.g. [..., '--auto-correct', ...] to :auto_correct.
180
227
  def long_opt_symbol(args)
181
228
  long_opt = args.find { |arg| arg.start_with?('--') }
182
- long_opt[2..-1].sub(/ .*/, '').tr('-', '_').gsub(/[\[\]]/, '').to_sym
229
+ long_opt[2..-1].sub('[no-]', '').sub(/ .*/, '')
230
+ .tr('-', '_').gsub(/[\[\]]/, '').to_sym
183
231
  end
184
232
  end
185
233
 
186
234
  # Validates option arguments and the options' compatibility with each other.
187
235
  class OptionsValidator
188
- # Cop name validation must be done later than option parsing, so it's not
189
- # called from within Options.
190
- def self.validate_cop_list(names)
191
- return unless names
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
192
241
 
193
- departments = Cop::Cop.registry.departments.map(&:to_s)
242
+ cop_names = Cop::Cop.registry.names
243
+ departments = Cop::Cop.registry.departments.map(&:to_s)
194
244
 
195
- names.each do |name|
196
- next if Cop::Cop.registry.names.include?(name)
197
- next if departments.include?(name)
198
- next if %w[Syntax Lint/Syntax].include?(name)
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)
199
249
 
200
- raise ArgumentError, "Unrecognized cop or department: #{name}."
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
201
267
  end
202
268
  end
203
269
 
@@ -205,50 +271,103 @@ module RuboCop
205
271
  @options = options
206
272
  end
207
273
 
208
- def validate_compatibility # rubocop:disable Metrics/MethodLength
209
- if only_includes_unneeded_disable?
210
- raise ArgumentError, 'Lint/UnneededDisable can not be used with --only.'
274
+ def validate_cop_options
275
+ %i[only except].each do |opt|
276
+ OptionsValidator.validate_cop_list(@options[opt])
211
277
  end
212
- if except_syntax?
213
- raise ArgumentError, 'Syntax checking can not be turned off.'
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.'
214
285
  end
286
+ raise OptionArgumentError, 'Syntax checking cannot be turned off.' if except_syntax?
215
287
  unless boolean_or_empty_cache?
216
- raise ArgumentError, '-C/--cache argument must be true or false'
288
+ raise OptionArgumentError, '-C/--cache argument must be true or false'
217
289
  end
218
- if no_offense_counts_without_auto_gen_config?
219
- raise ArgumentError, '--no-offense-counts can only be used together ' \
220
- 'with --auto-gen-config.'
290
+
291
+ if display_only_fail_level_offenses_with_autocorrect?
292
+ raise OptionArgumentError, '--autocorrect cannot be used with ' \
293
+ '--display-only-fail-level-offenses'
221
294
  end
295
+ validate_auto_gen_config
296
+ validate_auto_correct
297
+ validate_display_only_failed
222
298
  validate_parallel
223
299
 
224
300
  return if incompatible_options.size <= 1
225
- raise ArgumentError, 'Incompatible cli options: ' \
226
- "#{incompatible_options.inspect}"
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.')
227
335
  end
228
336
 
229
337
  def validate_parallel
230
338
  return unless @options.key?(:parallel)
231
339
 
232
340
  if @options[:cache] == 'false'
233
- raise ArgumentError, '-P/--parallel uses caching to speed up ' \
234
- 'execution, so combining with --cache false is ' \
235
- 'not allowed.'
341
+ raise OptionArgumentError, '-P/--parallel uses caching to speed up ' \
342
+ 'execution, so combining with --cache ' \
343
+ 'false is not allowed.'
236
344
  end
237
345
 
346
+ validate_parallel_with_combo_option
347
+ end
348
+
349
+ def validate_parallel_with_combo_option
238
350
  combos = {
239
351
  auto_gen_config: '-P/--parallel uses caching to speed up execution, ' \
240
352
  'while --auto-gen-config needs a non-cached run, ' \
241
353
  'so they cannot be combined.',
242
- fail_fast: '-P/--parallel can not be combined with -F/--fail-fast.',
243
- auto_correct: '-P/--parallel can not be combined with --auto-correct.'
354
+ fail_fast: '-P/--parallel cannot be combined with -F/--fail-fast.',
355
+ auto_correct: '-P/--parallel cannot be combined with --auto-correct.'
244
356
  }
245
357
 
246
- combos.each { |key, msg| raise ArgumentError, msg if @options.key?(key) }
358
+ combos.each do |key, msg|
359
+ raise OptionArgumentError, msg if @options.key?(key)
360
+ end
247
361
  end
248
362
 
249
- def only_includes_unneeded_disable?
363
+ def only_includes_redundant_disable?
250
364
  @options.key?(:only) &&
251
- (@options[:only] & %w[Lint/UnneededDisable UnneededDisable]).any?
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]
252
371
  end
253
372
 
254
373
  def except_syntax?
@@ -260,101 +379,110 @@ module RuboCop
260
379
  !@options.key?(:cache) || %w[true false].include?(@options[:cache])
261
380
  end
262
381
 
263
- def no_offense_counts_without_auto_gen_config?
264
- @options.key?(:no_offense_counts) && !@options.key?(:auto_gen_config)
265
- end
266
-
267
382
  def incompatible_options
268
383
  @incompatible_options ||= @options.keys & Options::EXITING_OPTIONS
269
384
  end
270
385
 
271
- def validate_exclude_limit_option(args)
272
- if @options[:exclude_limit] !~ /^\d+$/
273
- # Emulate OptionParser's behavior to make failures consistent regardless
274
- # of option order.
275
- raise OptionParser::MissingArgument
276
- end
277
-
278
- # --exclude-limit is valid if there's a parsed or yet unparsed
279
- # --auto-gen-config.
280
- return if @options[:auto_gen_config] || args.include?('--auto-gen-config')
386
+ def validate_exclude_limit_option
387
+ return if /^\d+$/.match?(@options[:exclude_limit])
281
388
 
282
- raise ArgumentError,
283
- '--exclude-limit can only be used with --auto-gen-config.'
389
+ # Emulate OptionParser's behavior to make failures consistent regardless
390
+ # of option order.
391
+ raise OptionParser::MissingArgument
284
392
  end
285
393
  end
286
394
 
287
395
  # This module contains help texts for command line options.
288
396
  module OptionsHelp
289
397
  MAX_EXCL = RuboCop::Options::DEFAULT_MAXIMUM_EXCLUSION_ITEMS.to_s
398
+ FORMATTER_OPTION_LIST = RuboCop::Formatter::FormatterSet::BUILTIN_FORMATTERS_FOR_KEYS.keys
399
+
290
400
  TEXT = {
291
- only: 'Run only the given cop(s).',
292
- only_guide_cops: ['Run only cops for rules that link to a',
293
- 'style guide.'],
294
- except: 'Disable the given cop(s).',
295
- require: 'Require Ruby file.',
296
- config: 'Specify configuration file.',
297
- auto_gen_config: ['Generate a configuration file acting as a',
298
- 'TODO list.'],
299
- no_offense_counts: ['Do not include offense counts in configuration',
300
- 'file generated by --auto-gen-config.'],
301
- exclude_limit: ['Used together with --auto-gen-config to',
302
- 'set the limit for how many Exclude',
303
- "properties to generate. Default is #{MAX_EXCL}."],
304
- force_exclusion: ['Force excluding files specified in the',
305
- 'configuration `Exclude` even if they are',
306
- 'explicitly passed as arguments.'],
307
- ignore_parent_exclusion:
308
- ['Prevent from inheriting AllCops/Exclude from',
309
- 'parent folders.'],
310
- force_default_config: ['Use default configuration even if configuration',
311
- 'files are present in the directory tree.'],
312
- format: ['Choose an output formatter. This option',
313
- 'can be specified multiple times to enable',
314
- 'multiple formatters at the same time.',
315
- ' [p]rogress (default)',
316
- ' [s]imple',
317
- ' [c]lang',
318
- ' [d]isabled cops via inline comments',
319
- ' [fu]ubar',
320
- ' [e]macs',
321
- ' [j]son',
322
- ' [h]tml',
323
- ' [fi]les',
324
- ' [o]ffenses',
325
- ' [w]orst',
326
- ' [t]ap',
327
- ' custom formatter class name'],
328
- out: ['Write output to a file instead of STDOUT.',
329
- 'This option applies to the previously',
330
- 'specified --format, or the default format',
331
- 'if no format is specified.'],
332
- fail_level: ['Minimum severity (A/R/C/W/E/F) for exit',
333
- 'with error code.'],
334
- show_cops: ['Shows the given cops, or all cops by',
335
- 'default, and their configurations for the',
336
- 'current directory.'],
337
- fail_fast: ['Inspect files in order of modification',
338
- 'time and stop after the first file',
339
- 'containing offenses.'],
340
- cache: ["Use result caching (FLAG=true) or don't",
341
- '(FLAG=false), default determined by',
342
- 'configuration parameter AllCops: UseCache.'],
343
- debug: 'Display debug info.',
344
- display_cop_names: 'Display cop names in offense messages.',
345
- display_style_guide: 'Display style guide URLs in offense messages.',
346
- extra_details: 'Display extra details in offense messages.',
347
- rails: 'Run extra Rails cops.',
348
- lint: 'Run only lint cops.',
349
- list_target_files: 'List all files RuboCop will inspect.',
350
- auto_correct: 'Auto-correct offenses.',
351
- no_color: 'Force color output on or off.',
352
- version: 'Display version.',
353
- verbose_version: 'Display verbose version.',
354
- parallel: ['Use available CPUs to execute inspection in',
355
- 'parallel.'],
356
- stdin: ['Pipe source from STDIN, using FILE in offense',
357
- 'reports. This is useful for editor integration.']
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_autocorrect: '(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.'
358
486
  }.freeze
359
487
  end
360
488
  end
@@ -5,18 +5,26 @@ module RuboCop
5
5
  module PathUtil
6
6
  module_function
7
7
 
8
- def relative_path(path, base_dir = Dir.pwd)
8
+ def relative_path(path, base_dir = PathUtil.pwd)
9
9
  # Optimization for the common case where path begins with the base
10
10
  # dir. Just cut off the first part.
11
- 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
12
16
 
13
17
  path_name = Pathname.new(File.expand_path(path))
14
- path_name.relative_path_from(Pathname.new(base_dir)).to_s
18
+ begin
19
+ path_name.relative_path_from(Pathname.new(base_dir)).to_s
20
+ rescue ArgumentError
21
+ path
22
+ end
15
23
  end
16
24
 
17
25
  def smart_path(path)
18
26
  # Ideally, we calculate this relative to the project root.
19
- base_dir = Dir.pwd
27
+ base_dir = PathUtil.pwd
20
28
 
21
29
  if path.start_with? base_dir
22
30
  relative_path(path, base_dir)
@@ -28,12 +36,14 @@ module RuboCop
28
36
  def match_path?(pattern, path)
29
37
  case pattern
30
38
  when String
31
- File.fnmatch?(pattern, path, File::FNM_PATHNAME)
39
+ File.fnmatch?(pattern, path, File::FNM_PATHNAME | File::FNM_EXTGLOB) ||
40
+ hidden_file_in_not_hidden_dir?(pattern, path)
32
41
  when Regexp
33
42
  begin
34
- path =~ pattern
43
+ pattern.match?(path)
35
44
  rescue ArgumentError => e
36
45
  return false if e.message.start_with?('invalid byte sequence')
46
+
37
47
  raise e
38
48
  end
39
49
  end
@@ -41,7 +51,35 @@ module RuboCop
41
51
 
42
52
  # Returns true for an absolute Unix or Windows path.
43
53
  def absolute?(path)
44
- path =~ %r{\A([A-Z]:)?/}
54
+ %r{\A([A-Z]:)?/}i.match?(path)
55
+ end
56
+
57
+ def self.pwd
58
+ @pwd ||= Dir.pwd
59
+ end
60
+
61
+ def self.reset_pwd
62
+ @pwd = nil
63
+ end
64
+
65
+ def self.chdir(dir, &block)
66
+ reset_pwd
67
+ Dir.chdir(dir, &block)
68
+ ensure
69
+ reset_pwd
70
+ end
71
+
72
+ def hidden_file_in_not_hidden_dir?(pattern, path)
73
+ File.fnmatch?(
74
+ pattern, path,
75
+ File::FNM_PATHNAME | File::FNM_EXTGLOB | File::FNM_DOTMATCH
76
+ ) && File.basename(path).start_with?('.') && !hidden_dir?(path)
77
+ end
78
+
79
+ def hidden_dir?(path)
80
+ File.dirname(path).split(File::SEPARATOR).any? do |dir|
81
+ dir.start_with?('.')
82
+ end
45
83
  end
46
84
  end
47
85
  end