rubocop 1.10.0 → 1.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (487) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +15 -14
  3. data/assets/output.html.erb +1 -1
  4. data/config/default.yml +60 -3
  5. data/exe/rubocop +1 -3
  6. data/lib/rubocop.rb +6 -1
  7. data/lib/rubocop/cached_data.rb +1 -3
  8. data/lib/rubocop/cli.rb +4 -6
  9. data/lib/rubocop/cli/command/auto_genenerate_config.rb +9 -19
  10. data/lib/rubocop/cli/command/execute_runner.rb +1 -1
  11. data/lib/rubocop/cli/command/init_dotfile.rb +1 -3
  12. data/lib/rubocop/cli/command/show_cops.rb +1 -4
  13. data/lib/rubocop/cli/command/suggest_extensions.rb +3 -2
  14. data/lib/rubocop/comment_config.rb +45 -101
  15. data/lib/rubocop/config.rb +11 -26
  16. data/lib/rubocop/config_loader.rb +5 -11
  17. data/lib/rubocop/config_loader_resolver.rb +22 -14
  18. data/lib/rubocop/config_obsoletion/cop_rule.rb +1 -2
  19. data/lib/rubocop/config_store.rb +1 -2
  20. data/lib/rubocop/config_validator.rb +5 -10
  21. data/lib/rubocop/cop/autocorrect_logic.rb +3 -8
  22. data/lib/rubocop/cop/badge.rb +1 -2
  23. data/lib/rubocop/cop/base.rb +8 -6
  24. data/lib/rubocop/cop/bundler/duplicated_gem.rb +3 -3
  25. data/lib/rubocop/cop/bundler/gem_comment.rb +43 -10
  26. data/lib/rubocop/cop/bundler/gem_version.rb +99 -0
  27. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +1 -0
  28. data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -4
  29. data/lib/rubocop/cop/commissioner.rb +2 -8
  30. data/lib/rubocop/cop/cop.rb +4 -18
  31. data/lib/rubocop/cop/corrector.rb +1 -4
  32. data/lib/rubocop/cop/correctors/alignment_corrector.rb +6 -12
  33. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +2 -4
  34. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +1 -2
  35. data/lib/rubocop/cop/correctors/line_break_corrector.rb +3 -6
  36. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1 -3
  37. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +1 -3
  38. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -8
  39. data/lib/rubocop/cop/gemspec/date_assignment.rb +1 -0
  40. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +3 -2
  41. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +2 -4
  42. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +2 -0
  43. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +2 -0
  44. data/lib/rubocop/cop/generator.rb +3 -6
  45. data/lib/rubocop/cop/generator/configuration_injector.rb +1 -2
  46. data/lib/rubocop/cop/generator/require_file_injector.rb +2 -5
  47. data/lib/rubocop/cop/internal_affairs.rb +1 -0
  48. data/lib/rubocop/cop/internal_affairs/example_description.rb +7 -4
  49. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +3 -5
  50. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +3 -3
  51. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +151 -0
  52. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +2 -3
  53. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +3 -2
  54. data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +1 -0
  55. data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +1 -0
  56. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -0
  57. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +3 -0
  58. data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +5 -2
  59. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +3 -3
  60. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +12 -10
  61. data/lib/rubocop/cop/layout/argument_alignment.rb +8 -9
  62. data/lib/rubocop/cop/layout/array_alignment.rb +7 -6
  63. data/lib/rubocop/cop/layout/assignment_indentation.rb +8 -7
  64. data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -4
  65. data/lib/rubocop/cop/layout/block_alignment.rb +8 -19
  66. data/lib/rubocop/cop/layout/block_end_newline.rb +4 -8
  67. data/lib/rubocop/cop/layout/case_indentation.rb +1 -3
  68. data/lib/rubocop/cop/layout/class_structure.rb +5 -10
  69. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +18 -30
  70. data/lib/rubocop/cop/layout/comment_indentation.rb +17 -21
  71. data/lib/rubocop/cop/layout/def_end_alignment.rb +2 -6
  72. data/lib/rubocop/cop/layout/dot_position.rb +1 -3
  73. data/lib/rubocop/cop/layout/else_alignment.rb +10 -9
  74. data/lib/rubocop/cop/layout/empty_comment.rb +5 -12
  75. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +22 -8
  76. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +2 -6
  77. data/lib/rubocop/cop/layout/empty_lines.rb +1 -3
  78. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +8 -18
  79. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +2 -8
  80. data/lib/rubocop/cop/layout/end_alignment.rb +1 -2
  81. data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
  82. data/lib/rubocop/cop/layout/extra_spacing.rb +5 -9
  83. data/lib/rubocop/cop/layout/first_argument_indentation.rb +11 -5
  84. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +10 -8
  85. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -2
  86. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +24 -20
  87. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -2
  88. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -2
  89. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +1 -2
  90. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +6 -5
  91. data/lib/rubocop/cop/layout/hash_alignment.rb +3 -6
  92. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -9
  93. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -6
  94. data/lib/rubocop/cop/layout/indentation_consistency.rb +9 -6
  95. data/lib/rubocop/cop/layout/indentation_style.rb +25 -30
  96. data/lib/rubocop/cop/layout/indentation_width.rb +21 -11
  97. data/lib/rubocop/cop/layout/initial_indentation.rb +1 -4
  98. data/lib/rubocop/cop/layout/line_length.rb +4 -15
  99. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +1 -2
  100. data/lib/rubocop/cop/layout/multiline_block_layout.rb +7 -15
  101. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -2
  102. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -2
  103. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +22 -15
  104. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +10 -5
  105. data/lib/rubocop/cop/layout/parameter_alignment.rb +6 -5
  106. data/lib/rubocop/cop/layout/redundant_line_break.rb +137 -0
  107. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +3 -6
  108. data/lib/rubocop/cop/layout/single_line_block_chain.rb +53 -0
  109. data/lib/rubocop/cop/layout/space_after_colon.rb +1 -3
  110. data/lib/rubocop/cop/layout/space_after_method_name.rb +2 -4
  111. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +6 -14
  112. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +1 -2
  113. data/lib/rubocop/cop/layout/space_around_keyword.rb +3 -6
  114. data/lib/rubocop/cop/layout/space_around_operators.rb +4 -9
  115. data/lib/rubocop/cop/layout/space_before_block_braces.rb +2 -3
  116. data/lib/rubocop/cop/layout/space_before_brackets.rb +1 -3
  117. data/lib/rubocop/cop/layout/space_before_comment.rb +1 -3
  118. data/lib/rubocop/cop/layout/space_before_first_arg.rb +5 -11
  119. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +2 -4
  120. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +5 -10
  121. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +2 -7
  122. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +6 -11
  123. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +1 -2
  124. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +1 -2
  125. data/lib/rubocop/cop/legacy/corrections_proxy.rb +2 -8
  126. data/lib/rubocop/cop/legacy/corrector.rb +1 -3
  127. data/lib/rubocop/cop/lint/ambiguous_assignment.rb +1 -6
  128. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +14 -7
  129. data/lib/rubocop/cop/lint/big_decimal_new.rb +1 -0
  130. data/lib/rubocop/cop/lint/boolean_symbol.rb +2 -2
  131. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +2 -0
  132. data/lib/rubocop/cop/lint/constant_resolution.rb +2 -2
  133. data/lib/rubocop/cop/lint/debugger.rb +3 -1
  134. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +79 -41
  135. data/lib/rubocop/cop/lint/deprecated_constants.rb +3 -3
  136. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +3 -5
  137. data/lib/rubocop/cop/lint/duplicate_branch.rb +2 -3
  138. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -3
  139. data/lib/rubocop/cop/lint/duplicate_methods.rb +6 -7
  140. data/lib/rubocop/cop/lint/duplicate_require.rb +1 -0
  141. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -0
  142. data/lib/rubocop/cop/lint/else_layout.rb +1 -3
  143. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -3
  144. data/lib/rubocop/cop/lint/empty_file.rb +1 -3
  145. data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -3
  146. data/lib/rubocop/cop/lint/ensure_return.rb +1 -3
  147. data/lib/rubocop/cop/lint/erb_new_arguments.rb +4 -7
  148. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -2
  149. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +4 -6
  150. data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +1 -0
  151. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +1 -2
  152. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -2
  153. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +4 -7
  154. data/lib/rubocop/cop/lint/inherit_exception.rb +2 -2
  155. data/lib/rubocop/cop/lint/interpolation_check.rb +3 -11
  156. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +3 -6
  157. data/lib/rubocop/cop/lint/loop.rb +1 -2
  158. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +3 -7
  159. data/lib/rubocop/cop/lint/missing_super.rb +1 -2
  160. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -2
  161. data/lib/rubocop/cop/lint/multiple_comparison.rb +1 -0
  162. data/lib/rubocop/cop/lint/nested_method_definition.rb +4 -2
  163. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -3
  164. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -0
  165. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +8 -3
  166. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -0
  167. data/lib/rubocop/cop/lint/number_conversion.rb +13 -5
  168. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +1 -2
  169. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +1 -3
  170. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -3
  171. data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -3
  172. data/lib/rubocop/cop/lint/raise_exception.rb +3 -2
  173. data/lib/rubocop/cop/lint/rand_one.rb +2 -2
  174. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +9 -22
  175. data/lib/rubocop/cop/lint/redundant_require_statement.rb +1 -0
  176. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +2 -3
  177. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +5 -7
  178. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
  179. data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -4
  180. data/lib/rubocop/cop/lint/redundant_with_object.rb +2 -4
  181. data/lib/rubocop/cop/lint/regexp_as_condition.rb +1 -3
  182. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -4
  183. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -2
  184. data/lib/rubocop/cop/lint/rescue_type.rb +2 -7
  185. data/lib/rubocop/cop/lint/return_in_void_context.rb +1 -2
  186. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +2 -2
  187. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +4 -10
  188. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +2 -2
  189. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +3 -7
  190. data/lib/rubocop/cop/lint/shadowed_argument.rb +5 -11
  191. data/lib/rubocop/cop/lint/shadowed_exception.rb +7 -8
  192. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +1 -0
  193. data/lib/rubocop/cop/lint/struct_new_override.rb +2 -2
  194. data/lib/rubocop/cop/lint/suppressed_exception.rb +44 -1
  195. data/lib/rubocop/cop/lint/symbol_conversion.rb +91 -6
  196. data/lib/rubocop/cop/lint/syntax.rb +1 -3
  197. data/lib/rubocop/cop/lint/to_enum_arguments.rb +3 -0
  198. data/lib/rubocop/cop/lint/to_json.rb +1 -2
  199. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -3
  200. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +1 -3
  201. data/lib/rubocop/cop/lint/unified_integer.rb +1 -0
  202. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +5 -0
  203. data/lib/rubocop/cop/lint/unreachable_code.rb +3 -5
  204. data/lib/rubocop/cop/lint/unreachable_loop.rb +15 -7
  205. data/lib/rubocop/cop/lint/unused_block_argument.rb +9 -7
  206. data/lib/rubocop/cop/lint/unused_method_argument.rb +2 -2
  207. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -0
  208. data/lib/rubocop/cop/lint/useless_access_modifier.rb +6 -4
  209. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -9
  210. data/lib/rubocop/cop/lint/useless_setter_call.rb +2 -3
  211. data/lib/rubocop/cop/lint/useless_times.rb +3 -0
  212. data/lib/rubocop/cop/lint/void.rb +4 -11
  213. data/lib/rubocop/cop/message_annotator.rb +1 -3
  214. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -7
  215. data/lib/rubocop/cop/metrics/class_length.rb +1 -3
  216. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -2
  217. data/lib/rubocop/cop/metrics/module_length.rb +3 -6
  218. data/lib/rubocop/cop/metrics/parameter_lists.rb +3 -5
  219. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -2
  220. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4 -7
  221. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +6 -4
  222. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +4 -7
  223. data/lib/rubocop/cop/migration/department_name.rb +3 -7
  224. data/lib/rubocop/cop/mixin/alignment.rb +12 -7
  225. data/lib/rubocop/cop/mixin/check_line_breakable.rb +1 -1
  226. data/lib/rubocop/cop/mixin/code_length.rb +1 -3
  227. data/lib/rubocop/cop/mixin/comments_help.rb +5 -1
  228. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +2 -2
  229. data/lib/rubocop/cop/mixin/configurable_formatting.rb +3 -8
  230. data/lib/rubocop/cop/mixin/def_node.rb +3 -5
  231. data/lib/rubocop/cop/mixin/documentation_comment.rb +3 -6
  232. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +6 -7
  233. data/lib/rubocop/cop/mixin/empty_parameter.rb +2 -3
  234. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -3
  235. data/lib/rubocop/cop/mixin/enforce_superclass.rb +4 -6
  236. data/lib/rubocop/cop/mixin/first_element_line_break.rb +1 -3
  237. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +3 -9
  238. data/lib/rubocop/cop/mixin/gem_declaration.rb +13 -0
  239. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +3 -6
  240. data/lib/rubocop/cop/mixin/hash_transform_method.rb +8 -22
  241. data/lib/rubocop/cop/mixin/interpolation.rb +1 -3
  242. data/lib/rubocop/cop/mixin/line_length_help.rb +13 -10
  243. data/lib/rubocop/cop/mixin/match_range.rb +2 -5
  244. data/lib/rubocop/cop/mixin/method_complexity.rb +2 -3
  245. data/lib/rubocop/cop/mixin/method_preference.rb +1 -2
  246. data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +4 -3
  247. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +1 -3
  248. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +11 -40
  249. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -2
  250. data/lib/rubocop/cop/mixin/negative_conditional.rb +4 -2
  251. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -4
  252. data/lib/rubocop/cop/mixin/percent_array.rb +1 -3
  253. data/lib/rubocop/cop/mixin/percent_literal.rb +0 -6
  254. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +5 -11
  255. data/lib/rubocop/cop/mixin/preferred_delimiters.rb +4 -7
  256. data/lib/rubocop/cop/mixin/range_help.rb +10 -13
  257. data/lib/rubocop/cop/mixin/rational_literal.rb +1 -0
  258. data/lib/rubocop/cop/mixin/rescue_node.rb +2 -6
  259. data/lib/rubocop/cop/mixin/safe_assignment.rb +6 -2
  260. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +2 -4
  261. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -2
  262. data/lib/rubocop/cop/mixin/statement_modifier.rb +1 -3
  263. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  264. data/lib/rubocop/cop/mixin/trailing_body.rb +1 -2
  265. data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -2
  266. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +7 -13
  267. data/lib/rubocop/cop/mixin/unused_argument.rb +1 -3
  268. data/lib/rubocop/cop/mixin/visibility_help.rb +1 -0
  269. data/lib/rubocop/cop/naming/ascii_identifiers.rb +2 -4
  270. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +2 -2
  271. data/lib/rubocop/cop/naming/constant_name.rb +2 -0
  272. data/lib/rubocop/cop/naming/file_name.rb +7 -16
  273. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +8 -3
  274. data/lib/rubocop/cop/naming/method_name.rb +4 -2
  275. data/lib/rubocop/cop/naming/predicate_name.rb +2 -2
  276. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +10 -0
  277. data/lib/rubocop/cop/offense.rb +3 -8
  278. data/lib/rubocop/cop/registry.rb +12 -11
  279. data/lib/rubocop/cop/security/eval.rb +1 -0
  280. data/lib/rubocop/cop/security/json_load.rb +1 -0
  281. data/lib/rubocop/cop/security/marshal_load.rb +1 -0
  282. data/lib/rubocop/cop/security/open.rb +1 -0
  283. data/lib/rubocop/cop/security/yaml_load.rb +1 -0
  284. data/lib/rubocop/cop/style/access_modifier_declarations.rb +4 -5
  285. data/lib/rubocop/cop/style/accessor_grouping.rb +1 -3
  286. data/lib/rubocop/cop/style/alias.rb +6 -12
  287. data/lib/rubocop/cop/style/and_or.rb +3 -1
  288. data/lib/rubocop/cop/style/arguments_forwarding.rb +4 -3
  289. data/lib/rubocop/cop/style/array_coercion.rb +2 -0
  290. data/lib/rubocop/cop/style/array_join.rb +1 -0
  291. data/lib/rubocop/cop/style/ascii_comments.rb +1 -2
  292. data/lib/rubocop/cop/style/attr.rb +2 -3
  293. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +2 -5
  294. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +59 -71
  295. data/lib/rubocop/cop/style/bisected_attr_accessor/macro.rb +60 -0
  296. data/lib/rubocop/cop/style/case_equality.rb +2 -1
  297. data/lib/rubocop/cop/style/case_like_if.rb +16 -6
  298. data/lib/rubocop/cop/style/character_literal.rb +2 -4
  299. data/lib/rubocop/cop/style/class_and_module_children.rb +6 -9
  300. data/lib/rubocop/cop/style/class_equality_comparison.rb +3 -0
  301. data/lib/rubocop/cop/style/class_methods.rb +1 -3
  302. data/lib/rubocop/cop/style/collection_compact.rb +3 -3
  303. data/lib/rubocop/cop/style/colon_method_call.rb +2 -3
  304. data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
  305. data/lib/rubocop/cop/style/command_literal.rb +4 -9
  306. data/lib/rubocop/cop/style/comment_annotation.rb +3 -6
  307. data/lib/rubocop/cop/style/commented_keyword.rb +7 -13
  308. data/lib/rubocop/cop/style/conditional_assignment.rb +12 -24
  309. data/lib/rubocop/cop/style/constant_visibility.rb +1 -0
  310. data/lib/rubocop/cop/style/copyright.rb +3 -6
  311. data/lib/rubocop/cop/style/date_time.rb +5 -5
  312. data/lib/rubocop/cop/style/def_with_parentheses.rb +1 -2
  313. data/lib/rubocop/cop/style/dir.rb +1 -0
  314. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +2 -2
  315. data/lib/rubocop/cop/style/documentation.rb +30 -3
  316. data/lib/rubocop/cop/style/documentation_method.rb +1 -0
  317. data/lib/rubocop/cop/style/double_negation.rb +1 -0
  318. data/lib/rubocop/cop/style/each_for_simple_loop.rb +2 -2
  319. data/lib/rubocop/cop/style/each_with_object.rb +1 -0
  320. data/lib/rubocop/cop/style/empty_case_condition.rb +2 -7
  321. data/lib/rubocop/cop/style/empty_else.rb +3 -9
  322. data/lib/rubocop/cop/style/empty_literal.rb +13 -8
  323. data/lib/rubocop/cop/style/empty_method.rb +3 -7
  324. data/lib/rubocop/cop/style/end_block.rb +1 -2
  325. data/lib/rubocop/cop/style/endless_method.rb +2 -3
  326. data/lib/rubocop/cop/style/eval_with_location.rb +5 -5
  327. data/lib/rubocop/cop/style/even_odd.rb +1 -0
  328. data/lib/rubocop/cop/style/expand_path_arguments.rb +4 -3
  329. data/lib/rubocop/cop/style/explicit_block_argument.rb +2 -4
  330. data/lib/rubocop/cop/style/float_division.rb +4 -0
  331. data/lib/rubocop/cop/style/format_string.rb +2 -0
  332. data/lib/rubocop/cop/style/format_string_token.rb +2 -4
  333. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -11
  334. data/lib/rubocop/cop/style/global_std_stream.rb +1 -0
  335. data/lib/rubocop/cop/style/guard_clause.rb +3 -7
  336. data/lib/rubocop/cop/style/hash_conversion.rb +57 -5
  337. data/lib/rubocop/cop/style/hash_each_methods.rb +2 -2
  338. data/lib/rubocop/cop/style/hash_except.rb +1 -0
  339. data/lib/rubocop/cop/style/hash_like_case.rb +2 -2
  340. data/lib/rubocop/cop/style/hash_syntax.rb +20 -24
  341. data/lib/rubocop/cop/style/hash_transform_keys.rb +4 -0
  342. data/lib/rubocop/cop/style/hash_transform_values.rb +4 -0
  343. data/lib/rubocop/cop/style/identical_conditional_branches.rb +1 -3
  344. data/lib/rubocop/cop/style/if_unless_modifier.rb +40 -13
  345. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +2 -0
  346. data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -0
  347. data/lib/rubocop/cop/style/infinite_loop.rb +2 -5
  348. data/lib/rubocop/cop/style/inverse_methods.rb +5 -7
  349. data/lib/rubocop/cop/style/ip_addresses.rb +1 -2
  350. data/lib/rubocop/cop/style/lambda.rb +2 -4
  351. data/lib/rubocop/cop/style/lambda_call.rb +1 -2
  352. data/lib/rubocop/cop/style/line_end_concatenation.rb +5 -12
  353. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +47 -3
  354. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +26 -16
  355. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -2
  356. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -4
  357. data/lib/rubocop/cop/style/method_def_parentheses.rb +4 -8
  358. data/lib/rubocop/cop/style/min_max.rb +2 -2
  359. data/lib/rubocop/cop/style/missing_else.rb +2 -4
  360. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +1 -2
  361. data/lib/rubocop/cop/style/mixin_grouping.rb +4 -10
  362. data/lib/rubocop/cop/style/mixin_usage.rb +3 -2
  363. data/lib/rubocop/cop/style/module_function.rb +8 -6
  364. data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -2
  365. data/lib/rubocop/cop/style/multiline_method_signature.rb +11 -6
  366. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +1 -2
  367. data/lib/rubocop/cop/style/multiple_comparison.rb +22 -5
  368. data/lib/rubocop/cop/style/mutable_constant.rb +7 -10
  369. data/lib/rubocop/cop/style/negated_if.rb +1 -2
  370. data/lib/rubocop/cop/style/negated_if_else_condition.rb +24 -2
  371. data/lib/rubocop/cop/style/negated_unless.rb +1 -2
  372. data/lib/rubocop/cop/style/nested_modifier.rb +3 -7
  373. data/lib/rubocop/cop/style/nested_ternary_operator.rb +2 -3
  374. data/lib/rubocop/cop/style/next.rb +4 -9
  375. data/lib/rubocop/cop/style/nil_comparison.rb +3 -0
  376. data/lib/rubocop/cop/style/nil_lambda.rb +1 -0
  377. data/lib/rubocop/cop/style/non_nil_check.rb +9 -5
  378. data/lib/rubocop/cop/style/numeric_literals.rb +3 -11
  379. data/lib/rubocop/cop/style/numeric_predicate.rb +5 -7
  380. data/lib/rubocop/cop/style/one_line_conditional.rb +1 -2
  381. data/lib/rubocop/cop/style/option_hash.rb +2 -3
  382. data/lib/rubocop/cop/style/optional_arguments.rb +2 -5
  383. data/lib/rubocop/cop/style/or_assignment.rb +4 -6
  384. data/lib/rubocop/cop/style/parallel_assignment.rb +12 -9
  385. data/lib/rubocop/cop/style/parentheses_around_condition.rb +1 -0
  386. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -3
  387. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -2
  388. data/lib/rubocop/cop/style/perl_backrefs.rb +2 -9
  389. data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -4
  390. data/lib/rubocop/cop/style/proc.rb +2 -2
  391. data/lib/rubocop/cop/style/raise_args.rb +4 -8
  392. data/lib/rubocop/cop/style/random_with_offset.rb +8 -8
  393. data/lib/rubocop/cop/style/redundant_argument.rb +2 -11
  394. data/lib/rubocop/cop/style/redundant_assignment.rb +2 -3
  395. data/lib/rubocop/cop/style/redundant_begin.rb +47 -7
  396. data/lib/rubocop/cop/style/redundant_capital_w.rb +1 -2
  397. data/lib/rubocop/cop/style/redundant_condition.rb +2 -5
  398. data/lib/rubocop/cop/style/redundant_conditional.rb +5 -6
  399. data/lib/rubocop/cop/style/redundant_exception.rb +5 -6
  400. data/lib/rubocop/cop/style/redundant_fetch_block.rb +2 -0
  401. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +2 -1
  402. data/lib/rubocop/cop/style/redundant_freeze.rb +2 -2
  403. data/lib/rubocop/cop/style/redundant_interpolation.rb +1 -2
  404. data/lib/rubocop/cop/style/redundant_parentheses.rb +21 -20
  405. data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -2
  406. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -4
  407. data/lib/rubocop/cop/style/redundant_return.rb +6 -4
  408. data/lib/rubocop/cop/style/redundant_self.rb +9 -9
  409. data/lib/rubocop/cop/style/redundant_self_assignment.rb +4 -2
  410. data/lib/rubocop/cop/style/redundant_sort.rb +3 -5
  411. data/lib/rubocop/cop/style/redundant_sort_by.rb +1 -0
  412. data/lib/rubocop/cop/style/regexp_literal.rb +4 -8
  413. data/lib/rubocop/cop/style/rescue_modifier.rb +21 -14
  414. data/lib/rubocop/cop/style/rescue_standard_error.rb +5 -7
  415. data/lib/rubocop/cop/style/return_nil.rb +7 -2
  416. data/lib/rubocop/cop/style/safe_navigation.rb +12 -21
  417. data/lib/rubocop/cop/style/sample.rb +1 -0
  418. data/lib/rubocop/cop/style/send.rb +1 -2
  419. data/lib/rubocop/cop/style/signal_exception.rb +6 -7
  420. data/lib/rubocop/cop/style/single_argument_dig.rb +2 -2
  421. data/lib/rubocop/cop/style/single_line_block_params.rb +2 -5
  422. data/lib/rubocop/cop/style/single_line_methods.rb +21 -4
  423. data/lib/rubocop/cop/style/slicing_with_range.rb +1 -0
  424. data/lib/rubocop/cop/style/sole_nested_conditional.rb +31 -7
  425. data/lib/rubocop/cop/style/special_global_vars.rb +6 -18
  426. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -2
  427. data/lib/rubocop/cop/style/stderr_puts.rb +3 -6
  428. data/lib/rubocop/cop/style/string_chars.rb +39 -0
  429. data/lib/rubocop/cop/style/string_concatenation.rb +9 -10
  430. data/lib/rubocop/cop/style/string_hash_keys.rb +2 -0
  431. data/lib/rubocop/cop/style/string_literals.rb +2 -5
  432. data/lib/rubocop/cop/style/strip.rb +1 -0
  433. data/lib/rubocop/cop/style/struct_inheritance.rb +11 -0
  434. data/lib/rubocop/cop/style/symbol_literal.rb +1 -3
  435. data/lib/rubocop/cop/style/symbol_proc.rb +29 -10
  436. data/lib/rubocop/cop/style/ternary_parentheses.rb +4 -6
  437. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +6 -2
  438. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +2 -6
  439. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +3 -6
  440. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -10
  441. data/lib/rubocop/cop/style/trivial_accessors.rb +3 -4
  442. data/lib/rubocop/cop/style/unless_else.rb +1 -2
  443. data/lib/rubocop/cop/style/unless_logical_operators.rb +105 -0
  444. data/lib/rubocop/cop/style/unpack_first.rb +1 -0
  445. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
  446. data/lib/rubocop/cop/style/when_then.rb +1 -3
  447. data/lib/rubocop/cop/style/while_until_modifier.rb +1 -2
  448. data/lib/rubocop/cop/style/word_array.rb +1 -2
  449. data/lib/rubocop/cop/style/yoda_condition.rb +4 -11
  450. data/lib/rubocop/cop/style/zero_length_predicate.rb +6 -2
  451. data/lib/rubocop/cop/team.rb +2 -5
  452. data/lib/rubocop/cop/util.rb +8 -11
  453. data/lib/rubocop/cop/utils/format_string.rb +1 -3
  454. data/lib/rubocop/cop/variable_force.rb +6 -15
  455. data/lib/rubocop/cop/variable_force/assignment.rb +1 -2
  456. data/lib/rubocop/cop/variable_force/branch.rb +16 -2
  457. data/lib/rubocop/cop/variable_force/reference.rb +1 -3
  458. data/lib/rubocop/cop/variable_force/scope.rb +4 -8
  459. data/lib/rubocop/cop/variable_force/variable.rb +2 -4
  460. data/lib/rubocop/cops_documentation_generator.rb +7 -21
  461. data/lib/rubocop/directive_comment.rb +69 -9
  462. data/lib/rubocop/ext/regexp_parser.rb +3 -6
  463. data/lib/rubocop/file_finder.rb +1 -3
  464. data/lib/rubocop/formatter/clang_style_formatter.rb +4 -2
  465. data/lib/rubocop/formatter/disabled_config_formatter.rb +3 -8
  466. data/lib/rubocop/formatter/git_hub_actions_formatter.rb +1 -5
  467. data/lib/rubocop/formatter/html_formatter.rb +4 -10
  468. data/lib/rubocop/formatter/json_formatter.rb +1 -5
  469. data/lib/rubocop/formatter/junit_formatter.rb +3 -9
  470. data/lib/rubocop/formatter/progress_formatter.rb +1 -3
  471. data/lib/rubocop/formatter/tap_formatter.rb +4 -2
  472. data/lib/rubocop/magic_comment.rb +1 -1
  473. data/lib/rubocop/name_similarity.rb +1 -1
  474. data/lib/rubocop/options.rb +27 -41
  475. data/lib/rubocop/path_util.rb +1 -3
  476. data/lib/rubocop/rake_task.rb +3 -0
  477. data/lib/rubocop/remote_config.rb +4 -7
  478. data/lib/rubocop/result_cache.rb +5 -12
  479. data/lib/rubocop/rspec/cop_helper.rb +1 -1
  480. data/lib/rubocop/rspec/expect_offense.rb +4 -9
  481. data/lib/rubocop/rspec/shared_contexts.rb +8 -15
  482. data/lib/rubocop/runner.rb +7 -14
  483. data/lib/rubocop/target_finder.rb +19 -16
  484. data/lib/rubocop/target_ruby.rb +25 -21
  485. data/lib/rubocop/version.rb +1 -1
  486. metadata +18 -11
  487. data/lib/rubocop/core_ext/hash.rb +0 -20
@@ -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
@@ -30,7 +30,7 @@ module RuboCop
30
30
  # if Dir.exist?(local)
31
31
  # gem 'rubocop', path: local
32
32
  # elsif ENV['RUBOCOP_VERSION'] == 'master'
33
- # gem 'rubocop', git: 'https://github.com/rubocop-hq/rubocop.git'
33
+ # gem 'rubocop', git: 'https://github.com/rubocop/rubocop.git'
34
34
  # else
35
35
  # gem 'rubocop', '~> 0.90.0'
36
36
  # end
@@ -57,6 +57,7 @@ module RuboCop
57
57
 
58
58
  private
59
59
 
60
+ # @!method gem_declarations(node)
60
61
  def_node_search :gem_declarations, '(send nil? :gem str ...)'
61
62
 
62
63
  def duplicated_gem_nodes
@@ -82,8 +83,7 @@ module RuboCop
82
83
 
83
84
  def register_offense(node, gem_name, line_of_first_occurrence)
84
85
  line_range = node.loc.column...node.loc.last_column
85
- offense_location =
86
- source_range(processed_source.buffer, node.first_line, line_range)
86
+ offense_location = source_range(processed_source.buffer, node.first_line, line_range)
87
87
  message = format(
88
88
  MSG,
89
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,14 +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
- def_node_matcher :gem_declaration?, '(send nil? :gem str ...)'
70
-
71
94
  def on_send(node)
72
95
  return unless gem_declaration?(node)
73
96
  return if ignored_gem?(node)
@@ -101,8 +124,7 @@ module RuboCop
101
124
  end
102
125
 
103
126
  def preceding_comment?(node1, node2)
104
- node1 && node2 && precede?(node2, node1) &&
105
- comment_line?(node2.loc.expression.source)
127
+ node1 && node2 && precede?(node2, node1) && comment_line?(node2.loc.expression.source)
106
128
  end
107
129
 
108
130
  def ignored_gem?(node)
@@ -113,6 +135,8 @@ module RuboCop
113
135
  def checked_options_present?(node)
114
136
  (cop_config[CHECKED_OPTIONS_CONFIG].include?(VERSION_SPECIFIERS_OPTION) &&
115
137
  version_specified_gem?(node)) ||
138
+ (cop_config[CHECKED_OPTIONS_CONFIG].include?(RESTRICTIVE_VERSION_SPECIFIERS_OPTION) &&
139
+ restrictive_version_specified_gem?(node)) ||
116
140
  contains_checked_options?(node)
117
141
  end
118
142
 
@@ -123,6 +147,15 @@ module RuboCop
123
147
  node.arguments[1]&.str_type?
124
148
  end
125
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
+
126
159
  def contains_checked_options?(node)
127
160
  (Array(cop_config[CHECKED_OPTIONS_CONFIG]) & gem_options(node).map(&:to_s)).any?
128
161
  end
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Bundler
6
+ # Enforce that Gem version specifications are either required
7
+ # or forbidden.
8
+ #
9
+ # @example EnforcedStyle: required (default)
10
+ # # bad
11
+ # gem 'rubocop'
12
+ #
13
+ # # good
14
+ # gem 'rubocop', '~> 1.12'
15
+ #
16
+ # # good
17
+ # gem 'rubocop', '>= 1.10.0'
18
+ #
19
+ # # good
20
+ # gem 'rubocop', '>= 1.5.0', '< 1.10.0'
21
+ #
22
+ # @example EnforcedStyle: forbidden
23
+ # # good
24
+ # gem 'rubocop'
25
+ #
26
+ # # bad
27
+ # gem 'rubocop', '~> 1.12'
28
+ #
29
+ # # bad
30
+ # gem 'rubocop', '>= 1.10.0'
31
+ #
32
+ # # bad
33
+ # gem 'rubocop', '>= 1.5.0', '< 1.10.0'
34
+ #
35
+ class GemVersion < Base
36
+ include ConfigurableEnforcedStyle
37
+ include GemDeclaration
38
+
39
+ REQUIRED_MSG = 'Gem version specification is required.'
40
+ FORBIDDEN_MSG = 'Gem version specification is forbidden.'
41
+ VERSION_SPECIFICATION_REGEX = /^\s*[~<>=]*\s*[0-9.]+/.freeze
42
+
43
+ # @!method includes_version_specification?(node)
44
+ def_node_matcher :includes_version_specification?, <<~PATTERN
45
+ (send nil? :gem <(str #version_specification?) ...>)
46
+ PATTERN
47
+
48
+ def on_send(node)
49
+ return unless gem_declaration?(node)
50
+ return if allowed_gem?(node)
51
+
52
+ if offense?(node)
53
+ add_offense(node)
54
+ opposite_style_detected
55
+ else
56
+ correct_style_detected
57
+ end
58
+ end
59
+
60
+ private
61
+
62
+ def allowed_gem?(node)
63
+ allowed_gems.include?(node.first_argument.value)
64
+ end
65
+
66
+ def allowed_gems
67
+ Array(cop_config['AllowedGems'])
68
+ end
69
+
70
+ def message(range)
71
+ gem_specification = range.source
72
+
73
+ if required_style?
74
+ format(REQUIRED_MSG, gem_specification: gem_specification)
75
+ elsif forbidden_style?
76
+ format(FORBIDDEN_MSG, gem_specification: gem_specification)
77
+ end
78
+ end
79
+
80
+ def offense?(node)
81
+ (required_style? && !includes_version_specification?(node)) ||
82
+ (forbidden_style? && includes_version_specification?(node))
83
+ end
84
+
85
+ def forbidden_style?
86
+ style == :forbidden
87
+ end
88
+
89
+ def required_style?
90
+ style == :required
91
+ end
92
+
93
+ def version_specification?(expression)
94
+ expression.match?(VERSION_SPECIFICATION_REGEX)
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
@@ -36,6 +36,7 @@ module RuboCop
36
36
 
37
37
  RESTRICT_ON_SEND = %i[source].freeze
38
38
 
39
+ # @!method insecure_protocol_source?(node)
39
40
  def_node_matcher :insecure_protocol_source?, <<~PATTERN
40
41
  (send nil? :source
41
42
  $(sym ${:gemcutter :rubygems :rubyforge}))
@@ -38,10 +38,7 @@ module RuboCop
38
38
  gem_declarations(processed_source.ast)
39
39
  .each_cons(2) do |previous, current|
40
40
  next unless consecutive_lines(previous, current)
41
- next unless case_insensitive_out_of_order?(
42
- gem_name(current),
43
- gem_name(previous)
44
- )
41
+ next unless case_insensitive_out_of_order?(gem_name(current), gem_name(previous))
45
42
 
46
43
  register_offense(previous, current)
47
44
  end
@@ -64,6 +61,7 @@ module RuboCop
64
61
  declarations.to_a[node_index - 1]
65
62
  end
66
63
 
64
+ # @!method gem_declarations(node)
67
65
  def_node_search :gem_declarations, <<~PATTERN
68
66
  (:send nil? :gem str ...)
69
67
  PATTERN
@@ -143,20 +143,14 @@ module RuboCop
143
143
  map = {}
144
144
  callbacks&.select! do |cop|
145
145
  restrictions = cop.class.send :restrict_on_send
146
- restrictions.each do |name|
147
- (map[name] ||= []) << cop
148
- end
146
+ restrictions.each { |name| (map[name] ||= []) << cop }
149
147
  restrictions.empty?
150
148
  end
151
149
  map
152
150
  end
153
151
 
154
152
  def invoke(callback, cops, *args)
155
- cops.each do |cop|
156
- with_cop_error_handling(cop) do
157
- cop.send(callback, *args)
158
- end
159
- end
153
+ cops.each { |cop| with_cop_error_handling(cop) { cop.send(callback, *args) } }
160
154
  end
161
155
 
162
156
  # Allow blind rescues here, since we're absorbing and packaging or
@@ -18,9 +18,7 @@ module RuboCop
18
18
  def call(corrector)
19
19
  lambda.call(corrector)
20
20
  rescue StandardError => e
21
- raise ErrorWithAnalyzedFileLocation.new(
22
- cause: e, node: node, cop: cop
23
- )
21
+ raise ErrorWithAnalyzedFileLocation.new(cause: e, node: node, cop: cop)
24
22
  end
25
23
  end
26
24
 
@@ -55,9 +53,7 @@ module RuboCop
55
53
  return unless method_defined?(:join_force?)
56
54
 
57
55
  cop = new
58
- Force.all.select do |force_class|
59
- cop.join_force?(force_class)
60
- end
56
+ Force.all.select { |force_class| cop.join_force?(force_class) }
61
57
  end
62
58
 
63
59
  # @deprecated
@@ -97,12 +93,6 @@ module RuboCop
97
93
  Registry.qualified_cop_name(name, origin)
98
94
  end
99
95
 
100
- # @deprecated
101
- # Open issue if there's a valid use case to include this in Base
102
- def parse(source, path = nil)
103
- ProcessedSource.new(source, target_ruby_version, path)
104
- end
105
-
106
96
  private
107
97
 
108
98
  def begin_investigation(processed_source)
@@ -130,17 +120,13 @@ module RuboCop
130
120
 
131
121
  return unless lambda
132
122
 
133
- suppress_clobbering do
134
- lambda.call(corrector)
135
- end
123
+ suppress_clobbering { lambda.call(corrector) }
136
124
  end
137
125
 
138
126
  def correction_lambda
139
127
  return unless support_autocorrect?
140
128
 
141
- dedup_on_node(@v0_argument) do
142
- autocorrect(@v0_argument)
143
- end
129
+ dedup_on_node(@v0_argument) { autocorrect(@v0_argument) }
144
130
  end
145
131
 
146
132
  def dedup_on_node(node)