rubocop 0.80.1 → 0.85.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 (324) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -4
  3. data/config/default.yml +202 -49
  4. data/lib/rubocop.rb +20 -61
  5. data/lib/rubocop/ast_aliases.rb +8 -0
  6. data/lib/rubocop/cli.rb +13 -7
  7. data/lib/rubocop/cli/command/auto_genenerate_config.rb +2 -2
  8. data/lib/rubocop/cli/command/show_cops.rb +2 -6
  9. data/lib/rubocop/comment_config.rb +1 -1
  10. data/lib/rubocop/config.rb +14 -2
  11. data/lib/rubocop/config_loader.rb +37 -33
  12. data/lib/rubocop/config_loader_resolver.rb +45 -6
  13. data/lib/rubocop/config_obsoletion.rb +2 -0
  14. data/lib/rubocop/config_store.rb +12 -2
  15. data/lib/rubocop/config_validator.rb +18 -1
  16. data/lib/rubocop/cop/autocorrect_logic.rb +1 -2
  17. data/lib/rubocop/cop/badge.rb +5 -5
  18. data/lib/rubocop/cop/bundler/gem_comment.rb +70 -1
  19. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +1 -1
  20. data/lib/rubocop/cop/commissioner.rb +0 -21
  21. data/lib/rubocop/cop/cop.rb +14 -6
  22. data/lib/rubocop/cop/corrector.rb +48 -24
  23. data/lib/rubocop/cop/correctors/alignment_corrector.rb +4 -8
  24. data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -2
  25. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +1 -1
  26. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +4 -4
  27. data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -2
  28. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
  29. data/lib/rubocop/cop/correctors/space_corrector.rb +1 -3
  30. data/lib/rubocop/cop/correctors/string_literal_corrector.rb +2 -2
  31. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -3
  32. data/lib/rubocop/cop/generator.rb +4 -3
  33. data/lib/rubocop/cop/ignored_node.rb +1 -3
  34. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +1 -1
  35. data/lib/rubocop/cop/layout/array_alignment.rb +53 -10
  36. data/lib/rubocop/cop/layout/block_end_newline.rb +5 -3
  37. data/lib/rubocop/cop/layout/case_indentation.rb +3 -3
  38. data/lib/rubocop/cop/layout/class_structure.rb +19 -16
  39. data/lib/rubocop/cop/layout/condition_position.rb +12 -2
  40. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  41. data/lib/rubocop/cop/layout/else_alignment.rb +8 -0
  42. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +2 -6
  43. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +126 -0
  44. data/lib/rubocop/cop/layout/end_of_line.rb +2 -2
  45. data/lib/rubocop/cop/layout/first_argument_indentation.rb +1 -3
  46. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +14 -10
  47. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -1
  48. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +1 -1
  49. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -3
  50. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
  51. data/lib/rubocop/cop/layout/hash_alignment.rb +6 -6
  52. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +5 -9
  53. data/lib/rubocop/cop/layout/heredoc_indentation.rb +20 -103
  54. data/lib/rubocop/cop/layout/{tab.rb → indentation_style.rb} +48 -6
  55. data/lib/rubocop/cop/layout/indentation_width.rb +1 -3
  56. data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
  57. data/lib/rubocop/cop/layout/line_length.rb +23 -20
  58. data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -1
  59. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -3
  60. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +1 -1
  61. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +13 -4
  62. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +3 -3
  63. data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -2
  64. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +131 -0
  65. data/lib/rubocop/cop/layout/space_around_operators.rb +19 -2
  66. data/lib/rubocop/cop/layout/space_before_comment.rb +1 -3
  67. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +1 -1
  68. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +1 -3
  69. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +2 -2
  70. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +2 -2
  71. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +1 -3
  72. data/lib/rubocop/cop/layout/trailing_whitespace.rb +2 -2
  73. data/lib/rubocop/cop/lint/ambiguous_operator.rb +41 -0
  74. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +14 -0
  75. data/lib/rubocop/cop/lint/boolean_symbol.rb +12 -0
  76. data/lib/rubocop/cop/lint/debugger.rb +1 -1
  77. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +137 -0
  78. data/lib/rubocop/cop/lint/duplicate_methods.rb +1 -5
  79. data/lib/rubocop/cop/lint/empty_when.rb +29 -6
  80. data/lib/rubocop/cop/lint/ensure_return.rb +19 -2
  81. data/lib/rubocop/cop/lint/erb_new_arguments.rb +2 -4
  82. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  83. data/lib/rubocop/cop/lint/inherit_exception.rb +1 -1
  84. data/lib/rubocop/cop/lint/interpolation_check.rb +1 -1
  85. data/lib/rubocop/cop/lint/literal_as_condition.rb +10 -13
  86. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
  87. data/lib/rubocop/cop/lint/loop.rb +7 -5
  88. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +62 -0
  89. data/lib/rubocop/cop/lint/multiple_comparison.rb +1 -1
  90. data/lib/rubocop/cop/lint/nested_method_definition.rb +2 -2
  91. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  92. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +2 -2
  93. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +7 -7
  94. data/lib/rubocop/cop/lint/number_conversion.rb +1 -1
  95. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +33 -11
  96. data/lib/rubocop/cop/lint/percent_string_array.rb +2 -4
  97. data/lib/rubocop/cop/lint/raise_exception.rb +75 -0
  98. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +1 -6
  99. data/lib/rubocop/cop/lint/redundant_require_statement.rb +3 -3
  100. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -1
  101. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  102. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +1 -1
  103. data/lib/rubocop/cop/lint/struct_new_override.rb +58 -0
  104. data/lib/rubocop/cop/lint/suppressed_exception.rb +23 -26
  105. data/lib/rubocop/cop/lint/syntax.rb +1 -3
  106. data/lib/rubocop/cop/lint/unified_integer.rb +0 -2
  107. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  108. data/lib/rubocop/cop/lint/unused_method_argument.rb +32 -6
  109. data/lib/rubocop/cop/lint/uri_regexp.rb +4 -4
  110. data/lib/rubocop/cop/lint/useless_access_modifier.rb +13 -3
  111. data/lib/rubocop/cop/lint/useless_assignment.rb +3 -2
  112. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -1
  113. data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
  114. data/lib/rubocop/cop/migration/department_name.rb +22 -9
  115. data/lib/rubocop/cop/mixin/alignment.rb +1 -3
  116. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -3
  117. data/lib/rubocop/cop/mixin/check_line_breakable.rb +3 -9
  118. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -3
  119. data/lib/rubocop/cop/mixin/configurable_formatting.rb +2 -4
  120. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +6 -1
  121. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +10 -1
  122. data/lib/rubocop/cop/mixin/hash_transform_method.rb +9 -2
  123. data/lib/rubocop/cop/mixin/ignored_pattern.rb +1 -1
  124. data/lib/rubocop/cop/mixin/line_length_help.rb +3 -2
  125. data/lib/rubocop/cop/mixin/method_complexity.rb +5 -0
  126. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +1 -1
  127. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +16 -0
  128. data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -22
  129. data/lib/rubocop/cop/mixin/target_ruby_version.rb +5 -1
  130. data/lib/rubocop/cop/mixin/trailing_comma.rb +2 -4
  131. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +1 -1
  132. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +11 -1
  133. data/lib/rubocop/cop/naming/constant_name.rb +2 -1
  134. data/lib/rubocop/cop/naming/file_name.rb +27 -14
  135. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +1 -1
  136. data/lib/rubocop/cop/naming/method_name.rb +26 -0
  137. data/lib/rubocop/cop/naming/predicate_name.rb +1 -1
  138. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +1 -1
  139. data/lib/rubocop/cop/registry.rb +12 -7
  140. data/lib/rubocop/cop/severity.rb +1 -3
  141. data/lib/rubocop/cop/style/access_modifier_declarations.rb +26 -6
  142. data/lib/rubocop/cop/style/alias.rb +4 -4
  143. data/lib/rubocop/cop/style/and_or.rb +7 -8
  144. data/lib/rubocop/cop/style/array_join.rb +2 -2
  145. data/lib/rubocop/cop/style/attr.rb +1 -3
  146. data/lib/rubocop/cop/style/bare_percent_literals.rb +1 -1
  147. data/lib/rubocop/cop/style/block_delimiters.rb +2 -8
  148. data/lib/rubocop/cop/style/case_equality.rb +24 -1
  149. data/lib/rubocop/cop/style/character_literal.rb +2 -2
  150. data/lib/rubocop/cop/style/collection_methods.rb +2 -0
  151. data/lib/rubocop/cop/style/conditional_assignment.rb +9 -11
  152. data/lib/rubocop/cop/style/copyright.rb +3 -3
  153. data/lib/rubocop/cop/style/dir.rb +1 -1
  154. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +49 -0
  155. data/lib/rubocop/cop/style/documentation.rb +43 -5
  156. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +1 -1
  157. data/lib/rubocop/cop/style/double_negation.rb +41 -4
  158. data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
  159. data/lib/rubocop/cop/style/each_with_object.rb +3 -3
  160. data/lib/rubocop/cop/style/empty_literal.rb +1 -3
  161. data/lib/rubocop/cop/style/empty_method.rb +2 -6
  162. data/lib/rubocop/cop/style/end_block.rb +6 -0
  163. data/lib/rubocop/cop/style/even_odd.rb +1 -1
  164. data/lib/rubocop/cop/style/expand_path_arguments.rb +3 -3
  165. data/lib/rubocop/cop/style/exponential_notation.rb +119 -0
  166. data/lib/rubocop/cop/style/format_string.rb +2 -2
  167. data/lib/rubocop/cop/style/format_string_token.rb +2 -3
  168. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -6
  169. data/lib/rubocop/cop/style/guard_clause.rb +25 -2
  170. data/lib/rubocop/cop/style/hash_each_methods.rb +6 -4
  171. data/lib/rubocop/cop/style/hash_syntax.rb +19 -12
  172. data/lib/rubocop/cop/style/hash_transform_keys.rb +6 -2
  173. data/lib/rubocop/cop/style/hash_transform_values.rb +6 -5
  174. data/lib/rubocop/cop/style/if_unless_modifier.rb +23 -3
  175. data/lib/rubocop/cop/style/if_with_semicolon.rb +16 -0
  176. data/lib/rubocop/cop/style/inline_comment.rb +1 -1
  177. data/lib/rubocop/cop/style/inverse_methods.rb +1 -1
  178. data/lib/rubocop/cop/style/lambda.rb +3 -2
  179. data/lib/rubocop/cop/style/lambda_call.rb +1 -21
  180. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +1 -3
  181. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -3
  182. data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
  183. data/lib/rubocop/cop/style/module_function.rb +58 -12
  184. data/lib/rubocop/cop/style/multiline_if_modifier.rb +1 -1
  185. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  186. data/lib/rubocop/cop/style/multiline_when_then.rb +16 -1
  187. data/lib/rubocop/cop/style/mutable_constant.rb +2 -4
  188. data/lib/rubocop/cop/style/negated_if.rb +3 -3
  189. data/lib/rubocop/cop/style/negated_unless.rb +3 -3
  190. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -2
  191. data/lib/rubocop/cop/style/next.rb +2 -2
  192. data/lib/rubocop/cop/style/nil_comparison.rb +1 -1
  193. data/lib/rubocop/cop/style/non_nil_check.rb +5 -5
  194. data/lib/rubocop/cop/style/not.rb +1 -1
  195. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
  196. data/lib/rubocop/cop/style/numeric_literals.rb +1 -1
  197. data/lib/rubocop/cop/style/numeric_predicate.rb +1 -1
  198. data/lib/rubocop/cop/style/one_line_conditional.rb +6 -9
  199. data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
  200. data/lib/rubocop/cop/style/or_assignment.rb +1 -1
  201. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
  202. data/lib/rubocop/cop/style/perl_backrefs.rb +2 -2
  203. data/lib/rubocop/cop/style/proc.rb +1 -1
  204. data/lib/rubocop/cop/style/raise_args.rb +1 -1
  205. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  206. data/lib/rubocop/cop/style/redundant_condition.rb +3 -4
  207. data/lib/rubocop/cop/style/redundant_conditional.rb +1 -1
  208. data/lib/rubocop/cop/style/redundant_exception.rb +3 -3
  209. data/lib/rubocop/cop/style/redundant_interpolation.rb +2 -2
  210. data/lib/rubocop/cop/style/redundant_parentheses.rb +2 -6
  211. data/lib/rubocop/cop/style/redundant_percent_q.rb +3 -3
  212. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +89 -0
  213. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +130 -0
  214. data/lib/rubocop/cop/style/redundant_return.rb +5 -7
  215. data/lib/rubocop/cop/style/redundant_self.rb +1 -1
  216. data/lib/rubocop/cop/style/redundant_sort.rb +2 -2
  217. data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
  218. data/lib/rubocop/cop/style/return_nil.rb +1 -1
  219. data/lib/rubocop/cop/style/safe_navigation.rb +3 -7
  220. data/lib/rubocop/cop/style/self_assignment.rb +1 -1
  221. data/lib/rubocop/cop/style/slicing_with_range.rb +39 -0
  222. data/lib/rubocop/cop/style/special_global_vars.rb +3 -7
  223. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -4
  224. data/lib/rubocop/cop/style/string_hash_keys.rb +1 -1
  225. data/lib/rubocop/cop/style/symbol_array.rb +2 -2
  226. data/lib/rubocop/cop/style/symbol_literal.rb +2 -2
  227. data/lib/rubocop/cop/style/ternary_parentheses.rb +2 -5
  228. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +35 -0
  229. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +41 -0
  230. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +88 -0
  231. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +44 -0
  232. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +1 -3
  233. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  234. data/lib/rubocop/cop/style/unless_else.rb +1 -1
  235. data/lib/rubocop/cop/style/unpack_first.rb +0 -4
  236. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
  237. data/lib/rubocop/cop/style/when_then.rb +1 -1
  238. data/lib/rubocop/cop/style/while_until_modifier.rb +1 -1
  239. data/lib/rubocop/cop/style/word_array.rb +1 -1
  240. data/lib/rubocop/cop/style/zero_length_predicate.rb +1 -1
  241. data/lib/rubocop/cop/team.rb +61 -25
  242. data/lib/rubocop/cop/util.rb +25 -1
  243. data/lib/rubocop/cop/variable_force.rb +3 -9
  244. data/lib/rubocop/cop/variable_force/assignment.rb +1 -0
  245. data/lib/rubocop/cop/variable_force/branch.rb +1 -3
  246. data/lib/rubocop/cop/variable_force/scope.rb +1 -0
  247. data/lib/rubocop/cop/variable_force/variable.rb +3 -6
  248. data/lib/rubocop/ext/processed_source.rb +18 -0
  249. data/lib/rubocop/formatter/base_formatter.rb +0 -4
  250. data/lib/rubocop/formatter/clang_style_formatter.rb +1 -1
  251. data/lib/rubocop/formatter/disabled_config_formatter.rb +4 -12
  252. data/lib/rubocop/formatter/formatter_set.rb +1 -4
  253. data/lib/rubocop/formatter/junit_formatter.rb +27 -6
  254. data/lib/rubocop/formatter/pacman_formatter.rb +1 -1
  255. data/lib/rubocop/formatter/tap_formatter.rb +1 -1
  256. data/lib/rubocop/magic_comment.rb +1 -1
  257. data/lib/rubocop/name_similarity.rb +12 -9
  258. data/lib/rubocop/options.rb +33 -12
  259. data/lib/rubocop/remote_config.rb +1 -3
  260. data/lib/rubocop/result_cache.rb +5 -7
  261. data/lib/rubocop/rspec/cop_helper.rb +3 -26
  262. data/lib/rubocop/rspec/expect_offense.rb +46 -16
  263. data/lib/rubocop/rspec/shared_contexts.rb +54 -20
  264. data/lib/rubocop/runner.rb +21 -14
  265. data/lib/rubocop/target_finder.rb +7 -7
  266. data/lib/rubocop/target_ruby.rb +5 -2
  267. data/lib/rubocop/version.rb +5 -3
  268. metadata +50 -77
  269. data/lib/rubocop/ast/builder.rb +0 -83
  270. data/lib/rubocop/ast/node.rb +0 -632
  271. data/lib/rubocop/ast/node/alias_node.rb +0 -24
  272. data/lib/rubocop/ast/node/and_node.rb +0 -29
  273. data/lib/rubocop/ast/node/args_node.rb +0 -29
  274. data/lib/rubocop/ast/node/array_node.rb +0 -57
  275. data/lib/rubocop/ast/node/block_node.rb +0 -117
  276. data/lib/rubocop/ast/node/break_node.rb +0 -17
  277. data/lib/rubocop/ast/node/case_node.rb +0 -56
  278. data/lib/rubocop/ast/node/class_node.rb +0 -31
  279. data/lib/rubocop/ast/node/def_node.rb +0 -82
  280. data/lib/rubocop/ast/node/defined_node.rb +0 -17
  281. data/lib/rubocop/ast/node/ensure_node.rb +0 -17
  282. data/lib/rubocop/ast/node/float_node.rb +0 -12
  283. data/lib/rubocop/ast/node/for_node.rb +0 -53
  284. data/lib/rubocop/ast/node/forward_args_node.rb +0 -18
  285. data/lib/rubocop/ast/node/hash_node.rb +0 -109
  286. data/lib/rubocop/ast/node/if_node.rb +0 -175
  287. data/lib/rubocop/ast/node/int_node.rb +0 -12
  288. data/lib/rubocop/ast/node/keyword_splat_node.rb +0 -45
  289. data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +0 -16
  290. data/lib/rubocop/ast/node/mixin/binary_operator_node.rb +0 -43
  291. data/lib/rubocop/ast/node/mixin/collection_node.rb +0 -15
  292. data/lib/rubocop/ast/node/mixin/conditional_node.rb +0 -45
  293. data/lib/rubocop/ast/node/mixin/hash_element_node.rb +0 -125
  294. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +0 -261
  295. data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +0 -114
  296. data/lib/rubocop/ast/node/mixin/modifier_node.rb +0 -17
  297. data/lib/rubocop/ast/node/mixin/numeric_node.rb +0 -21
  298. data/lib/rubocop/ast/node/mixin/parameterized_node.rb +0 -61
  299. data/lib/rubocop/ast/node/mixin/predicate_operator_node.rb +0 -35
  300. data/lib/rubocop/ast/node/module_node.rb +0 -24
  301. data/lib/rubocop/ast/node/or_node.rb +0 -29
  302. data/lib/rubocop/ast/node/pair_node.rb +0 -63
  303. data/lib/rubocop/ast/node/range_node.rb +0 -18
  304. data/lib/rubocop/ast/node/regexp_node.rb +0 -33
  305. data/lib/rubocop/ast/node/resbody_node.rb +0 -24
  306. data/lib/rubocop/ast/node/retry_node.rb +0 -17
  307. data/lib/rubocop/ast/node/return_node.rb +0 -24
  308. data/lib/rubocop/ast/node/self_class_node.rb +0 -24
  309. data/lib/rubocop/ast/node/send_node.rb +0 -13
  310. data/lib/rubocop/ast/node/str_node.rb +0 -16
  311. data/lib/rubocop/ast/node/super_node.rb +0 -21
  312. data/lib/rubocop/ast/node/symbol_node.rb +0 -12
  313. data/lib/rubocop/ast/node/until_node.rb +0 -35
  314. data/lib/rubocop/ast/node/when_node.rb +0 -53
  315. data/lib/rubocop/ast/node/while_node.rb +0 -35
  316. data/lib/rubocop/ast/node/yield_node.rb +0 -21
  317. data/lib/rubocop/ast/sexp.rb +0 -16
  318. data/lib/rubocop/ast/traversal.rb +0 -200
  319. data/lib/rubocop/cop/lint/end_in_method.rb +0 -40
  320. data/lib/rubocop/formatter/disabled_lines_formatter.rb +0 -57
  321. data/lib/rubocop/node_pattern.rb +0 -887
  322. data/lib/rubocop/processed_source.rb +0 -216
  323. data/lib/rubocop/string_util.rb +0 -14
  324. data/lib/rubocop/token.rb +0 -114
@@ -8,8 +8,8 @@ module RuboCop
8
8
  # The default regexp for an acceptable copyright notice can be found in
9
9
  # config/default.yml. The default can be changed as follows:
10
10
  #
11
- # Style/Copyright:
12
- # Notice: '^Copyright (\(c\) )?2\d{3} Acme Inc'
11
+ # Style/Copyright:
12
+ # Notice: '^Copyright (\(c\) )?2\d{3} Acme Inc'
13
13
  #
14
14
  # This regex string is treated as an unanchored regex. For each file
15
15
  # that RuboCop scans, a comment that matches this regex must be found or
@@ -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
@@ -42,7 +42,7 @@ module RuboCop
42
42
 
43
43
  max += 1 if range_type == :irange
44
44
 
45
- corrector.replace(node.send_node.source_range,
45
+ corrector.replace(node.send_node,
46
46
  "#{max - min}.times")
47
47
  end
48
48
  end
@@ -48,15 +48,15 @@ module RuboCop
48
48
 
49
49
  first_arg, second_arg = *node.arguments
50
50
 
51
- corrector.replace(first_arg.loc.expression, second_arg.source)
52
- corrector.replace(second_arg.loc.expression, first_arg.source)
51
+ corrector.replace(first_arg, second_arg.source)
52
+ corrector.replace(second_arg, first_arg.source)
53
53
 
54
54
  return_value = return_value(node.body)
55
55
 
56
56
  if return_value_occupies_whole_line?(return_value)
57
57
  corrector.remove(whole_line_expression(return_value))
58
58
  else
59
- corrector.remove(return_value.loc.expression)
59
+ corrector.remove(return_value)
60
60
  end
61
61
  end
62
62
  end
@@ -68,9 +68,7 @@ module RuboCop
68
68
 
69
69
  def first_argument_unparenthesized?(node)
70
70
  parent = node.parent
71
- unless parent && %i[send super zsuper].include?(parent.type)
72
- return false
73
- end
71
+ return false unless parent && %i[send super zsuper].include?(parent.type)
74
72
 
75
73
  node.object_id == parent.arguments.first.object_id &&
76
74
  !parentheses?(node.parent)
@@ -8,7 +8,7 @@ module RuboCop
8
8
  # line (compact style), but it can be configured to enforce the `end`
9
9
  # to go on its own line (expanded style).
10
10
  #
11
- # Note: A method definition is not considered empty if it contains
11
+ # NOTE: A method definition is not considered empty if it contains
12
12
  # comments.
13
13
  #
14
14
  # @example EnforcedStyle: compact (default)
@@ -57,7 +57,7 @@ module RuboCop
57
57
 
58
58
  def autocorrect(node)
59
59
  lambda do |corrector|
60
- corrector.replace(node.source_range, corrected(node))
60
+ corrector.replace(node, corrected(node))
61
61
  end
62
62
  end
63
63
 
@@ -90,10 +90,6 @@ module RuboCop
90
90
  compact_style? ? '; ' : "\n#{indent}"
91
91
  end
92
92
 
93
- def comment_lines?(node)
94
- processed_source[line_range(node)].any? { |line| comment_line?(line) }
95
- end
96
-
97
93
  def compact?(node)
98
94
  node.single_line?
99
95
  end
@@ -19,6 +19,12 @@ module RuboCop
19
19
  def on_postexe(node)
20
20
  add_offense(node, location: :keyword)
21
21
  end
22
+
23
+ def autocorrect(node)
24
+ lambda do |corrector|
25
+ corrector.replace(node.loc.keyword, 'at_exit')
26
+ end
27
+ end
22
28
  end
23
29
  end
24
30
  end
@@ -38,7 +38,7 @@ module RuboCop
38
38
  replacement_method = replacement_method(arg, method)
39
39
 
40
40
  correction = "#{base_number.source}.#{replacement_method}?"
41
- ->(corrector) { corrector.replace(node.source_range, correction) }
41
+ ->(corrector) { corrector.replace(node, correction) }
42
42
  end
43
43
  end
44
44
 
@@ -97,7 +97,7 @@ module RuboCop
97
97
  autocorrect_expand_path(corrector, current_path, default_dir)
98
98
  elsif (default_dir = pathname_parent_expand_path(node)) ||
99
99
  (default_dir = pathname_new_parent_expand_path(node))
100
- corrector.replace(default_dir.loc.expression, '__dir__')
100
+ corrector.replace(default_dir, '__dir__')
101
101
  remove_parent_method(corrector, default_dir)
102
102
  end
103
103
  end
@@ -145,8 +145,8 @@ module RuboCop
145
145
  else
146
146
  new_path = "'#{parent_path(stripped_current_path)}'"
147
147
 
148
- corrector.replace(current_path.loc.expression, new_path)
149
- corrector.replace(default_dir.loc.expression, '__dir__')
148
+ corrector.replace(current_path, new_path)
149
+ corrector.replace(default_dir, '__dir__')
150
150
  end
151
151
  end
152
152
 
@@ -0,0 +1,119 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop enforces consistency when using exponential notation
7
+ # for numbers in the code (eg 1.2e4). Different styles are supported:
8
+ # * `scientific` which enforces a mantissa between 1 (inclusive)
9
+ # and 10 (exclusive).
10
+ # * `engineering` which enforces the exponent to be a multiple of 3
11
+ # and the mantissa to be between 0.1 (inclusive)
12
+ # and 10 (exclusive).
13
+ # * `integral` which enforces the mantissa to always be a whole number
14
+ # without trailing zeroes.
15
+ #
16
+ # @example EnforcedStyle: scientific (default)
17
+ # # Enforces a mantissa between 1 (inclusive) and 10 (exclusive).
18
+ #
19
+ # # bad
20
+ # 10e6
21
+ # 0.3e4
22
+ # 11.7e5
23
+ # 3.14e0
24
+ #
25
+ # # good
26
+ # 1e7
27
+ # 3e3
28
+ # 1.17e6
29
+ # 3.14
30
+ #
31
+ # @example EnforcedStyle: engineering
32
+ # # Enforces using multiple of 3 exponents,
33
+ # # mantissa should be between 0.1 (inclusive) and 1000 (exclusive)
34
+ #
35
+ # # bad
36
+ # 3.2e7
37
+ # 0.1e5
38
+ # 12e5
39
+ # 1232e6
40
+ #
41
+ # # good
42
+ # 32e6
43
+ # 10e3
44
+ # 1.2e6
45
+ # 1.232e9
46
+ #
47
+ # @example EnforcedStyle: integral
48
+ # # Enforces the mantissa to have no decimal part and no
49
+ # # trailing zeroes.
50
+ #
51
+ # # bad
52
+ # 3.2e7
53
+ # 0.1e5
54
+ # 120e4
55
+ #
56
+ # # good
57
+ # 32e6
58
+ # 1e4
59
+ # 12e5
60
+ #
61
+ class ExponentialNotation < Cop
62
+ include ConfigurableEnforcedStyle
63
+
64
+ def on_float(node)
65
+ add_offense(node) if offense?(node)
66
+ end
67
+
68
+ private
69
+
70
+ def scientific?(node)
71
+ mantissa, = node.source.split('e')
72
+ mantissa =~ /^-?[1-9](\.\d*[0-9])?$/
73
+ end
74
+
75
+ def engineering?(node)
76
+ mantissa, exponent = node.source.split('e')
77
+ return false unless /^-?\d+$/.match?(exponent)
78
+ return false unless (exponent.to_i % 3).zero?
79
+ return false if /^-?\d{4}/.match?(mantissa)
80
+ return false if /^-?0\d/.match?(mantissa)
81
+ return false if /^-?0.0/.match?(mantissa)
82
+
83
+ true
84
+ end
85
+
86
+ def integral(node)
87
+ mantissa, = node.source.split('e')
88
+ mantissa =~ /^-?[1-9](\d*[1-9])?$/
89
+ end
90
+
91
+ def offense?(node)
92
+ return false unless node.source['e']
93
+
94
+ case style
95
+ when :scientific
96
+ !scientific?(node)
97
+ when :engineering
98
+ !engineering?(node)
99
+ when :integral
100
+ !integral(node)
101
+ else
102
+ false
103
+ end
104
+ end
105
+
106
+ def message(_node)
107
+ case style
108
+ when :scientific
109
+ 'Use a mantissa in [1, 10[.'
110
+ when :engineering
111
+ 'Use an exponent divisible by 3 and a mantissa in [0.1, 1000[.'
112
+ when :integral
113
+ 'Use an integer as mantissa, without trailing zero.'
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end