rubocop 0.88.0 → 0.91.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (515) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/bin/rubocop-profile +1 -0
  4. data/config/default.yml +219 -28
  5. data/lib/rubocop.rb +39 -5
  6. data/lib/rubocop/cached_data.rb +1 -0
  7. data/lib/rubocop/cli/command.rb +1 -0
  8. data/lib/rubocop/cli/command/auto_genenerate_config.rb +2 -1
  9. data/lib/rubocop/cli/command/base.rb +2 -0
  10. data/lib/rubocop/cli/command/execute_runner.rb +10 -1
  11. data/lib/rubocop/cli/command/init_dotfile.rb +1 -0
  12. data/lib/rubocop/cli/command/show_cops.rb +3 -2
  13. data/lib/rubocop/cli/command/version.rb +3 -2
  14. data/lib/rubocop/cli/environment.rb +1 -0
  15. data/lib/rubocop/comment_config.rb +19 -12
  16. data/lib/rubocop/config.rb +20 -3
  17. data/lib/rubocop/config_loader.rb +22 -11
  18. data/lib/rubocop/config_loader_resolver.rb +4 -3
  19. data/lib/rubocop/config_obsoletion.rb +7 -1
  20. data/lib/rubocop/config_store.rb +3 -3
  21. data/lib/rubocop/config_validator.rb +5 -4
  22. data/lib/rubocop/cop/base.rb +25 -2
  23. data/lib/rubocop/cop/bundler/duplicated_gem.rb +5 -1
  24. data/lib/rubocop/cop/bundler/gem_comment.rb +8 -3
  25. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +2 -0
  26. data/lib/rubocop/cop/commissioner.rb +47 -8
  27. data/lib/rubocop/cop/correctors/alignment_corrector.rb +4 -4
  28. data/lib/rubocop/cop/correctors/condition_corrector.rb +3 -5
  29. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +9 -10
  30. data/lib/rubocop/cop/correctors/line_break_corrector.rb +7 -7
  31. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +8 -3
  32. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -8
  33. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +6 -11
  34. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +8 -10
  35. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
  36. data/lib/rubocop/cop/documentation.rb +22 -0
  37. data/lib/rubocop/cop/force.rb +1 -0
  38. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +32 -11
  39. data/lib/rubocop/cop/generator.rb +2 -1
  40. data/lib/rubocop/cop/generator/configuration_injector.rb +2 -2
  41. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +5 -12
  42. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
  43. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -0
  44. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +9 -8
  45. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +11 -7
  46. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +8 -8
  47. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
  48. data/lib/rubocop/cop/layout/begin_end_alignment.rb +77 -0
  49. data/lib/rubocop/cop/layout/block_alignment.rb +24 -20
  50. data/lib/rubocop/cop/layout/case_indentation.rb +4 -7
  51. data/lib/rubocop/cop/layout/class_structure.rb +14 -17
  52. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +4 -6
  53. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  54. data/lib/rubocop/cop/layout/condition_position.rb +13 -15
  55. data/lib/rubocop/cop/layout/def_end_alignment.rb +8 -5
  56. data/lib/rubocop/cop/layout/dot_position.rb +21 -17
  57. data/lib/rubocop/cop/layout/empty_comment.rb +30 -23
  58. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +21 -18
  59. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +13 -13
  60. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +136 -0
  61. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +21 -23
  62. data/lib/rubocop/cop/layout/empty_lines.rb +6 -9
  63. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +18 -14
  64. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +7 -8
  65. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +4 -7
  66. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -5
  67. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +2 -5
  68. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -5
  69. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +3 -7
  70. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -5
  71. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +2 -5
  72. data/lib/rubocop/cop/layout/end_alignment.rb +11 -17
  73. data/lib/rubocop/cop/layout/extra_spacing.rb +22 -36
  74. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +2 -5
  75. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +2 -5
  76. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +5 -9
  77. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +2 -5
  78. data/lib/rubocop/cop/layout/hash_alignment.rb +17 -20
  79. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +15 -14
  80. data/lib/rubocop/cop/layout/heredoc_indentation.rb +16 -13
  81. data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
  82. data/lib/rubocop/cop/layout/initial_indentation.rb +6 -7
  83. data/lib/rubocop/cop/layout/leading_comment_space.rb +12 -10
  84. data/lib/rubocop/cop/layout/leading_empty_lines.rb +6 -11
  85. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +2 -5
  86. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +2 -5
  87. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +10 -14
  88. data/lib/rubocop/cop/layout/multiline_block_layout.rb +21 -19
  89. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +2 -5
  90. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +2 -5
  91. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +5 -9
  92. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -5
  93. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +2 -5
  94. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +41 -24
  95. data/lib/rubocop/cop/layout/space_after_colon.rb +11 -7
  96. data/lib/rubocop/cop/layout/space_after_comma.rb +2 -5
  97. data/lib/rubocop/cop/layout/space_after_method_name.rb +5 -6
  98. data/lib/rubocop/cop/layout/space_after_not.rb +9 -11
  99. data/lib/rubocop/cop/layout/space_after_semicolon.rb +2 -5
  100. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +22 -17
  101. data/lib/rubocop/cop/layout/space_around_keyword.rb +17 -18
  102. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +9 -1
  103. data/lib/rubocop/cop/layout/space_around_operators.rb +17 -16
  104. data/lib/rubocop/cop/layout/space_before_block_braces.rb +23 -22
  105. data/lib/rubocop/cop/layout/space_before_comma.rb +3 -5
  106. data/lib/rubocop/cop/layout/space_before_comment.rb +10 -7
  107. data/lib/rubocop/cop/layout/space_before_first_arg.rb +7 -7
  108. data/lib/rubocop/cop/layout/space_before_semicolon.rb +2 -5
  109. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -17
  110. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +20 -23
  111. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -8
  112. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +17 -16
  113. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +19 -37
  114. data/lib/rubocop/cop/layout/space_inside_parens.rb +9 -14
  115. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +5 -10
  116. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +8 -17
  117. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +16 -24
  118. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +12 -13
  119. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +10 -15
  120. data/lib/rubocop/cop/layout/trailing_whitespace.rb +11 -11
  121. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
  122. data/lib/rubocop/cop/lint/ambiguous_operator.rb +17 -10
  123. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +11 -13
  124. data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
  125. data/lib/rubocop/cop/lint/big_decimal_new.rb +9 -10
  126. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +50 -0
  127. data/lib/rubocop/cop/lint/boolean_symbol.rb +16 -11
  128. data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
  129. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +74 -0
  130. data/lib/rubocop/cop/lint/constant_resolution.rb +2 -2
  131. data/lib/rubocop/cop/lint/debugger.rb +6 -1
  132. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +7 -10
  133. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +17 -13
  134. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  135. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
  136. data/lib/rubocop/cop/lint/duplicate_methods.rb +5 -4
  137. data/lib/rubocop/cop/lint/duplicate_require.rb +46 -0
  138. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +47 -0
  139. data/lib/rubocop/cop/lint/each_with_object_argument.rb +2 -1
  140. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  141. data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
  142. data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
  143. data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
  144. data/lib/rubocop/cop/lint/empty_file.rb +50 -0
  145. data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
  146. data/lib/rubocop/cop/lint/empty_when.rb +2 -2
  147. data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
  148. data/lib/rubocop/cop/lint/erb_new_arguments.rb +13 -10
  149. data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
  150. data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
  151. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  152. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +4 -3
  153. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
  154. data/lib/rubocop/cop/lint/identity_comparison.rb +51 -0
  155. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +2 -2
  156. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +10 -13
  157. data/lib/rubocop/cop/lint/inherit_exception.rb +12 -7
  158. data/lib/rubocop/cop/lint/interpolation_check.rb +18 -15
  159. data/lib/rubocop/cop/lint/literal_as_condition.rb +4 -2
  160. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -7
  161. data/lib/rubocop/cop/lint/loop.rb +23 -2
  162. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +6 -5
  163. data/lib/rubocop/cop/lint/missing_super.rb +99 -0
  164. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +3 -36
  165. data/lib/rubocop/cop/lint/multiple_comparison.rb +9 -10
  166. data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -1
  167. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  168. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  169. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +27 -23
  170. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
  171. data/lib/rubocop/cop/lint/number_conversion.rb +7 -9
  172. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
  173. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +79 -0
  174. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +4 -10
  175. data/lib/rubocop/cop/lint/percent_string_array.rb +3 -6
  176. data/lib/rubocop/cop/lint/percent_symbol_array.rb +13 -12
  177. data/lib/rubocop/cop/lint/raise_exception.rb +13 -10
  178. data/lib/rubocop/cop/lint/rand_one.rb +2 -1
  179. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +38 -31
  180. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +20 -14
  181. data/lib/rubocop/cop/lint/redundant_require_statement.rb +5 -7
  182. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +13 -9
  183. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +6 -13
  184. data/lib/rubocop/cop/lint/redundant_with_index.rb +11 -14
  185. data/lib/rubocop/cop/lint/redundant_with_object.rb +11 -14
  186. data/lib/rubocop/cop/lint/regexp_as_condition.rb +4 -6
  187. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -2
  188. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  189. data/lib/rubocop/cop/lint/rescue_type.rb +8 -9
  190. data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -4
  191. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -6
  192. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +14 -10
  193. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +7 -7
  194. data/lib/rubocop/cop/lint/script_permission.rb +10 -7
  195. data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
  196. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +8 -12
  197. data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
  198. data/lib/rubocop/cop/lint/shadowed_exception.rb +8 -8
  199. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +7 -7
  200. data/lib/rubocop/cop/lint/struct_new_override.rb +2 -1
  201. data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
  202. data/lib/rubocop/cop/lint/to_json.rb +20 -11
  203. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
  204. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +57 -0
  205. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +4 -4
  206. data/lib/rubocop/cop/lint/unified_integer.rb +4 -6
  207. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  208. data/lib/rubocop/cop/lint/unreachable_loop.rb +171 -0
  209. data/lib/rubocop/cop/lint/unused_block_argument.rb +8 -3
  210. data/lib/rubocop/cop/lint/unused_method_argument.rb +8 -3
  211. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +4 -2
  212. data/lib/rubocop/cop/lint/uri_regexp.rb +12 -47
  213. data/lib/rubocop/cop/lint/useless_access_modifier.rb +27 -23
  214. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -4
  215. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -15
  216. data/lib/rubocop/cop/lint/useless_method_definition.rb +70 -0
  217. data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
  218. data/lib/rubocop/cop/lint/useless_times.rb +106 -0
  219. data/lib/rubocop/cop/lint/void.rb +3 -7
  220. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  221. data/lib/rubocop/cop/metrics/block_length.rb +2 -2
  222. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
  223. data/lib/rubocop/cop/metrics/class_length.rb +2 -2
  224. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
  225. data/lib/rubocop/cop/metrics/method_length.rb +2 -2
  226. data/lib/rubocop/cop/metrics/module_length.rb +2 -2
  227. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
  228. data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
  229. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +59 -5
  230. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +53 -24
  231. data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
  232. data/lib/rubocop/cop/migration/department_name.rb +14 -16
  233. data/lib/rubocop/cop/mixin/alignment.rb +5 -1
  234. data/lib/rubocop/cop/mixin/allowed_methods.rb +2 -0
  235. data/lib/rubocop/cop/mixin/annotation_comment.rb +5 -0
  236. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
  237. data/lib/rubocop/cop/mixin/check_line_breakable.rb +17 -8
  238. data/lib/rubocop/cop/mixin/code_length.rb +22 -5
  239. data/lib/rubocop/cop/mixin/comments_help.rb +48 -0
  240. data/lib/rubocop/cop/mixin/configurable_naming.rb +2 -2
  241. data/lib/rubocop/cop/mixin/configurable_numbering.rb +3 -3
  242. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +8 -7
  243. data/lib/rubocop/cop/mixin/empty_parameter.rb +3 -1
  244. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +12 -1
  245. data/lib/rubocop/cop/mixin/first_element_line_break.rb +3 -1
  246. data/lib/rubocop/cop/mixin/hash_transform_method.rb +31 -12
  247. data/lib/rubocop/cop/mixin/line_length_help.rb +1 -3
  248. data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
  249. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +3 -1
  250. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +13 -12
  251. data/lib/rubocop/cop/mixin/negative_conditional.rb +2 -2
  252. data/lib/rubocop/cop/mixin/percent_array.rb +16 -9
  253. data/lib/rubocop/cop/mixin/range_help.rb +18 -4
  254. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +1 -1
  255. data/lib/rubocop/cop/mixin/rescue_node.rb +11 -1
  256. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +4 -3
  257. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +4 -3
  258. data/lib/rubocop/cop/mixin/statement_modifier.rb +43 -8
  259. data/lib/rubocop/cop/mixin/surrounding_space.rb +8 -29
  260. data/lib/rubocop/cop/mixin/trailing_comma.rb +9 -11
  261. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +6 -13
  262. data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
  263. data/lib/rubocop/cop/mixin/visibility_help.rb +4 -16
  264. data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
  265. data/lib/rubocop/cop/naming/ascii_identifiers.rb +3 -3
  266. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +2 -2
  267. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  268. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -2
  269. data/lib/rubocop/cop/naming/constant_name.rb +2 -2
  270. data/lib/rubocop/cop/naming/file_name.rb +4 -4
  271. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
  272. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +2 -2
  273. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
  274. data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
  275. data/lib/rubocop/cop/naming/predicate_name.rb +3 -5
  276. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -11
  277. data/lib/rubocop/cop/offense.rb +1 -0
  278. data/lib/rubocop/cop/registry.rb +3 -3
  279. data/lib/rubocop/cop/security/eval.rb +3 -2
  280. data/lib/rubocop/cop/security/json_load.rb +7 -8
  281. data/lib/rubocop/cop/security/marshal_load.rb +3 -4
  282. data/lib/rubocop/cop/security/open.rb +3 -2
  283. data/lib/rubocop/cop/security/yaml_load.rb +7 -6
  284. data/lib/rubocop/cop/severity.rb +0 -8
  285. data/lib/rubocop/cop/style/access_modifier_declarations.rb +7 -8
  286. data/lib/rubocop/cop/style/accessor_grouping.rb +23 -21
  287. data/lib/rubocop/cop/style/alias.rb +43 -36
  288. data/lib/rubocop/cop/style/and_or.rb +9 -11
  289. data/lib/rubocop/cop/style/array_join.rb +7 -8
  290. data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
  291. data/lib/rubocop/cop/style/attr.rb +12 -9
  292. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +4 -5
  293. data/lib/rubocop/cop/style/bare_percent_literals.rb +10 -12
  294. data/lib/rubocop/cop/style/begin_block.rb +2 -2
  295. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +9 -14
  296. data/lib/rubocop/cop/style/block_comments.rb +14 -18
  297. data/lib/rubocop/cop/style/block_delimiters.rb +23 -23
  298. data/lib/rubocop/cop/style/case_equality.rb +32 -5
  299. data/lib/rubocop/cop/style/case_like_if.rb +38 -19
  300. data/lib/rubocop/cop/style/class_and_module_children.rb +16 -11
  301. data/lib/rubocop/cop/style/class_check.rb +6 -11
  302. data/lib/rubocop/cop/style/class_methods.rb +7 -11
  303. data/lib/rubocop/cop/style/class_methods_definitions.rb +157 -0
  304. data/lib/rubocop/cop/style/class_vars.rb +7 -12
  305. data/lib/rubocop/cop/style/collection_methods.rb +11 -17
  306. data/lib/rubocop/cop/style/colon_method_call.rb +8 -9
  307. data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
  308. data/lib/rubocop/cop/style/combinable_loops.rb +84 -0
  309. data/lib/rubocop/cop/style/command_literal.rb +23 -24
  310. data/lib/rubocop/cop/style/comment_annotation.rb +15 -15
  311. data/lib/rubocop/cop/style/commented_keyword.rb +8 -9
  312. data/lib/rubocop/cop/style/conditional_assignment.rb +61 -63
  313. data/lib/rubocop/cop/style/constant_visibility.rb +3 -2
  314. data/lib/rubocop/cop/style/copyright.rb +12 -12
  315. data/lib/rubocop/cop/style/date_time.rb +1 -1
  316. data/lib/rubocop/cop/style/def_with_parentheses.rb +8 -10
  317. data/lib/rubocop/cop/style/dir.rb +8 -10
  318. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +7 -9
  319. data/lib/rubocop/cop/style/documentation.rb +6 -8
  320. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  321. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
  322. data/lib/rubocop/cop/style/double_negation.rb +3 -2
  323. data/lib/rubocop/cop/style/each_for_simple_loop.rb +5 -8
  324. data/lib/rubocop/cop/style/each_with_object.rb +16 -19
  325. data/lib/rubocop/cop/style/empty_block_parameter.rb +9 -10
  326. data/lib/rubocop/cop/style/empty_case_condition.rb +19 -20
  327. data/lib/rubocop/cop/style/empty_else.rb +17 -19
  328. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +9 -10
  329. data/lib/rubocop/cop/style/empty_literal.rb +18 -17
  330. data/lib/rubocop/cop/style/empty_method.rb +10 -13
  331. data/lib/rubocop/cop/style/encoding.rb +5 -9
  332. data/lib/rubocop/cop/style/end_block.rb +4 -6
  333. data/lib/rubocop/cop/style/eval_with_location.rb +7 -7
  334. data/lib/rubocop/cop/style/even_odd.rb +8 -11
  335. data/lib/rubocop/cop/style/expand_path_arguments.rb +22 -21
  336. data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
  337. data/lib/rubocop/cop/style/exponential_notation.rb +1 -1
  338. data/lib/rubocop/cop/style/float_division.rb +3 -1
  339. data/lib/rubocop/cop/style/for.rb +11 -15
  340. data/lib/rubocop/cop/style/format_string.rb +18 -19
  341. data/lib/rubocop/cop/style/format_string_token.rb +5 -7
  342. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +19 -41
  343. data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
  344. data/lib/rubocop/cop/style/global_vars.rb +2 -2
  345. data/lib/rubocop/cop/style/guard_clause.rb +6 -6
  346. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +27 -1
  347. data/lib/rubocop/cop/style/hash_each_methods.rb +5 -8
  348. data/lib/rubocop/cop/style/hash_syntax.rb +10 -8
  349. data/lib/rubocop/cop/style/hash_transform_keys.rb +19 -11
  350. data/lib/rubocop/cop/style/hash_transform_values.rb +18 -10
  351. data/lib/rubocop/cop/style/identical_conditional_branches.rb +2 -2
  352. data/lib/rubocop/cop/style/if_inside_else.rb +3 -3
  353. data/lib/rubocop/cop/style/if_unless_modifier.rb +11 -37
  354. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +3 -7
  355. data/lib/rubocop/cop/style/if_with_semicolon.rb +3 -6
  356. data/lib/rubocop/cop/style/implicit_runtime_error.rb +2 -1
  357. data/lib/rubocop/cop/style/infinite_loop.rb +24 -24
  358. data/lib/rubocop/cop/style/inline_comment.rb +3 -3
  359. data/lib/rubocop/cop/style/inverse_methods.rb +22 -32
  360. data/lib/rubocop/cop/style/keyword_parameters_order.rb +53 -0
  361. data/lib/rubocop/cop/style/lambda.rb +7 -12
  362. data/lib/rubocop/cop/style/lambda_call.rb +17 -14
  363. data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -16
  364. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -1
  365. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +16 -11
  366. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +4 -8
  367. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -7
  368. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +12 -3
  369. data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -16
  370. data/lib/rubocop/cop/style/min_max.rb +8 -12
  371. data/lib/rubocop/cop/style/missing_else.rb +13 -13
  372. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +10 -3
  373. data/lib/rubocop/cop/style/mixin_grouping.rb +24 -27
  374. data/lib/rubocop/cop/style/mixin_usage.rb +2 -1
  375. data/lib/rubocop/cop/style/module_function.rb +10 -13
  376. data/lib/rubocop/cop/style/multiline_block_chain.rb +2 -2
  377. data/lib/rubocop/cop/style/multiline_if_modifier.rb +3 -10
  378. data/lib/rubocop/cop/style/multiline_if_then.rb +4 -10
  379. data/lib/rubocop/cop/style/multiline_memoization.rb +14 -12
  380. data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
  381. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +17 -6
  382. data/lib/rubocop/cop/style/multiline_when_then.rb +10 -11
  383. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  384. data/lib/rubocop/cop/style/mutable_constant.rb +23 -20
  385. data/lib/rubocop/cop/style/negated_if.rb +6 -6
  386. data/lib/rubocop/cop/style/negated_unless.rb +6 -6
  387. data/lib/rubocop/cop/style/negated_while.rb +7 -15
  388. data/lib/rubocop/cop/style/nested_modifier.rb +10 -13
  389. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +14 -12
  390. data/lib/rubocop/cop/style/nested_ternary_operator.rb +14 -16
  391. data/lib/rubocop/cop/style/next.rb +10 -14
  392. data/lib/rubocop/cop/style/nil_comparison.rb +13 -11
  393. data/lib/rubocop/cop/style/non_nil_check.rb +34 -26
  394. data/lib/rubocop/cop/style/not.rb +20 -26
  395. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +4 -9
  396. data/lib/rubocop/cop/style/numeric_predicate.rb +6 -11
  397. data/lib/rubocop/cop/style/one_line_conditional.rb +73 -23
  398. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  399. data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
  400. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +45 -0
  401. data/lib/rubocop/cop/style/or_assignment.rb +13 -10
  402. data/lib/rubocop/cop/style/parallel_assignment.rb +16 -16
  403. data/lib/rubocop/cop/style/parentheses_around_condition.rb +6 -6
  404. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +15 -21
  405. data/lib/rubocop/cop/style/percent_q_literals.rb +8 -10
  406. data/lib/rubocop/cop/style/perl_backrefs.rb +8 -10
  407. data/lib/rubocop/cop/style/preferred_hash_methods.rb +11 -14
  408. data/lib/rubocop/cop/style/proc.rb +6 -6
  409. data/lib/rubocop/cop/style/raise_args.rb +15 -24
  410. data/lib/rubocop/cop/style/random_with_offset.rb +20 -19
  411. data/lib/rubocop/cop/style/redundant_assignment.rb +8 -18
  412. data/lib/rubocop/cop/style/redundant_begin.rb +7 -9
  413. data/lib/rubocop/cop/style/redundant_capital_w.rb +6 -9
  414. data/lib/rubocop/cop/style/redundant_condition.rb +20 -9
  415. data/lib/rubocop/cop/style/redundant_conditional.rb +4 -5
  416. data/lib/rubocop/cop/style/redundant_exception.rb +2 -0
  417. data/lib/rubocop/cop/style/redundant_fetch_block.rb +3 -12
  418. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +9 -8
  419. data/lib/rubocop/cop/style/redundant_freeze.rb +5 -7
  420. data/lib/rubocop/cop/style/redundant_interpolation.rb +25 -24
  421. data/lib/rubocop/cop/style/redundant_parentheses.rb +21 -15
  422. data/lib/rubocop/cop/style/redundant_percent_q.rb +9 -11
  423. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -13
  424. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +14 -23
  425. data/lib/rubocop/cop/style/redundant_return.rb +17 -17
  426. data/lib/rubocop/cop/style/redundant_self.rb +9 -11
  427. data/lib/rubocop/cop/style/redundant_self_assignment.rb +116 -0
  428. data/lib/rubocop/cop/style/redundant_sort.rb +24 -28
  429. data/lib/rubocop/cop/style/redundant_sort_by.rb +5 -9
  430. data/lib/rubocop/cop/style/regexp_literal.rb +10 -21
  431. data/lib/rubocop/cop/style/rescue_modifier.rb +29 -9
  432. data/lib/rubocop/cop/style/rescue_standard_error.rb +20 -16
  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 -21
  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 +22 -22
  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 +11 -9
  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 +1 -1
  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/util.rb +2 -13
  478. data/lib/rubocop/cop/utils/format_string.rb +3 -5
  479. data/lib/rubocop/cop/variable_force.rb +2 -2
  480. data/lib/rubocop/cop/variable_force/branch.rb +1 -0
  481. data/lib/rubocop/cop/variable_force/variable.rb +2 -2
  482. data/lib/rubocop/cops_documentation_generator.rb +284 -0
  483. data/lib/rubocop/core_ext/string.rb +2 -2
  484. data/lib/rubocop/directive_comment.rb +32 -0
  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 +1 -0
  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 +19 -4
  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 +31 -13
  502. data/lib/rubocop/rspec/cop_helper.rb +4 -1
  503. data/lib/rubocop/rspec/expect_offense.rb +11 -6
  504. data/lib/rubocop/rspec/shared_contexts.rb +13 -5
  505. data/lib/rubocop/runner.rb +31 -15
  506. data/lib/rubocop/string_interpreter.rb +3 -0
  507. data/lib/rubocop/target_finder.rb +13 -9
  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 +38 -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
@@ -24,7 +24,7 @@ module RuboCop
24
24
  def initialize(hash = {}, loaded_path = nil)
25
25
  @loaded_path = loaded_path
26
26
  @for_cop = Hash.new do |h, cop|
27
- qualified_cop_name = Cop::Cop.qualified_cop_name(cop, loaded_path)
27
+ qualified_cop_name = Cop::Registry.qualified_cop_name(cop, loaded_path)
28
28
  cop_options = self[qualified_cop_name] || {}
29
29
  cop_options['Enabled'] = enable_cop?(qualified_cop_name, cop_options)
30
30
  h[cop] = cop_options
@@ -47,7 +47,7 @@ module RuboCop
47
47
  end
48
48
 
49
49
  def_delegators :@hash, :[], :[]=, :delete, :each, :key?, :keys, :each_key,
50
- :map, :merge, :to_h, :to_hash, :transform_values
50
+ :fetch, :map, :merge, :to_h, :to_hash, :transform_values
51
51
  def_delegators :@validator, :validate, :target_ruby_version
52
52
 
53
53
  def to_s
@@ -104,12 +104,29 @@ module RuboCop
104
104
  end
105
105
  end
106
106
 
107
+ # @return [Config] for the given cop / cop name.
108
+ # Note: the 'Enabled' attribute is calculated according to the department's
109
+ # and 'AllCops' configuration; other attributes are not inherited.
107
110
  def for_cop(cop)
108
111
  @for_cop[cop.respond_to?(:cop_name) ? cop.cop_name : cop]
109
112
  end
110
113
 
114
+ # @return [Config] for the given cop merged with that of its department (if any)
115
+ # Note: the 'Enabled' attribute is same as that returned by `for_cop`
116
+ def for_badge(badge)
117
+ cop_config = for_cop(badge.to_s)
118
+ fetch(badge.department.to_s) { return cop_config }
119
+ .merge(cop_config)
120
+ end
121
+
122
+ # @return [Config] for the given department name.
123
+ # Note: the 'Enabled' attribute will be present only if specified
124
+ # at the department's level
111
125
  def for_department(department_name)
112
- @for_cop[department_name]
126
+ @for_department ||= Hash.new do |h, dept|
127
+ h[dept] = self[dept] || {}
128
+ end
129
+ @for_department[department_name.to_s]
113
130
  end
114
131
 
115
132
  def for_all_cops
@@ -34,7 +34,7 @@ module RuboCop
34
34
  FileFinder.root_level = nil
35
35
  end
36
36
 
37
- def load_file(file) # rubocop:disable Metrics/AbcSize
37
+ def load_file(file)
38
38
  path = File.absolute_path(file.is_a?(RemoteConfig) ? file.file : file)
39
39
 
40
40
  hash = load_yaml_configuration(path)
@@ -73,7 +73,7 @@ module RuboCop
73
73
  # `can't add a new key into hash during iteration` error
74
74
  hash_keys = hash.keys
75
75
  hash_keys.each do |key|
76
- q = Cop::Cop.qualified_cop_name(key, path)
76
+ q = Cop::Registry.qualified_cop_name(key, path)
77
77
  next if q == key
78
78
 
79
79
  hash[q] = hash.delete(key)
@@ -129,9 +129,9 @@ module RuboCop
129
129
 
130
130
  def default_configuration
131
131
  @default_configuration ||= begin
132
- print 'Default ' if debug?
133
- load_file(DEFAULT_FILE)
134
- end
132
+ print 'Default ' if debug?
133
+ load_file(DEFAULT_FILE)
134
+ end
135
135
  end
136
136
 
137
137
  # Returns the path rubocop inferred as the root of the project. No file
@@ -140,22 +140,33 @@ module RuboCop
140
140
  @project_root ||= find_project_root
141
141
  end
142
142
 
143
+ PENDING_BANNER = <<~BANNER
144
+ The following cops were added to RuboCop, but are not configured. Please set Enabled to either `true` or `false` in your `.rubocop.yml` file.
145
+
146
+ Please also note that can also opt-in to new cops by default by adding this to your config:
147
+ AllCops:
148
+ NewCops: enable
149
+ BANNER
150
+
143
151
  def warn_on_pending_cops(pending_cops)
144
152
  return if pending_cops.empty?
145
153
 
146
- warn Rainbow('The following cops were added to RuboCop, but are not ' \
147
- 'configured. Please set Enabled to either `true` or ' \
148
- '`false` in your `.rubocop.yml` file:').yellow
154
+ warn Rainbow(PENDING_BANNER).yellow
149
155
 
150
156
  pending_cops.each do |cop|
151
- version = cop.metadata['VersionAdded'] || 'N/A'
152
-
153
- warn Rainbow(" - #{cop.name} (#{version})").yellow
157
+ warn_pending_cop cop
154
158
  end
155
159
 
156
160
  warn Rainbow('For more information: https://docs.rubocop.org/rubocop/versioning.html').yellow
157
161
  end
158
162
 
163
+ def warn_pending_cop(cop)
164
+ version = cop.metadata['VersionAdded'] || 'N/A'
165
+
166
+ warn Rainbow("#{cop.name}: # (new in #{version})").yellow
167
+ warn Rainbow(' Enabled: true').yellow
168
+ end
169
+
159
170
  # Merges the given configuration with the default one.
160
171
  def merge_with_default(config, config_file, unset_nil: true)
161
172
  resolver.merge_with_default(config, config_file, unset_nil: unset_nil)
@@ -5,6 +5,7 @@ require 'pathname'
5
5
 
6
6
  module RuboCop
7
7
  # A help class for ConfigLoader that handles configuration resolution.
8
+ # @api private
8
9
  class ConfigLoaderResolver
9
10
  def resolve_requires(path, hash)
10
11
  config_dir = File.dirname(path)
@@ -201,7 +202,7 @@ module RuboCop
201
202
  next unless dept_params['Enabled']
202
203
 
203
204
  new_default_configuration.each do |cop, params|
204
- next unless cop.start_with?(dept + '/')
205
+ next unless cop.start_with?("#{dept}/")
205
206
 
206
207
  # Retain original default configuration for cops in the department.
207
208
  params['Enabled'] = ConfigLoader.default_configuration[cop]['Enabled']
@@ -213,8 +214,8 @@ module RuboCop
213
214
  end
214
215
  end
215
216
 
216
- def transform(config)
217
- config.transform_values { |params| yield(params) }
217
+ def transform(config, &block)
218
+ config.transform_values(&block)
218
219
  end
219
220
 
220
221
  def gem_config_path(gem_name, relative_config_path)
@@ -2,6 +2,7 @@
2
2
 
3
3
  module RuboCop
4
4
  # This class handles obsolete configuration.
5
+ # @api private
5
6
  class ConfigObsoletion
6
7
  RENAMED_COPS = {
7
8
  'Layout/AlignArguments' => 'Layout/ArgumentAlignment',
@@ -84,7 +85,12 @@ module RuboCop
84
85
  'Lint/InvalidCharacterLiteral' => 'it was never being actually triggered',
85
86
  'Lint/SpaceBeforeFirstArg' =>
86
87
  'it was a duplicate of `Layout/SpaceBeforeFirstArg`. Please use ' \
87
- '`Layout/SpaceBeforeFirstArg` instead'
88
+ '`Layout/SpaceBeforeFirstArg` instead',
89
+ 'Style/MethodMissingSuper' => 'it has been superseded by `Lint/MissingSuper`. Please use ' \
90
+ '`Lint/MissingSuper` instead',
91
+ 'Lint/UselessComparison' => 'it has been superseded by '\
92
+ '`Lint/BinaryOperatorWithIdenticalOperands`. Please use '\
93
+ '`Lint/BinaryOperatorWithIdenticalOperands` instead'
88
94
  }.map do |cop_name, reason|
89
95
  [cop_name, "The `#{cop_name}` cop has been removed since #{reason}."]
90
96
  end
@@ -54,9 +54,9 @@ module RuboCop
54
54
  @path_cache[dir] ||= ConfigLoader.configuration_file_for(dir)
55
55
  path = @path_cache[dir]
56
56
  @object_cache[path] ||= begin
57
- print "For #{dir}: " if ConfigLoader.debug?
58
- ConfigLoader.configuration_from_file(path)
59
- end
57
+ print "For #{dir}: " if ConfigLoader.debug?
58
+ ConfigLoader.configuration_from_file(path)
59
+ end
60
60
  end
61
61
  end
62
62
  end
@@ -8,11 +8,14 @@ module RuboCop
8
8
  class ConfigValidator
9
9
  extend Forwardable
10
10
 
11
+ # @api private
11
12
  COMMON_PARAMS = %w[Exclude Include Severity inherit_mode
12
13
  AutoCorrect StyleGuide Details].freeze
14
+ # @api private
13
15
  INTERNAL_PARAMS = %w[Description StyleGuide
14
16
  VersionAdded VersionChanged VersionRemoved
15
17
  Reference Safe SafeAutoCorrect].freeze
18
+ # @api private
16
19
  NEW_COPS_VALUES = %w[pending disable enable].freeze
17
20
 
18
21
  def_delegators :@config, :smart_loaded_path, :for_all_cops
@@ -23,7 +26,6 @@ module RuboCop
23
26
  @target_ruby = TargetRuby.new(config)
24
27
  end
25
28
 
26
- # rubocop:disable Metrics/AbcSize
27
29
  def validate
28
30
  check_cop_config_value(@config)
29
31
  reject_conflicting_safe_settings
@@ -45,7 +47,6 @@ module RuboCop
45
47
  validate_syntax_cop
46
48
  reject_mutually_exclusive_defaults
47
49
  end
48
- # rubocop:enable Metrics/AbcSize
49
50
 
50
51
  def target_ruby_version
51
52
  target_ruby.version
@@ -86,7 +87,7 @@ module RuboCop
86
87
  unknown_cops = []
87
88
  invalid_cop_names.each do |name|
88
89
  # There could be a custom cop with this name. If so, don't warn
89
- next if Cop::Cop.registry.contains_cop_matching?([name])
90
+ next if Cop::Registry.global.contains_cop_matching?([name])
90
91
 
91
92
  # Special case for inherit_mode, which is a directive that we keep in
92
93
  # the configuration (even though it's not a cop), because it's easier
@@ -150,7 +151,7 @@ module RuboCop
150
151
  end
151
152
  end
152
153
 
153
- def validate_enforced_styles(valid_cop_names)
154
+ def validate_enforced_styles(valid_cop_names) # rubocop:todo Metrics/AbcSize
154
155
  valid_cop_names.each do |name|
155
156
  styles = @config[name].select { |key, _| key.start_with?('Enforced') }
156
157
 
@@ -46,6 +46,9 @@ module RuboCop
46
46
  # Consider creation API private
47
47
  InvestigationReport = Struct.new(:cop, :processed_source, :offenses, :corrector)
48
48
 
49
+ # List of methods names to restrict calls for `on_send` / `on_csend`
50
+ RESTRICT_ON_SEND = Set[].freeze
51
+
49
52
  # List of cops that should not try to autocorrect at the same
50
53
  # time as this cop
51
54
  #
@@ -56,6 +59,14 @@ module RuboCop
56
59
  []
57
60
  end
58
61
 
62
+ # Cops (other than builtin) are encouraged to implement this
63
+ # @return [String, nil]
64
+ #
65
+ # @api public
66
+ def self.documentation_url
67
+ Documentation.url_for(self) if builtin?
68
+ end
69
+
59
70
  def initialize(config = nil, options = nil)
60
71
  @config = config || Config.new
61
72
  @options = options || { debug: false }
@@ -137,6 +148,7 @@ module RuboCop
137
148
  end
138
149
 
139
150
  def self.inherited(subclass)
151
+ super
140
152
  Registry.global.enlist(subclass)
141
153
  end
142
154
 
@@ -189,8 +201,7 @@ module RuboCop
189
201
  def cop_config
190
202
  # Use department configuration as basis, but let individual cop
191
203
  # configuration override.
192
- @cop_config ||= @config.for_cop(self.class.department.to_s)
193
- .merge(@config.for_cop(self))
204
+ @cop_config ||= @config.for_badge(self.class.badge)
194
205
  end
195
206
 
196
207
  def config_to_allow_offenses
@@ -279,6 +290,10 @@ module RuboCop
279
290
  @currently_disabled_lines ||= Set.new
280
291
  end
281
292
 
293
+ private_class_method def self.restrict_on_send
294
+ @restrict_on_send ||= self::RESTRICT_ON_SEND.to_set.freeze
295
+ end
296
+
282
297
  # Called before any investigation
283
298
  def begin_investigation(processed_source)
284
299
  @current_offenses = []
@@ -297,6 +312,14 @@ module RuboCop
297
312
 
298
313
  ### Actually private methods
299
314
 
315
+ def self.builtin?
316
+ return false unless (m = instance_methods(false).first) # any custom method will do
317
+
318
+ path, _line = instance_method(m).source_location
319
+ path.start_with?(__dir__)
320
+ end
321
+ private_class_method :builtin?
322
+
300
323
  def reset_investigation
301
324
  @currently_disabled_lines = @current_offenses = @processed_source = @current_corrector = nil
302
325
  end
@@ -53,7 +53,11 @@ module RuboCop
53
53
  gem_declarations(processed_source.ast)
54
54
  .group_by(&:first_argument)
55
55
  .values
56
- .select { |nodes| nodes.size > 1 }
56
+ .select { |nodes| nodes.size > 1 && !condition?(nodes) }
57
+ end
58
+
59
+ def condition?(nodes)
60
+ nodes[0].parent&.if_type? && nodes[0].parent == nodes[1].parent
57
61
  end
58
62
 
59
63
  def register_offense(node, gem_name, line_of_first_occurrence)
@@ -64,13 +64,14 @@ module RuboCop
64
64
  MSG = 'Missing gem description comment.'
65
65
  CHECKED_OPTIONS_CONFIG = 'OnlyFor'
66
66
  VERSION_SPECIFIERS_OPTION = 'version_specifiers'
67
+ RESTRICT_ON_SEND = %i[gem].freeze
67
68
 
68
69
  def_node_matcher :gem_declaration?, '(send nil? :gem str ...)'
69
70
 
70
71
  def on_send(node)
71
72
  return unless gem_declaration?(node)
72
73
  return if ignored_gem?(node)
73
- return if commented?(node)
74
+ return if commented_any_descendant?(node)
74
75
  return if cop_config[CHECKED_OPTIONS_CONFIG].any? && !checked_options_present?(node)
75
76
 
76
77
  add_offense(node)
@@ -78,6 +79,10 @@ module RuboCop
78
79
 
79
80
  private
80
81
 
82
+ def commented_any_descendant?(node)
83
+ commented?(node) || node.each_descendant.any? { |n| commented?(n) }
84
+ end
85
+
81
86
  def commented?(node)
82
87
  preceding_lines = preceding_lines(node)
83
88
  preceding_comment?(node, preceding_lines.last)
@@ -86,12 +91,12 @@ module RuboCop
86
91
  # The args node1 & node2 may represent a RuboCop::AST::Node
87
92
  # or a Parser::Source::Comment. Both respond to #loc.
88
93
  def precede?(node1, node2)
89
- node2.loc.line - node1.loc.line == 1
94
+ node2.loc.line - node1.loc.line <= 1
90
95
  end
91
96
 
92
97
  def preceding_lines(node)
93
98
  processed_source.ast_with_comments[node].select do |line|
94
- line.loc.line < node.loc.line
99
+ line.loc.line <= node.loc.line
95
100
  end
96
101
  end
97
102
 
@@ -34,6 +34,8 @@ module RuboCop
34
34
  "Please change your source to 'https://rubygems.org' " \
35
35
  "if possible, or 'http://rubygems.org' if not."
36
36
 
37
+ RESTRICT_ON_SEND = %i[source].freeze
38
+
37
39
  def_node_matcher :insecure_protocol_source?, <<~PATTERN
38
40
  (send nil? :source
39
41
  $(sym ${:gemcutter :rubygems :rubyforge}))
@@ -7,6 +7,9 @@ module RuboCop
7
7
  class Commissioner
8
8
  include RuboCop::AST::Traversal
9
9
 
10
+ RESTRICTED_CALLBACKS = %i[on_send on_csend].freeze
11
+ private_constant :RESTRICTED_CALLBACKS
12
+
10
13
  # How a Commissioner returns the results of the investigation
11
14
  # as a list of Cop::InvestigationReport and any errors caught
12
15
  # during the investigation.
@@ -42,7 +45,8 @@ module RuboCop
42
45
  @cops = cops
43
46
  @forces = forces
44
47
  @options = options
45
- @callbacks = {}
48
+ @callbacks = Hash.new { |h, k| h[k] = cops_callbacks_for(k) }
49
+ @restricted_map = {}
46
50
 
47
51
  reset
48
52
  end
@@ -57,10 +61,17 @@ module RuboCop
57
61
  method_name = :"on_#{node_type}"
58
62
  next unless method_defined?(method_name)
59
63
 
60
- define_method(method_name) do |node|
61
- trigger_responding_cops(method_name, node)
62
- super(node) unless NO_CHILD_NODES.include?(node_type)
64
+ if RESTRICTED_CALLBACKS.include?(method_name)
65
+ trigger_restricted = "trigger_restricted_cops(:on_#{node_type}, node)"
63
66
  end
67
+
68
+ class_eval(<<~RUBY, __FILE__, __LINE__ + 1)
69
+ def on_#{node_type}(node)
70
+ trigger_responding_cops(:on_#{node_type}, node)
71
+ #{trigger_restricted}
72
+ #{'super(node)' unless NO_CHILD_NODES.include?(node_type)}
73
+ end
74
+ RUBY
64
75
  end
65
76
 
66
77
  # @return [InvestigationReport]
@@ -83,9 +94,6 @@ module RuboCop
83
94
  private
84
95
 
85
96
  def trigger_responding_cops(callback, node)
86
- @callbacks[callback] ||= @cops.select do |cop|
87
- cop.respond_to?(callback)
88
- end
89
97
  @callbacks[callback].each do |cop|
90
98
  with_cop_error_handling(cop, node) do
91
99
  cop.send(callback, node)
@@ -95,7 +103,38 @@ module RuboCop
95
103
 
96
104
  def reset
97
105
  @errors = []
98
- @callbacks = {}
106
+ end
107
+
108
+ def cops_callbacks_for(callback)
109
+ callbacks = @cops.select do |cop|
110
+ cop.respond_to?(callback)
111
+ end
112
+ if RESTRICTED_CALLBACKS.include?(callback)
113
+ @restricted_map[callback] = restricted_map(callbacks)
114
+ end
115
+ callbacks
116
+ end
117
+
118
+ def trigger_restricted_cops(event, node)
119
+ name = node.method_name
120
+ @restricted_map.fetch(event)[name]&.each do |cop|
121
+ with_cop_error_handling(cop, node) do
122
+ cop.send(event, node)
123
+ end
124
+ end
125
+ end
126
+
127
+ # Note: mutates `callbacks` in place
128
+ def restricted_map(callbacks)
129
+ map = {}
130
+ callbacks.select! do |cop|
131
+ restrictions = cop.class.send :restrict_on_send
132
+ restrictions.each do |name|
133
+ (map[name] ||= []) << cop
134
+ end
135
+ restrictions.empty?
136
+ end
137
+ map
99
138
  end
100
139
 
101
140
  def invoke(callback, cops, *args)