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 Formatter
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Formatter
@@ -9,7 +10,11 @@ module RuboCop
9
10
  def rainbow
10
11
  @rainbow ||= begin
11
12
  rainbow = Rainbow.new
12
- rainbow.enabled = false unless output.tty?
13
+ if options[:color]
14
+ rainbow.enabled = true
15
+ elsif options[:color] == false || !output.tty?
16
+ rainbow.enabled = false
17
+ end
13
18
  rainbow
14
19
  end
15
20
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Formatter
@@ -16,19 +17,20 @@ module RuboCop
16
17
  .join("\n")
17
18
 
18
19
  @config_to_allow_offenses = {}
20
+ @detected_styles = {}
19
21
 
20
22
  COPS = Cop::Cop.all.group_by(&:cop_name)
21
23
 
22
24
  class << self
23
- attr_accessor :config_to_allow_offenses
25
+ attr_accessor :config_to_allow_offenses, :detected_styles
24
26
  end
25
27
 
26
- def file_started(_file, file_info)
27
- @exclude_limit_option =
28
- file_info.fetch(:cli_options, {})[:exclude_limit]
28
+ def file_started(_file, _file_info)
29
+ @exclude_limit_option = @options[:exclude_limit]
29
30
  @exclude_limit = (
30
31
  @exclude_limit_option ||
31
32
  RuboCop::Options::DEFAULT_MAXIMUM_EXCLUSION_ITEMS).to_i
33
+ @show_offense_counts = !@options[:no_offense_counts]
32
34
  end
33
35
 
34
36
  def file_finished(file, offenses)
@@ -53,18 +55,18 @@ module RuboCop
53
55
 
54
56
  @cops_with_offenses.sort.each do |cop_name, offense_count|
55
57
  output.puts
56
- cfg = self.class.config_to_allow_offenses[cop_name]
57
- cfg ||= {}
58
+ cfg = self.class.config_to_allow_offenses[cop_name] || {}
59
+
58
60
  output_cop_comments(output, cfg, cop_name, offense_count)
59
61
  output_cop_config(output, cfg, cop_name)
60
62
  end
61
63
  puts "Created #{output.path}."
62
- puts "Run `rubocop --config #{output.path}`, or"
63
- puts "add inherit_from: #{output.path} in a .rubocop.yml file."
64
+ puts "Run `rubocop --config #{output.path}`, or add `inherit_from: " \
65
+ "#{output.path}` in a .rubocop.yml file."
64
66
  end
65
67
 
66
68
  def output_cop_comments(output, cfg, cop_name, offense_count)
67
- output.puts "# Offense count: #{offense_count}"
69
+ output.puts "# Offense count: #{offense_count}" if @show_offense_counts
68
70
  if COPS[cop_name] && COPS[cop_name].first.new.support_autocorrect?
69
71
  output.puts '# Cop supports --auto-correct.'
70
72
  end
@@ -73,11 +75,19 @@ module RuboCop
73
75
  return unless default_cfg
74
76
 
75
77
  params = default_cfg.keys -
76
- %w(Description StyleGuide Reference Enabled) -
78
+ %w(Description StyleGuide Reference Enabled Exclude) -
77
79
  cfg.keys
78
80
  return if params.empty?
79
81
 
80
82
  output.puts "# Configuration parameters: #{params.join(', ')}."
83
+
84
+ params.each do |param|
85
+ value = default_cfg[param]
86
+ if value.is_a?(Array)
87
+ next if value.empty?
88
+ output.puts "# #{param}: #{value.join(', ')}"
89
+ end
90
+ end
81
91
  end
82
92
 
83
93
  def output_cop_config(output, cfg, cop_name)
@@ -104,13 +114,17 @@ module RuboCop
104
114
  require 'pathname'
105
115
  parent = Pathname.new(Dir.pwd)
106
116
 
107
- # Exclude properties in .rubocop_todo.yml override default ones, so in
108
- # order to retain the default excludes we must copy them.
109
- default_cfg = RuboCop::ConfigLoader.default_configuration[cop_name]
110
- default_excludes = default_cfg ? default_cfg['Exclude'] || [] : []
117
+ # Exclude properties in .rubocop_todo.yml override default ones, as well
118
+ # as any custom excludes in .rubocop.yml, so in order to retain those
119
+ # excludes we must copy them.
120
+ # There can be multiple .rubocop.yml files in subdirectories, but we
121
+ # just look at the current working directory
122
+ config = ConfigStore.new.for(parent)
123
+ cfg = config[cop_name] || {}
124
+ excludes = ((cfg['Exclude'] || []) + offending_files).uniq
111
125
 
112
126
  output.puts ' Exclude:'
113
- (default_excludes + offending_files).each do |file|
127
+ excludes.each do |file|
114
128
  file_path = Pathname.new(file)
115
129
  begin
116
130
  relative = file_path.relative_path_from(parent)
@@ -1,4 +1,6 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
3
+
2
4
  module RuboCop
3
5
  module Formatter
4
6
  # A basic formatter that displays the lines disabled
@@ -33,7 +35,7 @@ module RuboCop
33
35
  disabled_cops.each do |cop, line_ranges|
34
36
  line_ranges.each do |line_range|
35
37
  file = cyan(smart_path(file))
36
- summary << "#{file}:#{line_range}: #{cop}\n"
38
+ summary += "#{file}:#{line_range}: #{cop}\n"
37
39
  end
38
40
  end
39
41
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Formatter
@@ -8,12 +9,15 @@ module RuboCop
8
9
  class EmacsStyleFormatter < BaseFormatter
9
10
  def file_finished(file, offenses)
10
11
  offenses.each do |o|
11
- message = o.corrected? ? '[Corrected] ' : ''
12
- message << o.message
12
+ message = if o.corrected?
13
+ "[Corrected] #{o.message}"
14
+ else
15
+ o.message
16
+ end
13
17
 
14
18
  output.printf("%s:%d:%d: %s: %s\n",
15
19
  file, o.line, o.real_column, o.severity.code,
16
- message)
20
+ message.tr("\n", ' '))
17
21
  end
18
22
  end
19
23
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Formatter
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'fileutils'
4
5
 
@@ -18,10 +19,11 @@ module RuboCop
18
19
  'html' => HTMLFormatter,
19
20
  'files' => FileListFormatter,
20
21
  'offenses' => OffenseCountFormatter,
21
- 'disabled' => DisabledLinesFormatter
22
- }
22
+ 'disabled' => DisabledLinesFormatter,
23
+ 'worst' => WorstOffendersFormatter
24
+ }.freeze
23
25
 
24
- FORMATTER_APIS = [:started, :finished]
26
+ FORMATTER_APIS = [:started, :finished].freeze
25
27
 
26
28
  FORMATTER_APIS.each do |method_name|
27
29
  define_method(method_name) do |*args|
@@ -29,28 +31,17 @@ module RuboCop
29
31
  end
30
32
  end
31
33
 
34
+ def initialize(options = {})
35
+ @options = options # CLI options
36
+ end
37
+
32
38
  def file_started(file, options)
33
- @cop_disabled_line_ranges = options[:cop_disabled_line_ranges]
34
- @comments = options[:comments]
35
39
  @options = options[:cli_options]
36
40
  @config_store = options[:config_store]
37
41
  each { |f| f.file_started(file, options) }
38
42
  end
39
43
 
40
44
  def file_finished(file, offenses)
41
- if @cop_disabled_line_ranges.any? &&
42
- # Don't check unneeded disable if --only or --except option is
43
- # given, because these options override configuration.
44
- (@options[:except] || []).empty? && (@options[:only] || []).empty?
45
- config = @config_store.for(file)
46
- if config['Lint/UnneededDisable']['Enabled']
47
- cop = Cop::Lint::UnneededDisable.new(config, @options)
48
- cop.check(offenses, @cop_disabled_line_ranges, @comments)
49
- offenses += cop.offenses
50
- end
51
- end
52
-
53
- offenses = offenses.sort.reject(&:disabled?)
54
45
  each { |f| f.file_finished(file, offenses) }
55
46
  offenses
56
47
  end
@@ -73,7 +64,7 @@ module RuboCop
73
64
  output = $stdout
74
65
  end
75
66
 
76
- self << formatter_class.new(output)
67
+ self << formatter_class.new(output, @options)
77
68
  end
78
69
 
79
70
  def close_output_files
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'ruby-progressbar'
4
5
 
@@ -9,7 +10,7 @@ module RuboCop
9
10
  # This is inspired by the Fuubar formatter for RSpec by Jeff Kreeftmeijer.
10
11
  # https://github.com/jeffkreeftmeijer/fuubar
11
12
  class FuubarStyleFormatter < ClangStyleFormatter
12
- RESET_SEQUENCE = "\e[0m"
13
+ RESET_SEQUENCE = "\e[0m".freeze
13
14
 
14
15
  def started(target_files)
15
16
  super
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'cgi'
4
5
  require 'erb'
@@ -13,9 +14,21 @@ module RuboCop
13
14
  TEMPLATE_PATH =
14
15
  File.expand_path('../../../../assets/output.html.erb', __FILE__)
15
16
 
17
+ Color = Struct.new(:red, :green, :blue, :alpha) do
18
+ def to_s
19
+ "rgba(#{values.join(', ')})"
20
+ end
21
+
22
+ def fade_out(amount)
23
+ dup.tap do |color|
24
+ color.alpha -= amount
25
+ end
26
+ end
27
+ end
28
+
16
29
  attr_reader :files, :summary
17
30
 
18
- def initialize(output)
31
+ def initialize(output, options = {})
19
32
  super
20
33
  @files = []
21
34
  @summary = OpenStruct.new(offense_count: 0)
@@ -46,18 +59,6 @@ module RuboCop
46
59
  output.write html
47
60
  end
48
61
 
49
- Color = Struct.new(:red, :green, :blue, :alpha) do
50
- def to_s
51
- "rgba(#{values.join(', ')})"
52
- end
53
-
54
- def fade_out(amount)
55
- dup.tap do |color|
56
- color.alpha -= amount
57
- end
58
- end
59
- end
60
-
61
62
  # This class provides helper methods used in the ERB template.
62
63
  class ERBContext
63
64
  include PathUtil, TextUtil
@@ -68,7 +69,7 @@ module RuboCop
68
69
  warning: Color.new(0x96, 0x28, 0xEF, 1.0),
69
70
  error: Color.new(0xD2, 0x32, 0x2D, 1.0),
70
71
  fatal: Color.new(0xD2, 0x32, 0x2D, 1.0)
71
- }
72
+ }.freeze
72
73
 
73
74
  LOGO_IMAGE_PATH =
74
75
  File.expand_path('../../../../assets/logo.png', __FILE__)
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'json'
4
5
  require 'pathname'
@@ -11,7 +12,7 @@ module RuboCop
11
12
 
12
13
  attr_reader :output_hash
13
14
 
14
- def initialize(output)
15
+ def initialize(output, options = {})
15
16
  super
16
17
  @output_hash = {
17
18
  metadata: metadata_hash,
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Formatter
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Formatter
@@ -9,11 +10,10 @@ module RuboCop
9
10
  include TextUtil
10
11
 
11
12
  DOT = '.'.freeze
12
- GREEN_DOT = Rainbow(DOT).green.freeze
13
13
 
14
- def initialize(output)
14
+ def initialize(output, options = {})
15
15
  super
16
- @dot = @output.tty? ? GREEN_DOT : DOT
16
+ @dot = green(DOT)
17
17
  end
18
18
 
19
19
  def started(target_files)
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'rubocop/formatter/colorizable'
4
5
  require 'rubocop/formatter/text_util'
@@ -9,7 +10,7 @@ module RuboCop
9
10
  # Offenses are displayed at compact form - just the
10
11
  # location of the problem and the associated message.
11
12
  class SimpleTextFormatter < BaseFormatter
12
- include Colorizable, PathUtil, TextUtil
13
+ include Colorizable, PathUtil
13
14
 
14
15
  COLOR_FOR_SEVERITY = {
15
16
  refactor: :yellow,
@@ -47,23 +48,13 @@ module RuboCop
47
48
  end
48
49
 
49
50
  def report_summary(file_count, offense_count, correction_count)
50
- summary = pluralize(file_count, 'file')
51
- summary << ' inspected, '
52
-
53
- offenses_text = pluralize(offense_count, 'offense', no_for_zero: true)
54
- offenses_text << ' detected'
55
- summary << colorize(offenses_text, offense_count.zero? ? :green : :red)
56
-
57
- if correction_count > 0
58
- summary << ', '
59
- correction_text = pluralize(correction_count, 'offense')
60
- correction_text << ' corrected'
61
- color = correction_count == offense_count ? :green : :cyan
62
- summary << colorize(correction_text, color)
63
- end
51
+ report = Report.new(file_count,
52
+ offense_count,
53
+ correction_count,
54
+ rainbow)
64
55
 
65
56
  output.puts
66
- output.puts summary
57
+ output.puts report.summary
67
58
  end
68
59
 
69
60
  private
@@ -95,7 +86,49 @@ module RuboCop
95
86
 
96
87
  def message(offense)
97
88
  message = offense.corrected? ? green('[Corrected] ') : ''
98
- message << annotate_message(offense.message)
89
+ "#{message}#{annotate_message(offense.message)}"
90
+ end
91
+
92
+ # A helper class for building the report summary text.
93
+ class Report
94
+ include Colorizable, TextUtil
95
+
96
+ def initialize(file_count, offense_count, correction_count, rainbow)
97
+ @file_count = file_count
98
+ @offense_count = offense_count
99
+ @correction_count = correction_count
100
+ @rainbow = rainbow
101
+ end
102
+
103
+ def summary
104
+ if @correction_count > 0
105
+ "#{files} inspected, #{offenses} detected, #{corrections} corrected"
106
+ else
107
+ "#{files} inspected, #{offenses} detected"
108
+ end
109
+ end
110
+
111
+ private
112
+
113
+ attr_reader :rainbow
114
+
115
+ def files
116
+ pluralize(@file_count, 'file')
117
+ end
118
+
119
+ def offenses
120
+ text = pluralize(@offense_count, 'offense', no_for_zero: true)
121
+ color = @offense_count.zero? ? :green : :red
122
+
123
+ colorize(text, color)
124
+ end
125
+
126
+ def corrections
127
+ text = pluralize(@correction_count, 'offense')
128
+ color = @correction_count == @offense_count ? :green : :cyan
129
+
130
+ colorize(text, color)
131
+ end
99
132
  end
100
133
  end
101
134
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Formatter
@@ -7,16 +8,13 @@ module RuboCop
7
8
  module_function
8
9
 
9
10
  def pluralize(number, thing, options = {})
10
- text = if number == 0 && options[:no_for_zero]
11
- 'no'
12
- else
13
- number.to_s
14
- end
15
-
16
- text << " #{thing}"
17
- text << 's' unless number == 1
18
-
19
- text
11
+ if number == 0 && options[:no_for_zero]
12
+ "no #{thing}s"
13
+ elsif number == 1
14
+ "1 #{thing}"
15
+ else
16
+ "#{number} #{thing}s"
17
+ end
20
18
  end
21
19
  end
22
20
  end