rubocop 0.87.1 → 0.91.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 (515) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/bin/rubocop-profile +32 -0
  4. data/config/default.yml +267 -33
  5. data/lib/rubocop.rb +45 -5
  6. data/lib/rubocop/cached_data.rb +1 -0
  7. data/lib/rubocop/cli.rb +2 -2
  8. data/lib/rubocop/cli/command.rb +1 -0
  9. data/lib/rubocop/cli/command/auto_genenerate_config.rb +4 -3
  10. data/lib/rubocop/cli/command/base.rb +2 -0
  11. data/lib/rubocop/cli/command/execute_runner.rb +10 -1
  12. data/lib/rubocop/cli/command/init_dotfile.rb +1 -0
  13. data/lib/rubocop/cli/command/show_cops.rb +3 -2
  14. data/lib/rubocop/cli/command/version.rb +3 -2
  15. data/lib/rubocop/cli/environment.rb +1 -0
  16. data/lib/rubocop/comment_config.rb +10 -7
  17. data/lib/rubocop/config.rb +20 -3
  18. data/lib/rubocop/config_loader.rb +42 -18
  19. data/lib/rubocop/config_loader_resolver.rb +4 -3
  20. data/lib/rubocop/config_obsoletion.rb +7 -1
  21. data/lib/rubocop/config_store.rb +7 -3
  22. data/lib/rubocop/config_validator.rb +5 -4
  23. data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
  24. data/lib/rubocop/cop/badge.rb +1 -1
  25. data/lib/rubocop/cop/base.rb +37 -6
  26. data/lib/rubocop/cop/bundler/duplicated_gem.rb +5 -1
  27. data/lib/rubocop/cop/bundler/gem_comment.rb +8 -3
  28. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +2 -0
  29. data/lib/rubocop/cop/commissioner.rb +47 -8
  30. data/lib/rubocop/cop/cop.rb +1 -1
  31. data/lib/rubocop/cop/correctors/alignment_corrector.rb +4 -4
  32. data/lib/rubocop/cop/correctors/condition_corrector.rb +3 -5
  33. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +9 -10
  34. data/lib/rubocop/cop/correctors/line_break_corrector.rb +6 -6
  35. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +34 -3
  36. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -8
  37. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +6 -11
  38. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +8 -10
  39. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
  40. data/lib/rubocop/cop/documentation.rb +22 -0
  41. data/lib/rubocop/cop/force.rb +1 -0
  42. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +38 -12
  43. data/lib/rubocop/cop/generator.rb +2 -1
  44. data/lib/rubocop/cop/generator/configuration_injector.rb +2 -2
  45. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +5 -12
  46. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
  47. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -0
  48. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +9 -8
  49. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +11 -7
  50. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +8 -8
  51. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
  52. data/lib/rubocop/cop/layout/begin_end_alignment.rb +77 -0
  53. data/lib/rubocop/cop/layout/block_alignment.rb +24 -20
  54. data/lib/rubocop/cop/layout/class_structure.rb +13 -16
  55. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +4 -6
  56. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  57. data/lib/rubocop/cop/layout/condition_position.rb +13 -15
  58. data/lib/rubocop/cop/layout/def_end_alignment.rb +8 -5
  59. data/lib/rubocop/cop/layout/dot_position.rb +21 -17
  60. data/lib/rubocop/cop/layout/empty_comment.rb +30 -23
  61. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +19 -16
  62. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +13 -13
  63. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +145 -0
  64. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +21 -23
  65. data/lib/rubocop/cop/layout/empty_lines.rb +6 -9
  66. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +5 -6
  67. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +7 -8
  68. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +3 -6
  69. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -5
  70. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +2 -5
  71. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -5
  72. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +2 -5
  73. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -5
  74. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +2 -5
  75. data/lib/rubocop/cop/layout/end_alignment.rb +14 -19
  76. data/lib/rubocop/cop/layout/extra_spacing.rb +22 -36
  77. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +2 -5
  78. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +2 -5
  79. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +5 -9
  80. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +2 -5
  81. data/lib/rubocop/cop/layout/hash_alignment.rb +17 -20
  82. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +15 -14
  83. data/lib/rubocop/cop/layout/heredoc_indentation.rb +16 -13
  84. data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
  85. data/lib/rubocop/cop/layout/initial_indentation.rb +6 -7
  86. data/lib/rubocop/cop/layout/leading_comment_space.rb +12 -10
  87. data/lib/rubocop/cop/layout/leading_empty_lines.rb +6 -11
  88. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +2 -5
  89. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +2 -5
  90. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +10 -14
  91. data/lib/rubocop/cop/layout/multiline_block_layout.rb +37 -24
  92. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +2 -5
  93. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +2 -5
  94. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +5 -9
  95. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -5
  96. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +2 -5
  97. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +32 -24
  98. data/lib/rubocop/cop/layout/space_after_colon.rb +11 -7
  99. data/lib/rubocop/cop/layout/space_after_comma.rb +2 -5
  100. data/lib/rubocop/cop/layout/space_after_method_name.rb +5 -6
  101. data/lib/rubocop/cop/layout/space_after_not.rb +9 -11
  102. data/lib/rubocop/cop/layout/space_after_semicolon.rb +2 -5
  103. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +3 -2
  104. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +20 -15
  105. data/lib/rubocop/cop/layout/space_around_keyword.rb +17 -18
  106. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +33 -66
  107. data/lib/rubocop/cop/layout/space_around_operators.rb +17 -16
  108. data/lib/rubocop/cop/layout/space_before_block_braces.rb +23 -22
  109. data/lib/rubocop/cop/layout/space_before_comma.rb +3 -5
  110. data/lib/rubocop/cop/layout/space_before_comment.rb +10 -7
  111. data/lib/rubocop/cop/layout/space_before_first_arg.rb +7 -7
  112. data/lib/rubocop/cop/layout/space_before_semicolon.rb +2 -5
  113. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -17
  114. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +16 -18
  115. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -8
  116. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +17 -16
  117. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +15 -19
  118. data/lib/rubocop/cop/layout/space_inside_parens.rb +9 -14
  119. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +5 -10
  120. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +8 -17
  121. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +14 -22
  122. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +10 -11
  123. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +10 -15
  124. data/lib/rubocop/cop/layout/trailing_whitespace.rb +11 -11
  125. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
  126. data/lib/rubocop/cop/lint/ambiguous_operator.rb +17 -10
  127. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +11 -13
  128. data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
  129. data/lib/rubocop/cop/lint/big_decimal_new.rb +9 -10
  130. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +50 -0
  131. data/lib/rubocop/cop/lint/boolean_symbol.rb +16 -11
  132. data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
  133. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +54 -0
  134. data/lib/rubocop/cop/lint/constant_resolution.rb +2 -2
  135. data/lib/rubocop/cop/lint/debugger.rb +6 -1
  136. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +7 -10
  137. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +17 -13
  138. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +8 -2
  139. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  140. data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +39 -0
  141. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
  142. data/lib/rubocop/cop/lint/duplicate_methods.rb +7 -6
  143. data/lib/rubocop/cop/lint/duplicate_require.rb +46 -0
  144. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +49 -0
  145. data/lib/rubocop/cop/lint/each_with_object_argument.rb +2 -1
  146. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  147. data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
  148. data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
  149. data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
  150. data/lib/rubocop/cop/lint/empty_file.rb +50 -0
  151. data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
  152. data/lib/rubocop/cop/lint/empty_when.rb +2 -2
  153. data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
  154. data/lib/rubocop/cop/lint/erb_new_arguments.rb +13 -10
  155. data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
  156. data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
  157. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  158. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +4 -3
  159. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
  160. data/lib/rubocop/cop/lint/identity_comparison.rb +49 -0
  161. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +5 -4
  162. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +8 -8
  163. data/lib/rubocop/cop/lint/inherit_exception.rb +12 -7
  164. data/lib/rubocop/cop/lint/interpolation_check.rb +18 -15
  165. data/lib/rubocop/cop/lint/literal_as_condition.rb +14 -2
  166. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -7
  167. data/lib/rubocop/cop/lint/loop.rb +23 -2
  168. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +6 -5
  169. data/lib/rubocop/cop/lint/missing_super.rb +99 -0
  170. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +3 -36
  171. data/lib/rubocop/cop/lint/multiple_comparison.rb +9 -10
  172. data/lib/rubocop/cop/lint/nested_method_definition.rb +14 -20
  173. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  174. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  175. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +82 -11
  176. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
  177. data/lib/rubocop/cop/lint/number_conversion.rb +7 -9
  178. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
  179. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +79 -0
  180. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +4 -10
  181. data/lib/rubocop/cop/lint/percent_string_array.rb +3 -6
  182. data/lib/rubocop/cop/lint/percent_symbol_array.rb +13 -12
  183. data/lib/rubocop/cop/lint/raise_exception.rb +13 -10
  184. data/lib/rubocop/cop/lint/rand_one.rb +2 -1
  185. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +16 -19
  186. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +7 -11
  187. data/lib/rubocop/cop/lint/redundant_require_statement.rb +5 -7
  188. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +13 -9
  189. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +6 -13
  190. data/lib/rubocop/cop/lint/redundant_with_index.rb +11 -14
  191. data/lib/rubocop/cop/lint/redundant_with_object.rb +11 -14
  192. data/lib/rubocop/cop/lint/regexp_as_condition.rb +4 -6
  193. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -2
  194. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  195. data/lib/rubocop/cop/lint/rescue_type.rb +8 -8
  196. data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -4
  197. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -6
  198. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +14 -10
  199. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +7 -7
  200. data/lib/rubocop/cop/lint/script_permission.rb +10 -7
  201. data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
  202. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +8 -12
  203. data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
  204. data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
  205. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +7 -7
  206. data/lib/rubocop/cop/lint/struct_new_override.rb +2 -1
  207. data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
  208. data/lib/rubocop/cop/lint/to_json.rb +20 -11
  209. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
  210. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +57 -0
  211. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +4 -4
  212. data/lib/rubocop/cop/lint/unified_integer.rb +4 -6
  213. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  214. data/lib/rubocop/cop/lint/unreachable_loop.rb +175 -0
  215. data/lib/rubocop/cop/lint/unused_block_argument.rb +8 -3
  216. data/lib/rubocop/cop/lint/unused_method_argument.rb +8 -3
  217. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +4 -2
  218. data/lib/rubocop/cop/lint/uri_regexp.rb +12 -47
  219. data/lib/rubocop/cop/lint/useless_access_modifier.rb +25 -15
  220. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -4
  221. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -15
  222. data/lib/rubocop/cop/lint/useless_method_definition.rb +70 -0
  223. data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
  224. data/lib/rubocop/cop/lint/useless_times.rb +97 -0
  225. data/lib/rubocop/cop/lint/void.rb +3 -7
  226. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  227. data/lib/rubocop/cop/metrics/block_length.rb +2 -2
  228. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
  229. data/lib/rubocop/cop/metrics/class_length.rb +2 -2
  230. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
  231. data/lib/rubocop/cop/metrics/method_length.rb +2 -2
  232. data/lib/rubocop/cop/metrics/module_length.rb +2 -2
  233. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
  234. data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
  235. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +50 -5
  236. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +53 -24
  237. data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
  238. data/lib/rubocop/cop/migration/department_name.rb +14 -16
  239. data/lib/rubocop/cop/mixin/alignment.rb +5 -1
  240. data/lib/rubocop/cop/mixin/allowed_methods.rb +2 -0
  241. data/lib/rubocop/cop/mixin/annotation_comment.rb +5 -0
  242. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
  243. data/lib/rubocop/cop/mixin/check_line_breakable.rb +17 -8
  244. data/lib/rubocop/cop/mixin/code_length.rb +22 -5
  245. data/lib/rubocop/cop/mixin/comments_help.rb +48 -0
  246. data/lib/rubocop/cop/mixin/configurable_naming.rb +2 -2
  247. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +8 -7
  248. data/lib/rubocop/cop/mixin/empty_parameter.rb +3 -1
  249. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +12 -1
  250. data/lib/rubocop/cop/mixin/first_element_line_break.rb +3 -1
  251. data/lib/rubocop/cop/mixin/hash_transform_method.rb +31 -12
  252. data/lib/rubocop/cop/mixin/line_length_help.rb +1 -3
  253. data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
  254. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +3 -1
  255. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +13 -12
  256. data/lib/rubocop/cop/mixin/negative_conditional.rb +2 -2
  257. data/lib/rubocop/cop/mixin/percent_array.rb +16 -9
  258. data/lib/rubocop/cop/mixin/range_help.rb +18 -4
  259. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +1 -1
  260. data/lib/rubocop/cop/mixin/rescue_node.rb +10 -1
  261. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +4 -3
  262. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +4 -3
  263. data/lib/rubocop/cop/mixin/statement_modifier.rb +39 -10
  264. data/lib/rubocop/cop/mixin/surrounding_space.rb +8 -29
  265. data/lib/rubocop/cop/mixin/trailing_comma.rb +9 -11
  266. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +6 -13
  267. data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
  268. data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
  269. data/lib/rubocop/cop/naming/ascii_identifiers.rb +3 -3
  270. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +2 -2
  271. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  272. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -2
  273. data/lib/rubocop/cop/naming/constant_name.rb +2 -2
  274. data/lib/rubocop/cop/naming/file_name.rb +4 -4
  275. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
  276. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +2 -2
  277. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
  278. data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
  279. data/lib/rubocop/cop/naming/predicate_name.rb +3 -5
  280. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -11
  281. data/lib/rubocop/cop/offense.rb +1 -0
  282. data/lib/rubocop/cop/registry.rb +3 -3
  283. data/lib/rubocop/cop/security/eval.rb +3 -2
  284. data/lib/rubocop/cop/security/json_load.rb +7 -8
  285. data/lib/rubocop/cop/security/marshal_load.rb +3 -4
  286. data/lib/rubocop/cop/security/open.rb +3 -2
  287. data/lib/rubocop/cop/security/yaml_load.rb +7 -6
  288. data/lib/rubocop/cop/severity.rb +0 -8
  289. data/lib/rubocop/cop/style/access_modifier_declarations.rb +7 -8
  290. data/lib/rubocop/cop/style/accessor_grouping.rb +29 -20
  291. data/lib/rubocop/cop/style/alias.rb +43 -36
  292. data/lib/rubocop/cop/style/and_or.rb +9 -11
  293. data/lib/rubocop/cop/style/array_coercion.rb +63 -0
  294. data/lib/rubocop/cop/style/array_join.rb +7 -8
  295. data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
  296. data/lib/rubocop/cop/style/attr.rb +12 -9
  297. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +7 -7
  298. data/lib/rubocop/cop/style/bare_percent_literals.rb +10 -12
  299. data/lib/rubocop/cop/style/begin_block.rb +2 -2
  300. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +14 -18
  301. data/lib/rubocop/cop/style/block_comments.rb +14 -18
  302. data/lib/rubocop/cop/style/block_delimiters.rb +23 -23
  303. data/lib/rubocop/cop/style/case_equality.rb +32 -5
  304. data/lib/rubocop/cop/style/case_like_if.rb +236 -0
  305. data/lib/rubocop/cop/style/class_and_module_children.rb +16 -11
  306. data/lib/rubocop/cop/style/class_check.rb +6 -11
  307. data/lib/rubocop/cop/style/class_methods.rb +7 -11
  308. data/lib/rubocop/cop/style/class_methods_definitions.rb +157 -0
  309. data/lib/rubocop/cop/style/class_vars.rb +7 -12
  310. data/lib/rubocop/cop/style/collection_methods.rb +11 -17
  311. data/lib/rubocop/cop/style/colon_method_call.rb +8 -9
  312. data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
  313. data/lib/rubocop/cop/style/combinable_loops.rb +89 -0
  314. data/lib/rubocop/cop/style/command_literal.rb +23 -24
  315. data/lib/rubocop/cop/style/comment_annotation.rb +15 -15
  316. data/lib/rubocop/cop/style/commented_keyword.rb +6 -3
  317. data/lib/rubocop/cop/style/conditional_assignment.rb +62 -64
  318. data/lib/rubocop/cop/style/constant_visibility.rb +3 -2
  319. data/lib/rubocop/cop/style/copyright.rb +12 -12
  320. data/lib/rubocop/cop/style/date_time.rb +1 -1
  321. data/lib/rubocop/cop/style/def_with_parentheses.rb +8 -10
  322. data/lib/rubocop/cop/style/dir.rb +8 -10
  323. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +7 -9
  324. data/lib/rubocop/cop/style/documentation.rb +6 -8
  325. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  326. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
  327. data/lib/rubocop/cop/style/double_negation.rb +3 -2
  328. data/lib/rubocop/cop/style/each_for_simple_loop.rb +5 -8
  329. data/lib/rubocop/cop/style/each_with_object.rb +16 -19
  330. data/lib/rubocop/cop/style/empty_block_parameter.rb +9 -10
  331. data/lib/rubocop/cop/style/empty_case_condition.rb +19 -20
  332. data/lib/rubocop/cop/style/empty_else.rb +17 -19
  333. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +9 -10
  334. data/lib/rubocop/cop/style/empty_literal.rb +18 -17
  335. data/lib/rubocop/cop/style/empty_method.rb +10 -13
  336. data/lib/rubocop/cop/style/encoding.rb +5 -9
  337. data/lib/rubocop/cop/style/end_block.rb +4 -6
  338. data/lib/rubocop/cop/style/eval_with_location.rb +7 -7
  339. data/lib/rubocop/cop/style/even_odd.rb +8 -11
  340. data/lib/rubocop/cop/style/expand_path_arguments.rb +22 -21
  341. data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
  342. data/lib/rubocop/cop/style/exponential_notation.rb +7 -9
  343. data/lib/rubocop/cop/style/float_division.rb +10 -11
  344. data/lib/rubocop/cop/style/for.rb +11 -15
  345. data/lib/rubocop/cop/style/format_string.rb +18 -19
  346. data/lib/rubocop/cop/style/format_string_token.rb +10 -12
  347. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +19 -41
  348. data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
  349. data/lib/rubocop/cop/style/global_vars.rb +2 -2
  350. data/lib/rubocop/cop/style/guard_clause.rb +6 -6
  351. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +79 -0
  352. data/lib/rubocop/cop/style/hash_each_methods.rb +5 -8
  353. data/lib/rubocop/cop/style/hash_like_case.rb +76 -0
  354. data/lib/rubocop/cop/style/hash_syntax.rb +10 -8
  355. data/lib/rubocop/cop/style/hash_transform_keys.rb +19 -11
  356. data/lib/rubocop/cop/style/hash_transform_values.rb +18 -10
  357. data/lib/rubocop/cop/style/identical_conditional_branches.rb +2 -2
  358. data/lib/rubocop/cop/style/if_inside_else.rb +3 -3
  359. data/lib/rubocop/cop/style/if_unless_modifier.rb +19 -41
  360. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +3 -7
  361. data/lib/rubocop/cop/style/if_with_semicolon.rb +3 -6
  362. data/lib/rubocop/cop/style/implicit_runtime_error.rb +2 -1
  363. data/lib/rubocop/cop/style/infinite_loop.rb +24 -24
  364. data/lib/rubocop/cop/style/inline_comment.rb +3 -3
  365. data/lib/rubocop/cop/style/inverse_methods.rb +22 -32
  366. data/lib/rubocop/cop/style/keyword_parameters_order.rb +58 -0
  367. data/lib/rubocop/cop/style/lambda.rb +7 -12
  368. data/lib/rubocop/cop/style/lambda_call.rb +17 -14
  369. data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -16
  370. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -1
  371. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +16 -11
  372. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +4 -8
  373. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -7
  374. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +12 -3
  375. data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -16
  376. data/lib/rubocop/cop/style/min_max.rb +8 -12
  377. data/lib/rubocop/cop/style/missing_else.rb +11 -21
  378. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +10 -3
  379. data/lib/rubocop/cop/style/mixin_grouping.rb +24 -27
  380. data/lib/rubocop/cop/style/mixin_usage.rb +2 -1
  381. data/lib/rubocop/cop/style/module_function.rb +10 -13
  382. data/lib/rubocop/cop/style/multiline_if_modifier.rb +3 -10
  383. data/lib/rubocop/cop/style/multiline_if_then.rb +4 -10
  384. data/lib/rubocop/cop/style/multiline_memoization.rb +14 -12
  385. data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
  386. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +17 -6
  387. data/lib/rubocop/cop/style/multiline_when_then.rb +9 -11
  388. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  389. data/lib/rubocop/cop/style/mutable_constant.rb +23 -20
  390. data/lib/rubocop/cop/style/negated_if.rb +6 -6
  391. data/lib/rubocop/cop/style/negated_unless.rb +6 -6
  392. data/lib/rubocop/cop/style/negated_while.rb +7 -15
  393. data/lib/rubocop/cop/style/nested_modifier.rb +10 -13
  394. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +14 -12
  395. data/lib/rubocop/cop/style/nested_ternary_operator.rb +14 -16
  396. data/lib/rubocop/cop/style/next.rb +10 -14
  397. data/lib/rubocop/cop/style/nil_comparison.rb +13 -11
  398. data/lib/rubocop/cop/style/non_nil_check.rb +34 -26
  399. data/lib/rubocop/cop/style/not.rb +20 -26
  400. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +4 -9
  401. data/lib/rubocop/cop/style/numeric_predicate.rb +9 -15
  402. data/lib/rubocop/cop/style/one_line_conditional.rb +71 -23
  403. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  404. data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
  405. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +42 -0
  406. data/lib/rubocop/cop/style/or_assignment.rb +13 -10
  407. data/lib/rubocop/cop/style/parallel_assignment.rb +18 -18
  408. data/lib/rubocop/cop/style/parentheses_around_condition.rb +6 -6
  409. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +14 -20
  410. data/lib/rubocop/cop/style/percent_q_literals.rb +8 -10
  411. data/lib/rubocop/cop/style/perl_backrefs.rb +8 -10
  412. data/lib/rubocop/cop/style/preferred_hash_methods.rb +11 -14
  413. data/lib/rubocop/cop/style/proc.rb +6 -6
  414. data/lib/rubocop/cop/style/raise_args.rb +15 -24
  415. data/lib/rubocop/cop/style/random_with_offset.rb +17 -16
  416. data/lib/rubocop/cop/style/redundant_assignment.rb +8 -10
  417. data/lib/rubocop/cop/style/redundant_begin.rb +7 -9
  418. data/lib/rubocop/cop/style/redundant_capital_w.rb +6 -9
  419. data/lib/rubocop/cop/style/redundant_condition.rb +20 -9
  420. data/lib/rubocop/cop/style/redundant_exception.rb +2 -0
  421. data/lib/rubocop/cop/style/redundant_fetch_block.rb +3 -12
  422. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +51 -0
  423. data/lib/rubocop/cop/style/redundant_freeze.rb +5 -7
  424. data/lib/rubocop/cop/style/redundant_interpolation.rb +25 -24
  425. data/lib/rubocop/cop/style/redundant_parentheses.rb +19 -12
  426. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -13
  427. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +14 -23
  428. data/lib/rubocop/cop/style/redundant_self.rb +2 -2
  429. data/lib/rubocop/cop/style/redundant_self_assignment.rb +116 -0
  430. data/lib/rubocop/cop/style/redundant_sort.rb +21 -13
  431. data/lib/rubocop/cop/style/regexp_literal.rb +10 -21
  432. data/lib/rubocop/cop/style/rescue_modifier.rb +29 -9
  433. data/lib/rubocop/cop/style/return_nil.rb +5 -5
  434. data/lib/rubocop/cop/style/safe_navigation.rb +22 -16
  435. data/lib/rubocop/cop/style/sample.rb +12 -14
  436. data/lib/rubocop/cop/style/self_assignment.rb +26 -22
  437. data/lib/rubocop/cop/style/semicolon.rb +6 -9
  438. data/lib/rubocop/cop/style/send.rb +4 -5
  439. data/lib/rubocop/cop/style/signal_exception.rb +25 -19
  440. data/lib/rubocop/cop/style/single_argument_dig.rb +55 -0
  441. data/lib/rubocop/cop/style/single_line_block_params.rb +4 -2
  442. data/lib/rubocop/cop/style/single_line_methods.rb +18 -17
  443. data/lib/rubocop/cop/style/slicing_with_range.rb +6 -8
  444. data/lib/rubocop/cop/style/sole_nested_conditional.rb +66 -0
  445. data/lib/rubocop/cop/style/special_global_vars.rb +10 -15
  446. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +17 -20
  447. data/lib/rubocop/cop/style/stderr_puts.rb +5 -6
  448. data/lib/rubocop/cop/style/string_concatenation.rb +106 -0
  449. data/lib/rubocop/cop/style/string_hash_keys.rb +6 -7
  450. data/lib/rubocop/cop/style/string_methods.rb +7 -17
  451. data/lib/rubocop/cop/style/strip.rb +9 -14
  452. data/lib/rubocop/cop/style/struct_inheritance.rb +4 -7
  453. data/lib/rubocop/cop/style/symbol_array.rb +6 -17
  454. data/lib/rubocop/cop/style/symbol_literal.rb +4 -6
  455. data/lib/rubocop/cop/style/symbol_proc.rb +15 -19
  456. data/lib/rubocop/cop/style/ternary_parentheses.rb +21 -20
  457. data/lib/rubocop/cop/style/trailing_body_on_class.rb +3 -6
  458. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +4 -7
  459. data/lib/rubocop/cop/style/trailing_body_on_module.rb +3 -6
  460. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +2 -5
  461. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +2 -5
  462. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +7 -6
  463. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +2 -5
  464. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +9 -32
  465. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +8 -17
  466. data/lib/rubocop/cop/style/trivial_accessors.rb +26 -30
  467. data/lib/rubocop/cop/style/unless_else.rb +5 -8
  468. data/lib/rubocop/cop/style/unpack_first.rb +5 -8
  469. data/lib/rubocop/cop/style/variable_interpolation.rb +7 -10
  470. data/lib/rubocop/cop/style/when_then.rb +4 -6
  471. data/lib/rubocop/cop/style/while_until_do.rb +6 -16
  472. data/lib/rubocop/cop/style/while_until_modifier.rb +6 -20
  473. data/lib/rubocop/cop/style/word_array.rb +5 -23
  474. data/lib/rubocop/cop/style/yoda_condition.rb +4 -15
  475. data/lib/rubocop/cop/style/zero_length_predicate.rb +17 -19
  476. data/lib/rubocop/cop/team.rb +2 -1
  477. data/lib/rubocop/cop/tokens_util.rb +84 -0
  478. data/lib/rubocop/cop/util.rb +3 -13
  479. data/lib/rubocop/cop/utils/format_string.rb +3 -5
  480. data/lib/rubocop/cop/variable_force.rb +2 -2
  481. data/lib/rubocop/cop/variable_force/branch.rb +1 -0
  482. data/lib/rubocop/cop/variable_force/variable.rb +7 -5
  483. data/lib/rubocop/cops_documentation_generator.rb +284 -0
  484. data/lib/rubocop/core_ext/string.rb +2 -2
  485. data/lib/rubocop/error.rb +1 -0
  486. data/lib/rubocop/ext/regexp_node.rb +46 -0
  487. data/lib/rubocop/file_finder.rb +13 -12
  488. data/lib/rubocop/formatter/auto_gen_config_formatter.rb +2 -1
  489. data/lib/rubocop/formatter/disabled_config_formatter.rb +1 -1
  490. data/lib/rubocop/formatter/formatter_set.rb +1 -0
  491. data/lib/rubocop/formatter/html_formatter.rb +2 -0
  492. data/lib/rubocop/formatter/junit_formatter.rb +1 -1
  493. data/lib/rubocop/formatter/progress_formatter.rb +2 -1
  494. data/lib/rubocop/formatter/quiet_formatter.rb +1 -1
  495. data/lib/rubocop/formatter/simple_text_formatter.rb +36 -6
  496. data/lib/rubocop/name_similarity.rb +1 -0
  497. data/lib/rubocop/options.rb +25 -4
  498. data/lib/rubocop/path_util.rb +17 -17
  499. data/lib/rubocop/rake_task.rb +1 -0
  500. data/lib/rubocop/remote_config.rb +1 -0
  501. data/lib/rubocop/result_cache.rb +37 -15
  502. data/lib/rubocop/rspec/cop_helper.rb +4 -1
  503. data/lib/rubocop/rspec/expect_offense.rb +37 -6
  504. data/lib/rubocop/rspec/shared_contexts.rb +25 -14
  505. data/lib/rubocop/runner.rb +36 -21
  506. data/lib/rubocop/string_interpreter.rb +3 -0
  507. data/lib/rubocop/target_finder.rb +14 -10
  508. data/lib/rubocop/target_ruby.rb +6 -0
  509. data/lib/rubocop/version.rb +3 -2
  510. data/lib/rubocop/yaml_duplication_checker.rb +1 -0
  511. metadata +45 -8
  512. data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
  513. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
  514. data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -25
  515. data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
@@ -9,7 +9,8 @@ module RuboCop
9
9
 
10
10
  report_summary(inspected_files.size,
11
11
  @total_offense_count,
12
- @total_correction_count)
12
+ @total_correction_count,
13
+ @total_correctable_count)
13
14
  end
14
15
  end
15
16
  end
@@ -114,7 +114,7 @@ module RuboCop
114
114
  def output_cop_comments(output_buffer, cfg, cop_name, offense_count)
115
115
  output_buffer.puts "# Offense count: #{offense_count}" if @show_offense_counts
116
116
 
117
- cop_class = Cop::Cop.registry.find_by_cop_name(cop_name)
117
+ cop_class = Cop::Registry.global.find_by_cop_name(cop_name)
118
118
  output_buffer.puts '# Cop supports --auto-correct.' if cop_class&.support_autocorrect?
119
119
 
120
120
  default_cfg = default_config(cop_name)
@@ -35,6 +35,7 @@ module RuboCop
35
35
  end
36
36
 
37
37
  def initialize(options = {})
38
+ super()
38
39
  @options = options # CLI options
39
40
  end
40
41
 
@@ -90,9 +90,11 @@ module RuboCop
90
90
  end
91
91
 
92
92
  # Make Kernel#binding public.
93
+ # rubocop:disable Lint/UselessMethodDefinition
93
94
  def binding
94
95
  super
95
96
  end
97
+ # rubocop:enable Lint/UselessMethodDefinition
96
98
 
97
99
  def decorated_message(offense)
98
100
  offense.message.gsub(/`(.+?)`/) do
@@ -34,7 +34,7 @@ module RuboCop
34
34
  # https://github.com/mikian/rubocop-junit-formatter/blob/v0.1.4/lib/rubocop/formatter/junit_formatter.rb#L9
35
35
  #
36
36
  # In the future, it would be preferable to return only enabled cops.
37
- Cop::Cop.all.each do |cop|
37
+ Cop::Registry.all.each do |cop|
38
38
  target_offenses = offenses_for_cop(offenses, cop)
39
39
 
40
40
  next unless relevant_for_output?(options, target_offenses)
@@ -45,7 +45,8 @@ module RuboCop
45
45
 
46
46
  report_summary(inspected_files.size,
47
47
  @total_offense_count,
48
- @total_correction_count)
48
+ @total_correction_count,
49
+ @total_correctable_count)
49
50
  end
50
51
 
51
52
  def report_file_as_mark(offenses)
@@ -5,7 +5,7 @@ module RuboCop
5
5
  # If no offenses are found, no output is displayed.
6
6
  # Otherwise, SimpleTextFormatter's output is displayed.
7
7
  class QuietFormatter < SimpleTextFormatter
8
- def report_summary(file_count, offense_count, correction_count)
8
+ def report_summary(file_count, offense_count, correction_count, correctable_count)
9
9
  super unless offense_count.zero?
10
10
  end
11
11
  end
@@ -23,6 +23,7 @@ module RuboCop
23
23
  def started(_target_files)
24
24
  @total_offense_count = 0
25
25
  @total_correction_count = 0
26
+ @total_correctable_count = 0
26
27
  end
27
28
 
28
29
  def file_finished(file, offenses)
@@ -35,7 +36,8 @@ module RuboCop
35
36
  def finished(inspected_files)
36
37
  report_summary(inspected_files.count,
37
38
  @total_offense_count,
38
- @total_correction_count)
39
+ @total_correction_count,
40
+ @total_correctable_count)
39
41
  end
40
42
 
41
43
  def report_file(file, offenses)
@@ -52,11 +54,13 @@ module RuboCop
52
54
  end
53
55
  end
54
56
 
55
- def report_summary(file_count, offense_count, correction_count)
57
+ def report_summary(file_count, offense_count, correction_count, correctable_count)
56
58
  report = Report.new(file_count,
57
59
  offense_count,
58
60
  correction_count,
59
- rainbow)
61
+ correctable_count,
62
+ rainbow,
63
+ safe_auto_correct: @options[:safe_auto_correct])
60
64
 
61
65
  output.puts
62
66
  output.puts report.summary
@@ -66,7 +70,9 @@ module RuboCop
66
70
 
67
71
  def count_stats(offenses)
68
72
  @total_offense_count += offenses.count
69
- @total_correction_count += offenses.count(&:corrected?)
73
+ corrected = offenses.count(&:corrected?)
74
+ @total_correction_count += corrected
75
+ @total_correctable_count += offenses.count(&:correctable?) - corrected
70
76
  end
71
77
 
72
78
  def colored_severity_code(offense)
@@ -96,16 +102,30 @@ module RuboCop
96
102
  include Colorizable
97
103
  include TextUtil
98
104
 
99
- def initialize(file_count, offense_count, correction_count, rainbow)
105
+ # rubocop:disable Metrics/ParameterLists
106
+ def initialize(
107
+ file_count, offense_count, correction_count, correctable_count, rainbow,
108
+ safe_auto_correct: false
109
+ )
100
110
  @file_count = file_count
101
111
  @offense_count = offense_count
102
112
  @correction_count = correction_count
113
+ @correctable_count = correctable_count
103
114
  @rainbow = rainbow
115
+ @safe_auto_correct = safe_auto_correct
104
116
  end
117
+ # rubocop:enable Metrics/ParameterLists
105
118
 
106
119
  def summary
107
120
  if @correction_count.positive?
108
- "#{files} inspected, #{offenses} detected, #{corrections} corrected"
121
+ if @correctable_count.positive?
122
+ "#{files} inspected, #{offenses} detected, #{corrections} corrected,"\
123
+ " #{correctable}"
124
+ else
125
+ "#{files} inspected, #{offenses} detected, #{corrections} corrected"
126
+ end
127
+ elsif @correctable_count.positive?
128
+ "#{files} inspected, #{offenses} detected, #{correctable}"
109
129
  else
110
130
  "#{files} inspected, #{offenses} detected"
111
131
  end
@@ -132,6 +152,16 @@ module RuboCop
132
152
 
133
153
  colorize(text, color)
134
154
  end
155
+
156
+ def correctable
157
+ if @safe_auto_correct
158
+ text = pluralize(@correctable_count, 'more offense')
159
+ "#{colorize(text, :yellow)} can be corrected with `rubocop -A`"
160
+ else
161
+ text = pluralize(@correctable_count, 'offense')
162
+ "#{colorize(text, :yellow)} auto-correctable"
163
+ end
164
+ end
135
165
  end
136
166
  end
137
167
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  module RuboCop
4
4
  # Common functionality for finding names that are similar to a given name.
5
+ # @api private
5
6
  module NameSimilarity
6
7
  module_function
7
8
 
@@ -8,6 +8,7 @@ module RuboCop
8
8
  class OptionArgumentError < StandardError; end
9
9
 
10
10
  # This class handles command line options.
11
+ # @api private
11
12
  class Options
12
13
  E_STDIN_NO_PATH = '-s/--stdin requires exactly one path, relative to the ' \
13
14
  'root of the project. RuboCop will use this path to determine which ' \
@@ -68,6 +69,7 @@ module RuboCop
68
69
 
69
70
  add_severity_option(opts)
70
71
  add_flags_with_optional_args(opts)
72
+ add_cache_options(opts)
71
73
  add_boolean_flags(opts)
72
74
  add_aliases(opts)
73
75
 
@@ -94,7 +96,7 @@ module RuboCop
94
96
  ['']
95
97
  else
96
98
  list.split(',').map do |c|
97
- Cop::Cop.qualified_cop_name(c, "--#{option} option")
99
+ Cop::Registry.qualified_cop_name(c, "--#{option} option")
98
100
  end
99
101
  end
100
102
  end
@@ -163,10 +165,16 @@ module RuboCop
163
165
  end
164
166
  end
165
167
 
168
+ def add_cache_options(opts)
169
+ option(opts, '-C', '--cache FLAG')
170
+ option(opts, '--cache-root DIR') do
171
+ @validator.validate_cache_enabled_for_cache_root
172
+ end
173
+ end
174
+
166
175
  # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
167
176
  def add_boolean_flags(opts)
168
177
  option(opts, '-F', '--fail-fast')
169
- option(opts, '-C', '--cache FLAG')
170
178
  option(opts, '-d', '--debug')
171
179
  option(opts, '-D', '--[no-]display-cop-names')
172
180
  option(opts, '-E', '--extra-details')
@@ -232,6 +240,7 @@ module RuboCop
232
240
  end
233
241
 
234
242
  # Validates option arguments and the options' compatibility with each other.
243
+ # @api private
235
244
  class OptionsValidator
236
245
  class << self
237
246
  # Cop name validation must be done later than option parsing, so it's not
@@ -239,8 +248,8 @@ module RuboCop
239
248
  def validate_cop_list(names)
240
249
  return unless names
241
250
 
242
- cop_names = Cop::Cop.registry.names
243
- departments = Cop::Cop.registry.departments.map(&:to_s)
251
+ cop_names = Cop::Registry.global.names
252
+ departments = Cop::Registry.global.departments.map(&:to_s)
244
253
 
245
254
  names.each do |name|
246
255
  next if cop_names.include?(name)
@@ -390,9 +399,17 @@ module RuboCop
390
399
  # of option order.
391
400
  raise OptionParser::MissingArgument
392
401
  end
402
+
403
+ def validate_cache_enabled_for_cache_root
404
+ return unless @options[:cache] == 'false'
405
+
406
+ raise OptionArgumentError, '--cache-root can not be used with ' \
407
+ '--cache false'
408
+ end
393
409
  end
394
410
 
395
411
  # This module contains help texts for command line options.
412
+ # @api private
396
413
  module OptionsHelp
397
414
  MAX_EXCL = RuboCop::Options::DEFAULT_MAXIMUM_EXCLUSION_ITEMS.to_s
398
415
  FORMATTER_OPTION_LIST = RuboCop::Formatter::FormatterSet::BUILTIN_FORMATTERS_FOR_KEYS.keys
@@ -461,6 +478,10 @@ module RuboCop
461
478
  cache: ["Use result caching (FLAG=true) or don't",
462
479
  '(FLAG=false), default determined by',
463
480
  'configuration parameter AllCops: UseCache.'],
481
+ cache_root: ['Set the cache root directory.',
482
+ 'Takes precedence over the configuration',
483
+ 'parameter AllCops: CacheRootDirectory and',
484
+ 'the $RUBOCOP_CACHE_ROOT environment variable.'],
464
485
  debug: 'Display debug info.',
465
486
  display_cop_names: ['Display cop names in offense messages.',
466
487
  'Default is true.'],
@@ -5,7 +5,7 @@ module RuboCop
5
5
  module PathUtil
6
6
  module_function
7
7
 
8
- def relative_path(path, base_dir = PathUtil.pwd)
8
+ def relative_path(path, base_dir = Dir.pwd)
9
9
  # Optimization for the common case where path begins with the base
10
10
  # dir. Just cut off the first part.
11
11
  if path.start_with?(base_dir)
@@ -24,7 +24,7 @@ module RuboCop
24
24
 
25
25
  def smart_path(path)
26
26
  # Ideally, we calculate this relative to the project root.
27
- base_dir = PathUtil.pwd
27
+ base_dir = Dir.pwd
28
28
 
29
29
  if path.start_with? base_dir
30
30
  relative_path(path, base_dir)
@@ -54,26 +54,26 @@ module RuboCop
54
54
  %r{\A([A-Z]:)?/}i.match?(path)
55
55
  end
56
56
 
57
- def self.pwd
58
- @pwd ||= Dir.pwd
57
+ def hidden_file_in_not_hidden_dir?(pattern, path)
58
+ hidden_file?(path) &&
59
+ File.fnmatch?(
60
+ pattern, path,
61
+ File::FNM_PATHNAME | File::FNM_EXTGLOB | File::FNM_DOTMATCH
62
+ ) &&
63
+ !hidden_dir?(path)
59
64
  end
60
65
 
61
- def self.reset_pwd
62
- @pwd = nil
66
+ def hidden_file?(path)
67
+ maybe_hidden_file?(path) && File.basename(path).start_with?('.')
63
68
  end
64
69
 
65
- def self.chdir(dir, &block)
66
- reset_pwd
67
- Dir.chdir(dir, &block)
68
- ensure
69
- reset_pwd
70
- end
70
+ # Loose check to reduce memory allocations
71
+ def maybe_hidden_file?(path)
72
+ separator_index = path.rindex(File::SEPARATOR)
73
+ return false unless separator_index
71
74
 
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)
75
+ dot_index = path.index('.', separator_index + 1)
76
+ dot_index == separator_index + 1
77
77
  end
78
78
 
79
79
  def hidden_dir?(path)
@@ -15,6 +15,7 @@ module RuboCop
15
15
  attr_accessor :name, :verbose, :fail_on_error, :patterns, :formatters, :requires, :options
16
16
 
17
17
  def initialize(name = :rubocop, *args, &task_block)
18
+ super()
18
19
  setup_ivars(name)
19
20
 
20
21
  desc 'Run RuboCop' unless ::Rake.application.last_description
@@ -5,6 +5,7 @@ require 'time'
5
5
 
6
6
  module RuboCop
7
7
  # Common methods and behaviors for dealing with remote config files.
8
+ # @api private
8
9
  class RemoteConfig
9
10
  attr_reader :uri
10
11
 
@@ -3,9 +3,11 @@
3
3
  require 'digest/sha1'
4
4
  require 'find'
5
5
  require 'etc'
6
+ require 'zlib'
6
7
 
7
8
  module RuboCop
8
9
  # Provides functionality for caching rubocop runs.
10
+ # @api private
9
11
  class ResultCache
10
12
  NON_CHANGING = %i[color format formatters out debug fail_level auto_correct
11
13
  cache fail_fast stdin parallel].freeze
@@ -29,11 +31,16 @@ module RuboCop
29
31
  end
30
32
 
31
33
  class << self
34
+ # @api private
35
+ attr_accessor :rubocop_required_features
36
+
37
+ ResultCache.rubocop_required_features = []
38
+
32
39
  private
33
40
 
34
41
  def requires_file_removal?(file_count, config_store)
35
42
  file_count > 1 &&
36
- file_count > config_store.for_dir('.').for_all_cops['MaxFilesInCache']
43
+ file_count > config_store.for_pwd.for_all_cops['MaxFilesInCache']
37
44
  end
38
45
 
39
46
  def remove_oldest_files(files, dirs, cache_root, verbose)
@@ -60,7 +67,8 @@ module RuboCop
60
67
  end
61
68
 
62
69
  def self.cache_root(config_store)
63
- root = config_store.for_dir('.').for_all_cops['CacheRootDirectory']
70
+ root = ENV['RUBOCOP_CACHE_ROOT']
71
+ root ||= config_store.for_pwd.for_all_cops['CacheRootDirectory']
64
72
  root ||= if ENV.key?('XDG_CACHE_HOME')
65
73
  # Include user ID in the path to make sure the user has write
66
74
  # access.
@@ -72,10 +80,13 @@ module RuboCop
72
80
  end
73
81
 
74
82
  def self.allow_symlinks_in_cache_location?(config_store)
75
- config_store.for_dir('.').for_all_cops['AllowSymlinksInCacheRootDirectory']
83
+ config_store.for_pwd.for_all_cops['AllowSymlinksInCacheRootDirectory']
76
84
  end
77
85
 
86
+ attr :path
87
+
78
88
  def initialize(file, team, options, config_store, cache_root = nil)
89
+ cache_root ||= options[:cache_root]
79
90
  cache_root ||= ResultCache.cache_root(config_store)
80
91
  @allow_symlinks_in_cache_location =
81
92
  ResultCache.allow_symlinks_in_cache_location?(config_store)
@@ -161,21 +172,32 @@ module RuboCop
161
172
  def rubocop_checksum
162
173
  ResultCache.source_checksum ||=
163
174
  begin
164
- lib_root = File.join(File.dirname(__FILE__), '..')
165
- exe_root = File.join(lib_root, '..', 'exe')
166
-
167
- # These are all the files we have `require`d plus everything in the
168
- # exe directory. A change to any of them could affect the cop output
169
- # so we include them in the cache hash.
170
- source_files = $LOADED_FEATURES + Find.find(exe_root).to_a
171
- sources = source_files
172
- .select { |path| File.file?(path) }
173
- .sort
174
- .map { |path| IO.read(path, encoding: Encoding::UTF_8) }
175
- Digest::SHA1.hexdigest(sources.join)
175
+ digest = Digest::SHA1.new
176
+ rubocop_extra_features
177
+ .select { |path| File.file?(path) }
178
+ .sort!
179
+ .each do |path|
180
+ content = File.open(path, 'rb', &:read)
181
+ digest << Zlib.crc32(content).to_s # mtime not reliable
182
+ end
183
+ digest << RuboCop::Version::STRING << RuboCop::AST::Version::STRING
184
+ digest.hexdigest
176
185
  end
177
186
  end
178
187
 
188
+ def rubocop_extra_features
189
+ lib_root = File.join(File.dirname(__FILE__), '..')
190
+ exe_root = File.join(lib_root, '..', 'exe')
191
+
192
+ # These are all the files we have `require`d plus everything in the
193
+ # exe directory. A change to any of them could affect the cop output
194
+ # so we include them in the cache hash.
195
+ source_files = $LOADED_FEATURES + Find.find(exe_root).to_a
196
+ source_files -= ResultCache.rubocop_required_features # Rely on gem versions
197
+
198
+ source_files
199
+ end
200
+
179
201
  # Return a hash of the options given at invocation, minus the ones that have
180
202
  # no effect on which offenses and disabled line ranges are found, and thus
181
203
  # don't affect caching.
@@ -17,7 +17,10 @@ module CopHelper
17
17
  RuboCop::Formatter::DisabledConfigFormatter.config_to_allow_offenses = {}
18
18
  RuboCop::Formatter::DisabledConfigFormatter.detected_styles = {}
19
19
  processed_source = parse_source(source, file)
20
- raise 'Error parsing example code' unless processed_source.valid_syntax?
20
+ unless processed_source.valid_syntax?
21
+ raise 'Error parsing example code: ' \
22
+ "#{processed_source.diagnostics.map(&:render).join("\n")}"
23
+ end
21
24
 
22
25
  _investigate(cop, processed_source)
23
26
  end