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
  class Team
7
8
  attr_reader :errors, :warnings, :updated_source_file
8
9
 
9
- alias_method :updated_source_file?, :updated_source_file
10
+ alias updated_source_file? updated_source_file
10
11
 
11
12
  def initialize(cop_classes, config, options = nil)
12
13
  @cop_classes = cop_classes
@@ -14,6 +15,8 @@ module RuboCop
14
15
  @options = options || { auto_correct: false, debug: false }
15
16
  @errors = []
16
17
  @warnings = []
18
+
19
+ validate_config
17
20
  end
18
21
 
19
22
  def autocorrect?
@@ -38,9 +41,8 @@ module RuboCop
38
41
  end
39
42
 
40
43
  def cops
41
- @cops ||= @cop_classes.each_with_object([]) do |cop_class, instances|
42
- next unless cop_enabled?(cop_class)
43
- instances << cop_class.new(@config, @options)
44
+ @cops ||= @cop_classes.select { |c| cop_enabled?(c) }.map do |cop_class|
45
+ cop_class.new(@config, @options)
44
46
  end
45
47
  end
46
48
 
@@ -67,8 +69,13 @@ module RuboCop
67
69
 
68
70
  return if new_source == buffer.source
69
71
 
70
- filename = buffer.name
71
- File.open(filename, 'w') { |f| f.write(new_source) }
72
+ if @options[:stdin]
73
+ # holds source read in from stdin, when --stdin option is used
74
+ @options[:stdin] = new_source
75
+ else
76
+ filename = buffer.name
77
+ File.open(filename, 'wb') { |f| f.write(new_source) }
78
+ end
72
79
  @updated_source_file = true
73
80
  end
74
81
 
@@ -76,17 +83,10 @@ module RuboCop
76
83
  # re-running of auto-corrections will make sure that the full set of
77
84
  # auto-corrections is tried again after this method has finished.
78
85
  def autocorrect_one_cop(buffer, cops)
79
- cop_with_corrections = cops.find do |cop|
80
- cop.relevant_file?(buffer.name) && cop.corrections.any?
81
- end
86
+ cop_with_corrections = cops.find { |cop| cop.corrections.any? }
87
+
82
88
  if cop_with_corrections
83
89
  corrections = cop_with_corrections.corrections
84
- # Be extra careful if there are tabs in the source and just correct
85
- # one offense, because inserting or removing space next to a tab has
86
- # special implications, and existing ranges can't be used after such
87
- # a change.
88
- corrections = [corrections.first] if buffer.source =~ /\t/
89
-
90
90
  corrector = Corrector.new(buffer, corrections)
91
91
  corrector.rewrite
92
92
  else
@@ -94,6 +94,12 @@ module RuboCop
94
94
  end
95
95
  end
96
96
 
97
+ def validate_config
98
+ cops.each do |cop|
99
+ cop.validate_config if cop.respond_to?(:validate_config)
100
+ end
101
+ end
102
+
97
103
  def process_commissioner_errors(file, file_errors)
98
104
  file_errors.each do |cop, errors|
99
105
  errors.each do |e|
@@ -1,28 +1,42 @@
1
1
  # encoding: utf-8
2
-
2
+ # frozen_string_literal: true
3
3
  # rubocop:disable Metrics/ModuleLength
4
+
4
5
  module RuboCop
5
6
  module Cop
6
7
  # This module contains a collection of useful utility methods.
7
8
  module Util
8
9
  include PathUtil
9
- extend AST::Sexp
10
-
11
- PROC_NEW_NODE = s(:send, s(:const, nil, :Proc), :new)
12
- EQUALS_ASGN_NODES = [:lvasgn, :ivasgn, :cvasgn, :gvasgn, :casgn, :masgn]
13
- SHORTHAND_ASGN_NODES = [:op_asgn, :or_asgn, :and_asgn]
14
- ASGN_NODES = EQUALS_ASGN_NODES + SHORTHAND_ASGN_NODES
10
+ extend RuboCop::Sexp
15
11
 
16
- LITERALS = [:str, :dstr, :int, :float, :sym, :dsym, :array,
17
- :hash, :regexp, :nil, :true, :false]
18
- BASIC_LITERALS = LITERALS - [:dstr, :dsym, :array, :hash]
12
+ EQUALS_ASGN_NODES = [:lvasgn, :ivasgn, :cvasgn, :gvasgn,
13
+ :casgn, :masgn].freeze
14
+ SHORTHAND_ASGN_NODES = [:op_asgn, :or_asgn, :and_asgn].freeze
15
+ ASGN_NODES = (EQUALS_ASGN_NODES + SHORTHAND_ASGN_NODES).freeze
19
16
 
20
17
  # http://phrogz.net/programmingruby/language.html#table_18.4
21
18
  # Backtick is added last just to help editors parse this code.
22
19
  OPERATOR_METHODS = %w(
23
20
  | ^ & <=> == === =~ > >= < <= << >>
24
21
  + - * / % ** ~ +@ -@ [] []= ! != !~
25
- ).map(&:to_sym) + [:'`']
22
+ ).map(&:to_sym).push(:'`').freeze
23
+
24
+ STRING_ESCAPES = {
25
+ '\a' => "\a", '\b' => "\b", '\e' => "\e", '\f' => "\f", '\n' => "\n",
26
+ '\r' => "\r", '\s' => ' ', '\t' => "\t", '\v' => "\v", "\\\n" => ''
27
+ }.freeze
28
+ STRING_ESCAPE_REGEX = /\\(?:
29
+ [abefnrstv\n] | # simple escapes (above)
30
+ \d{1,3} | # octal byte escape
31
+ x\d{1,2} | # hex byte escape
32
+ u[0-9a-fA-F]{4} | # unicode char escape
33
+ u\{[^}]*\} | # extended unicode escape
34
+ . # any other escaped char
35
+ )/x
36
+
37
+ # Match literal regex characters, not including anchors, character
38
+ # classes, alternatives, groups, repetitions, references, etc
39
+ LITERAL_REGEX = /[\w\s\-,"'!#%&<>=;:`~]|\\[^AbBdDgGkwWszZS0-9]/
26
40
 
27
41
  module_function
28
42
 
@@ -33,12 +47,11 @@ module RuboCop
33
47
  def strip_quotes(str)
34
48
  if str[0] == '"' || str[0] == "'"
35
49
  str[0] = ''
36
- str[-1] = ''
37
50
  else
38
51
  # we're dealing with %q or %Q
39
52
  str[0, 3] = ''
40
- str[-1] = ''
41
53
  end
54
+ str[-1] = ''
42
55
 
43
56
  str
44
57
  end
@@ -56,7 +69,7 @@ module RuboCop
56
69
  when Parser::Source::Range
57
70
  arg
58
71
  when Parser::AST::Node
59
- arg.loc.expression
72
+ arg.source_range
60
73
  else
61
74
  fail ArgumentError, "Invalid argument #{arg}"
62
75
  end
@@ -64,65 +77,20 @@ module RuboCop
64
77
  source_range.begin.line..source_range.end.line
65
78
  end
66
79
 
67
- def const_name(node)
68
- return nil if node.nil? || node.type != :const
69
-
70
- const_names = []
71
- const_node = node
72
-
73
- loop do
74
- namespace_node, name = *const_node
75
- const_names << name
76
- break unless namespace_node
77
- break unless namespace_node.is_a?(Parser::AST::Node)
78
- break if namespace_node.type == :cbase
79
- const_node = namespace_node
80
- end
81
-
82
- const_names.reverse.join('::')
83
- end
84
-
85
- def command?(name, node)
86
- return unless node.type == :send
87
-
88
- receiver, method_name, _args = *node
89
-
90
- # commands have no explicit receiver
91
- !receiver && method_name == name
92
- end
93
-
94
- def lambda?(node)
95
- fail 'Not a block node' unless node.type == :block
96
-
97
- send_node, _block_args, _block_body = *node
98
-
99
- command?(:lambda, send_node)
100
- end
101
-
102
- def proc?(node)
103
- fail 'Not a block node' unless node.type == :block
104
-
105
- send_node, _block_args, _block_body = *node
106
-
107
- command?(:proc, send_node) || send_node == PROC_NEW_NODE
108
- end
109
-
110
- def lambda_or_proc?(node)
111
- lambda?(node) || proc?(node)
112
- end
113
-
114
80
  def parentheses?(node)
115
- node.loc.respond_to?(:end) && node.loc.end
81
+ node.loc.respond_to?(:end) && node.loc.end &&
82
+ node.loc.end.is?(')'.freeze)
116
83
  end
117
84
 
118
- def on_node(syms, sexp, excludes = [])
119
- yield sexp if Array(syms).include?(sexp.type)
85
+ def on_node(syms, sexp, excludes = [], &block)
86
+ return to_enum(:on_node, syms, sexp, excludes) unless block_given?
120
87
 
88
+ yield sexp if Array(syms).include?(sexp.type)
121
89
  return if Array(excludes).include?(sexp.type)
122
90
 
123
91
  sexp.children.each do |elem|
124
92
  next unless elem.is_a?(Parser::AST::Node)
125
- on_node(syms, elem, excludes) { |s| yield s }
93
+ on_node(syms, elem, excludes, &block)
126
94
  end
127
95
  end
128
96
 
@@ -191,13 +159,17 @@ module RuboCop
191
159
  end
192
160
 
193
161
  def begins_its_line?(range)
194
- source_before_range = range.source_buffer.source[0...range.begin_pos]
195
- source_before_range.rpartition("\n").last.strip.empty?
162
+ (range.source_line =~ /\S/) == range.column
163
+ end
164
+
165
+ def ends_its_line?(range)
166
+ line = range.source_buffer.source_line(range.last_line)
167
+ (line =~ /\s*\z/) == range.last_column
196
168
  end
197
169
 
198
170
  def within_node?(inner, outer)
199
- o = outer.loc.expression
200
- i = inner.loc.expression
171
+ o = outer.is_a?(Node) ? outer.source_range : outer
172
+ i = inner.is_a?(Node) ? inner.source_range : inner
201
173
  i.begin_pos >= o.begin_pos && i.end_pos <= o.end_pos
202
174
  end
203
175
 
@@ -226,6 +198,67 @@ module RuboCop
226
198
  size = 0 if size < 0
227
199
  size
228
200
  end
201
+
202
+ # If converting a string to Ruby string literal source code, must
203
+ # double quotes be used?
204
+ def double_quotes_required?(string)
205
+ # Double quotes are required for strings which either:
206
+ # - Contain single quotes
207
+ # - Contain non-printable characters, which must use an escape
208
+
209
+ # Regex matches IF there is a ' or there is a \\ in the string that is
210
+ # not preceded/followed by another \\ (e.g. "\\x34") but not "\\\\".
211
+ string.inspect =~ /'|(?<! \\) \\{2}* \\ (?![\\"])/x
212
+ end
213
+
214
+ # If double quoted string literals are found in Ruby code, and they are
215
+ # not the preferred style, should they be flagged?
216
+ def double_quotes_acceptable?(string)
217
+ # If a string literal contains hard-to-type characters which would
218
+ # not appear on a "normal" keyboard, then double-quotes are acceptable
219
+ double_quotes_required?(string) ||
220
+ string.codepoints.any? { |cp| cp < 32 || cp > 126 }
221
+ end
222
+
223
+ def to_string_literal(string)
224
+ if double_quotes_required?(string)
225
+ string.inspect
226
+ else
227
+ "'#{string.gsub('\\') { '\\\\' }}'"
228
+ end
229
+ end
230
+
231
+ def to_symbol_literal(string)
232
+ if string =~ /\s/ || double_quotes_required?(string)
233
+ ":#{to_string_literal(string)}"
234
+ else
235
+ ":#{string}"
236
+ end
237
+ end
238
+
239
+ # Take a string with embedded escapes, and convert the escapes as the Ruby
240
+ # interpreter would when reading a double-quoted string literal.
241
+ # For example, "\\n" will be converted to "\n".
242
+ def interpret_string_escapes(string)
243
+ # We currently don't handle \cx, \C-x, and \M-x
244
+ string.gsub(STRING_ESCAPE_REGEX) do |escape|
245
+ STRING_ESCAPES[escape] || begin
246
+ if escape[1] == 'x'
247
+ [escape[2..-1].hex].pack('C')
248
+ elsif escape[1] == 'u'
249
+ if escape[2] == '{'
250
+ escape[3..-1].split(/\s+/).map(&:hex).pack('U')
251
+ else
252
+ [escape[2..-1].hex].pack('U')
253
+ end
254
+ elsif escape[1] =~ /\d/ # octal escape
255
+ [escape[1..-1].to_i(8)].pack('C')
256
+ else
257
+ escape[1] # literal escaped char, like \\
258
+ end
259
+ end
260
+ end
261
+ end
229
262
  end
230
263
  end
231
264
  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
@@ -59,7 +60,7 @@ module RuboCop
59
60
  if root_node.begin_type?
60
61
  root_node
61
62
  else
62
- Astrolabe::Node.new(:begin, [root_node])
63
+ Node.new(:begin, [root_node])
63
64
  end
64
65
  end
65
66
 
@@ -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,7 +12,7 @@ module RuboCop
11
12
  REFERENCE_PENETRABLE_BRANCH_TYPES = %w(rescue_main ensure_main).freeze
12
13
 
13
14
  attr_reader :node, :variable, :referenced
14
- alias_method :referenced?, :referenced
15
+ alias referenced? referenced
15
16
 
16
17
  def initialize(node, variable)
17
18
  unless VARIABLE_ASSIGNMENT_TYPES.include?(node.type)
@@ -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
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
@@ -13,7 +14,7 @@ module RuboCop
13
14
  class: 0..1,
14
15
  sclass: 0..0,
15
16
  block: 0..0
16
- }
17
+ }.freeze
17
18
 
18
19
  attr_reader :node, :variables
19
20
 
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
@@ -12,7 +13,7 @@ module RuboCop
12
13
 
13
14
  attr_reader :name, :declaration_node, :scope,
14
15
  :assignments, :references, :captured_by_block
15
- alias_method :captured_by_block?, :captured_by_block
16
+ alias captured_by_block? captured_by_block
16
17
 
17
18
  def initialize(name, declaration_node, scope)
18
19
  unless VARIABLE_DECLARATION_TYPES.include?(declaration_node.type)
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
@@ -58,7 +59,7 @@ module RuboCop
58
59
 
59
60
  unless variable
60
61
  fail "Assigning to undeclared local variable \"#{name}\" " \
61
- "at #{node.loc.expression}, #{node.inspect}"
62
+ "at #{node.source_range}, #{node.inspect}"
62
63
  end
63
64
 
64
65
  variable.assign(node)
@@ -0,0 +1,12 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ module RuboCop
5
+ # An Error exception is different from an Offense with severity 'error'
6
+ # When this exception is raised, it means that RuboCop is unable to perform
7
+ # a requested action (probably due to misconfiguration) and must stop
8
+ # immediately, rather than carrying on
9
+ class Error < StandardError; end
10
+
11
+ class ValidationError < Error; end
12
+ end
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  # rubocop:disable Metrics/LineLength
4
5
 
@@ -53,12 +54,20 @@ module RuboCop
53
54
  # @see #initialize
54
55
  attr_reader :output
55
56
 
57
+ # @api public
58
+ #
59
+ # @!attribute [r] options
60
+ #
61
+ # @return [Hash]
62
+ attr_reader :options
63
+
56
64
  # @api public
57
65
  #
58
66
  # @param output [IO]
59
67
  # `$stdout` or opened file
60
- def initialize(output)
68
+ def initialize(output, options = {})
61
69
  @output = output
70
+ @options = options
62
71
  end
63
72
 
64
73
  # @api public