rubocop 0.35.1 → 0.36.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rubocop might be problematic. Click here for more details.

Files changed (385) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +164 -0
  3. data/LICENSE.txt +1 -1
  4. data/README.md +72 -21
  5. data/bin/rubocop +1 -0
  6. data/config/default.yml +167 -18
  7. data/config/disabled.yml +19 -6
  8. data/config/enabled.yml +159 -14
  9. data/lib/rubocop.rb +67 -26
  10. data/lib/rubocop/ast_node.rb +488 -14
  11. data/lib/rubocop/ast_node/builder.rb +24 -0
  12. data/lib/rubocop/ast_node/sexp.rb +13 -0
  13. data/lib/rubocop/cached_data.rb +58 -0
  14. data/lib/rubocop/cli.rb +47 -10
  15. data/lib/rubocop/comment_config.rb +9 -2
  16. data/lib/rubocop/config.rb +99 -31
  17. data/lib/rubocop/config_loader.rb +23 -14
  18. data/lib/rubocop/config_store.rb +1 -0
  19. data/lib/rubocop/cop/autocorrect_logic.rb +2 -1
  20. data/lib/rubocop/cop/commissioner.rb +3 -5
  21. data/lib/rubocop/cop/cop.rb +23 -17
  22. data/lib/rubocop/cop/corrector.rb +25 -0
  23. data/lib/rubocop/cop/force.rb +1 -0
  24. data/lib/rubocop/cop/ignored_node.rb +3 -2
  25. data/lib/rubocop/cop/lint/ambiguous_operator.rb +2 -1
  26. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +2 -1
  27. data/lib/rubocop/cop/lint/assignment_in_condition.rb +4 -3
  28. data/lib/rubocop/cop/lint/block_alignment.rb +29 -91
  29. data/lib/rubocop/cop/lint/circular_argument_reference.rb +2 -1
  30. data/lib/rubocop/cop/lint/condition_position.rb +2 -1
  31. data/lib/rubocop/cop/lint/debugger.rb +29 -12
  32. data/lib/rubocop/cop/lint/def_end_alignment.rb +16 -18
  33. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +6 -6
  34. data/lib/rubocop/cop/lint/duplicate_methods.rb +98 -74
  35. data/lib/rubocop/cop/lint/duplicated_key.rb +3 -2
  36. data/lib/rubocop/cop/lint/each_with_object_argument.rb +3 -2
  37. data/lib/rubocop/cop/lint/else_layout.rb +2 -1
  38. data/lib/rubocop/cop/lint/empty_ensure.rb +2 -1
  39. data/lib/rubocop/cop/lint/empty_interpolation.rb +2 -1
  40. data/lib/rubocop/cop/lint/end_alignment.rb +77 -39
  41. data/lib/rubocop/cop/lint/end_in_method.rb +2 -1
  42. data/lib/rubocop/cop/lint/ensure_return.rb +2 -1
  43. data/lib/rubocop/cop/lint/eval.rb +2 -1
  44. data/lib/rubocop/cop/lint/float_out_of_range.rb +31 -0
  45. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +14 -30
  46. data/lib/rubocop/cop/lint/handle_exceptions.rb +2 -1
  47. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +85 -0
  48. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +120 -0
  49. data/lib/rubocop/cop/lint/invalid_character_literal.rb +3 -1
  50. data/lib/rubocop/cop/lint/literal_in_condition.rb +6 -9
  51. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +6 -9
  52. data/lib/rubocop/cop/lint/loop.rb +2 -1
  53. data/lib/rubocop/cop/lint/nested_method_definition.rb +19 -3
  54. data/lib/rubocop/cop/lint/next_without_accumulator.rb +38 -0
  55. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +5 -8
  56. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +8 -6
  57. data/lib/rubocop/cop/lint/rand_one.rb +36 -0
  58. data/lib/rubocop/cop/lint/require_parentheses.rb +6 -5
  59. data/lib/rubocop/cop/lint/rescue_exception.rb +3 -2
  60. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +2 -1
  61. data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +6 -4
  62. data/lib/rubocop/cop/lint/syntax.rb +9 -5
  63. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +3 -2
  64. data/lib/rubocop/cop/lint/unneeded_disable.rb +121 -18
  65. data/lib/rubocop/cop/lint/unreachable_code.rb +5 -4
  66. data/lib/rubocop/cop/lint/unused_block_argument.rb +9 -7
  67. data/lib/rubocop/cop/lint/unused_method_argument.rb +2 -1
  68. data/lib/rubocop/cop/lint/useless_access_modifier.rb +56 -29
  69. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -16
  70. data/lib/rubocop/cop/lint/useless_comparison.rb +3 -2
  71. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +2 -1
  72. data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -20
  73. data/lib/rubocop/cop/lint/void.rb +10 -11
  74. data/lib/rubocop/cop/metrics/abc_size.rb +3 -1
  75. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -1
  76. data/lib/rubocop/cop/metrics/class_length.rb +1 -0
  77. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +4 -2
  78. data/lib/rubocop/cop/metrics/line_length.rb +35 -13
  79. data/lib/rubocop/cop/metrics/method_length.rb +2 -1
  80. data/lib/rubocop/cop/metrics/module_length.rb +1 -0
  81. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -1
  82. data/lib/rubocop/cop/metrics/perceived_complexity.rb +4 -2
  83. data/lib/rubocop/cop/mixin/access_modifier_node.rb +3 -10
  84. data/lib/rubocop/cop/mixin/annotation_comment.rb +1 -0
  85. data/lib/rubocop/cop/mixin/array_hash_indentation.rb +80 -0
  86. data/lib/rubocop/cop/mixin/array_syntax.rb +2 -1
  87. data/lib/rubocop/cop/mixin/autocorrect_alignment.rb +14 -20
  88. data/lib/rubocop/cop/mixin/autocorrect_unless_changing_ast.rb +5 -4
  89. data/lib/rubocop/cop/mixin/check_assignment.rb +20 -15
  90. data/lib/rubocop/cop/mixin/classish_length.rb +1 -0
  91. data/lib/rubocop/cop/mixin/code_length.rb +1 -0
  92. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +17 -15
  93. data/lib/rubocop/cop/mixin/configurable_max.rb +1 -0
  94. data/lib/rubocop/cop/mixin/configurable_naming.rb +4 -0
  95. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +9 -4
  96. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +24 -16
  97. data/lib/rubocop/cop/mixin/first_element_line_break.rb +3 -2
  98. data/lib/rubocop/cop/mixin/hash_node.rb +15 -0
  99. data/lib/rubocop/cop/mixin/if_node.rb +1 -0
  100. data/lib/rubocop/cop/mixin/method_complexity.rb +1 -0
  101. data/lib/rubocop/cop/mixin/method_preference.rb +1 -0
  102. data/lib/rubocop/cop/mixin/min_body_length.rb +1 -0
  103. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +177 -0
  104. data/lib/rubocop/cop/mixin/negative_conditional.rb +1 -0
  105. data/lib/rubocop/cop/mixin/on_method_def.rb +6 -5
  106. data/lib/rubocop/cop/mixin/on_normal_if_unless.rb +1 -0
  107. data/lib/rubocop/cop/mixin/parentheses.rb +22 -0
  108. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +1 -0
  109. data/lib/rubocop/cop/mixin/percent_literal.rb +1 -0
  110. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +79 -0
  111. data/lib/rubocop/cop/mixin/safe_assignment.rb +1 -0
  112. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +2 -1
  113. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +2 -1
  114. data/lib/rubocop/cop/mixin/space_inside.rb +2 -1
  115. data/lib/rubocop/cop/mixin/statement_modifier.rb +6 -5
  116. data/lib/rubocop/cop/mixin/string_help.rb +2 -9
  117. data/lib/rubocop/cop/mixin/string_literals_help.rb +13 -7
  118. data/lib/rubocop/cop/mixin/surrounding_space.rb +3 -2
  119. data/lib/rubocop/cop/mixin/trailing_comma.rb +134 -0
  120. data/lib/rubocop/cop/mixin/unused_argument.rb +1 -0
  121. data/lib/rubocop/cop/offense.rb +19 -14
  122. data/lib/rubocop/cop/performance/case_when_splat.rb +8 -8
  123. data/lib/rubocop/cop/performance/casecmp.rb +54 -0
  124. data/lib/rubocop/cop/performance/count.rb +10 -9
  125. data/lib/rubocop/cop/performance/detect.rb +6 -5
  126. data/lib/rubocop/cop/performance/double_start_end_with.rb +65 -0
  127. data/lib/rubocop/cop/performance/end_with.rb +55 -0
  128. data/lib/rubocop/cop/performance/fixed_size.rb +1 -0
  129. data/lib/rubocop/cop/performance/flat_map.rb +9 -8
  130. data/lib/rubocop/cop/performance/hash_each.rb +86 -0
  131. data/lib/rubocop/cop/performance/lstrip_rstrip.rb +44 -0
  132. data/lib/rubocop/cop/performance/range_include.rb +40 -0
  133. data/lib/rubocop/cop/performance/redundant_block_call.rb +57 -0
  134. data/lib/rubocop/cop/performance/redundant_match.rb +51 -0
  135. data/lib/rubocop/cop/performance/redundant_merge.rb +85 -0
  136. data/lib/rubocop/cop/performance/redundant_sort_by.rb +45 -0
  137. data/lib/rubocop/cop/performance/reverse_each.rb +3 -2
  138. data/lib/rubocop/cop/performance/sample.rb +6 -5
  139. data/lib/rubocop/cop/performance/size.rb +2 -1
  140. data/lib/rubocop/cop/performance/start_with.rb +58 -0
  141. data/lib/rubocop/cop/performance/string_replacement.rb +18 -23
  142. data/lib/rubocop/cop/performance/times_map.rb +49 -0
  143. data/lib/rubocop/cop/rails/action_filter.rb +4 -3
  144. data/lib/rubocop/cop/rails/date.rb +5 -4
  145. data/lib/rubocop/cop/rails/delegate.rb +3 -2
  146. data/lib/rubocop/cop/rails/find_by.rb +20 -14
  147. data/lib/rubocop/cop/rails/find_each.rb +23 -2
  148. data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +3 -2
  149. data/lib/rubocop/cop/rails/output.rb +4 -2
  150. data/lib/rubocop/cop/rails/pluralization_grammar.rb +3 -2
  151. data/lib/rubocop/cop/rails/read_write_attribute.rb +5 -7
  152. data/lib/rubocop/cop/rails/scope_args.rb +3 -2
  153. data/lib/rubocop/cop/rails/time_zone.rb +14 -10
  154. data/lib/rubocop/cop/rails/validation.rb +4 -3
  155. data/lib/rubocop/cop/severity.rb +8 -7
  156. data/lib/rubocop/cop/style/access_modifier_indentation.rb +5 -4
  157. data/lib/rubocop/cop/style/accessor_method_name.rb +1 -0
  158. data/lib/rubocop/cop/style/alias.rb +84 -24
  159. data/lib/rubocop/cop/style/align_array.rb +2 -1
  160. data/lib/rubocop/cop/style/align_hash.rb +13 -14
  161. data/lib/rubocop/cop/style/align_parameters.rb +3 -2
  162. data/lib/rubocop/cop/style/and_or.rb +9 -7
  163. data/lib/rubocop/cop/style/array_join.rb +5 -5
  164. data/lib/rubocop/cop/style/ascii_comments.rb +2 -1
  165. data/lib/rubocop/cop/style/ascii_identifiers.rb +2 -1
  166. data/lib/rubocop/cop/style/attr.rb +30 -5
  167. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +3 -3
  168. data/lib/rubocop/cop/style/bare_percent_literals.rb +2 -1
  169. data/lib/rubocop/cop/style/begin_block.rb +2 -1
  170. data/lib/rubocop/cop/style/block_comments.rb +2 -1
  171. data/lib/rubocop/cop/style/block_delimiters.rb +10 -9
  172. data/lib/rubocop/cop/style/block_end_newline.rb +3 -2
  173. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +9 -8
  174. data/lib/rubocop/cop/style/case_equality.rb +2 -1
  175. data/lib/rubocop/cop/style/case_indentation.rb +2 -1
  176. data/lib/rubocop/cop/style/character_literal.rb +11 -7
  177. data/lib/rubocop/cop/style/class_and_module_camel_case.rb +2 -1
  178. data/lib/rubocop/cop/style/class_and_module_children.rb +3 -2
  179. data/lib/rubocop/cop/style/class_check.rb +2 -1
  180. data/lib/rubocop/cop/style/class_methods.rb +2 -1
  181. data/lib/rubocop/cop/style/class_vars.rb +2 -1
  182. data/lib/rubocop/cop/style/closing_parenthesis_indentation.rb +3 -2
  183. data/lib/rubocop/cop/style/collection_methods.rb +2 -1
  184. data/lib/rubocop/cop/style/colon_method_call.rb +3 -2
  185. data/lib/rubocop/cop/style/command_literal.rb +8 -7
  186. data/lib/rubocop/cop/style/comment_annotation.rb +3 -2
  187. data/lib/rubocop/cop/style/comment_indentation.rb +4 -6
  188. data/lib/rubocop/cop/style/conditional_assignment.rb +362 -0
  189. data/lib/rubocop/cop/style/constant_name.rb +2 -1
  190. data/lib/rubocop/cop/style/copyright.rb +7 -6
  191. data/lib/rubocop/cop/style/def_with_parentheses.rb +2 -1
  192. data/lib/rubocop/cop/style/deprecated_hash_methods.rb +3 -2
  193. data/lib/rubocop/cop/style/documentation.rb +7 -11
  194. data/lib/rubocop/cop/style/dot_position.rb +3 -2
  195. data/lib/rubocop/cop/style/double_negation.rb +2 -1
  196. data/lib/rubocop/cop/style/each_with_object.rb +4 -3
  197. data/lib/rubocop/cop/style/else_alignment.rb +3 -2
  198. data/lib/rubocop/cop/style/empty_else.rb +4 -3
  199. data/lib/rubocop/cop/style/empty_line_between_defs.rb +2 -1
  200. data/lib/rubocop/cop/style/empty_lines.rb +10 -4
  201. data/lib/rubocop/cop/style/empty_lines_around_access_modifier.rb +13 -5
  202. data/lib/rubocop/cop/style/empty_lines_around_block_body.rb +7 -3
  203. data/lib/rubocop/cop/style/empty_lines_around_class_body.rb +6 -3
  204. data/lib/rubocop/cop/style/empty_lines_around_method_body.rb +4 -3
  205. data/lib/rubocop/cop/style/empty_lines_around_module_body.rb +4 -2
  206. data/lib/rubocop/cop/style/empty_literal.rb +20 -5
  207. data/lib/rubocop/cop/style/encoding.rb +8 -11
  208. data/lib/rubocop/cop/style/end_block.rb +3 -1
  209. data/lib/rubocop/cop/style/end_of_line.rb +2 -1
  210. data/lib/rubocop/cop/style/even_odd.rb +4 -3
  211. data/lib/rubocop/cop/style/extra_spacing.rb +110 -74
  212. data/lib/rubocop/cop/style/file_name.rb +103 -6
  213. data/lib/rubocop/cop/style/first_array_element_line_break.rb +3 -2
  214. data/lib/rubocop/cop/style/first_hash_element_line_break.rb +5 -6
  215. data/lib/rubocop/cop/style/first_method_argument_line_break.rb +14 -1
  216. data/lib/rubocop/cop/style/first_method_parameter_line_break.rb +2 -1
  217. data/lib/rubocop/cop/style/first_parameter_indentation.rb +6 -4
  218. data/lib/rubocop/cop/style/flip_flop.rb +2 -1
  219. data/lib/rubocop/cop/style/for.rb +2 -1
  220. data/lib/rubocop/cop/style/format_string.rb +1 -0
  221. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +89 -0
  222. data/lib/rubocop/cop/style/global_vars.rb +2 -1
  223. data/lib/rubocop/cop/style/guard_clause.rb +63 -11
  224. data/lib/rubocop/cop/style/hash_syntax.rb +10 -10
  225. data/lib/rubocop/cop/style/identical_conditional_branches.rb +93 -0
  226. data/lib/rubocop/cop/style/if_inside_else.rb +49 -0
  227. data/lib/rubocop/cop/style/if_unless_modifier.rb +6 -5
  228. data/lib/rubocop/cop/style/if_with_semicolon.rb +2 -1
  229. data/lib/rubocop/cop/style/indent_array.rb +89 -38
  230. data/lib/rubocop/cop/style/indent_assignment.rb +43 -0
  231. data/lib/rubocop/cop/style/indent_hash.rb +16 -77
  232. data/lib/rubocop/cop/style/indentation_consistency.rb +2 -1
  233. data/lib/rubocop/cop/style/indentation_width.rb +11 -11
  234. data/lib/rubocop/cop/style/infinite_loop.rb +5 -9
  235. data/lib/rubocop/cop/style/initial_indentation.rb +2 -1
  236. data/lib/rubocop/cop/style/inline_comment.rb +2 -1
  237. data/lib/rubocop/cop/style/lambda.rb +14 -11
  238. data/lib/rubocop/cop/style/lambda_call.rb +4 -4
  239. data/lib/rubocop/cop/style/leading_comment_space.rb +2 -1
  240. data/lib/rubocop/cop/style/line_end_concatenation.rb +3 -1
  241. data/lib/rubocop/cop/style/method_call_parentheses.rb +9 -1
  242. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -2
  243. data/lib/rubocop/cop/style/method_def_parentheses.rb +4 -4
  244. data/lib/rubocop/cop/style/method_name.rb +1 -0
  245. data/lib/rubocop/cop/style/missing_else.rb +5 -3
  246. data/lib/rubocop/cop/style/module_function.rb +2 -1
  247. data/lib/rubocop/cop/style/multiline_array_brace_layout.rb +95 -0
  248. data/lib/rubocop/cop/style/multiline_assignment_layout.rb +91 -0
  249. data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -2
  250. data/lib/rubocop/cop/style/multiline_block_layout.rb +11 -9
  251. data/lib/rubocop/cop/style/multiline_if_then.rb +1 -0
  252. data/lib/rubocop/cop/style/multiline_method_call_indentation.rb +137 -0
  253. data/lib/rubocop/cop/style/multiline_operation_indentation.rb +25 -135
  254. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +2 -1
  255. data/lib/rubocop/cop/style/mutable_constant.rb +4 -5
  256. data/lib/rubocop/cop/style/negated_if.rb +3 -3
  257. data/lib/rubocop/cop/style/negated_while.rb +3 -3
  258. data/lib/rubocop/cop/style/nested_modifier.rb +6 -5
  259. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +48 -0
  260. data/lib/rubocop/cop/style/nested_ternary_operator.rb +2 -1
  261. data/lib/rubocop/cop/style/next.rb +79 -15
  262. data/lib/rubocop/cop/style/nil_comparison.rb +5 -5
  263. data/lib/rubocop/cop/style/non_nil_check.rb +5 -5
  264. data/lib/rubocop/cop/style/not.rb +5 -9
  265. data/lib/rubocop/cop/style/numeric_literals.rb +5 -4
  266. data/lib/rubocop/cop/style/one_line_conditional.rb +3 -2
  267. data/lib/rubocop/cop/style/op_method.rb +7 -4
  268. data/lib/rubocop/cop/style/option_hash.rb +13 -7
  269. data/lib/rubocop/cop/style/optional_arguments.rb +3 -2
  270. data/lib/rubocop/cop/style/parallel_assignment.rb +40 -16
  271. data/lib/rubocop/cop/style/parentheses_around_condition.rb +3 -16
  272. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +3 -2
  273. data/lib/rubocop/cop/style/percent_q_literals.rb +3 -6
  274. data/lib/rubocop/cop/style/perl_backrefs.rb +4 -3
  275. data/lib/rubocop/cop/style/predicate_name.rb +1 -0
  276. data/lib/rubocop/cop/style/proc.rb +3 -2
  277. data/lib/rubocop/cop/style/raise_args.rb +2 -1
  278. data/lib/rubocop/cop/style/redundant_begin.rb +2 -1
  279. data/lib/rubocop/cop/style/redundant_exception.rb +5 -5
  280. data/lib/rubocop/cop/style/redundant_freeze.rb +5 -4
  281. data/lib/rubocop/cop/style/redundant_parentheses.rb +80 -0
  282. data/lib/rubocop/cop/style/redundant_return.rb +5 -4
  283. data/lib/rubocop/cop/style/redundant_self.rb +7 -8
  284. data/lib/rubocop/cop/style/regexp_literal.rb +9 -8
  285. data/lib/rubocop/cop/style/rescue_ensure_alignment.rb +3 -2
  286. data/lib/rubocop/cop/style/rescue_modifier.rb +11 -9
  287. data/lib/rubocop/cop/style/self_assignment.rb +4 -5
  288. data/lib/rubocop/cop/style/semicolon.rb +3 -2
  289. data/lib/rubocop/cop/style/send.rb +3 -1
  290. data/lib/rubocop/cop/style/signal_exception.rb +5 -3
  291. data/lib/rubocop/cop/style/single_line_block_params.rb +2 -1
  292. data/lib/rubocop/cop/style/single_line_methods.rb +7 -7
  293. data/lib/rubocop/cop/style/space_after_colon.rb +2 -1
  294. data/lib/rubocop/cop/style/space_after_comma.rb +1 -0
  295. data/lib/rubocop/cop/style/space_after_control_keyword.rb +5 -5
  296. data/lib/rubocop/cop/style/space_after_method_name.rb +3 -2
  297. data/lib/rubocop/cop/style/space_after_not.rb +4 -3
  298. data/lib/rubocop/cop/style/space_after_semicolon.rb +1 -0
  299. data/lib/rubocop/cop/style/space_around_block_parameters.rb +8 -7
  300. data/lib/rubocop/cop/style/space_around_equals_in_parameter_default.rb +1 -0
  301. data/lib/rubocop/cop/style/space_around_operators.rb +72 -32
  302. data/lib/rubocop/cop/style/space_before_block_braces.rb +2 -1
  303. data/lib/rubocop/cop/style/space_before_comma.rb +1 -0
  304. data/lib/rubocop/cop/style/space_before_comment.rb +2 -1
  305. data/lib/rubocop/cop/style/{single_space_before_first_arg.rb → space_before_first_arg.rb} +13 -4
  306. data/lib/rubocop/cop/style/space_before_modifier_keyword.rb +4 -3
  307. data/lib/rubocop/cop/style/space_before_semicolon.rb +1 -0
  308. data/lib/rubocop/cop/style/space_inside_block_braces.rb +3 -2
  309. data/lib/rubocop/cop/style/space_inside_brackets.rb +1 -0
  310. data/lib/rubocop/cop/style/space_inside_hash_literal_braces.rb +4 -1
  311. data/lib/rubocop/cop/style/space_inside_parens.rb +1 -0
  312. data/lib/rubocop/cop/style/space_inside_range_literal.rb +5 -4
  313. data/lib/rubocop/cop/style/space_inside_string_interpolation.rb +8 -17
  314. data/lib/rubocop/cop/style/special_global_vars.rb +97 -52
  315. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +16 -9
  316. data/lib/rubocop/cop/style/string_literals.rb +41 -1
  317. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +2 -1
  318. data/lib/rubocop/cop/style/string_methods.rb +2 -1
  319. data/lib/rubocop/cop/style/struct_inheritance.rb +3 -2
  320. data/lib/rubocop/cop/style/symbol_array.rb +74 -7
  321. data/lib/rubocop/cop/style/symbol_literal.rb +4 -7
  322. data/lib/rubocop/cop/style/symbol_proc.rb +11 -7
  323. data/lib/rubocop/cop/style/tab.rb +25 -2
  324. data/lib/rubocop/cop/style/trailing_blank_lines.rb +1 -2
  325. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +45 -0
  326. data/lib/rubocop/cop/style/trailing_comma_in_literal.rb +56 -0
  327. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +8 -7
  328. data/lib/rubocop/cop/style/trailing_whitespace.rb +2 -1
  329. data/lib/rubocop/cop/style/trivial_accessors.rb +18 -9
  330. data/lib/rubocop/cop/style/unless_else.rb +2 -1
  331. data/lib/rubocop/cop/style/unneeded_capital_w.rb +4 -3
  332. data/lib/rubocop/cop/style/unneeded_interpolation.rb +87 -0
  333. data/lib/rubocop/cop/style/unneeded_percent_q.rb +23 -7
  334. data/lib/rubocop/cop/style/variable_interpolation.rb +8 -6
  335. data/lib/rubocop/cop/style/variable_name.rb +1 -0
  336. data/lib/rubocop/cop/style/when_then.rb +2 -1
  337. data/lib/rubocop/cop/style/while_until_do.rb +3 -2
  338. data/lib/rubocop/cop/style/while_until_modifier.rb +3 -4
  339. data/lib/rubocop/cop/style/word_array.rb +74 -51
  340. data/lib/rubocop/cop/team.rb +21 -15
  341. data/lib/rubocop/cop/util.rb +102 -69
  342. data/lib/rubocop/cop/variable_force.rb +2 -1
  343. data/lib/rubocop/cop/variable_force/assignment.rb +2 -1
  344. data/lib/rubocop/cop/variable_force/locatable.rb +1 -0
  345. data/lib/rubocop/cop/variable_force/reference.rb +1 -0
  346. data/lib/rubocop/cop/variable_force/scope.rb +2 -1
  347. data/lib/rubocop/cop/variable_force/variable.rb +2 -1
  348. data/lib/rubocop/cop/variable_force/variable_table.rb +2 -1
  349. data/lib/rubocop/error.rb +12 -0
  350. data/lib/rubocop/formatter/base_formatter.rb +10 -1
  351. data/lib/rubocop/formatter/clang_style_formatter.rb +1 -0
  352. data/lib/rubocop/formatter/colorizable.rb +6 -1
  353. data/lib/rubocop/formatter/disabled_config_formatter.rb +29 -15
  354. data/lib/rubocop/formatter/disabled_lines_formatter.rb +3 -1
  355. data/lib/rubocop/formatter/emacs_style_formatter.rb +7 -3
  356. data/lib/rubocop/formatter/file_list_formatter.rb +1 -0
  357. data/lib/rubocop/formatter/formatter_set.rb +10 -19
  358. data/lib/rubocop/formatter/fuubar_style_formatter.rb +2 -1
  359. data/lib/rubocop/formatter/html_formatter.rb +15 -14
  360. data/lib/rubocop/formatter/json_formatter.rb +2 -1
  361. data/lib/rubocop/formatter/offense_count_formatter.rb +1 -0
  362. data/lib/rubocop/formatter/progress_formatter.rb +3 -3
  363. data/lib/rubocop/formatter/simple_text_formatter.rb +50 -17
  364. data/lib/rubocop/formatter/text_util.rb +8 -10
  365. data/lib/rubocop/formatter/worst_offenders_formatter.rb +61 -0
  366. data/lib/rubocop/name_similarity.rb +22 -0
  367. data/lib/rubocop/node_pattern.rb +126 -35
  368. data/lib/rubocop/options.rb +28 -19
  369. data/lib/rubocop/path_util.rb +1 -0
  370. data/lib/rubocop/processed_source.rb +41 -16
  371. data/lib/rubocop/rake_task.rb +6 -9
  372. data/lib/rubocop/remote_config.rb +1 -0
  373. data/lib/rubocop/result_cache.rb +60 -43
  374. data/lib/rubocop/runner.rb +48 -45
  375. data/lib/rubocop/string_util.rb +1 -0
  376. data/lib/rubocop/target_finder.rb +2 -1
  377. data/lib/rubocop/token.rb +1 -0
  378. data/lib/rubocop/version.rb +3 -2
  379. data/lib/rubocop/warning.rb +1 -0
  380. data/relnotes/v0.36.0.md +306 -0
  381. data/rubocop.gemspec +3 -9
  382. metadata +48 -92
  383. data/lib/rubocop/cop/lint/space_before_first_arg.rb +0 -44
  384. data/lib/rubocop/cop/rails/default_scope.rb +0 -33
  385. data/lib/rubocop/cop/style/trailing_comma.rb +0 -182
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
@@ -6,7 +7,7 @@ module RuboCop
6
7
  # This cop looks for *unless* expressions with *else* clauses.
7
8
  class UnlessElse < Cop
8
9
  MSG = 'Do not use `unless` with `else`. Rewrite these with the ' \
9
- 'positive case first.'
10
+ 'positive case first.'.freeze
10
11
 
11
12
  def on_if(node)
12
13
  loc = node.loc
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
@@ -7,8 +8,8 @@ module RuboCop
7
8
  class UnneededCapitalW < Cop
8
9
  include PercentLiteral
9
10
 
10
- MSG =
11
- 'Do not use `%W` unless interpolation is needed. If not, use `%w`.'
11
+ MSG = 'Do not use `%W` unless interpolation is needed. ' \
12
+ 'If not, use `%w`.'.freeze
12
13
 
13
14
  def on_array(node)
14
15
  process(node, '%W')
@@ -19,7 +20,7 @@ module RuboCop
19
20
  def on_percent_literal(node)
20
21
  requires_interpolation = node.children.any? do |string|
21
22
  string.type == :dstr ||
22
- string.loc.expression.source =~ StringHelp::ESCAPED_CHAR_REGEXP
23
+ double_quotes_acceptable?(string.str_content)
23
24
  end
24
25
  add_offense(node, :expression) unless requires_interpolation
25
26
  end
@@ -0,0 +1,87 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ module RuboCop
5
+ module Cop
6
+ module Style
7
+ # This cop checks for strings that are just an interpolated expression.
8
+ #
9
+ # @example
10
+ #
11
+ # # bad
12
+ # "#{@var}"
13
+ #
14
+ # # good
15
+ # @var.to_s
16
+ #
17
+ # # good if @var is already a String
18
+ # @var
19
+ class UnneededInterpolation < Cop
20
+ include PercentLiteral
21
+
22
+ MSG = 'Prefer `to_s` over string interpolation.'.freeze
23
+
24
+ def on_dstr(node)
25
+ add_offense(node, :expression, MSG) if single_interpolation?(node)
26
+ end
27
+
28
+ private
29
+
30
+ def single_interpolation?(node)
31
+ single_child?(node) &&
32
+ interpolation?(node.children.first) &&
33
+ !implicit_concatenation?(node) &&
34
+ !embedded_in_percent_array?(node)
35
+ end
36
+
37
+ def single_variable_interpolation?(node)
38
+ single_child?(node) && variable_interpolation?(node.children.first)
39
+ end
40
+
41
+ def single_child?(node)
42
+ node.children.size == 1
43
+ end
44
+
45
+ def interpolation?(node)
46
+ variable_interpolation?(node) || node.type == :begin
47
+ end
48
+
49
+ def variable_interpolation?(node)
50
+ node.variable? || node.reference?
51
+ end
52
+
53
+ def implicit_concatenation?(node)
54
+ node.parent && node.parent.type == :dstr
55
+ end
56
+
57
+ def embedded_in_percent_array?(node)
58
+ node.parent &&
59
+ node.parent.type == :array &&
60
+ percent_literal?(node.parent)
61
+ end
62
+
63
+ def autocorrect(node)
64
+ loc = node.loc
65
+ embedded_node = node.children.first
66
+ embedded_loc = embedded_node.loc
67
+
68
+ if variable_interpolation?(embedded_node)
69
+ replacement = "#{embedded_loc.expression.source}.to_s"
70
+ ->(corrector) { corrector.replace(loc.expression, replacement) }
71
+ elsif single_variable_interpolation?(embedded_node)
72
+ variable_loc = embedded_node.children.first.loc
73
+ replacement = "#{variable_loc.expression.source}.to_s"
74
+ ->(corrector) { corrector.replace(loc.expression, replacement) }
75
+ else
76
+ lambda do |corrector|
77
+ corrector.replace(loc.begin, '')
78
+ corrector.replace(loc.end, '')
79
+ corrector.replace(embedded_loc.begin, '(')
80
+ corrector.replace(embedded_loc.end, ').to_s')
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
@@ -6,8 +7,9 @@ module RuboCop
6
7
  # This cop checks for usage of the %q/%Q syntax when '' or "" would do.
7
8
  class UnneededPercentQ < Cop
8
9
  MSG = 'Use `%s` only for strings that contain both single quotes and ' \
9
- 'double quotes%s.'
10
- DYNAMIC_MSG = ', or for dynamic strings that contain double quotes'
10
+ 'double quotes%s.'.freeze
11
+ DYNAMIC_MSG = ', or for dynamic strings that contain ' \
12
+ 'double quotes'.freeze
11
13
  SINGLE_QUOTE = "'".freeze
12
14
  QUOTE = '"'.freeze
13
15
  EMPTY = ''.freeze
@@ -30,25 +32,32 @@ module RuboCop
30
32
  private
31
33
 
32
34
  def check(node)
33
- src = node.loc.expression.source
35
+ src = node.source
34
36
  return unless start_with_percent_q_variant?(src)
35
37
  return if src.include?(SINGLE_QUOTE) && src.include?(QUOTE)
36
- return if src =~ StringHelp::ESCAPED_CHAR_REGEXP
37
38
  if src.start_with?(PERCENT_Q) && src =~ STRING_INTERPOLATION_REGEXP
38
39
  return
39
40
  end
41
+ if src.start_with?(PERCENT_CAPITAL_Q) && acceptable_capital_q?(node)
42
+ return
43
+ end
44
+
45
+ add_offense(node, :expression)
46
+ end
40
47
 
48
+ def message(node)
49
+ src = node.source
41
50
  extra = if src.start_with?(PERCENT_CAPITAL_Q)
42
51
  DYNAMIC_MSG
43
52
  else
44
53
  EMPTY
45
54
  end
46
- add_offense(node, :expression, format(MSG, src[0, 2], extra))
55
+ format(MSG, src[0, 2], extra)
47
56
  end
48
57
 
49
58
  def autocorrect(node)
50
59
  delimiter =
51
- node.loc.expression.source =~ /^%Q[^"]+$|'/ ? QUOTE : SINGLE_QUOTE
60
+ node.source =~ /^%Q[^"]+$|'/ ? QUOTE : SINGLE_QUOTE
52
61
  lambda do |corrector|
53
62
  corrector.replace(node.loc.begin, delimiter)
54
63
  corrector.replace(node.loc.end, delimiter)
@@ -61,7 +70,14 @@ module RuboCop
61
70
  end
62
71
 
63
72
  def start_with_percent_q_variant?(string)
64
- string.start_with?(PERCENT_Q) || string.start_with?(PERCENT_CAPITAL_Q)
73
+ string.start_with?(PERCENT_Q, PERCENT_CAPITAL_Q)
74
+ end
75
+
76
+ def acceptable_capital_q?(node)
77
+ src = node.source
78
+ src.include?(QUOTE) &&
79
+ (src =~ STRING_INTERPOLATION_REGEXP ||
80
+ (node.str_type? && double_quotes_acceptable?(node.str_content)))
65
81
  end
66
82
  end
67
83
  end
@@ -1,11 +1,13 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
5
6
  module Style
6
7
  # This cop checks for variable interpolation (like "#@ivar").
7
8
  class VariableInterpolation < Cop
8
- MSG = 'Replace interpolated variable `%s` with expression `#{%s}`.'
9
+ MSG = 'Replace interpolated variable `%s` ' \
10
+ 'with expression `#{%s}`.'.freeze
9
11
 
10
12
  def on_dstr(node)
11
13
  check_for_interpolation(node)
@@ -23,19 +25,19 @@ module RuboCop
23
25
 
24
26
  def check_for_interpolation(node)
25
27
  var_nodes(node.children).each do |v|
26
- var = v.loc.expression.source
27
-
28
+ var = v.source
28
29
  add_offense(v, :expression, format(MSG, var, var))
29
30
  end
30
31
  end
31
32
 
32
33
  def autocorrect(node)
33
- expr = node.loc.expression
34
- ->(corrector) { corrector.replace(expr, "{#{expr.source}}") }
34
+ lambda do |corrector|
35
+ corrector.replace(node.source_range, "{#{node.source}}")
36
+ end
35
37
  end
36
38
 
37
39
  def var_nodes(nodes)
38
- nodes.select { |n| [:ivar, :cvar, :gvar, :nth_ref].include?(n.type) }
40
+ nodes.select { |n| n.variable? || n.reference? }
39
41
  end
40
42
  end
41
43
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
@@ -1,11 +1,12 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
5
6
  module Style
6
7
  # This cop checks for *when;* uses in *case* expressions.
7
8
  class WhenThen < Cop
8
- MSG = 'Do not use `when x;`. Use `when x then` instead.'
9
+ MSG = 'Do not use `when x;`. Use `when x then` instead.'.freeze
9
10
 
10
11
  def on_when(node)
11
12
  return unless node.loc.begin && node.loc.begin.is?(';')
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
@@ -14,7 +15,7 @@ module RuboCop
14
15
  end
15
16
 
16
17
  def handle(node)
17
- length = node.loc.expression.source.lines.to_a.size
18
+ length = node.source.lines.to_a.size
18
19
  return unless length > 1
19
20
  return unless node.loc.begin && node.loc.begin.is?('do')
20
21
 
@@ -29,7 +30,7 @@ module RuboCop
29
30
 
30
31
  def autocorrect(node)
31
32
  condition_node, = *node
32
- end_of_condition_range = condition_node.loc.expression.end
33
+ end_of_condition_range = condition_node.source_range.end
33
34
  do_range = node.loc.begin
34
35
  whitespaces_and_do_range = end_of_condition_range.join(do_range)
35
36
  ->(corrector) { corrector.remove(whitespaces_and_do_range) }
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
@@ -19,10 +20,8 @@ module RuboCop
19
20
 
20
21
  def autocorrect(node)
21
22
  cond, body = *node
22
- oneline = "#{body.loc.expression.source} " \
23
- "#{node.loc.keyword.source} " +
24
- cond.loc.expression.source
25
- ->(corrector) { corrector.replace(node.loc.expression, oneline) }
23
+ oneline = "#{body.source} #{node.loc.keyword.source} " + cond.source
24
+ ->(corrector) { corrector.replace(node.source_range, oneline) }
26
25
  end
27
26
 
28
27
  private
@@ -1,55 +1,75 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
5
6
  module Style
6
- # This cop checks for array literals made up of word-like
7
+ # This cop can check for array literals made up of word-like
7
8
  # strings, that are not using the %w() syntax.
9
+ #
10
+ # Alternatively, it can check for uses of the %w() syntax, in projects
11
+ # which do not want to include that syntax.
8
12
  class WordArray < Cop
9
13
  include ArraySyntax
10
- # The parameter is called MinSize (meaning the minimum array size for
11
- # which an offense can be registered), but essentially it's a Max
12
- # parameter (the maximum number of something that's allowed).
13
- include ConfigurableMax
14
14
 
15
- MSG = 'Use `%w` or `%W` for array of words.'
15
+ PERCENT_MSG = 'Use `%w` or `%W` for an array of words.'.freeze
16
+ ARRAY_MSG = 'Use `[]` for an array of words.'.freeze
16
17
  QUESTION_MARK_SIZE = '?'.size
17
18
 
18
19
  def on_array(node)
19
20
  array_elems = node.children
20
- return unless array_of?(:str, node) &&
21
- !complex_content?(array_elems) &&
22
- array_elems.size > min_size && !comments_in_array?(node)
23
21
 
24
- add_offense(node, :expression) { self.max = array_elems.size }
22
+ if bracketed_array_of?(:str, node)
23
+ return if complex_content?(array_elems) ||
24
+ comments_in_array?(node)
25
+ style_detected(:brackets, array_elems.size)
26
+
27
+ if style == :percent && array_elems.size >= min_size
28
+ add_offense(node, :expression, PERCENT_MSG)
29
+ end
30
+ elsif node.loc.begin && node.loc.begin.source =~ /\A%[wW]/
31
+ style_detected(:percent, array_elems.size)
32
+ add_offense(node, :expression, ARRAY_MSG) if style == :brackets
33
+ end
25
34
  end
26
35
 
27
- private
28
-
29
- def parameter_name
30
- 'MinSize'
36
+ def autocorrect(node)
37
+ words = node.children
38
+ if style == :percent
39
+ escape = words.any? { |w| double_quotes_required?(w.children[0]) }
40
+ char = escape ? 'W' : 'w'
41
+ contents = autocorrect_words(words, escape, node.loc.line)
42
+ lambda do |corrector|
43
+ corrector.replace(node.source_range, "%#{char}(#{contents})")
44
+ end
45
+ else
46
+ words = words.map { |w| to_string_literal(w.children[0]) }
47
+ lambda do |corrector|
48
+ corrector.replace(node.source_range, "[#{words.join(', ')}]")
49
+ end
50
+ end
31
51
  end
32
52
 
53
+ private
54
+
33
55
  def comments_in_array?(node)
34
56
  comments = processed_source.comments
35
-
36
- array_range = node.loc.expression.to_a
57
+ array_range = node.source_range.to_a
37
58
 
38
59
  comments.any? do |comment|
39
60
  !(comment.loc.expression.to_a & array_range).empty?
40
61
  end
41
62
  end
42
63
 
43
- def complex_content?(arr_sexp)
44
- arr_sexp.each do |s|
45
- source = s.loc.expression.source
46
- next if source.start_with?('?') # %W(\r \n) can replace [?\r, ?\n]
47
-
48
- str_content = Util.strip_quotes(source)
49
- return true unless str_content =~ word_regex
64
+ def complex_content?(strings)
65
+ strings.any? do |s|
66
+ string = s.str_content
67
+ string !~ word_regex || string =~ / /
50
68
  end
69
+ end
51
70
 
52
- false
71
+ def style
72
+ cop_config['EnforcedStyle'].to_sym
53
73
  end
54
74
 
55
75
  def min_size
@@ -60,43 +80,46 @@ module RuboCop
60
80
  cop_config['WordRegex']
61
81
  end
62
82
 
63
- def autocorrect(node)
64
- @interpolated = false
65
- contents = autocorrect_words(node.children, node.loc.line)
66
-
67
- char = @interpolated ? 'W' : 'w'
68
-
69
- lambda do |corrector|
70
- corrector.replace(node.loc.expression, "%#{char}(#{contents})")
71
- end
72
- end
73
-
74
- def autocorrect_words(word_nodes, base_line_number)
83
+ def autocorrect_words(word_nodes, escape, base_line_number)
75
84
  previous_node_line_number = base_line_number
76
85
  word_nodes.map do |node|
77
86
  number_of_line_breaks = node.loc.line - previous_node_line_number
78
87
  line_breaks = "\n" * number_of_line_breaks
79
88
  previous_node_line_number = node.loc.line
80
-
81
- line_breaks + source_for(node)
89
+ content = node.children[0]
90
+ content = escape ? escape_string(content) : content
91
+ content.gsub!(/\)/, '\\)')
92
+ line_breaks + content
82
93
  end.join(' ')
83
94
  end
84
95
 
85
- def source_for(str_node)
86
- if character_literal?(str_node)
87
- @interpolated = true
88
- begin_pos = str_node.loc.expression.begin_pos + QUESTION_MARK_SIZE
89
- end_pos = str_node.loc.expression.end_pos
90
- else
91
- begin_pos = str_node.loc.begin.end_pos
92
- end_pos = str_node.loc.end.begin_pos
93
- end
94
- Parser::Source::Range.new(str_node.loc.expression.source_buffer,
95
- begin_pos, end_pos).source
96
+ def escape_string(string)
97
+ string.inspect[1..-2].tap { |s| s.gsub!(/\\"/, '"') }
96
98
  end
97
99
 
98
- def character_literal?(node)
99
- node.loc.end.nil?
100
+ def style_detected(style, ary_size)
101
+ cfg = config_to_allow_offenses
102
+ return if cfg['Enabled'] == false
103
+
104
+ @largest_brackets ||= -Float::INFINITY
105
+ @smallest_percent ||= Float::INFINITY
106
+
107
+ if style == :percent
108
+ @smallest_percent = ary_size if ary_size < @smallest_percent
109
+ elsif ary_size > @largest_brackets
110
+ @largest_brackets = ary_size
111
+ end
112
+
113
+ if cfg['EnforcedStyle'] == style.to_s
114
+ # do nothing
115
+ elsif cfg['EnforcedStyle'].nil?
116
+ cfg['EnforcedStyle'] = style.to_s
117
+ elsif @smallest_percent <= @largest_brackets
118
+ self.config_to_allow_offenses = { 'Enabled' => false }
119
+ else
120
+ cfg['EnforcedStyle'] = 'percent'
121
+ cfg['MinSize'] = @largest_brackets + 1
122
+ end
100
123
  end
101
124
  end
102
125
  end