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
@@ -9,10 +10,10 @@ module RuboCop
9
10
  include OnNormalIfUnless
10
11
 
11
12
  MSG = 'Favor the ternary operator (`?:`) ' \
12
- 'over `%s/then/else/end` constructs.'
13
+ 'over `%s/then/else/end` constructs.'.freeze
13
14
 
14
15
  def on_normal_if_unless(node)
15
- exp = node.loc.expression.source
16
+ exp = node.source
16
17
  return if exp.include?("\n")
17
18
  return unless node.loc.respond_to?(:else) && node.loc.else
18
19
  condition = exp.include?('if') ? 'if' : 'unless'
@@ -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,13 +7,15 @@ module RuboCop
6
7
  # This cop makes sure that certain operator methods have their sole
7
8
  # parameter named `other`.
8
9
  class OpMethod < Cop
9
- MSG = 'When defining the `%s` operator, name its argument `other`.'
10
+ MSG = 'When defining the `%s` operator, ' \
11
+ 'name its argument `other`.'.freeze
10
12
 
11
- OP_LIKE_METHODS = [:eql?, :equal?]
13
+ OP_LIKE_METHODS = [:eql?, :equal?].freeze
12
14
 
13
- BLACKLISTED = [:+@, :-@, :[], :[]=, :<<]
15
+ BLACKLISTED = [:+@, :-@, :[], :[]=, :<<].freeze
14
16
 
15
- TARGET_ARGS = [s(:args, s(:arg, :other)), s(:args, s(:arg, :_other))]
17
+ TARGET_ARGS = [s(:args, s(:arg, :other)),
18
+ s(:args, s(:arg, :_other))].freeze
16
19
 
17
20
  def on_def(node)
18
21
  name, args, _body = *node
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
@@ -20,11 +21,9 @@ module RuboCop
20
21
  # ...
21
22
  # end
22
23
  class OptionHash < Cop
23
- MSG = 'Prefer keyword arguments to options hashes.'
24
+ MSG = 'Prefer keyword arguments to options hashes.'.freeze
24
25
 
25
26
  def on_args(node)
26
- return unless supports_keyword_arguments?
27
-
28
27
  *_but_last, last_arg = *node
29
28
 
30
29
  # asserting that there was an argument at all
@@ -48,12 +47,19 @@ module RuboCop
48
47
  add_offense(last_arg, :expression, MSG)
49
48
  end
50
49
 
51
- private
52
-
53
- def supports_keyword_arguments?
54
- RUBY_VERSION >= '2.0.0'
50
+ def validate_config
51
+ if target_ruby_version < 2.0
52
+ fail ValidationError, 'The `Style/OptionHash` cop is only ' \
53
+ 'compatible with Ruby 2.0 and up, but the ' \
54
+ 'target Ruby version for your project is ' \
55
+ "1.9.\nPlease disable this cop or adjust " \
56
+ 'the `TargetRubyVersion` parameter in your ' \
57
+ 'configuration.'
58
+ end
55
59
  end
56
60
 
61
+ private
62
+
57
63
  def name_in_suspicious_param_names?(arg_name)
58
64
  cop_config.key?('SuspiciousParamNames') &&
59
65
  cop_config['SuspiciousParamNames'].include?(arg_name.to_s)
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
@@ -18,8 +19,8 @@ module RuboCop
18
19
  # def foobar(a = 1, b = 2, c = 3)
19
20
  # end
20
21
  class OptionalArguments < Cop
21
- MSG =
22
- 'Optional arguments should appear at the end of the argument list.'
22
+ MSG = 'Optional arguments should appear at the end ' \
23
+ 'of the argument list.'.freeze
23
24
 
24
25
  def on_def(node)
25
26
  _method, arguments, = *node
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'tsort'
4
5
 
@@ -25,7 +26,7 @@ module RuboCop
25
26
  class ParallelAssignment < Cop
26
27
  include IfNode
27
28
 
28
- MSG = 'Do not use parallel assignment.'
29
+ MSG = 'Do not use parallel assignment.'.freeze
29
30
 
30
31
  def on_masgn(node)
31
32
  left, right = *node
@@ -99,6 +100,7 @@ module RuboCop
99
100
 
100
101
  def_node_matcher :var_name, '{(casgn _ $_) (_ $_)}'
101
102
  def_node_search :uses_var?, '{({lvar ivar cvar gvar} %) (const _ %)}'
103
+ def_node_search :matching_calls, '(send %1 %2 $...)'
102
104
 
103
105
  def initialize(assignments)
104
106
  @assignments = assignments
@@ -115,7 +117,23 @@ module RuboCop
115
117
 
116
118
  @assignments.each do |other|
117
119
  _other_lhs, other_rhs = *other
118
- yield other if uses_var?(other_rhs, var_name(my_lhs))
120
+ if ((var = var_name(my_lhs)) && uses_var?(other_rhs, var)) ||
121
+ (my_lhs.asgn_method_call? && accesses?(other_rhs, my_lhs))
122
+ yield other
123
+ end
124
+ end
125
+ end
126
+
127
+ # `lhs` is an assignment method call like `obj.attr=` or `ary[idx]=`.
128
+ # Does `rhs` access the same value which is assigned by `lhs`?
129
+ def accesses?(rhs, lhs)
130
+ if lhs.method_name == :[]=
131
+ matching_calls(rhs, lhs.receiver, :[]).any? do |args|
132
+ args == lhs.method_args
133
+ end
134
+ else
135
+ access_method = lhs.method_name.to_s.chop.to_sym
136
+ matching_calls(rhs, lhs.receiver, access_method).any?
119
137
  end
120
138
  end
121
139
  end
@@ -151,25 +169,29 @@ module RuboCop
151
169
  end
152
170
 
153
171
  def correction
154
- "#{assignment.join("\n#{offset(node)}")}"
172
+ assignment.join("\n#{offset(node)}")
155
173
  end
156
174
 
157
175
  def correction_range
158
- node.loc.expression
176
+ node.source_range
159
177
  end
160
178
 
161
179
  protected
162
180
 
163
181
  def assignment
164
182
  @new_elements.map do |lhs, rhs|
165
- "#{lhs.loc.expression.source} = #{rhs.loc.expression.source}"
183
+ "#{lhs.source} = #{rhs.source}"
166
184
  end
167
185
  end
168
186
 
169
187
  private
170
188
 
171
189
  def extract_sources(node)
172
- node.children.map { |child| child.loc.expression.source }
190
+ node.children.map(&:source)
191
+ end
192
+
193
+ def cop_config
194
+ @config.for_cop('Style/ParallelAssignment')
173
195
  end
174
196
  end
175
197
 
@@ -180,15 +202,16 @@ module RuboCop
180
202
  _node, rescue_clause = *node.parent
181
203
  _, _, rescue_result = *rescue_clause
182
204
 
183
- "begin\n" <<
184
- indentation(node) << assignment.join("\n#{indentation(node)}") <<
185
- "\n#{offset(node)}rescue\n" <<
186
- indentation(node) << rescue_result.loc.expression.source <<
205
+ "begin\n" \
206
+ "#{indentation(node)}" \
207
+ "#{assignment.join("\n#{indentation(node)}")}" \
208
+ "\n#{offset(node)}rescue\n" \
209
+ "#{indentation(node)}#{rescue_result.source}" \
187
210
  "\n#{offset(node)}end"
188
211
  end
189
212
 
190
213
  def correction_range
191
- node.parent.loc.expression
214
+ node.parent.source_range
192
215
  end
193
216
  end
194
217
 
@@ -199,17 +222,18 @@ module RuboCop
199
222
  parent = node.parent
200
223
 
201
224
  modifier_range =
202
- Parser::Source::Range.new(parent.loc.expression.source_buffer,
225
+ Parser::Source::Range.new(parent.source_range.source_buffer,
203
226
  parent.loc.keyword.begin_pos,
204
- parent.loc.expression.end_pos)
227
+ parent.source_range.end_pos)
205
228
 
206
- "#{modifier_range.source}\n" <<
207
- indentation(node) << assignment.join("\n#{indentation(node)}") <<
229
+ "#{modifier_range.source}\n" \
230
+ "#{indentation(node)}" \
231
+ "#{assignment.join("\n#{indentation(node)}")}" \
208
232
  "\n#{offset(node)}end"
209
233
  end
210
234
 
211
235
  def correction_range
212
- node.parent.loc.expression
236
+ node.parent.source_range
213
237
  end
214
238
  end
215
239
  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
@@ -8,6 +9,7 @@ module RuboCop
8
9
  class ParenthesesAroundCondition < Cop
9
10
  include IfNode
10
11
  include SafeAssignment
12
+ include Parentheses
11
13
 
12
14
  def on_if(node)
13
15
  return if ternary_op?(node)
@@ -31,7 +33,7 @@ module RuboCop
31
33
  # handle `if (something rescue something_else) ...`
32
34
  return if modifier_op?(cond.children.first)
33
35
  # check if there's any whitespace between the keyword and the cond
34
- return if parens_required?(node)
36
+ return if parens_required?(node.children.first)
35
37
  # allow safe assignment
36
38
  return if safe_assignment?(cond) && safe_assignment_allowed?
37
39
 
@@ -46,26 +48,11 @@ module RuboCop
46
48
  node.loc.end.nil?
47
49
  end
48
50
 
49
- def parens_required?(node)
50
- exp = node.loc.expression
51
- kw = node.loc.keyword
52
- kw_offset = kw.begin_pos - exp.begin_pos
53
-
54
- exp.source[kw_offset..-1].start_with?(kw.source + '(')
55
- end
56
-
57
51
  def message(node)
58
52
  kw = node.loc.keyword.source
59
53
  article = kw == 'while' ? 'a' : 'an'
60
54
  "Don't use parentheses around the condition of #{article} `#{kw}`."
61
55
  end
62
-
63
- def autocorrect(node)
64
- lambda do |corrector|
65
- corrector.remove(node.loc.begin)
66
- corrector.remove(node.loc.end)
67
- end
68
- end
69
56
  end
70
57
  end
71
58
  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
@@ -18,7 +19,7 @@ module RuboCop
18
19
  def on_str(node)
19
20
  process(node, '%', '%Q', '%q')
20
21
  end
21
- alias_method :on_dstr, :on_str
22
+ alias on_dstr on_str
22
23
 
23
24
  def on_sym(node)
24
25
  process(node, '%s')
@@ -76,7 +77,7 @@ module RuboCop
76
77
  if node.is_a?(String)
77
78
  node
78
79
  elsif node.respond_to?(:type) && node.type == :str
79
- node.loc.expression.source
80
+ node.source
80
81
  end
81
82
  end
82
83
  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
@@ -27,20 +28,16 @@ module RuboCop
27
28
  end
28
29
 
29
30
  def check(node, msg)
30
- src = node.loc.expression.source
31
31
  # Report offense only if changing case doesn't change semantics,
32
32
  # i.e., if the string would become dynamic or has special characters.
33
- return if node.children !=
34
- ProcessedSource.new(corrected(src)).ast.children
33
+ return if node.children != parse(corrected(node.source)).ast.children
35
34
 
36
35
  add_offense(node, :begin, msg)
37
36
  end
38
37
 
39
38
  def autocorrect(node)
40
- src = node.loc.expression.source
41
-
42
39
  lambda do |corrector|
43
- corrector.replace(node.loc.expression, corrected(src))
40
+ corrector.replace(node.source_range, corrected(node.source))
44
41
  end
45
42
  end
46
43
 
@@ -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 uses of Perl-style regexp match
7
8
  # backreferences like $1, $2, etc.
8
9
  class PerlBackrefs < Cop
9
- MSG = 'Avoid the use of Perl-style backrefs.'
10
+ MSG = 'Avoid the use of Perl-style backrefs.'.freeze
10
11
 
11
12
  def on_nth_ref(node)
12
13
  add_offense(node, :expression)
@@ -17,10 +18,10 @@ module RuboCop
17
18
  backref, = *node
18
19
  parent_type = node.parent ? node.parent.type : nil
19
20
  if [:dstr, :xstr, :regexp].include?(parent_type)
20
- corrector.replace(node.loc.expression,
21
+ corrector.replace(node.source_range,
21
22
  "{Regexp.last_match(#{backref})}")
22
23
  else
23
- corrector.replace(node.loc.expression,
24
+ corrector.replace(node.source_range,
24
25
  "Regexp.last_match(#{backref})")
25
26
  end
26
27
  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,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 cops checks for uses of Proc.new where Kernel#proc
7
8
  # would be more appropriate.
8
9
  class Proc < Cop
9
- MSG = 'Use `proc` instead of `Proc.new`.'
10
+ MSG = 'Use `proc` instead of `Proc.new`.'.freeze
10
11
 
11
12
  TARGET = s(:send, s(:const, nil, :Proc), :new)
12
13
 
@@ -22,7 +23,7 @@ module RuboCop
22
23
  end
23
24
 
24
25
  def autocorrect(node)
25
- ->(corrector) { corrector.replace(node.loc.expression, 'proc') }
26
+ ->(corrector) { corrector.replace(node.source_range, 'proc') }
26
27
  end
27
28
  end
28
29
  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
@@ -8,7 +9,7 @@ module RuboCop
8
9
  include ConfigurableEnforcedStyle
9
10
 
10
11
  def on_send(node)
11
- return unless command?(:raise, node) || command?(:fail, node)
12
+ return unless node.command?(:raise) || node.command?(:fail)
12
13
 
13
14
  case style
14
15
  when :compact
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
@@ -27,7 +28,7 @@ module RuboCop
27
28
  class RedundantBegin < Cop
28
29
  include OnMethodDef
29
30
 
30
- MSG = 'Redundant `begin` block detected.'
31
+ MSG = 'Redundant `begin` block detected.'.freeze
31
32
 
32
33
  def on_method_def(_node, _method_name, _args, body)
33
34
  return unless body && body.type == :kwbegin
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
@@ -11,12 +12,12 @@ module RuboCop
11
12
  #
12
13
  # raise RuntimeError, 'message'
13
14
  class RedundantException < Cop
14
- MSG = 'Redundant `RuntimeError` argument can be removed.'
15
+ MSG = 'Redundant `RuntimeError` argument can be removed.'.freeze
15
16
 
16
17
  TARGET_NODE = s(:const, nil, :RuntimeError)
17
18
 
18
19
  def on_send(node)
19
- return unless command?(:raise, node) || command?(:fail, node)
20
+ return unless node.command?(:raise) || node.command?(:fail)
20
21
 
21
22
  _receiver, _selector, *args = *node
22
23
 
@@ -29,9 +30,8 @@ module RuboCop
29
30
 
30
31
  # switch `raise RuntimeError, 'message'` to `raise 'message'`
31
32
  def autocorrect(node)
32
- start_range = node.loc.expression.begin
33
- no_comma = range_with_surrounding_comma(node.loc.expression.end,
34
- :right)
33
+ start_range = node.source_range.begin
34
+ no_comma = range_with_surrounding_comma(node.source_range.end, :right)
35
35
  comma_range = start_range.join(no_comma)
36
36
  final_range = range_with_surrounding_space(comma_range, :right)
37
37
  ->(corrector) { corrector.replace(final_range, '') }