rubocop 1.9.0 → 1.12.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 (275) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +14 -14
  3. data/assets/output.html.erb +1 -1
  4. data/config/default.yml +70 -17
  5. data/config/obsoletion.yml +4 -0
  6. data/lib/rubocop.rb +5 -0
  7. data/lib/rubocop/cli/command/execute_runner.rb +1 -1
  8. data/lib/rubocop/cli/command/suggest_extensions.rb +3 -2
  9. data/lib/rubocop/comment_config.rb +43 -94
  10. data/lib/rubocop/config.rb +4 -1
  11. data/lib/rubocop/cop/base.rb +1 -0
  12. data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -1
  13. data/lib/rubocop/cop/bundler/gem_comment.rb +1 -0
  14. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +1 -0
  15. data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -0
  16. data/lib/rubocop/cop/correctors/alignment_corrector.rb +3 -6
  17. data/lib/rubocop/cop/exclude_limit.rb +26 -0
  18. data/lib/rubocop/cop/gemspec/date_assignment.rb +57 -0
  19. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +2 -0
  20. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -0
  21. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +2 -0
  22. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +2 -0
  23. data/lib/rubocop/cop/generator.rb +2 -2
  24. data/lib/rubocop/cop/internal_affairs.rb +1 -0
  25. data/lib/rubocop/cop/internal_affairs/example_description.rb +1 -0
  26. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +1 -0
  27. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +2 -0
  28. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +151 -0
  29. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -0
  30. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +2 -0
  31. data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +1 -0
  32. data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +1 -0
  33. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -0
  34. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +3 -0
  35. data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +4 -0
  36. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -0
  37. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +11 -8
  38. data/lib/rubocop/cop/layout/argument_alignment.rb +6 -5
  39. data/lib/rubocop/cop/layout/array_alignment.rb +7 -6
  40. data/lib/rubocop/cop/layout/assignment_indentation.rb +6 -3
  41. data/lib/rubocop/cop/layout/block_alignment.rb +1 -0
  42. data/lib/rubocop/cop/layout/block_end_newline.rb +4 -8
  43. data/lib/rubocop/cop/layout/class_structure.rb +1 -0
  44. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +14 -15
  45. data/lib/rubocop/cop/layout/comment_indentation.rb +16 -16
  46. data/lib/rubocop/cop/layout/else_alignment.rb +9 -6
  47. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +20 -3
  48. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +37 -17
  49. data/lib/rubocop/cop/layout/extra_spacing.rb +2 -2
  50. data/lib/rubocop/cop/layout/first_argument_indentation.rb +27 -7
  51. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +9 -6
  52. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +22 -15
  53. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +6 -5
  54. data/lib/rubocop/cop/layout/indentation_consistency.rb +9 -6
  55. data/lib/rubocop/cop/layout/indentation_style.rb +27 -30
  56. data/lib/rubocop/cop/layout/indentation_width.rb +20 -9
  57. data/lib/rubocop/cop/layout/line_length.rb +2 -1
  58. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +26 -0
  59. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +18 -5
  60. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +10 -5
  61. data/lib/rubocop/cop/layout/parameter_alignment.rb +6 -5
  62. data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -1
  63. data/lib/rubocop/cop/layout/space_before_brackets.rb +9 -4
  64. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -1
  65. data/lib/rubocop/cop/lint/big_decimal_new.rb +1 -0
  66. data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -0
  67. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +2 -0
  68. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -0
  69. data/lib/rubocop/cop/lint/debugger.rb +60 -14
  70. data/lib/rubocop/cop/lint/deprecated_constants.rb +5 -0
  71. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +14 -4
  72. data/lib/rubocop/cop/lint/duplicate_branch.rb +1 -1
  73. data/lib/rubocop/cop/lint/duplicate_methods.rb +3 -0
  74. data/lib/rubocop/cop/lint/duplicate_require.rb +3 -2
  75. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -0
  76. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  77. data/lib/rubocop/cop/lint/erb_new_arguments.rb +1 -0
  78. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +1 -0
  79. data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +1 -0
  80. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -0
  81. data/lib/rubocop/cop/lint/inherit_exception.rb +1 -0
  82. data/lib/rubocop/cop/lint/multiple_comparison.rb +5 -4
  83. data/lib/rubocop/cop/lint/nested_method_definition.rb +3 -0
  84. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -0
  85. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +7 -0
  86. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -0
  87. data/lib/rubocop/cop/lint/number_conversion.rb +11 -2
  88. data/lib/rubocop/cop/lint/raise_exception.rb +2 -0
  89. data/lib/rubocop/cop/lint/rand_one.rb +1 -0
  90. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +1 -2
  91. data/lib/rubocop/cop/lint/redundant_require_statement.rb +1 -0
  92. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +1 -0
  93. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +7 -3
  94. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -0
  95. data/lib/rubocop/cop/lint/redundant_with_index.rb +1 -0
  96. data/lib/rubocop/cop/lint/redundant_with_object.rb +1 -0
  97. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +1 -0
  98. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -0
  99. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -0
  100. data/lib/rubocop/cop/lint/shadowed_argument.rb +1 -0
  101. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +1 -0
  102. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -0
  103. data/lib/rubocop/cop/lint/suppressed_exception.rb +44 -1
  104. data/lib/rubocop/cop/lint/symbol_conversion.rb +91 -3
  105. data/lib/rubocop/cop/lint/to_enum_arguments.rb +3 -0
  106. data/lib/rubocop/cop/lint/unified_integer.rb +1 -0
  107. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +5 -0
  108. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -0
  109. data/lib/rubocop/cop/lint/unreachable_loop.rb +1 -0
  110. data/lib/rubocop/cop/lint/unused_method_argument.rb +1 -0
  111. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -0
  112. data/lib/rubocop/cop/lint/useless_access_modifier.rb +4 -0
  113. data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -0
  114. data/lib/rubocop/cop/lint/useless_times.rb +3 -0
  115. data/lib/rubocop/cop/message_annotator.rb +4 -1
  116. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
  117. data/lib/rubocop/cop/metrics/module_length.rb +1 -0
  118. data/lib/rubocop/cop/metrics/parameter_lists.rb +6 -2
  119. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +6 -4
  120. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +2 -0
  121. data/lib/rubocop/cop/mixin/alignment.rb +10 -3
  122. data/lib/rubocop/cop/mixin/check_line_breakable.rb +1 -1
  123. data/lib/rubocop/cop/mixin/code_length.rb +3 -1
  124. data/lib/rubocop/cop/mixin/comments_help.rb +5 -1
  125. data/lib/rubocop/cop/mixin/configurable_max.rb +1 -0
  126. data/lib/rubocop/cop/mixin/def_node.rb +1 -0
  127. data/lib/rubocop/cop/mixin/documentation_comment.rb +1 -1
  128. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +3 -0
  129. data/lib/rubocop/cop/mixin/empty_parameter.rb +1 -0
  130. data/lib/rubocop/cop/mixin/enforce_superclass.rb +2 -0
  131. data/lib/rubocop/cop/mixin/hash_transform_method.rb +1 -0
  132. data/lib/rubocop/cop/mixin/line_length_help.rb +11 -6
  133. data/lib/rubocop/cop/mixin/method_complexity.rb +4 -1
  134. data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +3 -1
  135. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +4 -23
  136. data/lib/rubocop/cop/mixin/negative_conditional.rb +3 -0
  137. data/lib/rubocop/cop/mixin/preferred_delimiters.rb +3 -3
  138. data/lib/rubocop/cop/mixin/rational_literal.rb +1 -0
  139. data/lib/rubocop/cop/mixin/safe_assignment.rb +5 -0
  140. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +4 -6
  141. data/lib/rubocop/cop/mixin/visibility_help.rb +1 -0
  142. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -0
  143. data/lib/rubocop/cop/naming/constant_name.rb +2 -0
  144. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +6 -0
  145. data/lib/rubocop/cop/naming/method_name.rb +3 -0
  146. data/lib/rubocop/cop/naming/predicate_name.rb +1 -0
  147. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +10 -0
  148. data/lib/rubocop/cop/registry.rb +10 -1
  149. data/lib/rubocop/cop/security/eval.rb +1 -0
  150. data/lib/rubocop/cop/security/json_load.rb +1 -0
  151. data/lib/rubocop/cop/security/marshal_load.rb +1 -0
  152. data/lib/rubocop/cop/security/open.rb +1 -0
  153. data/lib/rubocop/cop/security/yaml_load.rb +1 -0
  154. data/lib/rubocop/cop/style/access_modifier_declarations.rb +3 -2
  155. data/lib/rubocop/cop/style/alias.rb +1 -0
  156. data/lib/rubocop/cop/style/and_or.rb +3 -1
  157. data/lib/rubocop/cop/style/arguments_forwarding.rb +3 -0
  158. data/lib/rubocop/cop/style/array_coercion.rb +2 -0
  159. data/lib/rubocop/cop/style/array_join.rb +1 -0
  160. data/lib/rubocop/cop/style/attr.rb +1 -0
  161. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +59 -71
  162. data/lib/rubocop/cop/style/bisected_attr_accessor/macro.rb +62 -0
  163. data/lib/rubocop/cop/style/case_equality.rb +2 -1
  164. data/lib/rubocop/cop/style/case_like_if.rb +15 -4
  165. data/lib/rubocop/cop/style/class_equality_comparison.rb +3 -0
  166. data/lib/rubocop/cop/style/collection_compact.rb +2 -0
  167. data/lib/rubocop/cop/style/colon_method_call.rb +1 -0
  168. data/lib/rubocop/cop/style/command_literal.rb +1 -1
  169. data/lib/rubocop/cop/style/commented_keyword.rb +10 -10
  170. data/lib/rubocop/cop/style/conditional_assignment.rb +2 -0
  171. data/lib/rubocop/cop/style/constant_visibility.rb +28 -0
  172. data/lib/rubocop/cop/style/date_time.rb +3 -0
  173. data/lib/rubocop/cop/style/dir.rb +1 -0
  174. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +2 -2
  175. data/lib/rubocop/cop/style/documentation.rb +30 -3
  176. data/lib/rubocop/cop/style/documentation_method.rb +1 -0
  177. data/lib/rubocop/cop/style/double_negation.rb +3 -2
  178. data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -0
  179. data/lib/rubocop/cop/style/each_with_object.rb +1 -0
  180. data/lib/rubocop/cop/style/empty_literal.rb +9 -0
  181. data/lib/rubocop/cop/style/endless_method.rb +1 -0
  182. data/lib/rubocop/cop/style/eval_with_location.rb +90 -28
  183. data/lib/rubocop/cop/style/even_odd.rb +1 -0
  184. data/lib/rubocop/cop/style/expand_path_arguments.rb +3 -0
  185. data/lib/rubocop/cop/style/explicit_block_argument.rb +2 -1
  186. data/lib/rubocop/cop/style/exponential_notation.rb +6 -7
  187. data/lib/rubocop/cop/style/float_division.rb +4 -0
  188. data/lib/rubocop/cop/style/format_string.rb +2 -0
  189. data/lib/rubocop/cop/style/format_string_token.rb +1 -0
  190. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +0 -3
  191. data/lib/rubocop/cop/style/global_std_stream.rb +1 -0
  192. data/lib/rubocop/cop/style/hash_conversion.rb +108 -0
  193. data/lib/rubocop/cop/style/hash_each_methods.rb +1 -0
  194. data/lib/rubocop/cop/style/hash_except.rb +1 -0
  195. data/lib/rubocop/cop/style/hash_like_case.rb +1 -0
  196. data/lib/rubocop/cop/style/hash_syntax.rb +16 -15
  197. data/lib/rubocop/cop/style/hash_transform_keys.rb +4 -0
  198. data/lib/rubocop/cop/style/hash_transform_values.rb +4 -0
  199. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +37 -11
  200. data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -0
  201. data/lib/rubocop/cop/style/inverse_methods.rb +2 -0
  202. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +46 -2
  203. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +19 -3
  204. data/lib/rubocop/cop/style/min_max.rb +1 -0
  205. data/lib/rubocop/cop/style/mixin_usage.rb +2 -0
  206. data/lib/rubocop/cop/style/module_function.rb +5 -0
  207. data/lib/rubocop/cop/style/multiline_method_signature.rb +10 -3
  208. data/lib/rubocop/cop/style/multiple_comparison.rb +21 -2
  209. data/lib/rubocop/cop/style/mutable_constant.rb +3 -0
  210. data/lib/rubocop/cop/style/negated_if_else_condition.rb +16 -2
  211. data/lib/rubocop/cop/style/nil_comparison.rb +6 -1
  212. data/lib/rubocop/cop/style/nil_lambda.rb +1 -0
  213. data/lib/rubocop/cop/style/non_nil_check.rb +7 -0
  214. data/lib/rubocop/cop/style/numeric_literals.rb +6 -9
  215. data/lib/rubocop/cop/style/numeric_predicate.rb +4 -1
  216. data/lib/rubocop/cop/style/option_hash.rb +1 -0
  217. data/lib/rubocop/cop/style/or_assignment.rb +2 -0
  218. data/lib/rubocop/cop/style/parallel_assignment.rb +6 -0
  219. data/lib/rubocop/cop/style/parentheses_around_condition.rb +1 -0
  220. data/lib/rubocop/cop/style/proc.rb +1 -0
  221. data/lib/rubocop/cop/style/random_with_offset.rb +5 -0
  222. data/lib/rubocop/cop/style/redundant_assignment.rb +1 -0
  223. data/lib/rubocop/cop/style/redundant_begin.rb +44 -4
  224. data/lib/rubocop/cop/style/redundant_conditional.rb +2 -0
  225. data/lib/rubocop/cop/style/redundant_exception.rb +2 -0
  226. data/lib/rubocop/cop/style/redundant_fetch_block.rb +2 -0
  227. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -0
  228. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -0
  229. data/lib/rubocop/cop/style/redundant_parentheses.rb +13 -0
  230. data/lib/rubocop/cop/style/redundant_return.rb +4 -0
  231. data/lib/rubocop/cop/style/redundant_self.rb +7 -3
  232. data/lib/rubocop/cop/style/redundant_self_assignment.rb +2 -0
  233. data/lib/rubocop/cop/style/redundant_sort.rb +1 -0
  234. data/lib/rubocop/cop/style/redundant_sort_by.rb +1 -0
  235. data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
  236. data/lib/rubocop/cop/style/rescue_modifier.rb +17 -14
  237. data/lib/rubocop/cop/style/rescue_standard_error.rb +2 -0
  238. data/lib/rubocop/cop/style/return_nil.rb +6 -0
  239. data/lib/rubocop/cop/style/safe_navigation.rb +2 -0
  240. data/lib/rubocop/cop/style/sample.rb +1 -0
  241. data/lib/rubocop/cop/style/signal_exception.rb +3 -0
  242. data/lib/rubocop/cop/style/single_argument_dig.rb +1 -0
  243. data/lib/rubocop/cop/style/single_line_methods.rb +4 -1
  244. data/lib/rubocop/cop/style/slicing_with_range.rb +1 -0
  245. data/lib/rubocop/cop/style/sole_nested_conditional.rb +20 -4
  246. data/lib/rubocop/cop/style/special_global_vars.rb +3 -3
  247. data/lib/rubocop/cop/style/stderr_puts.rb +1 -0
  248. data/lib/rubocop/cop/style/string_chars.rb +38 -0
  249. data/lib/rubocop/cop/style/string_concatenation.rb +1 -0
  250. data/lib/rubocop/cop/style/string_hash_keys.rb +2 -0
  251. data/lib/rubocop/cop/style/strip.rb +1 -0
  252. data/lib/rubocop/cop/style/struct_inheritance.rb +3 -0
  253. data/lib/rubocop/cop/style/symbol_proc.rb +25 -1
  254. data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -0
  255. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +5 -0
  256. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -1
  257. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -0
  258. data/lib/rubocop/cop/style/unless_logical_operators.rb +105 -0
  259. data/lib/rubocop/cop/style/unpack_first.rb +1 -0
  260. data/lib/rubocop/cop/style/yoda_condition.rb +1 -0
  261. data/lib/rubocop/cop/style/zero_length_predicate.rb +5 -0
  262. data/lib/rubocop/cop/util.rb +4 -1
  263. data/lib/rubocop/directive_comment.rb +69 -9
  264. data/lib/rubocop/ext/regexp_parser.rb +3 -6
  265. data/lib/rubocop/formatter/clang_style_formatter.rb +4 -2
  266. data/lib/rubocop/formatter/offense_count_formatter.rb +1 -1
  267. data/lib/rubocop/formatter/simple_text_formatter.rb +2 -1
  268. data/lib/rubocop/formatter/tap_formatter.rb +4 -2
  269. data/lib/rubocop/formatter/worst_offenders_formatter.rb +1 -1
  270. data/lib/rubocop/magic_comment.rb +1 -1
  271. data/lib/rubocop/name_similarity.rb +1 -1
  272. data/lib/rubocop/target_finder.rb +1 -0
  273. data/lib/rubocop/target_ruby.rb +21 -13
  274. data/lib/rubocop/version.rb +1 -1
  275. metadata +14 -7
@@ -42,16 +42,18 @@ module RuboCop
42
42
  # end
43
43
  # end
44
44
  # end
45
- class IndentationWidth < Cop # rubocop:disable Metrics/ClassLength
45
+ class IndentationWidth < Base # rubocop:disable Metrics/ClassLength
46
46
  include EndKeywordAlignment
47
47
  include Alignment
48
48
  include CheckAssignment
49
49
  include IgnoredPattern
50
50
  include RangeHelp
51
+ extend AutoCorrector
51
52
 
52
53
  MSG = 'Use %<configured_indentation_width>d (not %<indentation>d) ' \
53
54
  'spaces for%<name>s indentation.'
54
55
 
56
+ # @!method access_modifier?(node)
55
57
  def_node_matcher :access_modifier?, <<~PATTERN
56
58
  [(send ...) access_modifier?]
57
59
  PATTERN
@@ -144,12 +146,12 @@ module RuboCop
144
146
  check_if(node, node.body, node.else_branch, base.loc)
145
147
  end
146
148
 
147
- def autocorrect(node)
148
- AlignmentCorrector.correct(processed_source, node, @column_delta)
149
- end
150
-
151
149
  private
152
150
 
151
+ def autocorrect(corrector, node)
152
+ AlignmentCorrector.correct(corrector, processed_source, node, @column_delta)
153
+ end
154
+
153
155
  def check_members(base, members)
154
156
  check_indentation(base, select_check_member(members.first))
155
157
 
@@ -279,8 +281,9 @@ module RuboCop
279
281
  name = style == 'normal' ? '' : " #{style}"
280
282
  message = message(configured_indentation_width, indentation, name)
281
283
 
282
- add_offense(node, location: offending_range(body_node, indentation),
283
- message: message)
284
+ add_offense(offending_range(body_node, indentation), message: message) do |corrector|
285
+ autocorrect(corrector, node)
286
+ end
284
287
  end
285
288
 
286
289
  def message(configured_indentation_width, indentation, name)
@@ -307,12 +310,20 @@ module RuboCop
307
310
  def indentation_to_check?(base_loc, body_node)
308
311
  return false if skip_check?(base_loc, body_node)
309
312
 
310
- if %i[rescue ensure].include?(body_node.type)
313
+ if body_node.rescue_type?
314
+ check_rescue?(body_node)
315
+ elsif body_node.ensure_type?
311
316
  block_body, = *body_node
312
317
  return unless block_body
318
+
319
+ check_rescue?(block_body) if block_body.rescue_type?
320
+ else
321
+ true
313
322
  end
323
+ end
314
324
 
315
- true
325
+ def check_rescue?(rescue_node)
326
+ rescue_node.body
316
327
  end
317
328
 
318
329
  def skip_check?(base_loc, body_node)
@@ -60,12 +60,13 @@ module RuboCop
60
60
  # }
61
61
  class LineLength < Base
62
62
  include CheckLineBreakable
63
- include ConfigurableMax
64
63
  include IgnoredPattern
65
64
  include RangeHelp
66
65
  include LineLengthHelp
67
66
  extend AutoCorrector
68
67
 
68
+ exclude_limit 'Max'
69
+
69
70
  MSG = 'Line is too long. [%<length>d/%<max>d]'
70
71
 
71
72
  def on_block(node)
@@ -31,6 +31,32 @@ module RuboCop
31
31
  # foo = if expression
32
32
  # 'bar'
33
33
  # end
34
+ #
35
+ # @example SupportedTypes: ['block', 'case', 'class', 'if', 'kwbegin', 'module'] (default)
36
+ # # good
37
+ # foo =
38
+ # if expression
39
+ # 'bar'
40
+ # end
41
+ #
42
+ # # good
43
+ # foo =
44
+ # [1].map do |i|
45
+ # i + 1
46
+ # end
47
+ #
48
+ # @example SupportedTypes: ['block']
49
+ # # good
50
+ # foo = if expression
51
+ # 'bar'
52
+ # end
53
+ #
54
+ # # good
55
+ # foo =
56
+ # [1].map do |i|
57
+ # 'bar' * i
58
+ # end
59
+ #
34
60
  class MultilineAssignmentLayout < Base
35
61
  include CheckAssignment
36
62
  include ConfigurableEnforcedStyle
@@ -46,10 +46,11 @@ module RuboCop
46
46
  # .a
47
47
  # .b
48
48
  # .c
49
- class MultilineMethodCallIndentation < Cop
49
+ class MultilineMethodCallIndentation < Base
50
50
  include ConfigurableEnforcedStyle
51
51
  include Alignment
52
52
  include MultilineExpressionIndentation
53
+ extend AutoCorrector
53
54
 
54
55
  def validate_config
55
56
  return unless style == :aligned && cop_config['IndentationWidth']
@@ -61,16 +62,28 @@ module RuboCop
61
62
  '`EnforcedStyle` is `indented`.'
62
63
  end
63
64
 
64
- def autocorrect(node)
65
- AlignmentCorrector.correct(processed_source, node, @column_delta)
66
- end
67
-
68
65
  private
69
66
 
67
+ def autocorrect(corrector, node)
68
+ AlignmentCorrector.correct(corrector, processed_source, node, @column_delta)
69
+ end
70
+
70
71
  def relevant_node?(send_node)
71
72
  send_node.loc.dot # Only check method calls with dot operator
72
73
  end
73
74
 
75
+ def right_hand_side(send_node)
76
+ dot = send_node.loc.dot
77
+ selector = send_node.loc.selector
78
+ if send_node.dot? && selector && dot.line == selector.line
79
+ dot.join(selector)
80
+ elsif selector
81
+ selector
82
+ elsif send_node.implicit_call?
83
+ dot.join(send_node.loc.begin)
84
+ end
85
+ end
86
+
74
87
  def offending_range(node, lhs, rhs, given_style)
75
88
  return false unless begins_its_line?(rhs)
76
89
  return false if not_for_this_cop?(node)
@@ -41,10 +41,11 @@ module RuboCop
41
41
  # something_else
42
42
  # end
43
43
  #
44
- class MultilineOperationIndentation < Cop
44
+ class MultilineOperationIndentation < Base
45
45
  include ConfigurableEnforcedStyle
46
46
  include Alignment
47
47
  include MultilineExpressionIndentation
48
+ extend AutoCorrector
48
49
 
49
50
  def on_and(node)
50
51
  check_and_or(node)
@@ -63,12 +64,12 @@ module RuboCop
63
64
  '`EnforcedStyle` is `indented`.'
64
65
  end
65
66
 
66
- def autocorrect(node)
67
- AlignmentCorrector.correct(processed_source, node, @column_delta)
68
- end
69
-
70
67
  private
71
68
 
69
+ def autocorrect(corrector, node)
70
+ AlignmentCorrector.correct(corrector, processed_source, node, @column_delta)
71
+ end
72
+
72
73
  def relevant_node?(node)
73
74
  return false if node.send_type? && node.unary_operation?
74
75
 
@@ -117,6 +118,10 @@ module RuboCop
117
118
  "spaces for indenting #{what} spanning multiple lines."
118
119
  end
119
120
  end
121
+
122
+ def right_hand_side(send_node)
123
+ send_node.first_argument.source_range
124
+ end
120
125
  end
121
126
  end
122
127
  end
@@ -68,8 +68,9 @@ module RuboCop
68
68
  # baz)
69
69
  # 123
70
70
  # end
71
- class ParameterAlignment < Cop
71
+ class ParameterAlignment < Base
72
72
  include Alignment
73
+ extend AutoCorrector
73
74
 
74
75
  ALIGN_PARAMS_MSG = 'Align the parameters of a method definition if ' \
75
76
  'they span more than one line.'
@@ -84,12 +85,12 @@ module RuboCop
84
85
  end
85
86
  alias on_defs on_def
86
87
 
87
- def autocorrect(node)
88
- AlignmentCorrector.correct(processed_source, node, column_delta)
89
- end
90
-
91
88
  private
92
89
 
90
+ def autocorrect(corrector, node)
91
+ AlignmentCorrector.correct(corrector, processed_source, node, column_delta)
92
+ end
93
+
93
94
  def message(_node)
94
95
  fixed_indentation? ? FIXED_INDENT_MSG : ALIGN_PARAMS_MSG
95
96
  end
@@ -61,7 +61,7 @@ module RuboCop
61
61
  # by `EnforcedStyle: line_count_based` of `Style/BlockDelimiters` cop.
62
62
  # That means preventing auto-correction to incorrect auto-corrected
63
63
  # code.
64
- # See: https://github.com/rubocop-hq/rubocop/issues/7534
64
+ # See: https://github.com/rubocop/rubocop/issues/7534
65
65
  return if conflict_with_block_delimiters?(node)
66
66
 
67
67
  left_brace = node.loc.begin
@@ -39,12 +39,17 @@ module RuboCop
39
39
 
40
40
  range_between(receiver_end_pos, selector_begin_pos)
41
41
  elsif node.method?(:[]=)
42
- end_pos = node.receiver.source_range.end_pos
42
+ offense_range_for_assignment(node, begin_pos)
43
+ end
44
+ end
43
45
 
44
- return if begin_pos - end_pos == 1
46
+ def offense_range_for_assignment(node, begin_pos)
47
+ end_pos = node.receiver.source_range.end_pos
45
48
 
46
- range_between(end_pos, begin_pos - 1)
47
- end
49
+ return if begin_pos - end_pos == 1 ||
50
+ (range = range_between(end_pos, begin_pos - 1)).source.start_with?('[')
51
+
52
+ range
48
53
  end
49
54
 
50
55
  def register_offense(range)
@@ -89,7 +89,7 @@ module RuboCop
89
89
  # preventing auto-correction to single-line empty braces. It will
90
90
  # conflict with auto-correction by `Layout/SpaceInsideBlockBraces` cop
91
91
  # if auto-corrected to a single-line empty braces.
92
- # See: https://github.com/rubocop-hq/rubocop/issues/7363
92
+ # See: https://github.com/rubocop/rubocop/issues/7363
93
93
  return if node.body.nil? && node.multiline?
94
94
 
95
95
  left_brace = node.loc.begin
@@ -21,6 +21,7 @@ module RuboCop
21
21
  'Use `%<double_colon>sBigDecimal()` instead.'
22
22
  RESTRICT_ON_SEND = %i[new].freeze
23
23
 
24
+ # @!method big_decimal_new(node)
24
25
  def_node_matcher :big_decimal_new, <<~PATTERN
25
26
  (send
26
27
  (const ${nil? cbase} :BigDecimal) :new ...)
@@ -27,6 +27,7 @@ module RuboCop
27
27
  MSG = 'Symbol with a boolean name - ' \
28
28
  'you probably meant to use `%<boolean>s`.'
29
29
 
30
+ # @!method boolean_symbol?(node)
30
31
  def_node_matcher :boolean_symbol?, '(sym {:true :false})'
31
32
 
32
33
  def on_sym(node)
@@ -66,10 +66,12 @@ module RuboCop
66
66
 
67
67
  MSG = 'Do not define constants this way within a block.'
68
68
 
69
+ # @!method constant_assigned_in_block?(node)
69
70
  def_node_matcher :constant_assigned_in_block?, <<~PATTERN
70
71
  ({^block_type? [^begin_type? ^^block_type?]} nil? ...)
71
72
  PATTERN
72
73
 
74
+ # @!method module_defined_in_block?(node)
73
75
  def_node_matcher :module_defined_in_block?, <<~PATTERN
74
76
  ({^block_type? [^begin_type? ^^block_type?]} ...)
75
77
  PATTERN
@@ -58,6 +58,7 @@ module RuboCop
58
58
  class ConstantResolution < Base
59
59
  MSG = 'Fully qualify this constant to avoid possibly ambiguous resolution.'
60
60
 
61
+ # @!method unqualified_const?(node)
61
62
  def_node_matcher :unqualified_const?, <<~PATTERN
62
63
  (const nil? #const_name?)
63
64
  PATTERN
@@ -3,8 +3,21 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Lint
6
- # This cop checks for calls to debugger or pry.
7
- # The cop can be configured to define which methods and receivers must be fixed.
6
+ # This cop checks for debug calls (such as `debugger` or `binding.pry`) that should
7
+ # not be kept for production code.
8
+ #
9
+ # The cop can be configured using `DebuggerMethods`. By default, a number of gems
10
+ # debug entrypoints are configured (`Kernel`, `Byebug`, `Capybara`, `Pry`, `Rails`,
11
+ # and `WebConsole`). Additional methods can be added.
12
+ #
13
+ # Specific default groups can be disabled if necessary:
14
+ #
15
+ # [source,yaml]
16
+ # ----
17
+ # Lint/Debugger:
18
+ # WebConsole: ~
19
+ # ----
20
+ #
8
21
  #
9
22
  # @example
10
23
  #
@@ -33,14 +46,34 @@ module RuboCop
33
46
  # def some_method
34
47
  # do_something
35
48
  # end
49
+ #
50
+ # @example DebuggerMethods: [my_debugger]
51
+ #
52
+ # # bad (ok during development)
53
+ #
54
+ # def some_method
55
+ # my_debugger
56
+ # end
36
57
  class Debugger < Base
37
58
  MSG = 'Remove debugger entry point `%<source>s`.'
38
59
 
39
60
  RESTRICT_ON_SEND = [].freeze
40
61
 
62
+ # @!method kernel?(node)
63
+ def_node_matcher :kernel?, <<~PATTERN
64
+ (const {nil? cbase} :Kernel)
65
+ PATTERN
66
+
67
+ # @!method valid_receiver?(node, arg1)
68
+ def_node_matcher :valid_receiver?, <<~PATTERN
69
+ {
70
+ (const {nil? cbase} %1)
71
+ (send {nil? #kernel?} %1)
72
+ }
73
+ PATTERN
74
+
41
75
  def on_send(node)
42
- return unless debugger_method?(node.method_name)
43
- return if !node.receiver.nil? && !debugger_receiver?(node)
76
+ return unless debugger_method?(node)
44
77
 
45
78
  add_offense(node)
46
79
  end
@@ -51,19 +84,32 @@ module RuboCop
51
84
  format(MSG, source: node.source)
52
85
  end
53
86
 
54
- def debugger_method?(name)
55
- cop_config.fetch('DebuggerMethods', []).include?(name.to_s)
87
+ def debugger_methods
88
+ @debugger_methods ||= begin
89
+ config = cop_config.fetch('DebuggerMethods', [])
90
+ values = config.is_a?(Array) ? config : config.values.flatten
91
+ values.map do |v|
92
+ next unless v
93
+
94
+ *receiver, method_name = v.split('.')
95
+ {
96
+ receiver: receiver.empty? ? nil : receiver.join.to_sym,
97
+ method_name: method_name.to_sym
98
+ }
99
+ end.compact
100
+ end
56
101
  end
57
102
 
58
- def debugger_receiver?(node)
59
- receiver = case node.receiver
60
- when RuboCop::AST::SendNode
61
- node.receiver.method_name
62
- when RuboCop::AST::ConstNode
63
- node.receiver.const_name
64
- end
103
+ def debugger_method?(send_node)
104
+ debugger_methods.any? do |method|
105
+ next unless method[:method_name] == send_node.method_name
65
106
 
66
- cop_config.fetch('DebuggerReceivers', []).include?(receiver.to_s)
107
+ if method[:receiver].nil?
108
+ send_node.receiver.nil?
109
+ else
110
+ valid_receiver?(send_node.receiver, method[:receiver])
111
+ end
112
+ end
67
113
  end
68
114
  end
69
115
  end
@@ -37,6 +37,11 @@ module RuboCop
37
37
  DO_NOT_USE_MSG = 'Do not use `%<bad>s`%<deprecated_message>s.'
38
38
 
39
39
  def on_const(node)
40
+ # FIXME: Workaround for "`undefined method `expression' for nil:NilClass`" when processing
41
+ # `__ENCODING__`. It is better to be able to work without this condition.
42
+ # Maybe further investigation of RuboCop AST will lead to an essential solution.
43
+ return unless node.loc
44
+
40
45
  constant = node.absolute? ? consntant_name(node, node.short_name.to_s) : node.source
41
46
  return unless (deprecated_constant = deprecated_constants[constant])
42
47
 
@@ -44,6 +44,9 @@ module RuboCop
44
44
  MSG = 'Use `%<constant>s.%<method>s(%<replacement_args>s)`' \
45
45
  ' instead of `%<original>s`.'
46
46
 
47
+ NO_ARG_ALGORITHM = %w[BF DES IDEA RC4].freeze
48
+
49
+ # @!method algorithm_const(node)
47
50
  def_node_matcher :algorithm_const, <<~PATTERN
48
51
  (send
49
52
  $(const
@@ -104,7 +107,7 @@ module RuboCop
104
107
  def algorithm_name(node)
105
108
  name = node.loc.name.source
106
109
 
107
- if openssl_class(node) == 'OpenSSL::Cipher'
110
+ if openssl_class(node) == 'OpenSSL::Cipher' && !NO_ARG_ALGORITHM.include?(name)
108
111
  name.scan(/.{3}/).join('-')
109
112
  else
110
113
  name
@@ -124,16 +127,23 @@ module RuboCop
124
127
  algorithm_name = algorithm_name(algorithm_constant)
125
128
 
126
129
  if openssl_class(algorithm_constant) == 'OpenSSL::Cipher'
127
- build_cipher_arguments(node, algorithm_name)
130
+ build_cipher_arguments(node, algorithm_name, node.arguments.empty?)
128
131
  else
129
132
  (["'#{algorithm_name}'"] + node.arguments.map(&:source)).join(', ')
130
133
  end
131
134
  end
132
135
 
133
- def build_cipher_arguments(node, algorithm_name)
136
+ def build_cipher_arguments(node, algorithm_name, no_arguments)
134
137
  algorithm_parts = algorithm_name.downcase.split('-')
135
138
  size_and_mode = sanitize_arguments(node.arguments).map(&:downcase)
136
- "'#{(algorithm_parts + size_and_mode + ['cbc']).take(3).join('-')}'"
139
+
140
+ if NO_ARG_ALGORITHM.include?(algorithm_parts.first.upcase) && no_arguments
141
+ "'#{algorithm_parts.first}'"
142
+ else
143
+ mode = 'cbc' unless size_and_mode == ['cbc']
144
+
145
+ "'#{(algorithm_parts + size_and_mode + [mode]).compact.take(3).join('-')}'"
146
+ end
137
147
  end
138
148
  end
139
149
  end