rubocop 1.12.1 → 1.16.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 (412) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -2
  3. data/config/default.yml +78 -8
  4. data/exe/rubocop +1 -3
  5. data/lib/rubocop.rb +10 -1
  6. data/lib/rubocop/cached_data.rb +1 -3
  7. data/lib/rubocop/cli.rb +4 -6
  8. data/lib/rubocop/cli/command/auto_genenerate_config.rb +9 -19
  9. data/lib/rubocop/cli/command/init_dotfile.rb +1 -3
  10. data/lib/rubocop/cli/command/show_cops.rb +1 -4
  11. data/lib/rubocop/comment_config.rb +2 -7
  12. data/lib/rubocop/config.rb +11 -26
  13. data/lib/rubocop/config_loader.rb +5 -11
  14. data/lib/rubocop/config_loader_resolver.rb +22 -14
  15. data/lib/rubocop/config_obsoletion/cop_rule.rb +1 -2
  16. data/lib/rubocop/config_store.rb +1 -2
  17. data/lib/rubocop/config_validator.rb +5 -10
  18. data/lib/rubocop/cop/autocorrect_logic.rb +3 -8
  19. data/lib/rubocop/cop/badge.rb +1 -2
  20. data/lib/rubocop/cop/base.rb +8 -6
  21. data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -2
  22. data/lib/rubocop/cop/bundler/gem_comment.rb +43 -11
  23. data/lib/rubocop/cop/bundler/gem_version.rb +99 -0
  24. data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -4
  25. data/lib/rubocop/cop/commissioner.rb +2 -8
  26. data/lib/rubocop/cop/cop.rb +4 -18
  27. data/lib/rubocop/cop/corrector.rb +1 -4
  28. data/lib/rubocop/cop/correctors/alignment_corrector.rb +3 -6
  29. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +2 -4
  30. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +1 -2
  31. data/lib/rubocop/cop/correctors/line_break_corrector.rb +3 -6
  32. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1 -3
  33. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +1 -3
  34. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -8
  35. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +1 -2
  36. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -4
  37. data/lib/rubocop/cop/generator.rb +1 -4
  38. data/lib/rubocop/cop/generator/configuration_injector.rb +1 -2
  39. data/lib/rubocop/cop/generator/require_file_injector.rb +2 -5
  40. data/lib/rubocop/cop/internal_affairs/example_description.rb +7 -5
  41. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +2 -5
  42. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -3
  43. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -3
  44. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +1 -2
  45. data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +1 -2
  46. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +1 -3
  47. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -2
  48. data/lib/rubocop/cop/layout/argument_alignment.rb +30 -14
  49. data/lib/rubocop/cop/layout/assignment_indentation.rb +2 -4
  50. data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -4
  51. data/lib/rubocop/cop/layout/block_alignment.rb +7 -19
  52. data/lib/rubocop/cop/layout/case_indentation.rb +57 -11
  53. data/lib/rubocop/cop/layout/class_structure.rb +4 -10
  54. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +4 -15
  55. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -5
  56. data/lib/rubocop/cop/layout/def_end_alignment.rb +2 -6
  57. data/lib/rubocop/cop/layout/dot_position.rb +1 -3
  58. data/lib/rubocop/cop/layout/else_alignment.rb +1 -3
  59. data/lib/rubocop/cop/layout/empty_comment.rb +5 -12
  60. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +2 -5
  61. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +2 -6
  62. data/lib/rubocop/cop/layout/empty_lines.rb +1 -3
  63. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +8 -18
  64. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +2 -8
  65. data/lib/rubocop/cop/layout/end_alignment.rb +1 -2
  66. data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
  67. data/lib/rubocop/cop/layout/extra_spacing.rb +3 -7
  68. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +1 -2
  69. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -2
  70. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +14 -5
  71. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -2
  72. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -2
  73. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +1 -2
  74. data/lib/rubocop/cop/layout/hash_alignment.rb +36 -15
  75. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -9
  76. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -6
  77. data/lib/rubocop/cop/layout/indentation_style.rb +1 -3
  78. data/lib/rubocop/cop/layout/indentation_width.rb +6 -4
  79. data/lib/rubocop/cop/layout/initial_indentation.rb +1 -4
  80. data/lib/rubocop/cop/layout/line_length.rb +4 -15
  81. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +1 -2
  82. data/lib/rubocop/cop/layout/multiline_block_layout.rb +7 -15
  83. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -2
  84. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -2
  85. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -10
  86. data/lib/rubocop/cop/layout/redundant_line_break.rb +137 -0
  87. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +3 -6
  88. data/lib/rubocop/cop/layout/single_line_block_chain.rb +53 -0
  89. data/lib/rubocop/cop/layout/space_after_colon.rb +1 -3
  90. data/lib/rubocop/cop/layout/space_after_method_name.rb +2 -4
  91. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +6 -14
  92. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +1 -2
  93. data/lib/rubocop/cop/layout/space_around_keyword.rb +19 -6
  94. data/lib/rubocop/cop/layout/space_around_operators.rb +4 -9
  95. data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -2
  96. data/lib/rubocop/cop/layout/space_before_brackets.rb +1 -3
  97. data/lib/rubocop/cop/layout/space_before_comment.rb +1 -3
  98. data/lib/rubocop/cop/layout/space_before_first_arg.rb +5 -11
  99. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +2 -4
  100. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +5 -10
  101. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +2 -7
  102. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +5 -10
  103. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +1 -2
  104. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +1 -2
  105. data/lib/rubocop/cop/legacy/corrections_proxy.rb +2 -8
  106. data/lib/rubocop/cop/legacy/corrector.rb +1 -3
  107. data/lib/rubocop/cop/lint/ambiguous_assignment.rb +1 -6
  108. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +14 -7
  109. data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -2
  110. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -2
  111. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +83 -41
  112. data/lib/rubocop/cop/lint/deprecated_constants.rb +3 -3
  113. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +2 -5
  114. data/lib/rubocop/cop/lint/duplicate_branch.rb +1 -2
  115. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -3
  116. data/lib/rubocop/cop/lint/duplicate_methods.rb +3 -7
  117. data/lib/rubocop/cop/lint/else_layout.rb +1 -3
  118. data/lib/rubocop/cop/lint/empty_block.rb +18 -2
  119. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -3
  120. data/lib/rubocop/cop/lint/empty_file.rb +1 -3
  121. data/lib/rubocop/cop/lint/empty_in_pattern.rb +62 -0
  122. data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -3
  123. data/lib/rubocop/cop/lint/ensure_return.rb +1 -3
  124. data/lib/rubocop/cop/lint/erb_new_arguments.rb +3 -7
  125. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -2
  126. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +3 -6
  127. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +1 -2
  128. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -2
  129. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +3 -7
  130. data/lib/rubocop/cop/lint/inherit_exception.rb +1 -2
  131. data/lib/rubocop/cop/lint/interpolation_check.rb +3 -11
  132. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +3 -6
  133. data/lib/rubocop/cop/lint/loop.rb +1 -2
  134. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +3 -7
  135. data/lib/rubocop/cop/lint/missing_super.rb +1 -2
  136. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -2
  137. data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -2
  138. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -3
  139. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +1 -3
  140. data/lib/rubocop/cop/lint/number_conversion.rb +2 -3
  141. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +1 -2
  142. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +1 -3
  143. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -3
  144. data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -3
  145. data/lib/rubocop/cop/lint/raise_exception.rb +1 -2
  146. data/lib/rubocop/cop/lint/rand_one.rb +1 -2
  147. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +18 -27
  148. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +1 -3
  149. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +3 -7
  150. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -2
  151. data/lib/rubocop/cop/lint/redundant_with_index.rb +1 -4
  152. data/lib/rubocop/cop/lint/redundant_with_object.rb +1 -4
  153. data/lib/rubocop/cop/lint/regexp_as_condition.rb +1 -3
  154. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -4
  155. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -2
  156. data/lib/rubocop/cop/lint/rescue_type.rb +2 -7
  157. data/lib/rubocop/cop/lint/return_in_void_context.rb +1 -2
  158. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +1 -2
  159. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +4 -10
  160. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -2
  161. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +2 -7
  162. data/lib/rubocop/cop/lint/shadowed_argument.rb +4 -11
  163. data/lib/rubocop/cop/lint/shadowed_exception.rb +7 -8
  164. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -2
  165. data/lib/rubocop/cop/lint/symbol_conversion.rb +4 -16
  166. data/lib/rubocop/cop/lint/syntax.rb +1 -3
  167. data/lib/rubocop/cop/lint/to_json.rb +1 -2
  168. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -3
  169. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +1 -3
  170. data/lib/rubocop/cop/lint/unreachable_code.rb +2 -5
  171. data/lib/rubocop/cop/lint/unreachable_loop.rb +14 -7
  172. data/lib/rubocop/cop/lint/unused_block_argument.rb +9 -7
  173. data/lib/rubocop/cop/lint/unused_method_argument.rb +1 -2
  174. data/lib/rubocop/cop/lint/useless_access_modifier.rb +2 -4
  175. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -9
  176. data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -3
  177. data/lib/rubocop/cop/lint/void.rb +5 -12
  178. data/lib/rubocop/cop/message_annotator.rb +1 -3
  179. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -7
  180. data/lib/rubocop/cop/metrics/class_length.rb +1 -3
  181. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -2
  182. data/lib/rubocop/cop/metrics/module_length.rb +2 -6
  183. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -5
  184. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -2
  185. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4 -7
  186. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +2 -7
  187. data/lib/rubocop/cop/migration/department_name.rb +3 -7
  188. data/lib/rubocop/cop/mixin/alignment.rb +2 -4
  189. data/lib/rubocop/cop/mixin/check_line_breakable.rb +19 -3
  190. data/lib/rubocop/cop/mixin/code_length.rb +1 -3
  191. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +2 -2
  192. data/lib/rubocop/cop/mixin/configurable_formatting.rb +3 -8
  193. data/lib/rubocop/cop/mixin/def_node.rb +2 -5
  194. data/lib/rubocop/cop/mixin/documentation_comment.rb +2 -5
  195. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +3 -7
  196. data/lib/rubocop/cop/mixin/empty_parameter.rb +1 -3
  197. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -3
  198. data/lib/rubocop/cop/mixin/enforce_superclass.rb +2 -6
  199. data/lib/rubocop/cop/mixin/first_element_line_break.rb +1 -3
  200. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +7 -7
  201. data/lib/rubocop/cop/mixin/gem_declaration.rb +13 -0
  202. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +17 -9
  203. data/lib/rubocop/cop/mixin/hash_transform_method.rb +7 -22
  204. data/lib/rubocop/cop/mixin/interpolation.rb +1 -3
  205. data/lib/rubocop/cop/mixin/line_length_help.rb +2 -4
  206. data/lib/rubocop/cop/mixin/match_range.rb +2 -5
  207. data/lib/rubocop/cop/mixin/method_complexity.rb +1 -3
  208. data/lib/rubocop/cop/mixin/method_preference.rb +1 -2
  209. data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +1 -2
  210. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +1 -3
  211. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -17
  212. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -2
  213. data/lib/rubocop/cop/mixin/negative_conditional.rb +1 -2
  214. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -4
  215. data/lib/rubocop/cop/mixin/percent_array.rb +1 -3
  216. data/lib/rubocop/cop/mixin/percent_literal.rb +0 -6
  217. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +5 -11
  218. data/lib/rubocop/cop/mixin/preferred_delimiters.rb +3 -6
  219. data/lib/rubocop/cop/mixin/range_help.rb +10 -13
  220. data/lib/rubocop/cop/mixin/rescue_node.rb +2 -6
  221. data/lib/rubocop/cop/mixin/safe_assignment.rb +1 -2
  222. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +2 -4
  223. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -2
  224. data/lib/rubocop/cop/mixin/statement_modifier.rb +1 -3
  225. data/lib/rubocop/cop/mixin/string_literals_help.rb +3 -5
  226. data/lib/rubocop/cop/mixin/symbol_help.rb +13 -0
  227. data/lib/rubocop/cop/mixin/trailing_body.rb +1 -2
  228. data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -2
  229. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +3 -7
  230. data/lib/rubocop/cop/mixin/unused_argument.rb +1 -3
  231. data/lib/rubocop/cop/naming/ascii_identifiers.rb +2 -4
  232. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -2
  233. data/lib/rubocop/cop/naming/file_name.rb +7 -16
  234. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -3
  235. data/lib/rubocop/cop/naming/method_name.rb +1 -2
  236. data/lib/rubocop/cop/naming/predicate_name.rb +1 -2
  237. data/lib/rubocop/cop/offense.rb +3 -8
  238. data/lib/rubocop/cop/registry.rb +3 -11
  239. data/lib/rubocop/cop/style/access_modifier_declarations.rb +1 -3
  240. data/lib/rubocop/cop/style/accessor_grouping.rb +1 -3
  241. data/lib/rubocop/cop/style/alias.rb +5 -12
  242. data/lib/rubocop/cop/style/arguments_forwarding.rb +1 -3
  243. data/lib/rubocop/cop/style/ascii_comments.rb +1 -2
  244. data/lib/rubocop/cop/style/attr.rb +1 -3
  245. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +2 -5
  246. data/lib/rubocop/cop/style/bisected_attr_accessor/macro.rb +1 -3
  247. data/lib/rubocop/cop/style/case_like_if.rb +1 -2
  248. data/lib/rubocop/cop/style/character_literal.rb +2 -4
  249. data/lib/rubocop/cop/style/class_and_module_children.rb +19 -10
  250. data/lib/rubocop/cop/style/class_methods.rb +1 -3
  251. data/lib/rubocop/cop/style/collection_compact.rb +1 -3
  252. data/lib/rubocop/cop/style/colon_method_call.rb +1 -3
  253. data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
  254. data/lib/rubocop/cop/style/command_literal.rb +3 -8
  255. data/lib/rubocop/cop/style/comment_annotation.rb +3 -6
  256. data/lib/rubocop/cop/style/commented_keyword.rb +2 -8
  257. data/lib/rubocop/cop/style/conditional_assignment.rb +10 -24
  258. data/lib/rubocop/cop/style/copyright.rb +3 -6
  259. data/lib/rubocop/cop/style/date_time.rb +2 -5
  260. data/lib/rubocop/cop/style/def_with_parentheses.rb +1 -2
  261. data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -2
  262. data/lib/rubocop/cop/style/empty_case_condition.rb +2 -7
  263. data/lib/rubocop/cop/style/empty_else.rb +3 -9
  264. data/lib/rubocop/cop/style/empty_literal.rb +12 -9
  265. data/lib/rubocop/cop/style/empty_method.rb +3 -7
  266. data/lib/rubocop/cop/style/end_block.rb +1 -2
  267. data/lib/rubocop/cop/style/endless_method.rb +1 -3
  268. data/lib/rubocop/cop/style/eval_with_location.rb +2 -4
  269. data/lib/rubocop/cop/style/expand_path_arguments.rb +1 -3
  270. data/lib/rubocop/cop/style/explicit_block_argument.rb +1 -4
  271. data/lib/rubocop/cop/style/format_string_token.rb +1 -4
  272. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -8
  273. data/lib/rubocop/cop/style/guard_clause.rb +3 -7
  274. data/lib/rubocop/cop/style/hash_conversion.rb +28 -3
  275. data/lib/rubocop/cop/style/hash_each_methods.rb +19 -3
  276. data/lib/rubocop/cop/style/hash_like_case.rb +1 -2
  277. data/lib/rubocop/cop/style/hash_syntax.rb +4 -9
  278. data/lib/rubocop/cop/style/identical_conditional_branches.rb +27 -8
  279. data/lib/rubocop/cop/style/if_unless_modifier.rb +40 -13
  280. data/lib/rubocop/cop/style/in_pattern_then.rb +56 -0
  281. data/lib/rubocop/cop/style/infinite_loop.rb +2 -5
  282. data/lib/rubocop/cop/style/inverse_methods.rb +3 -7
  283. data/lib/rubocop/cop/style/ip_addresses.rb +1 -2
  284. data/lib/rubocop/cop/style/lambda.rb +2 -4
  285. data/lib/rubocop/cop/style/lambda_call.rb +1 -2
  286. data/lib/rubocop/cop/style/line_end_concatenation.rb +5 -12
  287. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +1 -1
  288. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +7 -12
  289. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -2
  290. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -4
  291. data/lib/rubocop/cop/style/method_def_parentheses.rb +4 -8
  292. data/lib/rubocop/cop/style/min_max.rb +1 -2
  293. data/lib/rubocop/cop/style/missing_else.rb +2 -4
  294. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +1 -2
  295. data/lib/rubocop/cop/style/mixin_grouping.rb +4 -10
  296. data/lib/rubocop/cop/style/mixin_usage.rb +1 -2
  297. data/lib/rubocop/cop/style/module_function.rb +3 -6
  298. data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -2
  299. data/lib/rubocop/cop/style/multiline_in_pattern_then.rb +62 -0
  300. data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -3
  301. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +1 -2
  302. data/lib/rubocop/cop/style/multiline_when_then.rb +2 -11
  303. data/lib/rubocop/cop/style/multiple_comparison.rb +2 -4
  304. data/lib/rubocop/cop/style/mutable_constant.rb +4 -10
  305. data/lib/rubocop/cop/style/negated_if.rb +1 -2
  306. data/lib/rubocop/cop/style/negated_if_else_condition.rb +17 -9
  307. data/lib/rubocop/cop/style/negated_unless.rb +1 -2
  308. data/lib/rubocop/cop/style/nested_modifier.rb +3 -7
  309. data/lib/rubocop/cop/style/nested_ternary_operator.rb +2 -3
  310. data/lib/rubocop/cop/style/next.rb +4 -9
  311. data/lib/rubocop/cop/style/nil_lambda.rb +29 -12
  312. data/lib/rubocop/cop/style/non_nil_check.rb +2 -5
  313. data/lib/rubocop/cop/style/numeric_literals.rb +3 -11
  314. data/lib/rubocop/cop/style/numeric_predicate.rb +2 -7
  315. data/lib/rubocop/cop/style/one_line_conditional.rb +1 -2
  316. data/lib/rubocop/cop/style/option_hash.rb +1 -3
  317. data/lib/rubocop/cop/style/optional_arguments.rb +2 -5
  318. data/lib/rubocop/cop/style/or_assignment.rb +2 -6
  319. data/lib/rubocop/cop/style/parallel_assignment.rb +6 -9
  320. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -3
  321. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -2
  322. data/lib/rubocop/cop/style/perl_backrefs.rb +2 -9
  323. data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -4
  324. data/lib/rubocop/cop/style/proc.rb +1 -2
  325. data/lib/rubocop/cop/style/quoted_symbols.rb +110 -0
  326. data/lib/rubocop/cop/style/raise_args.rb +4 -8
  327. data/lib/rubocop/cop/style/random_with_offset.rb +3 -8
  328. data/lib/rubocop/cop/style/redundant_argument.rb +2 -11
  329. data/lib/rubocop/cop/style/redundant_assignment.rb +1 -3
  330. data/lib/rubocop/cop/style/redundant_begin.rb +4 -4
  331. data/lib/rubocop/cop/style/redundant_capital_w.rb +1 -2
  332. data/lib/rubocop/cop/style/redundant_condition.rb +2 -5
  333. data/lib/rubocop/cop/style/redundant_conditional.rb +3 -6
  334. data/lib/rubocop/cop/style/redundant_exception.rb +3 -6
  335. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
  336. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -2
  337. data/lib/rubocop/cop/style/redundant_interpolation.rb +1 -2
  338. data/lib/rubocop/cop/style/redundant_parentheses.rb +8 -20
  339. data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -2
  340. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -4
  341. data/lib/rubocop/cop/style/redundant_return.rb +3 -5
  342. data/lib/rubocop/cop/style/redundant_self.rb +25 -7
  343. data/lib/rubocop/cop/style/redundant_self_assignment.rb +2 -2
  344. data/lib/rubocop/cop/style/redundant_sort.rb +2 -5
  345. data/lib/rubocop/cop/style/regexp_literal.rb +4 -8
  346. data/lib/rubocop/cop/style/rescue_modifier.rb +4 -0
  347. data/lib/rubocop/cop/style/rescue_standard_error.rb +3 -7
  348. data/lib/rubocop/cop/style/return_nil.rb +1 -2
  349. data/lib/rubocop/cop/style/safe_navigation.rb +10 -21
  350. data/lib/rubocop/cop/style/send.rb +1 -2
  351. data/lib/rubocop/cop/style/signal_exception.rb +3 -7
  352. data/lib/rubocop/cop/style/single_argument_dig.rb +1 -2
  353. data/lib/rubocop/cop/style/single_line_block_params.rb +2 -5
  354. data/lib/rubocop/cop/style/single_line_methods.rb +20 -4
  355. data/lib/rubocop/cop/style/sole_nested_conditional.rb +15 -7
  356. data/lib/rubocop/cop/style/special_global_vars.rb +6 -18
  357. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -2
  358. data/lib/rubocop/cop/style/stderr_puts.rb +2 -6
  359. data/lib/rubocop/cop/style/string_chars.rb +2 -1
  360. data/lib/rubocop/cop/style/string_concatenation.rb +8 -10
  361. data/lib/rubocop/cop/style/string_literals.rb +3 -5
  362. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +1 -0
  363. data/lib/rubocop/cop/style/struct_inheritance.rb +9 -1
  364. data/lib/rubocop/cop/style/symbol_literal.rb +1 -3
  365. data/lib/rubocop/cop/style/symbol_proc.rb +4 -9
  366. data/lib/rubocop/cop/style/ternary_parentheses.rb +3 -6
  367. data/lib/rubocop/cop/style/top_level_method_definition.rb +83 -0
  368. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +1 -2
  369. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +2 -6
  370. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +2 -5
  371. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -10
  372. data/lib/rubocop/cop/style/trivial_accessors.rb +67 -4
  373. data/lib/rubocop/cop/style/unless_else.rb +1 -2
  374. data/lib/rubocop/cop/style/unless_logical_operators.rb +2 -2
  375. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
  376. data/lib/rubocop/cop/style/when_then.rb +4 -2
  377. data/lib/rubocop/cop/style/while_until_modifier.rb +1 -2
  378. data/lib/rubocop/cop/style/word_array.rb +1 -2
  379. data/lib/rubocop/cop/style/yoda_condition.rb +3 -11
  380. data/lib/rubocop/cop/style/zero_length_predicate.rb +1 -2
  381. data/lib/rubocop/cop/team.rb +2 -5
  382. data/lib/rubocop/cop/util.rb +4 -10
  383. data/lib/rubocop/cop/utils/format_string.rb +1 -3
  384. data/lib/rubocop/cop/variable_force.rb +6 -15
  385. data/lib/rubocop/cop/variable_force/assignment.rb +1 -2
  386. data/lib/rubocop/cop/variable_force/branch.rb +16 -2
  387. data/lib/rubocop/cop/variable_force/reference.rb +1 -3
  388. data/lib/rubocop/cop/variable_force/scope.rb +4 -8
  389. data/lib/rubocop/cop/variable_force/variable.rb +2 -4
  390. data/lib/rubocop/cops_documentation_generator.rb +7 -21
  391. data/lib/rubocop/directive_comment.rb +5 -1
  392. data/lib/rubocop/file_finder.rb +1 -3
  393. data/lib/rubocop/formatter/disabled_config_formatter.rb +3 -8
  394. data/lib/rubocop/formatter/git_hub_actions_formatter.rb +1 -5
  395. data/lib/rubocop/formatter/html_formatter.rb +4 -10
  396. data/lib/rubocop/formatter/json_formatter.rb +1 -5
  397. data/lib/rubocop/formatter/junit_formatter.rb +23 -14
  398. data/lib/rubocop/formatter/progress_formatter.rb +1 -3
  399. data/lib/rubocop/options.rb +30 -50
  400. data/lib/rubocop/path_util.rb +1 -3
  401. data/lib/rubocop/rake_task.rb +3 -0
  402. data/lib/rubocop/remote_config.rb +4 -7
  403. data/lib/rubocop/result_cache.rb +5 -12
  404. data/lib/rubocop/rspec/cop_helper.rb +1 -1
  405. data/lib/rubocop/rspec/expect_offense.rb +4 -9
  406. data/lib/rubocop/rspec/shared_contexts.rb +8 -15
  407. data/lib/rubocop/runner.rb +7 -14
  408. data/lib/rubocop/target_finder.rb +18 -16
  409. data/lib/rubocop/target_ruby.rb +4 -8
  410. data/lib/rubocop/version.rb +1 -1
  411. metadata +16 -7
  412. data/lib/rubocop/core_ext/hash.rb +0 -20
@@ -31,9 +31,7 @@ module RuboCop
31
31
  # See https://docs.rubocop.org/rubocop/configuration
32
32
  DESC
33
33
 
34
- File.open(DOTFILE, 'w') do |f|
35
- f.write(description)
36
- end
34
+ File.open(DOTFILE, 'w') { |f| f.write(description) }
37
35
 
38
36
  puts "Writing new #{DOTFILE} to #{path}"
39
37
 
@@ -26,10 +26,7 @@ module RuboCop
26
26
  registry = Cop::Registry.global
27
27
  show_all = @options[:show_cops].empty?
28
28
 
29
- if show_all
30
- puts "# Available cops (#{registry.length}) " \
31
- "+ config for #{Dir.pwd}: "
32
- end
29
+ puts "# Available cops (#{registry.length}) + config for #{Dir.pwd}: " if show_all
33
30
 
34
31
  registry.departments.sort!.each do |department|
35
32
  print_cops_of_department(registry, department, show_all)
@@ -25,16 +25,11 @@ module RuboCop
25
25
  end
26
26
 
27
27
  def extra_enabled_comments
28
- extra_enabled_comments_with_names(
29
- extras: Hash.new { |h, k| h[k] = [] },
30
- names: Hash.new(0)
31
- )
28
+ extra_enabled_comments_with_names(extras: Hash.new { |h, k| h[k] = [] }, names: Hash.new(0))
32
29
  end
33
30
 
34
31
  def comment_only_line?(line_number)
35
- non_comment_token_line_numbers.none? do |non_comment_line_number|
36
- non_comment_line_number == line_number
37
- end
32
+ non_comment_token_line_numbers.none?(line_number)
38
33
  end
39
34
 
40
35
  private
@@ -45,9 +45,7 @@ module RuboCop
45
45
  end
46
46
 
47
47
  def check
48
- deprecation_check do |deprecation_message|
49
- warn("#{loaded_path} - #{deprecation_message}")
50
- end
48
+ deprecation_check { |deprecation_message| warn("#{loaded_path} - #{deprecation_message}") }
51
49
  @validator.validate
52
50
  make_excludes_absolute
53
51
  self
@@ -67,8 +65,7 @@ module RuboCop
67
65
 
68
66
  # True if this is a config file that is shipped with RuboCop
69
67
  def internal?
70
- base_config_path = File.expand_path(File.join(ConfigLoader::RUBOCOP_HOME,
71
- 'config'))
68
+ base_config_path = File.expand_path(File.join(ConfigLoader::RUBOCOP_HOME, 'config'))
72
69
  File.expand_path(loaded_path).start_with?(base_config_path)
73
70
  end
74
71
 
@@ -79,8 +76,7 @@ module RuboCop
79
76
 
80
77
  self[key]['Exclude'].map! do |exclude_elem|
81
78
  if exclude_elem.is_a?(String) && !absolute?(exclude_elem)
82
- File.expand_path(File.join(base_dir_for_path_parameters,
83
- exclude_elem))
79
+ File.expand_path(File.join(base_dir_for_path_parameters, exclude_elem))
84
80
  else
85
81
  exclude_elem
86
82
  end
@@ -122,17 +118,14 @@ module RuboCop
122
118
  # Note: the 'Enabled' attribute is same as that returned by `for_cop`
123
119
  def for_badge(badge)
124
120
  cop_config = for_cop(badge.to_s)
125
- fetch(badge.department.to_s) { return cop_config }
126
- .merge(cop_config)
121
+ fetch(badge.department.to_s) { return cop_config }.merge(cop_config)
127
122
  end
128
123
 
129
124
  # @return [Config] for the given department name.
130
125
  # Note: the 'Enabled' attribute will be present only if specified
131
126
  # at the department's level
132
127
  def for_department(department_name)
133
- @for_department ||= Hash.new do |h, dept|
134
- h[dept] = self[dept] || {}
135
- end
128
+ @for_department ||= Hash.new { |h, dept| h[dept] = self[dept] || {} }
136
129
  @for_department[department_name.to_s]
137
130
  end
138
131
 
@@ -153,8 +146,7 @@ module RuboCop
153
146
 
154
147
  # Optimization to quickly decide if the given file is hidden (on the top
155
148
  # level) and cannot be matched by any pattern.
156
- is_hidden = relative_file_path.start_with?('.') &&
157
- !relative_file_path.start_with?('..')
149
+ is_hidden = relative_file_path.start_with?('.') && !relative_file_path.start_with?('..')
158
150
  return false if is_hidden && !possibly_include_hidden?
159
151
 
160
152
  absolute_file_path = File.expand_path(file)
@@ -163,8 +155,7 @@ module RuboCop
163
155
  if block_given?
164
156
  yield pattern, relative_file_path, absolute_file_path
165
157
  else
166
- match_path?(pattern, relative_file_path) ||
167
- match_path?(pattern, absolute_file_path)
158
+ match_path?(pattern, relative_file_path) || match_path?(pattern, absolute_file_path)
168
159
  end
169
160
  end
170
161
  end
@@ -177,8 +168,7 @@ module RuboCop
177
168
 
178
169
  file_to_include?(file) do |pattern, relative_path, absolute_path|
179
170
  /[A-Z]/.match?(pattern.to_s) &&
180
- (match_path?(pattern, relative_path) ||
181
- match_path?(pattern, absolute_path))
171
+ (match_path?(pattern, relative_path) || match_path?(pattern, absolute_path))
182
172
  end
183
173
  end
184
174
 
@@ -194,9 +184,7 @@ module RuboCop
194
184
 
195
185
  def file_to_exclude?(file)
196
186
  file = File.expand_path(file)
197
- patterns_to_exclude.any? do |pattern|
198
- match_path?(pattern, file)
199
- end
187
+ patterns_to_exclude.any? { |pattern| match_path?(pattern, file) }
200
188
  end
201
189
 
202
190
  def patterns_to_include
@@ -267,8 +255,7 @@ module RuboCop
267
255
  private
268
256
 
269
257
  def target_rails_version_from_bundler_lock_file
270
- @target_rails_version_from_bundler_lock_file ||=
271
- read_rails_version_from_bundler_lock_file
258
+ @target_rails_version_from_bundler_lock_file ||= read_rails_version_from_bundler_lock_file
272
259
  end
273
260
 
274
261
  def read_rails_version_from_bundler_lock_file
@@ -288,9 +275,7 @@ module RuboCop
288
275
  return true if cop_options['Enabled'] == true
289
276
 
290
277
  department = department_of(qualified_cop_name)
291
- cop_enabled = cop_options.fetch('Enabled') do
292
- !for_all_cops['DisabledByDefault']
293
- end
278
+ cop_enabled = cop_options.fetch('Enabled') { !for_all_cops['DisabledByDefault'] }
294
279
  return true if cop_enabled == 'override_department'
295
280
  return false if department && department['Enabled'] == false
296
281
 
@@ -22,8 +22,7 @@ module RuboCop
22
22
  class << self
23
23
  include FileFinder
24
24
 
25
- attr_accessor :debug, :ignore_parent_exclusion,
26
- :disable_pending_cops, :enable_pending_cops
25
+ attr_accessor :debug, :ignore_parent_exclusion, :disable_pending_cops, :enable_pending_cops
27
26
  attr_writer :default_configuration, :project_root
28
27
  attr_reader :loaded_features
29
28
 
@@ -58,9 +57,7 @@ module RuboCop
58
57
 
59
58
  def load_yaml_configuration(absolute_path)
60
59
  file_contents = read_file(absolute_path)
61
- yaml_code = Dir.chdir(File.dirname(absolute_path)) do
62
- ERB.new(file_contents).result
63
- end
60
+ yaml_code = Dir.chdir(File.dirname(absolute_path)) { ERB.new(file_contents).result }
64
61
  check_duplication(yaml_code, absolute_path)
65
62
  hash = yaml_safe_load(yaml_code, absolute_path) || {}
66
63
 
@@ -156,9 +153,7 @@ module RuboCop
156
153
 
157
154
  warn Rainbow(PENDING_BANNER).yellow
158
155
 
159
- pending_cops.each do |cop|
160
- warn_pending_cop cop
161
- end
156
+ pending_cops.each { |cop| warn_pending_cop cop }
162
157
 
163
158
  warn Rainbow('For more information: https://docs.rubocop.org/rubocop/versioning.html').yellow
164
159
  end
@@ -246,10 +241,9 @@ module RuboCop
246
241
  # stderr. Care is taken to use the standard OS exit code for a "file not
247
242
  # found" error.
248
243
  def read_file(absolute_path)
249
- IO.read(absolute_path, encoding: Encoding::UTF_8)
244
+ File.read(absolute_path, encoding: Encoding::UTF_8)
250
245
  rescue Errno::ENOENT
251
- raise ConfigNotFoundError,
252
- "Configuration file not found: #{absolute_path}"
246
+ raise ConfigNotFoundError, "Configuration file not found: #{absolute_path}"
253
247
  end
254
248
 
255
249
  def yaml_safe_load(yaml_code, filename)
@@ -37,16 +37,30 @@ module RuboCop
37
37
  inherit_mode: determine_inherit_mode(hash, k))
38
38
  end
39
39
  hash[k] = v
40
+ fix_include_paths(base_config.loaded_path, hash, path, k, v) if v.key?('Include')
40
41
  end
41
42
  end
42
43
  end
43
44
 
45
+ # When one .rubocop.yml file inherits from another .rubocop.yml file, the Include paths in the
46
+ # base configuration are relative to the directory where the base configuration file is. For the
47
+ # derived configuration, we need to make those paths relative to where the derived configuration
48
+ # file is.
49
+ def fix_include_paths(base_config_path, hash, path, key, value)
50
+ return unless File.basename(base_config_path).start_with?('.rubocop')
51
+
52
+ base_dir = File.dirname(base_config_path)
53
+ derived_dir = File.dirname(path)
54
+ hash[key]['Include'] = value['Include'].map do |include_path|
55
+ PathUtil.relative_path(File.join(base_dir, include_path), derived_dir)
56
+ end
57
+ end
58
+
44
59
  def resolve_inheritance_from_gems(hash)
45
60
  gems = hash.delete('inherit_gem')
46
61
  (gems || {}).each_pair do |gem_name, config_path|
47
62
  if gem_name == 'rubocop'
48
- raise ArgumentError,
49
- "can't inherit configuration from the rubocop gem"
63
+ raise ArgumentError, "can't inherit configuration from the rubocop gem"
50
64
  end
51
65
 
52
66
  hash['inherit_from'] = Array(hash['inherit_from'])
@@ -77,8 +91,7 @@ module RuboCop
77
91
  config = handle_disabled_by_default(config, default_configuration) if disabled_by_default
78
92
  override_enabled_for_disabled_departments(default_configuration, config)
79
93
 
80
- opts = { inherit_mode: config['inherit_mode'] || {},
81
- unset_nil: unset_nil }
94
+ opts = { inherit_mode: config['inherit_mode'] || {}, unset_nil: unset_nil }
82
95
  Config.new(merge(default_configuration, config, **opts), config_file)
83
96
  end
84
97
 
@@ -112,8 +125,7 @@ module RuboCop
112
125
  next unless key =~ %r{(.*)/.*}
113
126
 
114
127
  department = Regexp.last_match(1)
115
- next unless disabled?(derived_hash, department) ||
116
- disabled?(base_hash, department)
128
+ next unless disabled?(derived_hash, department) || disabled?(base_hash, department)
117
129
 
118
130
  # The `override_department` setting for the `Enabled` parameter is an
119
131
  # internal setting that's not documented in the manual. It will cause a
@@ -155,13 +167,10 @@ module RuboCop
155
167
  end
156
168
 
157
169
  def warn_on_duplicate_setting(base_hash, derived_hash, key, **opts)
158
- return unless duplicate_setting?(base_hash, derived_hash,
159
- key, opts[:inherited_file])
170
+ return unless duplicate_setting?(base_hash, derived_hash, key, opts[:inherited_file])
160
171
 
161
- inherit_mode = opts[:inherit_mode]['merge'] ||
162
- opts[:inherit_mode]['override']
163
- return if base_hash[key].is_a?(Array) &&
164
- inherit_mode && inherit_mode.include?(key)
172
+ inherit_mode = opts[:inherit_mode]['merge'] || opts[:inherit_mode]['override']
173
+ return if base_hash[key].is_a?(Array) && inherit_mode && inherit_mode.include?(key)
165
174
 
166
175
  puts "#{PathUtil.smart_path(opts[:file])}: " \
167
176
  "#{opts[:cop_name]}:#{key} overrides " \
@@ -251,8 +260,7 @@ module RuboCop
251
260
 
252
261
  File.join(gem_path, relative_config_path)
253
262
  rescue Gem::LoadError => e
254
- raise Gem::LoadError,
255
- "Unable to find gem #{gem_name}; is the gem installed? #{e}"
263
+ raise Gem::LoadError, "Unable to find gem #{gem_name}; is the gem installed? #{e}"
256
264
  end
257
265
  end
258
266
  end
@@ -17,8 +17,7 @@ module RuboCop
17
17
  end
18
18
 
19
19
  def message
20
- rule_message + "\n(obsolete configuration found in " \
21
- "#{smart_loaded_path}, please update it)"
20
+ rule_message + "\n(obsolete configuration found in #{smart_loaded_path}, please update it)"
22
21
  end
23
22
 
24
23
  # Cop rules currently can only be failures, not warnings
@@ -27,8 +27,7 @@ module RuboCop
27
27
 
28
28
  def options_config=(options_config)
29
29
  loaded_config = ConfigLoader.load_file(options_config)
30
- @options_config = ConfigLoader.merge_with_default(loaded_config,
31
- options_config)
30
+ @options_config = ConfigLoader.merge_with_default(loaded_config, options_config)
32
31
  end
33
32
 
34
33
  def force_default_config!
@@ -9,8 +9,7 @@ module RuboCop
9
9
  extend Forwardable
10
10
 
11
11
  # @api private
12
- COMMON_PARAMS = %w[Exclude Include Severity inherit_mode
13
- AutoCorrect StyleGuide Details].freeze
12
+ COMMON_PARAMS = %w[Exclude Include Severity inherit_mode AutoCorrect StyleGuide Details].freeze
14
13
  # @api private
15
14
  INTERNAL_PARAMS = %w[Description StyleGuide
16
15
  VersionAdded VersionChanged VersionRemoved
@@ -60,8 +59,7 @@ module RuboCop
60
59
  def validate_section_presence(name)
61
60
  return unless @config.key?(name) && @config[name].nil?
62
61
 
63
- raise ValidationError,
64
- "empty section #{name} found in #{smart_loaded_path}"
62
+ raise ValidationError, "empty section #{name} found in #{smart_loaded_path}"
65
63
  end
66
64
 
67
65
  private
@@ -123,8 +121,7 @@ module RuboCop
123
121
  syntax_config = @config['Lint/Syntax']
124
122
  default_config = ConfigLoader.default_configuration['Lint/Syntax']
125
123
 
126
- return unless syntax_config &&
127
- default_config.merge(syntax_config) != default_config
124
+ return unless syntax_config && default_config.merge(syntax_config) != default_config
128
125
 
129
126
  raise ValidationError,
130
127
  "configuration for Syntax cop found in #{smart_loaded_path}\n" \
@@ -133,8 +130,7 @@ module RuboCop
133
130
 
134
131
  def validate_new_cops_parameter
135
132
  new_cop_parameter = @config.for_all_cops['NewCops']
136
- return if new_cop_parameter.nil? ||
137
- NEW_COPS_VALUES.include?(new_cop_parameter)
133
+ return if new_cop_parameter.nil? || NEW_COPS_VALUES.include?(new_cop_parameter)
138
134
 
139
135
  message = "invalid #{new_cop_parameter} for `NewCops` found in" \
140
136
  "#{smart_loaded_path}\n" \
@@ -208,8 +204,7 @@ module RuboCop
208
204
  def reject_conflicting_safe_settings
209
205
  @config.each do |name, cop_config|
210
206
  next unless cop_config.is_a?(Hash)
211
- next unless cop_config['Safe'] == false &&
212
- cop_config['SafeAutoCorrect'] == true
207
+ next unless cop_config['Safe'] == false && cop_config['SafeAutoCorrect'] == true
213
208
 
214
209
  msg = 'Unsafe cops cannot have a safe auto-correction ' \
215
210
  "(section #{name} in #{smart_loaded_path})"
@@ -21,8 +21,7 @@ module RuboCop
21
21
  end
22
22
 
23
23
  def safe_autocorrect?
24
- cop_config.fetch('Safe', true) &&
25
- cop_config.fetch('SafeAutoCorrect', true)
24
+ cop_config.fetch('Safe', true) && cop_config.fetch('SafeAutoCorrect', true)
26
25
  end
27
26
 
28
27
  def autocorrect_enabled?
@@ -68,9 +67,7 @@ module RuboCop
68
67
  begin_of_first_line = range.begin_pos - range.column
69
68
  end_of_first_line = begin_of_first_line + range.source_line.length
70
69
 
71
- Parser::Source::Range.new(range.source_buffer,
72
- begin_of_first_line,
73
- end_of_first_line)
70
+ Parser::Source::Range.new(range.source_buffer, begin_of_first_line, end_of_first_line)
74
71
  end
75
72
 
76
73
  # Expand the given range to include all of any lines it covers. Does not
@@ -82,9 +79,7 @@ module RuboCop
82
79
  last_line_offset = last_line.length - range.last_column
83
80
  end_of_last_line = range.end_pos + last_line_offset
84
81
 
85
- Parser::Source::Range.new(range.source_buffer,
86
- begin_of_first_line,
87
- end_of_last_line)
82
+ Parser::Source::Range.new(range.source_buffer, begin_of_first_line, end_of_last_line)
88
83
  end
89
84
 
90
85
  def max_line_length
@@ -38,8 +38,7 @@ module RuboCop
38
38
  end
39
39
 
40
40
  def match?(other)
41
- cop_name == other.cop_name &&
42
- (!qualified? || department == other.department)
41
+ cop_name == other.cop_name && (!qualified? || department == other.department)
43
42
  end
44
43
 
45
44
  def to_s
@@ -187,8 +187,7 @@ module RuboCop
187
187
  def self.match?(given_names)
188
188
  return false unless given_names
189
189
 
190
- given_names.include?(cop_name) ||
191
- given_names.include?(department.to_s)
190
+ given_names.include?(cop_name) || given_names.include?(department.to_s)
192
191
  end
193
192
 
194
193
  def cop_name
@@ -206,13 +205,11 @@ module RuboCop
206
205
  end
207
206
 
208
207
  def config_to_allow_offenses
209
- Formatter::DisabledConfigFormatter
210
- .config_to_allow_offenses[cop_name] ||= {}
208
+ Formatter::DisabledConfigFormatter.config_to_allow_offenses[cop_name] ||= {}
211
209
  end
212
210
 
213
211
  def config_to_allow_offenses=(hash)
214
- Formatter::DisabledConfigFormatter.config_to_allow_offenses[cop_name] =
215
- hash
212
+ Formatter::DisabledConfigFormatter.config_to_allow_offenses[cop_name] = hash
216
213
  end
217
214
 
218
215
  def target_ruby_version
@@ -233,6 +230,11 @@ module RuboCop
233
230
  !relevant_file?(file)
234
231
  end
235
232
 
233
+ # There should be very limited reasons for a Cop to do it's own parsing
234
+ def parse(source, path = nil)
235
+ ProcessedSource.new(source, target_ruby_version, path)
236
+ end
237
+
236
238
  ### Persistence
237
239
 
238
240
  # Override if your cop should be called repeatedly for multiple investigations
@@ -83,8 +83,7 @@ module RuboCop
83
83
 
84
84
  def register_offense(node, gem_name, line_of_first_occurrence)
85
85
  line_range = node.loc.column...node.loc.last_column
86
- offense_location =
87
- source_range(processed_source.buffer, node.first_line, line_range)
86
+ offense_location = source_range(processed_source.buffer, node.first_line, line_range)
88
87
  message = format(
89
88
  MSG,
90
89
  gem_name: gem_name,
@@ -3,15 +3,24 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Bundler
6
- # Add a comment describing each gem in your Gemfile.
6
+ # Each gem in the Gemfile should have a comment explaining
7
+ # its purpose in the project, or the reason for its version
8
+ # or source.
7
9
  #
8
- # Optionally, the "OnlyFor" configuration
10
+ # The optional "OnlyFor" configuration array
9
11
  # can be used to only register offenses when the gems
10
12
  # use certain options or have version specifiers.
11
- # Add "version_specifiers" and/or the gem option names
12
- # you want to check.
13
13
  #
14
- # A useful use-case is to enforce a comment when using
14
+ # When "version_specifiers" is included, a comment
15
+ # will be enforced if the gem has any version specifier.
16
+ #
17
+ # When "restrictive_version_specifiers" is included, a comment
18
+ # will be enforced if the gem has a version specifier that
19
+ # holds back the version of the gem.
20
+ #
21
+ # For any other value in the array, a comment will be enforced for
22
+ # a gem if an option by the same name is present.
23
+ # A useful use case is to enforce a comment when using
15
24
  # options that change the source of a gem:
16
25
  #
17
26
  # - `bitbucket`
@@ -21,7 +30,8 @@ module RuboCop
21
30
  # - `source`
22
31
  #
23
32
  # For a full list of options supported by bundler,
24
- # you can check the https://bundler.io/man/gemfile.5.html[official documentation].
33
+ # see https://bundler.io/man/gemfile.5.html
34
+ # .
25
35
  #
26
36
  # @example OnlyFor: [] (default)
27
37
  # # bad
@@ -43,6 +53,18 @@ module RuboCop
43
53
  # # Version 2.1 introduces breaking change baz
44
54
  # gem 'foo', '< 2.1'
45
55
  #
56
+ # @example OnlyFor: ['restrictive_version_specifiers']
57
+ # # bad
58
+ #
59
+ # gem 'foo', '< 2.1'
60
+ #
61
+ # # good
62
+ #
63
+ # gem 'foo', '>= 1.0'
64
+ #
65
+ # # Version 2.1 introduces breaking change baz
66
+ # gem 'foo', '< 2.1'
67
+ #
46
68
  # @example OnlyFor: ['version_specifiers', 'github']
47
69
  # # bad
48
70
  #
@@ -60,15 +82,15 @@ module RuboCop
60
82
  #
61
83
  class GemComment < Base
62
84
  include DefNode
85
+ include GemDeclaration
63
86
 
64
87
  MSG = 'Missing gem description comment.'
65
88
  CHECKED_OPTIONS_CONFIG = 'OnlyFor'
66
89
  VERSION_SPECIFIERS_OPTION = 'version_specifiers'
90
+ RESTRICTIVE_VERSION_SPECIFIERS_OPTION = 'restrictive_version_specifiers'
91
+ RESTRICTIVE_VERSION_PATTERN = /<|~>/.freeze
67
92
  RESTRICT_ON_SEND = %i[gem].freeze
68
93
 
69
- # @!method gem_declaration?(node)
70
- def_node_matcher :gem_declaration?, '(send nil? :gem str ...)'
71
-
72
94
  def on_send(node)
73
95
  return unless gem_declaration?(node)
74
96
  return if ignored_gem?(node)
@@ -102,8 +124,7 @@ module RuboCop
102
124
  end
103
125
 
104
126
  def preceding_comment?(node1, node2)
105
- node1 && node2 && precede?(node2, node1) &&
106
- comment_line?(node2.loc.expression.source)
127
+ node1 && node2 && precede?(node2, node1) && comment_line?(node2.loc.expression.source)
107
128
  end
108
129
 
109
130
  def ignored_gem?(node)
@@ -114,6 +135,8 @@ module RuboCop
114
135
  def checked_options_present?(node)
115
136
  (cop_config[CHECKED_OPTIONS_CONFIG].include?(VERSION_SPECIFIERS_OPTION) &&
116
137
  version_specified_gem?(node)) ||
138
+ (cop_config[CHECKED_OPTIONS_CONFIG].include?(RESTRICTIVE_VERSION_SPECIFIERS_OPTION) &&
139
+ restrictive_version_specified_gem?(node)) ||
117
140
  contains_checked_options?(node)
118
141
  end
119
142
 
@@ -124,6 +147,15 @@ module RuboCop
124
147
  node.arguments[1]&.str_type?
125
148
  end
126
149
 
150
+ # Version specifications that restrict all updates going forward. This excludes versions
151
+ # like ">= 1.0" or "!= 2.0.3".
152
+ def restrictive_version_specified_gem?(node)
153
+ return unless version_specified_gem?(node)
154
+
155
+ node.arguments
156
+ .any? { |arg| arg&.str_type? && RESTRICTIVE_VERSION_PATTERN.match?(arg.to_s) }
157
+ end
158
+
127
159
  def contains_checked_options?(node)
128
160
  (Array(cop_config[CHECKED_OPTIONS_CONFIG]) & gem_options(node).map(&:to_s)).any?
129
161
  end