rubocop 0.80.0 → 0.84.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 (293) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -4
  3. data/config/default.yml +171 -34
  4. data/lib/rubocop.rb +15 -62
  5. data/lib/rubocop/ast_aliases.rb +8 -0
  6. data/lib/rubocop/cli.rb +11 -5
  7. data/lib/rubocop/cli/command/show_cops.rb +2 -6
  8. data/lib/rubocop/config.rb +41 -13
  9. data/lib/rubocop/config_loader.rb +40 -36
  10. data/lib/rubocop/config_loader_resolver.rb +27 -4
  11. data/lib/rubocop/config_obsoletion.rb +2 -0
  12. data/lib/rubocop/config_validator.rb +18 -1
  13. data/lib/rubocop/cop/autocorrect_logic.rb +1 -2
  14. data/lib/rubocop/cop/badge.rb +5 -5
  15. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +1 -1
  16. data/lib/rubocop/cop/corrector.rb +49 -27
  17. data/lib/rubocop/cop/correctors/alignment_corrector.rb +4 -8
  18. data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -2
  19. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +1 -1
  20. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +3 -3
  21. data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -2
  22. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +1 -3
  23. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
  24. data/lib/rubocop/cop/correctors/space_corrector.rb +1 -3
  25. data/lib/rubocop/cop/correctors/string_literal_corrector.rb +2 -2
  26. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -3
  27. data/lib/rubocop/cop/generator.rb +4 -3
  28. data/lib/rubocop/cop/ignored_node.rb +1 -3
  29. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +1 -1
  30. data/lib/rubocop/cop/layout/array_alignment.rb +53 -10
  31. data/lib/rubocop/cop/layout/block_end_newline.rb +5 -3
  32. data/lib/rubocop/cop/layout/condition_position.rb +12 -2
  33. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  34. data/lib/rubocop/cop/layout/else_alignment.rb +8 -0
  35. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +2 -6
  36. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +126 -0
  37. data/lib/rubocop/cop/layout/end_of_line.rb +2 -2
  38. data/lib/rubocop/cop/layout/first_argument_indentation.rb +0 -2
  39. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +14 -10
  40. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +1 -1
  41. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -3
  42. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +4 -8
  43. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
  44. data/lib/rubocop/cop/layout/{tab.rb → indentation_style.rb} +48 -6
  45. data/lib/rubocop/cop/layout/indentation_width.rb +1 -3
  46. data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
  47. data/lib/rubocop/cop/layout/line_length.rb +7 -4
  48. data/lib/rubocop/cop/layout/multiline_block_layout.rb +2 -4
  49. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -3
  50. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +1 -1
  51. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +13 -4
  52. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +3 -3
  53. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +129 -0
  54. data/lib/rubocop/cop/layout/space_around_operators.rb +19 -2
  55. data/lib/rubocop/cop/layout/space_before_comment.rb +1 -3
  56. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +1 -1
  57. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +1 -3
  58. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +2 -2
  59. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +2 -2
  60. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +2 -6
  61. data/lib/rubocop/cop/layout/trailing_whitespace.rb +2 -2
  62. data/lib/rubocop/cop/lint/ambiguous_operator.rb +40 -0
  63. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +14 -0
  64. data/lib/rubocop/cop/lint/boolean_symbol.rb +12 -0
  65. data/lib/rubocop/cop/lint/debugger.rb +1 -1
  66. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +133 -0
  67. data/lib/rubocop/cop/lint/duplicate_methods.rb +1 -5
  68. data/lib/rubocop/cop/lint/empty_when.rb +29 -6
  69. data/lib/rubocop/cop/lint/ensure_return.rb +18 -1
  70. data/lib/rubocop/cop/lint/erb_new_arguments.rb +3 -7
  71. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  72. data/lib/rubocop/cop/lint/inherit_exception.rb +1 -1
  73. data/lib/rubocop/cop/lint/interpolation_check.rb +1 -1
  74. data/lib/rubocop/cop/lint/literal_as_condition.rb +10 -13
  75. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
  76. data/lib/rubocop/cop/lint/loop.rb +6 -4
  77. data/lib/rubocop/cop/lint/multiple_comparison.rb +1 -1
  78. data/lib/rubocop/cop/lint/nested_method_definition.rb +2 -2
  79. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +2 -2
  80. data/lib/rubocop/cop/lint/number_conversion.rb +1 -1
  81. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +31 -11
  82. data/lib/rubocop/cop/lint/percent_string_array.rb +2 -4
  83. data/lib/rubocop/cop/lint/raise_exception.rb +75 -0
  84. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +1 -6
  85. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -1
  86. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +1 -1
  87. data/lib/rubocop/cop/lint/struct_new_override.rb +58 -0
  88. data/lib/rubocop/cop/lint/suppressed_exception.rb +20 -25
  89. data/lib/rubocop/cop/lint/syntax.rb +1 -3
  90. data/lib/rubocop/cop/lint/unified_integer.rb +0 -2
  91. data/lib/rubocop/cop/lint/unused_method_argument.rb +32 -6
  92. data/lib/rubocop/cop/lint/uri_regexp.rb +4 -4
  93. data/lib/rubocop/cop/lint/useless_access_modifier.rb +13 -3
  94. data/lib/rubocop/cop/lint/useless_assignment.rb +3 -2
  95. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +5 -0
  96. data/lib/rubocop/cop/migration/department_name.rb +21 -12
  97. data/lib/rubocop/cop/mixin/alignment.rb +1 -3
  98. data/lib/rubocop/cop/mixin/array_min_size.rb +2 -6
  99. data/lib/rubocop/cop/mixin/check_line_breakable.rb +4 -12
  100. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -3
  101. data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -3
  102. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +6 -1
  103. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +10 -1
  104. data/lib/rubocop/cop/mixin/hash_transform_method.rb +9 -3
  105. data/lib/rubocop/cop/mixin/line_length_help.rb +2 -1
  106. data/lib/rubocop/cop/mixin/method_complexity.rb +5 -0
  107. data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +1 -3
  108. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +1 -1
  109. data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -22
  110. data/lib/rubocop/cop/mixin/surrounding_space.rb +1 -3
  111. data/lib/rubocop/cop/mixin/target_ruby_version.rb +5 -1
  112. data/lib/rubocop/cop/mixin/trailing_comma.rb +2 -4
  113. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +1 -1
  114. data/lib/rubocop/cop/naming/constant_name.rb +2 -1
  115. data/lib/rubocop/cop/naming/file_name.rb +1 -3
  116. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +1 -1
  117. data/lib/rubocop/cop/naming/method_name.rb +26 -0
  118. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +1 -1
  119. data/lib/rubocop/cop/registry.rb +13 -10
  120. data/lib/rubocop/cop/severity.rb +1 -3
  121. data/lib/rubocop/cop/style/access_modifier_declarations.rb +26 -6
  122. data/lib/rubocop/cop/style/alias.rb +4 -4
  123. data/lib/rubocop/cop/style/and_or.rb +7 -8
  124. data/lib/rubocop/cop/style/array_join.rb +1 -1
  125. data/lib/rubocop/cop/style/attr.rb +1 -3
  126. data/lib/rubocop/cop/style/block_delimiters.rb +2 -8
  127. data/lib/rubocop/cop/style/case_equality.rb +24 -1
  128. data/lib/rubocop/cop/style/character_literal.rb +2 -2
  129. data/lib/rubocop/cop/style/collection_methods.rb +2 -0
  130. data/lib/rubocop/cop/style/conditional_assignment.rb +9 -11
  131. data/lib/rubocop/cop/style/copyright.rb +1 -1
  132. data/lib/rubocop/cop/style/dir.rb +1 -1
  133. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +49 -0
  134. data/lib/rubocop/cop/style/documentation.rb +43 -5
  135. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +1 -1
  136. data/lib/rubocop/cop/style/double_negation.rb +41 -4
  137. data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
  138. data/lib/rubocop/cop/style/each_with_object.rb +3 -3
  139. data/lib/rubocop/cop/style/empty_literal.rb +1 -3
  140. data/lib/rubocop/cop/style/empty_method.rb +1 -5
  141. data/lib/rubocop/cop/style/end_block.rb +6 -0
  142. data/lib/rubocop/cop/style/even_odd.rb +1 -1
  143. data/lib/rubocop/cop/style/expand_path_arguments.rb +3 -3
  144. data/lib/rubocop/cop/style/exponential_notation.rb +119 -0
  145. data/lib/rubocop/cop/style/format_string.rb +2 -2
  146. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +2 -4
  147. data/lib/rubocop/cop/style/guard_clause.rb +25 -2
  148. data/lib/rubocop/cop/style/hash_each_methods.rb +5 -3
  149. data/lib/rubocop/cop/style/hash_syntax.rb +15 -10
  150. data/lib/rubocop/cop/style/hash_transform_keys.rb +6 -2
  151. data/lib/rubocop/cop/style/hash_transform_values.rb +6 -5
  152. data/lib/rubocop/cop/style/if_unless_modifier.rb +23 -3
  153. data/lib/rubocop/cop/style/if_with_semicolon.rb +16 -0
  154. data/lib/rubocop/cop/style/inverse_methods.rb +9 -5
  155. data/lib/rubocop/cop/style/lambda.rb +3 -2
  156. data/lib/rubocop/cop/style/lambda_call.rb +1 -21
  157. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +1 -3
  158. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -3
  159. data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
  160. data/lib/rubocop/cop/style/module_function.rb +58 -12
  161. data/lib/rubocop/cop/style/multiline_if_modifier.rb +1 -1
  162. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  163. data/lib/rubocop/cop/style/multiline_when_then.rb +16 -1
  164. data/lib/rubocop/cop/style/mutable_constant.rb +2 -4
  165. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +4 -4
  166. data/lib/rubocop/cop/style/next.rb +2 -2
  167. data/lib/rubocop/cop/style/nil_comparison.rb +1 -1
  168. data/lib/rubocop/cop/style/non_nil_check.rb +4 -4
  169. data/lib/rubocop/cop/style/not.rb +1 -1
  170. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
  171. data/lib/rubocop/cop/style/numeric_literals.rb +1 -1
  172. data/lib/rubocop/cop/style/numeric_predicate.rb +1 -1
  173. data/lib/rubocop/cop/style/one_line_conditional.rb +6 -9
  174. data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
  175. data/lib/rubocop/cop/style/or_assignment.rb +1 -1
  176. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
  177. data/lib/rubocop/cop/style/perl_backrefs.rb +2 -2
  178. data/lib/rubocop/cop/style/proc.rb +1 -1
  179. data/lib/rubocop/cop/style/raise_args.rb +1 -1
  180. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  181. data/lib/rubocop/cop/style/redundant_condition.rb +18 -6
  182. data/lib/rubocop/cop/style/redundant_conditional.rb +1 -1
  183. data/lib/rubocop/cop/style/redundant_exception.rb +3 -3
  184. data/lib/rubocop/cop/style/redundant_interpolation.rb +2 -2
  185. data/lib/rubocop/cop/style/redundant_parentheses.rb +2 -6
  186. data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -2
  187. data/lib/rubocop/cop/style/redundant_return.rb +5 -7
  188. data/lib/rubocop/cop/style/redundant_self.rb +1 -1
  189. data/lib/rubocop/cop/style/redundant_sort.rb +2 -2
  190. data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
  191. data/lib/rubocop/cop/style/return_nil.rb +1 -1
  192. data/lib/rubocop/cop/style/safe_navigation.rb +3 -7
  193. data/lib/rubocop/cop/style/self_assignment.rb +1 -1
  194. data/lib/rubocop/cop/style/slicing_with_range.rb +39 -0
  195. data/lib/rubocop/cop/style/special_global_vars.rb +3 -7
  196. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -4
  197. data/lib/rubocop/cop/style/string_hash_keys.rb +1 -1
  198. data/lib/rubocop/cop/style/symbol_array.rb +1 -1
  199. data/lib/rubocop/cop/style/symbol_literal.rb +2 -2
  200. data/lib/rubocop/cop/style/ternary_parentheses.rb +2 -5
  201. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +35 -0
  202. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +41 -0
  203. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +88 -0
  204. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +44 -0
  205. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +2 -6
  206. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  207. data/lib/rubocop/cop/style/unpack_first.rb +0 -4
  208. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
  209. data/lib/rubocop/cop/style/while_until_modifier.rb +1 -1
  210. data/lib/rubocop/cop/style/word_array.rb +1 -1
  211. data/lib/rubocop/cop/style/zero_length_predicate.rb +1 -1
  212. data/lib/rubocop/cop/util.rb +24 -0
  213. data/lib/rubocop/cop/variable_force.rb +3 -9
  214. data/lib/rubocop/cop/variable_force/assignment.rb +1 -0
  215. data/lib/rubocop/cop/variable_force/branch.rb +2 -6
  216. data/lib/rubocop/cop/variable_force/scope.rb +1 -0
  217. data/lib/rubocop/cop/variable_force/variable.rb +3 -6
  218. data/lib/rubocop/ext/processed_source.rb +18 -0
  219. data/lib/rubocop/formatter/base_formatter.rb +0 -4
  220. data/lib/rubocop/formatter/clang_style_formatter.rb +1 -1
  221. data/lib/rubocop/formatter/disabled_config_formatter.rb +4 -12
  222. data/lib/rubocop/formatter/formatter_set.rb +1 -4
  223. data/lib/rubocop/formatter/junit_formatter.rb +17 -6
  224. data/lib/rubocop/formatter/pacman_formatter.rb +1 -1
  225. data/lib/rubocop/formatter/tap_formatter.rb +1 -1
  226. data/lib/rubocop/name_similarity.rb +12 -9
  227. data/lib/rubocop/options.rb +20 -13
  228. data/lib/rubocop/remote_config.rb +1 -3
  229. data/lib/rubocop/result_cache.rb +1 -3
  230. data/lib/rubocop/rspec/cop_helper.rb +2 -4
  231. data/lib/rubocop/rspec/expect_offense.rb +4 -10
  232. data/lib/rubocop/rspec/shared_contexts.rb +54 -20
  233. data/lib/rubocop/runner.rb +15 -12
  234. data/lib/rubocop/target_finder.rb +5 -7
  235. data/lib/rubocop/target_ruby.rb +2 -2
  236. data/lib/rubocop/version.rb +5 -3
  237. metadata +32 -77
  238. data/lib/rubocop/ast/builder.rb +0 -83
  239. data/lib/rubocop/ast/node.rb +0 -632
  240. data/lib/rubocop/ast/node/alias_node.rb +0 -24
  241. data/lib/rubocop/ast/node/and_node.rb +0 -29
  242. data/lib/rubocop/ast/node/args_node.rb +0 -29
  243. data/lib/rubocop/ast/node/array_node.rb +0 -57
  244. data/lib/rubocop/ast/node/block_node.rb +0 -117
  245. data/lib/rubocop/ast/node/break_node.rb +0 -17
  246. data/lib/rubocop/ast/node/case_node.rb +0 -56
  247. data/lib/rubocop/ast/node/class_node.rb +0 -31
  248. data/lib/rubocop/ast/node/def_node.rb +0 -82
  249. data/lib/rubocop/ast/node/defined_node.rb +0 -17
  250. data/lib/rubocop/ast/node/ensure_node.rb +0 -17
  251. data/lib/rubocop/ast/node/float_node.rb +0 -12
  252. data/lib/rubocop/ast/node/for_node.rb +0 -53
  253. data/lib/rubocop/ast/node/forward_args_node.rb +0 -18
  254. data/lib/rubocop/ast/node/hash_node.rb +0 -109
  255. data/lib/rubocop/ast/node/if_node.rb +0 -175
  256. data/lib/rubocop/ast/node/int_node.rb +0 -12
  257. data/lib/rubocop/ast/node/keyword_splat_node.rb +0 -45
  258. data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +0 -16
  259. data/lib/rubocop/ast/node/mixin/binary_operator_node.rb +0 -43
  260. data/lib/rubocop/ast/node/mixin/collection_node.rb +0 -15
  261. data/lib/rubocop/ast/node/mixin/conditional_node.rb +0 -45
  262. data/lib/rubocop/ast/node/mixin/hash_element_node.rb +0 -125
  263. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +0 -261
  264. data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +0 -114
  265. data/lib/rubocop/ast/node/mixin/modifier_node.rb +0 -17
  266. data/lib/rubocop/ast/node/mixin/numeric_node.rb +0 -21
  267. data/lib/rubocop/ast/node/mixin/parameterized_node.rb +0 -61
  268. data/lib/rubocop/ast/node/mixin/predicate_operator_node.rb +0 -35
  269. data/lib/rubocop/ast/node/module_node.rb +0 -24
  270. data/lib/rubocop/ast/node/or_node.rb +0 -29
  271. data/lib/rubocop/ast/node/pair_node.rb +0 -63
  272. data/lib/rubocop/ast/node/range_node.rb +0 -18
  273. data/lib/rubocop/ast/node/regexp_node.rb +0 -33
  274. data/lib/rubocop/ast/node/resbody_node.rb +0 -24
  275. data/lib/rubocop/ast/node/retry_node.rb +0 -17
  276. data/lib/rubocop/ast/node/return_node.rb +0 -24
  277. data/lib/rubocop/ast/node/self_class_node.rb +0 -24
  278. data/lib/rubocop/ast/node/send_node.rb +0 -13
  279. data/lib/rubocop/ast/node/str_node.rb +0 -16
  280. data/lib/rubocop/ast/node/super_node.rb +0 -21
  281. data/lib/rubocop/ast/node/symbol_node.rb +0 -12
  282. data/lib/rubocop/ast/node/until_node.rb +0 -35
  283. data/lib/rubocop/ast/node/when_node.rb +0 -53
  284. data/lib/rubocop/ast/node/while_node.rb +0 -35
  285. data/lib/rubocop/ast/node/yield_node.rb +0 -21
  286. data/lib/rubocop/ast/sexp.rb +0 -16
  287. data/lib/rubocop/ast/traversal.rb +0 -200
  288. data/lib/rubocop/cop/lint/end_in_method.rb +0 -40
  289. data/lib/rubocop/formatter/disabled_lines_formatter.rb +0 -57
  290. data/lib/rubocop/node_pattern.rb +0 -887
  291. data/lib/rubocop/processed_source.rb +0 -216
  292. data/lib/rubocop/string_util.rb +0 -14
  293. data/lib/rubocop/token.rb +0 -114
@@ -115,7 +115,7 @@ module RuboCop
115
115
  lambda do |corrector|
116
116
  new, old = *send_node.arguments
117
117
  replacement = "alias #{identifier(new)} #{identifier(old)}"
118
- corrector.replace(send_node.source_range, replacement)
118
+ corrector.replace(send_node, replacement)
119
119
  end
120
120
  end
121
121
 
@@ -125,15 +125,15 @@ module RuboCop
125
125
  'alias_method ' \
126
126
  ":#{identifier(node.new_identifier)}, " \
127
127
  ":#{identifier(node.old_identifier)}"
128
- corrector.replace(node.source_range, replacement)
128
+ corrector.replace(node, replacement)
129
129
  end
130
130
  end
131
131
 
132
132
  def correct_alias_with_symbol_args(node)
133
133
  lambda do |corrector|
134
- corrector.replace(node.new_identifier.source_range,
134
+ corrector.replace(node.new_identifier,
135
135
  node.new_identifier.source[1..-1])
136
- corrector.replace(node.old_identifier.source_range,
136
+ corrector.replace(node.old_identifier,
137
137
  node.old_identifier.source[1..-1])
138
138
  end
139
139
  end
@@ -7,7 +7,7 @@ module RuboCop
7
7
  # `||` instead. It can be configured to check only in conditions or in
8
8
  # all contexts.
9
9
  #
10
- # @example EnforcedStyle: always (default)
10
+ # @example EnforcedStyle: always
11
11
  # # bad
12
12
  # foo.save and return
13
13
  #
@@ -22,7 +22,7 @@ module RuboCop
22
22
  # if foo && bar
23
23
  # end
24
24
  #
25
- # @example EnforcedStyle: conditionals
25
+ # @example EnforcedStyle: conditionals (default)
26
26
  # # bad
27
27
  # if foo and bar
28
28
  # end
@@ -97,12 +97,12 @@ module RuboCop
97
97
  return unless correctable_send?(node)
98
98
 
99
99
  corrector.replace(whitespace_before_arg(node), '(')
100
- corrector.insert_after(node.last_argument.source_range, ')')
100
+ corrector.insert_after(node.last_argument, ')')
101
101
  end
102
102
 
103
103
  def correct_setter(node, corrector)
104
- corrector.insert_before(node.receiver.source_range, '(')
105
- corrector.insert_after(node.last_argument.source_range, ')')
104
+ corrector.insert_before(node.receiver, '(')
105
+ corrector.insert_after(node.last_argument, ')')
106
106
  end
107
107
 
108
108
  # ! is a special case:
@@ -124,8 +124,7 @@ module RuboCop
124
124
  def correct_other(node, corrector)
125
125
  return if node.source_range.begin.is?('(')
126
126
 
127
- corrector.insert_before(node.source_range, '(')
128
- corrector.insert_after(node.source_range, ')')
127
+ corrector.wrap(node, '(', ')')
129
128
  end
130
129
 
131
130
  def correctable_send?(node)
@@ -137,7 +136,7 @@ module RuboCop
137
136
  end_paren = begin_paren
138
137
  # Increment position of parenthesis, unless message is a predicate
139
138
  # method followed by a non-whitespace char (e.g. is_a?String).
140
- end_paren += 1 unless node.source =~ /\?\S/
139
+ end_paren += 1 unless /\?\S/.match?(node.source)
141
140
  range_between(begin_paren, end_paren)
142
141
  end
143
142
  end
@@ -30,7 +30,7 @@ module RuboCop
30
30
  array, join_arg = join_candidate?(node).map(&:source)
31
31
 
32
32
  lambda do |corrector|
33
- corrector.replace(node.source_range, "#{array}.join(#{join_arg})")
33
+ corrector.replace(node, "#{array}.join(#{join_arg})")
34
34
  end
35
35
  end
36
36
  end
@@ -35,9 +35,7 @@ module RuboCop
35
35
  node_expr = node.source_range
36
36
  attr_expr = attr_name.source_range
37
37
 
38
- if setter&.boolean_type?
39
- remove = range_between(attr_expr.end_pos, node_expr.end_pos)
40
- end
38
+ remove = range_between(attr_expr.end_pos, node_expr.end_pos) if setter&.boolean_type?
41
39
 
42
40
  lambda do |corrector|
43
41
  corrector.replace(node.loc.selector, replacement_method(node))
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # rubocop:disable Metrics/ClassLength
4
3
  module RuboCop
5
4
  module Cop
6
5
  module Style
@@ -210,9 +209,7 @@ module RuboCop
210
209
  end
211
210
 
212
211
  def message(node)
213
- if braces_required_method?(node.method_name)
214
- return braces_required_message(node)
215
- end
212
+ return braces_required_message(node) if braces_required_method?(node.method_name)
216
213
 
217
214
  case style
218
215
  when :line_count_based then line_count_based_message(node)
@@ -276,9 +273,7 @@ module RuboCop
276
273
  # rubocop:enable Metrics/CyclomaticComplexity
277
274
 
278
275
  def proper_block_style?(node)
279
- if special_method?(node.method_name)
280
- return special_method_proper_block_style?(node)
281
- end
276
+ return special_method_proper_block_style?(node) if special_method?(node.method_name)
282
277
 
283
278
  case style
284
279
  when :line_count_based then line_count_based_block_style?(node)
@@ -387,4 +382,3 @@ module RuboCop
387
382
  end
388
383
  end
389
384
  end
390
- # rubocop:enable Metrics/ClassLength
@@ -16,14 +16,37 @@ module RuboCop
16
16
  # (1..100).include?(7)
17
17
  # some_string =~ /something/
18
18
  #
19
+ # @example AllowOnConstant
20
+ # # Style/CaseEquality:
21
+ # # AllowOnConstant: true
22
+ #
23
+ # # bad
24
+ # (1..100) === 7
25
+ # /something/ === some_string
26
+ #
27
+ # # good
28
+ # Array === something
29
+ # (1..100).include?(7)
30
+ # some_string =~ /something/
31
+ #
19
32
  class CaseEquality < Cop
20
33
  MSG = 'Avoid the use of the case equality operator `===`.'
21
34
 
22
- def_node_matcher :case_equality?, '(send _ :=== _)'
35
+ def_node_matcher :case_equality?, '(send #const? :=== _)'
23
36
 
24
37
  def on_send(node)
25
38
  case_equality?(node) { add_offense(node, location: :selector) }
26
39
  end
40
+
41
+ private
42
+
43
+ def const?(node)
44
+ if cop_config.fetch('AllowOnConstant', false)
45
+ !node&.const_type?
46
+ else
47
+ true
48
+ end
49
+ end
27
50
  end
28
51
  end
29
52
  end
@@ -33,9 +33,9 @@ module RuboCop
33
33
  # special character like \n
34
34
  # or ' which needs to use "" or be escaped.
35
35
  if string.length == 2 || string == "'"
36
- corrector.replace(node.source_range, %("#{string}"))
36
+ corrector.replace(node, %("#{string}"))
37
37
  elsif string.length == 1 # normal character
38
- corrector.replace(node.source_range, "'#{string}'")
38
+ corrector.replace(node, "'#{string}'")
39
39
  end
40
40
  end
41
41
  end
@@ -27,6 +27,7 @@ module RuboCop
27
27
  # items.inject
28
28
  # items.detect
29
29
  # items.find_all
30
+ # items.member?
30
31
  #
31
32
  # # good
32
33
  # items.map
@@ -34,6 +35,7 @@ module RuboCop
34
35
  # items.reduce
35
36
  # items.find
36
37
  # items.select
38
+ # items.include?
37
39
  #
38
40
  class CollectionMethods < Cop
39
41
  include MethodPreference
@@ -312,9 +312,7 @@ module RuboCop
312
312
  # ignore pseudo-assignments without rhs in for nodes
313
313
  return if node.parent&.for_type?
314
314
 
315
- if assignment.begin_type? && assignment.children.one?
316
- assignment, = *assignment
317
- end
315
+ assignment, = *assignment if assignment.begin_type? && assignment.children.one?
318
316
 
319
317
  assignment
320
318
  end
@@ -458,7 +456,7 @@ module RuboCop
458
456
  def correct_if_branches(corrector, cop, node)
459
457
  if_branch, elsif_branches, else_branch = extract_tail_branches(node)
460
458
 
461
- corrector.insert_before(node.source_range, lhs(if_branch))
459
+ corrector.insert_before(node, lhs(if_branch))
462
460
  replace_branch_assignment(corrector, if_branch)
463
461
  correct_branches(corrector, elsif_branches)
464
462
  replace_branch_assignment(corrector, else_branch)
@@ -475,13 +473,13 @@ module RuboCop
475
473
  source
476
474
  end
477
475
 
478
- corrector.replace(branch.source_range, replacement)
476
+ corrector.replace(branch, replacement)
479
477
  end
480
478
 
481
479
  def correct_branches(corrector, branches)
482
480
  branches.each do |branch|
483
481
  *_, assignment = *branch
484
- corrector.replace(branch.source_range, assignment.source)
482
+ corrector.replace(branch, assignment.source)
485
483
  end
486
484
  end
487
485
  end
@@ -494,7 +492,7 @@ module RuboCop
494
492
 
495
493
  def correct(node)
496
494
  lambda do |corrector|
497
- corrector.replace(node.source_range, correction(node))
495
+ corrector.replace(node, correction(node))
498
496
  end
499
497
  end
500
498
 
@@ -547,7 +545,7 @@ module RuboCop
547
545
  end
548
546
 
549
547
  def move_branch_inside_condition(corrector, branch, assignment)
550
- corrector.insert_before(branch.loc.expression, assignment.source)
548
+ corrector.insert_before(branch, assignment.source)
551
549
  end
552
550
  end
553
551
  end
@@ -589,7 +587,7 @@ module RuboCop
589
587
  def move_branch_inside_condition(corrector, branch, condition,
590
588
  assignment, column)
591
589
  branch_assignment = tail(branch)
592
- corrector.insert_before(branch_assignment.loc.expression,
590
+ corrector.insert_before(branch_assignment,
593
591
  assignment.source)
594
592
 
595
593
  remove_whitespace_in_branches(corrector, branch, condition, column)
@@ -611,7 +609,7 @@ module RuboCop
611
609
  when_branches, else_branch = extract_tail_branches(node)
612
610
 
613
611
  lambda do |corrector|
614
- corrector.insert_before(node.source_range, lhs(else_branch))
612
+ corrector.insert_before(node, lhs(else_branch))
615
613
  correct_branches(corrector, when_branches)
616
614
  replace_branch_assignment(corrector, else_branch)
617
615
 
@@ -652,7 +650,7 @@ module RuboCop
652
650
  def move_branch_inside_condition(corrector, branch, condition,
653
651
  assignment, column)
654
652
  branch_assignment = tail(branch)
655
- corrector.insert_before(branch_assignment.loc.expression,
653
+ corrector.insert_before(branch_assignment,
656
654
  assignment.source)
657
655
 
658
656
  remove_whitespace_in_branches(corrector, branch, condition, column)
@@ -55,7 +55,7 @@ module RuboCop
55
55
  raise Warning, AUTOCORRECT_EMPTY_WARNING if autocorrect_notice.empty?
56
56
 
57
57
  regex = Regexp.new(notice)
58
- return if autocorrect_notice =~ regex
58
+ return if autocorrect_notice&.match?(regex)
59
59
 
60
60
  raise Warning, "AutocorrectNotice '#{autocorrect_notice}' must " \
61
61
  "match Notice /#{notice}/"
@@ -33,7 +33,7 @@ module RuboCop
33
33
 
34
34
  def autocorrect(node)
35
35
  lambda do |corrector|
36
- corrector.replace(node.source_range, '__dir__')
36
+ corrector.replace(node, '__dir__')
37
37
  end
38
38
  end
39
39
 
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ # rubocop:disable Lint/RedundantCopDisableDirective
4
+
5
+ module RuboCop
6
+ module Cop
7
+ module Style
8
+ # Detects comments to enable/disable RuboCop.
9
+ # This is useful if want to make sure that every RuboCop error gets fixed
10
+ # and not quickly disabled with a comment.
11
+ #
12
+ # @example
13
+ # # bad
14
+ # # rubocop:disable Metrics/AbcSize
15
+ # def f
16
+ # end
17
+ # # rubocop:enable Metrics/AbcSize
18
+ #
19
+ # # good
20
+ # def fixed_method_name_and_no_rubocop_comments
21
+ # end
22
+ #
23
+ class DisableCopsWithinSourceCodeDirective < Cop
24
+ # rubocop:enable Lint/RedundantCopDisableDirective
25
+ MSG = 'Comment to disable/enable RuboCop.'
26
+
27
+ def investigate(processed_source)
28
+ processed_source.comments.each do |comment|
29
+ next unless rubocop_directive_comment?(comment)
30
+
31
+ add_offense(comment)
32
+ end
33
+ end
34
+
35
+ def autocorrect(comment)
36
+ lambda do |corrector|
37
+ corrector.replace(comment, '')
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ def rubocop_directive_comment?(comment)
44
+ comment.text =~ CommentConfig::COMMENT_DIRECTIVE_REGEXP
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -3,10 +3,11 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # This cop checks for missing top-level documentation of
7
- # classes and modules. Classes with no body are exempt from the
8
- # check and so are namespace modules - modules that have nothing in
9
- # their bodies except classes, other modules, or constant definitions.
6
+ # This cop checks for missing top-level documentation of classes and
7
+ # modules. Classes with no body are exempt from the check and so are
8
+ # namespace modules - modules that have nothing in their bodies except
9
+ # classes, other modules, constant definitions or constant visibility
10
+ # declarations.
10
11
  #
11
12
  # The documentation requirement is annulled if the class or module has
12
13
  # a "#:nodoc:" comment next to it. Likewise, "#:nodoc: all" does the
@@ -18,12 +19,42 @@ module RuboCop
18
19
  # # ...
19
20
  # end
20
21
  #
22
+ # module Math
23
+ # end
24
+ #
21
25
  # # good
22
26
  # # Description/Explanation of Person class
23
27
  # class Person
24
28
  # # ...
25
29
  # end
26
30
  #
31
+ # # allowed
32
+ # # Class without body
33
+ # class Person
34
+ # end
35
+ #
36
+ # # Namespace - A namespace can be a class or a module
37
+ # # Containing a class
38
+ # module Namespace
39
+ # # Description/Explanation of Person class
40
+ # class Person
41
+ # # ...
42
+ # end
43
+ # end
44
+ #
45
+ # # Containing constant visibility declaration
46
+ # module Namespace
47
+ # class Private
48
+ # end
49
+ #
50
+ # private_constant :Private
51
+ # end
52
+ #
53
+ # # Containing constant definition
54
+ # module Namespace
55
+ # Public = Class.new
56
+ # end
57
+ #
27
58
  class Documentation < Cop
28
59
  include DocumentationComment
29
60
 
@@ -31,6 +62,9 @@ module RuboCop
31
62
 
32
63
  def_node_matcher :constant_definition?, '{class module casgn}'
33
64
  def_node_search :outer_module, '(const (const nil? _) _)'
65
+ def_node_matcher :constant_visibility_declaration?, <<~PATTERN
66
+ (send nil? {:public_constant :private_constant} ({sym str} _))
67
+ PATTERN
34
68
 
35
69
  def on_class(node)
36
70
  return unless node.body
@@ -59,12 +93,16 @@ module RuboCop
59
93
  return false unless node
60
94
 
61
95
  if node.begin_type?
62
- node.children.all? { |child| constant_definition?(child) }
96
+ node.children.all?(&method(:constant_declaration?))
63
97
  else
64
98
  constant_definition?(node)
65
99
  end
66
100
  end
67
101
 
102
+ def constant_declaration?(node)
103
+ constant_definition?(node) || constant_visibility_declaration?(node)
104
+ end
105
+
68
106
  def compact_namespace?(node)
69
107
  node.loc.name.source =~ /::/
70
108
  end
@@ -45,7 +45,7 @@ module RuboCop
45
45
  end
46
46
 
47
47
  lambda do |corrector|
48
- corrector.replace(comment.loc.expression,
48
+ corrector.replace(comment,
49
49
  comment.text[/#{prefix} \S+/])
50
50
  end
51
51
  end
@@ -3,32 +3,69 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # This cop checks for uses of double negation (!!) to convert something
7
- # to a boolean value. As this is both cryptic and usually redundant, it
8
- # should be avoided.
6
+ # This cop checks for uses of double negation (`!!`) to convert something to a boolean value.
9
7
  #
10
- # @example
8
+ # When using `EnforcedStyle: allowed_in_returns`, allow double nagation in contexts
9
+ # that use boolean as a return value. When using `EnforcedStyle: forbidden`, double nagation
10
+ # should be forbidden always.
11
11
  #
12
+ # @example
12
13
  # # bad
13
14
  # !!something
14
15
  #
15
16
  # # good
16
17
  # !something.nil?
17
18
  #
19
+ # @example EnforcedStyle: allowed_in_returns (default)
20
+ # # good
21
+ # def foo?
22
+ # !!return_value
23
+ # end
24
+ #
25
+ # @example EnforcedStyle: forbidden
26
+ # # bad
27
+ # def foo?
28
+ # !!return_value
29
+ # end
30
+ #
18
31
  # Please, note that when something is a boolean value
19
32
  # !!something and !something.nil? are not the same thing.
20
33
  # As you're unlikely to write code that can accept values of any type
21
34
  # this is rarely a problem in practice.
22
35
  class DoubleNegation < Cop
36
+ include ConfigurableEnforcedStyle
37
+
23
38
  MSG = 'Avoid the use of double negation (`!!`).'
24
39
 
25
40
  def_node_matcher :double_negative?, '(send (send _ :!) :!)'
26
41
 
27
42
  def on_send(node)
28
43
  return unless double_negative?(node) && node.prefix_bang?
44
+ return if style == :allowed_in_returns && allowed_in_returns?(node)
29
45
 
30
46
  add_offense(node, location: :selector)
31
47
  end
48
+
49
+ private
50
+
51
+ def allowed_in_returns?(node)
52
+ node.parent&.return_type? || end_of_method_definition?(node)
53
+ end
54
+
55
+ def end_of_method_definition?(node)
56
+ return false unless (def_node = find_def_node_from_ascendant(node))
57
+
58
+ last_child = def_node.child_nodes.last
59
+
60
+ last_child.last_line == node.last_line
61
+ end
62
+
63
+ def find_def_node_from_ascendant(node)
64
+ return unless (parent = node.parent)
65
+ return parent if parent.def_type? || parent.defs_type?
66
+
67
+ find_def_node_from_ascendant(node.parent)
68
+ end
32
69
  end
33
70
  end
34
71
  end