rubocop 0.12.0 → 0.13.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 (279) hide show
  1. data/CHANGELOG.md +40 -0
  2. data/README.md +49 -8
  3. data/config/default.yml +40 -0
  4. data/config/enabled.yml +37 -9
  5. data/lib/rubocop.rb +24 -10
  6. data/lib/rubocop/cli.rb +41 -106
  7. data/lib/rubocop/config.rb +3 -2
  8. data/lib/rubocop/cop/commissioner.rb +15 -5
  9. data/lib/rubocop/cop/cop.rb +47 -32
  10. data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
  11. data/lib/rubocop/cop/lint/block_alignment.rb +30 -9
  12. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
  13. data/lib/rubocop/cop/lint/end_alignment.rb +4 -4
  14. data/lib/rubocop/cop/lint/end_in_method.rb +1 -1
  15. data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
  16. data/lib/rubocop/cop/lint/eval.rb +1 -3
  17. data/lib/rubocop/cop/lint/handle_exceptions.rb +1 -1
  18. data/lib/rubocop/cop/lint/literal_in_condition.rb +6 -4
  19. data/lib/rubocop/cop/lint/loop.rb +1 -1
  20. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -1
  21. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  22. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +5 -8
  23. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  24. data/lib/rubocop/cop/lint/useless_assignment.rb +57 -60
  25. data/lib/rubocop/cop/lint/useless_comparison.rb +1 -1
  26. data/lib/rubocop/cop/lint/useless_setter_call.rb +85 -0
  27. data/lib/rubocop/cop/lint/void.rb +6 -8
  28. data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +1 -1
  29. data/lib/rubocop/cop/rails/read_attribute.rb +1 -1
  30. data/lib/rubocop/cop/rails/validation.rb +1 -1
  31. data/lib/rubocop/cop/style/access_control.rb +4 -6
  32. data/lib/rubocop/cop/style/alias.rb +1 -3
  33. data/lib/rubocop/cop/style/align_array.rb +47 -0
  34. data/lib/rubocop/cop/style/align_hash.rb +145 -0
  35. data/lib/rubocop/cop/style/align_parameters.rb +9 -3
  36. data/lib/rubocop/cop/style/and_or.rb +3 -4
  37. data/lib/rubocop/cop/style/ascii_comments.rb +1 -3
  38. data/lib/rubocop/cop/style/ascii_identifiers.rb +1 -1
  39. data/lib/rubocop/cop/style/attr.rb +1 -4
  40. data/lib/rubocop/cop/style/begin_block.rb +1 -1
  41. data/lib/rubocop/cop/style/block_comments.rb +1 -1
  42. data/lib/rubocop/cop/style/block_nesting.rb +2 -2
  43. data/lib/rubocop/cop/style/blocks.rb +14 -2
  44. data/lib/rubocop/cop/style/case_equality.rb +1 -3
  45. data/lib/rubocop/cop/style/case_indentation.rb +1 -1
  46. data/lib/rubocop/cop/style/character_literal.rb +1 -2
  47. data/lib/rubocop/cop/style/class_and_module_camel_case.rb +1 -1
  48. data/lib/rubocop/cop/style/class_methods.rb +1 -3
  49. data/lib/rubocop/cop/style/{avoid_class_vars.rb → class_vars.rb} +6 -2
  50. data/lib/rubocop/cop/style/collection_methods.rb +7 -9
  51. data/lib/rubocop/cop/style/colon_method_call.rb +1 -2
  52. data/lib/rubocop/cop/style/comment_annotation.rb +6 -6
  53. data/lib/rubocop/cop/style/constant_name.rb +1 -3
  54. data/lib/rubocop/cop/style/def_parentheses.rb +4 -12
  55. data/lib/rubocop/cop/style/documentation.rb +2 -2
  56. data/lib/rubocop/cop/style/dot_position.rb +2 -4
  57. data/lib/rubocop/cop/style/empty_line_between_defs.rb +21 -6
  58. data/lib/rubocop/cop/style/empty_lines.rb +1 -1
  59. data/lib/rubocop/cop/style/empty_literal.rb +3 -12
  60. data/lib/rubocop/cop/style/encoding.rb +6 -6
  61. data/lib/rubocop/cop/style/end_block.rb +1 -1
  62. data/lib/rubocop/cop/style/end_of_line.rb +5 -5
  63. data/lib/rubocop/cop/style/even_odd.rb +2 -2
  64. data/lib/rubocop/cop/style/favor_join.rb +1 -3
  65. data/lib/rubocop/cop/style/favor_modifier.rb +7 -3
  66. data/lib/rubocop/cop/style/favor_sprintf.rb +1 -1
  67. data/lib/rubocop/cop/style/favor_unless_over_negated_if.rb +1 -1
  68. data/lib/rubocop/cop/style/final_newline.rb +23 -0
  69. data/lib/rubocop/cop/style/{avoid_for.rb → for.rb} +2 -2
  70. data/lib/rubocop/cop/style/{avoid_global_vars.rb → global_vars.rb} +19 -6
  71. data/lib/rubocop/cop/style/hash_methods.rb +3 -5
  72. data/lib/rubocop/cop/style/hash_syntax.rb +4 -4
  73. data/lib/rubocop/cop/style/if_then_else.rb +1 -1
  74. data/lib/rubocop/cop/style/indentation_width.rb +4 -4
  75. data/lib/rubocop/cop/style/lambda.rb +2 -2
  76. data/lib/rubocop/cop/style/leading_comment_space.rb +1 -1
  77. data/lib/rubocop/cop/style/line_length.rb +7 -8
  78. data/lib/rubocop/cop/style/method_and_variable_snake_case.rb +1 -1
  79. data/lib/rubocop/cop/style/method_call_parentheses.rb +1 -4
  80. data/lib/rubocop/cop/style/method_length.rb +4 -4
  81. data/lib/rubocop/cop/style/module_function.rb +1 -3
  82. data/lib/rubocop/cop/style/multiline_block_chain.rb +44 -0
  83. data/lib/rubocop/cop/style/nil_comparison.rb +1 -3
  84. data/lib/rubocop/cop/style/not.rb +1 -1
  85. data/lib/rubocop/cop/style/numeric_literals.rb +26 -6
  86. data/lib/rubocop/cop/style/op_method.rb +2 -2
  87. data/lib/rubocop/cop/style/parameter_lists.rb +4 -4
  88. data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
  89. data/lib/rubocop/cop/style/perl_backrefs.rb +26 -0
  90. data/lib/rubocop/cop/style/proc.rb +1 -3
  91. data/lib/rubocop/cop/style/reduce_arguments.rb +7 -5
  92. data/lib/rubocop/cop/style/redundant_begin.rb +1 -1
  93. data/lib/rubocop/cop/style/redundant_return.rb +9 -2
  94. data/lib/rubocop/cop/style/redundant_self.rb +9 -2
  95. data/lib/rubocop/cop/style/regexp_literal.rb +7 -8
  96. data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
  97. data/lib/rubocop/cop/style/semicolon.rb +10 -10
  98. data/lib/rubocop/cop/style/signal_exception.rb +2 -4
  99. data/lib/rubocop/cop/style/single_line_methods.rb +2 -4
  100. data/lib/rubocop/cop/style/space_after_comma_etc.rb +1 -1
  101. data/lib/rubocop/cop/style/space_after_control_keyword.rb +1 -1
  102. data/lib/rubocop/cop/style/space_after_method_name.rb +1 -1
  103. data/lib/rubocop/cop/style/space_before_modifier_keyword.rb +34 -0
  104. data/lib/rubocop/cop/style/{avoid_perlisms.rb → special_global_vars.rb} +17 -8
  105. data/lib/rubocop/cop/style/string_literals.rb +1 -2
  106. data/lib/rubocop/cop/style/surrounding_space.rb +9 -8
  107. data/lib/rubocop/cop/style/symbol_array.rb +1 -1
  108. data/lib/rubocop/cop/style/symbol_name.rb +9 -2
  109. data/lib/rubocop/cop/style/tab.rb +5 -5
  110. data/lib/rubocop/cop/style/ternary_operator.rb +2 -6
  111. data/lib/rubocop/cop/style/trailing_blank_lines.rb +32 -0
  112. data/lib/rubocop/cop/style/trailing_whitespace.rb +5 -6
  113. data/lib/rubocop/cop/style/trivial_accessors.rb +5 -5
  114. data/lib/rubocop/cop/style/unless_else.rb +1 -1
  115. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -3
  116. data/lib/rubocop/cop/style/when_then.rb +1 -4
  117. data/lib/rubocop/cop/style/while_until_do.rb +7 -5
  118. data/lib/rubocop/cop/style/word_array.rb +1 -1
  119. data/lib/rubocop/cop/team.rb +100 -0
  120. data/lib/rubocop/cop/variable_inspector.rb +323 -235
  121. data/lib/rubocop/cop/variable_inspector/assignment.rb +103 -0
  122. data/lib/rubocop/cop/variable_inspector/locatable.rb +162 -0
  123. data/lib/rubocop/cop/variable_inspector/reference.rb +31 -0
  124. data/lib/rubocop/cop/variable_inspector/scope.rb +70 -0
  125. data/lib/rubocop/cop/variable_inspector/variable.rb +87 -0
  126. data/lib/rubocop/cop/variable_inspector/variable_table.rb +129 -0
  127. data/lib/rubocop/formatter/json_formatter.rb +8 -8
  128. data/lib/rubocop/formatter/progress_formatter.rb +4 -4
  129. data/lib/rubocop/processed_source.rb +22 -1
  130. data/lib/rubocop/version.rb +1 -1
  131. data/rubocop.gemspec +1 -1
  132. data/spec/rubocop/cli_spec.rb +32 -30
  133. data/spec/rubocop/config_spec.rb +4 -6
  134. data/spec/rubocop/cop/commissioner_spec.rb +4 -5
  135. data/spec/rubocop/cop/cop_spec.rb +8 -26
  136. data/spec/rubocop/cop/lint/assignment_in_condition_spec.rb +5 -9
  137. data/spec/rubocop/cop/lint/block_alignment_spec.rb +105 -57
  138. data/spec/rubocop/cop/lint/empty_ensure_spec.rb +1 -1
  139. data/spec/rubocop/cop/lint/end_alignment_spec.rb +1 -1
  140. data/spec/rubocop/cop/lint/end_in_method_spec.rb +1 -1
  141. data/spec/rubocop/cop/lint/ensure_return_spec.rb +1 -1
  142. data/spec/rubocop/cop/lint/eval_spec.rb +3 -3
  143. data/spec/rubocop/cop/lint/handle_exceptions_spec.rb +2 -2
  144. data/spec/rubocop/cop/lint/literal_in_condition_spec.rb +1 -1
  145. data/spec/rubocop/cop/lint/loop_spec.rb +1 -1
  146. data/spec/rubocop/cop/lint/parentheses_as_grouped_expression_spec.rb +1 -1
  147. data/spec/rubocop/cop/lint/rescue_exception_spec.rb +5 -5
  148. data/spec/rubocop/cop/lint/unreachable_code_spec.rb +1 -1
  149. data/spec/rubocop/cop/lint/useless_assignment_spec.rb +1545 -108
  150. data/spec/rubocop/cop/lint/useless_comparison_spec.rb +1 -1
  151. data/spec/rubocop/cop/lint/useless_setter_call_spec.rb +101 -0
  152. data/spec/rubocop/cop/lint/void_spec.rb +1 -1
  153. data/spec/rubocop/cop/offence_spec.rb +4 -4
  154. data/spec/rubocop/cop/rails/has_and_belongs_to_many_spec.rb +1 -1
  155. data/spec/rubocop/cop/rails/read_attribute_spec.rb +1 -1
  156. data/spec/rubocop/cop/rails/validation_spec.rb +1 -1
  157. data/spec/rubocop/cop/style/access_control_spec.rb +20 -20
  158. data/spec/rubocop/cop/style/alias_spec.rb +3 -3
  159. data/spec/rubocop/cop/style/align_array_spec.rb +62 -0
  160. data/spec/rubocop/cop/style/align_hash_spec.rb +267 -0
  161. data/spec/rubocop/cop/style/align_parameters_spec.rb +2 -2
  162. data/spec/rubocop/cop/style/and_or_spec.rb +1 -1
  163. data/spec/rubocop/cop/style/ascii_comments_spec.rb +2 -2
  164. data/spec/rubocop/cop/style/ascii_identifiers_spec.rb +2 -2
  165. data/spec/rubocop/cop/style/attr_spec.rb +1 -1
  166. data/spec/rubocop/cop/style/begin_block_spec.rb +1 -1
  167. data/spec/rubocop/cop/style/block_comments_spec.rb +1 -1
  168. data/spec/rubocop/cop/style/block_nesting_spec.rb +3 -3
  169. data/spec/rubocop/cop/style/blocks_spec.rb +25 -1
  170. data/spec/rubocop/cop/style/case_equality_spec.rb +1 -1
  171. data/spec/rubocop/cop/style/case_indentation_spec.rb +5 -5
  172. data/spec/rubocop/cop/style/character_literal_spec.rb +1 -1
  173. data/spec/rubocop/cop/style/class_and_module_camel_case_spec.rb +1 -1
  174. data/spec/rubocop/cop/style/class_methods_spec.rb +1 -1
  175. data/spec/rubocop/cop/style/class_vars_spec.rb +25 -0
  176. data/spec/rubocop/cop/style/collection_methods_spec.rb +5 -6
  177. data/spec/rubocop/cop/style/colon_method_call_spec.rb +0 -3
  178. data/spec/rubocop/cop/style/comment_annotation_spec.rb +20 -18
  179. data/spec/rubocop/cop/style/constant_name_spec.rb +1 -1
  180. data/spec/rubocop/cop/style/def_with_parentheses_spec.rb +1 -1
  181. data/spec/rubocop/cop/style/def_without_parentheses_spec.rb +1 -1
  182. data/spec/rubocop/cop/style/documentation_spec.rb +1 -1
  183. data/spec/rubocop/cop/style/dot_position_spec.rb +5 -5
  184. data/spec/rubocop/cop/style/empty_line_between_defs_spec.rb +35 -4
  185. data/spec/rubocop/cop/style/empty_lines_spec.rb +1 -1
  186. data/spec/rubocop/cop/style/empty_literal_spec.rb +7 -7
  187. data/spec/rubocop/cop/style/encoding_spec.rb +11 -5
  188. data/spec/rubocop/cop/style/end_block_spec.rb +1 -1
  189. data/spec/rubocop/cop/style/end_of_line_spec.rb +4 -3
  190. data/spec/rubocop/cop/style/even_odd_spec.rb +1 -1
  191. data/spec/rubocop/cop/style/favor_join_spec.rb +2 -2
  192. data/spec/rubocop/cop/style/favor_modifier_spec.rb +13 -10
  193. data/spec/rubocop/cop/style/favor_sprintf_spec.rb +4 -4
  194. data/spec/rubocop/cop/style/favor_unless_over_negated_if_spec.rb +1 -1
  195. data/spec/rubocop/cop/style/favor_until_over_negated_while_spec.rb +4 -4
  196. data/spec/rubocop/cop/style/final_newline_spec.rb +25 -0
  197. data/spec/rubocop/cop/style/{avoid_for_spec.rb → for_spec.rb} +8 -12
  198. data/spec/rubocop/cop/style/{avoid_global_vars_spec.rb → global_vars_spec.rb} +13 -3
  199. data/spec/rubocop/cop/style/hash_methods_spec.rb +1 -1
  200. data/spec/rubocop/cop/style/hash_syntax_spec.rb +20 -9
  201. data/spec/rubocop/cop/style/if_with_semicolon_spec.rb +3 -3
  202. data/spec/rubocop/cop/style/indentation_width_spec.rb +19 -19
  203. data/spec/rubocop/cop/style/lambda_spec.rb +6 -6
  204. data/spec/rubocop/cop/style/leading_comment_space_spec.rb +1 -1
  205. data/spec/rubocop/cop/style/line_length_spec.rb +3 -3
  206. data/spec/rubocop/cop/style/method_and_variable_snake_case_spec.rb +8 -9
  207. data/spec/rubocop/cop/style/method_call_parentheses_spec.rb +1 -1
  208. data/spec/rubocop/cop/style/method_length_spec.rb +18 -17
  209. data/spec/rubocop/cop/style/module_function_spec.rb +1 -1
  210. data/spec/rubocop/cop/style/multiline_block_chain_spec.rb +84 -0
  211. data/spec/rubocop/cop/style/multiline_if_then_spec.rb +2 -2
  212. data/spec/rubocop/cop/style/nil_comparison_spec.rb +1 -1
  213. data/spec/rubocop/cop/style/not_spec.rb +1 -1
  214. data/spec/rubocop/cop/style/numeric_literals_spec.rb +15 -25
  215. data/spec/rubocop/cop/style/one_line_conditional_spec.rb +2 -2
  216. data/spec/rubocop/cop/style/op_method_spec.rb +3 -3
  217. data/spec/rubocop/cop/style/parameter_lists_spec.rb +5 -5
  218. data/spec/rubocop/cop/style/parentheses_around_condition_spec.rb +4 -8
  219. data/spec/rubocop/cop/style/perl_backrefs_spec.rb +23 -0
  220. data/spec/rubocop/cop/style/proc_spec.rb +1 -1
  221. data/spec/rubocop/cop/style/reduce_arguments_spec.rb +18 -11
  222. data/spec/rubocop/cop/style/redundant_begin_spec.rb +1 -1
  223. data/spec/rubocop/cop/style/redundant_return_spec.rb +16 -1
  224. data/spec/rubocop/cop/style/redundant_self_spec.rb +6 -1
  225. data/spec/rubocop/cop/style/regexp_literal_spec.rb +19 -23
  226. data/spec/rubocop/cop/style/rescue_modifier_spec.rb +3 -3
  227. data/spec/rubocop/cop/style/semicolon_spec.rb +3 -3
  228. data/spec/rubocop/cop/style/signal_exception_spec.rb +1 -1
  229. data/spec/rubocop/cop/style/single_line_methods_spec.rb +22 -18
  230. data/spec/rubocop/cop/style/space_after_colon_spec.rb +4 -4
  231. data/spec/rubocop/cop/style/space_after_comma_spec.rb +4 -4
  232. data/spec/rubocop/cop/style/space_after_control_keyword_spec.rb +1 -1
  233. data/spec/rubocop/cop/style/space_after_method_name_spec.rb +1 -1
  234. data/spec/rubocop/cop/style/space_after_semicolon_spec.rb +3 -3
  235. data/spec/rubocop/cop/style/space_around_braces_spec.rb +13 -12
  236. data/spec/rubocop/cop/style/space_around_equals_in_default_parameter_spec.rb +3 -3
  237. data/spec/rubocop/cop/style/space_around_operators_spec.rb +25 -25
  238. data/spec/rubocop/cop/style/space_before_modifier_keyword_spec.rb +53 -0
  239. data/spec/rubocop/cop/style/space_inside_brackets_spec.rb +9 -9
  240. data/spec/rubocop/cop/style/space_inside_hash_literal_braces_spec.rb +47 -61
  241. data/spec/rubocop/cop/style/space_inside_parens_spec.rb +4 -4
  242. data/spec/rubocop/cop/style/special_global_vars_spec.rb +52 -0
  243. data/spec/rubocop/cop/style/string_literals_spec.rb +5 -5
  244. data/spec/rubocop/cop/style/symbol_array_spec.rb +1 -1
  245. data/spec/rubocop/cop/style/symbol_name_spec.rb +27 -18
  246. data/spec/rubocop/cop/style/tab_spec.rb +1 -1
  247. data/spec/rubocop/cop/style/ternary_operator_spec.rb +2 -2
  248. data/spec/rubocop/cop/style/trailing_blank_lines_spec.rb +24 -0
  249. data/spec/rubocop/cop/style/trailing_whitespace_spec.rb +7 -7
  250. data/spec/rubocop/cop/style/trivial_accessors_spec.rb +6 -14
  251. data/spec/rubocop/cop/style/unless_else_spec.rb +3 -3
  252. data/spec/rubocop/cop/style/variable_interpolation_spec.rb +5 -5
  253. data/spec/rubocop/cop/style/when_then_spec.rb +15 -15
  254. data/spec/rubocop/cop/style/while_until_do_spec.rb +3 -3
  255. data/spec/rubocop/cop/style/word_array_spec.rb +1 -1
  256. data/spec/rubocop/cop/team_spec.rb +158 -0
  257. data/spec/rubocop/cop/variable_inspector/assignment_spec.rb +217 -0
  258. data/spec/rubocop/cop/variable_inspector/locatable_spec.rb +740 -0
  259. data/spec/rubocop/cop/variable_inspector/scope_spec.rb +191 -0
  260. data/spec/rubocop/cop/variable_inspector/variable_spec.rb +79 -0
  261. data/spec/rubocop/cop/variable_inspector/variable_table_spec.rb +275 -0
  262. data/spec/rubocop/cop/variable_inspector_spec.rb +13 -533
  263. data/spec/rubocop/formatter/clang_style_formatter_spec.rb +4 -4
  264. data/spec/rubocop/formatter/disabled_config_formatter_spec.rb +1 -1
  265. data/spec/rubocop/formatter/emacs_style_formatter_spec.rb +3 -3
  266. data/spec/rubocop/formatter/file_list_formatter_spec.rb +3 -3
  267. data/spec/rubocop/formatter/progress_formatter_spec.rb +1 -1
  268. data/spec/spec_helper.rb +5 -1
  269. data/spec/support/ast_helper.rb +15 -0
  270. data/spec/support/shared_context.rb +18 -0
  271. data/spec/support/shared_examples.rb +1 -1
  272. metadata +95 -32
  273. checksums.yaml +0 -7
  274. data/lib/rubocop/cop/lint/unused_local_variable.rb +0 -32
  275. data/lib/rubocop/cop/style/avoid_perl_backrefs.rb +0 -19
  276. data/spec/rubocop/cop/lint/unused_local_variable_spec.rb +0 -588
  277. data/spec/rubocop/cop/style/avoid_class_vars_spec.rb +0 -27
  278. data/spec/rubocop/cop/style/avoid_perl_backrefs_spec.rb +0 -20
  279. data/spec/rubocop/cop/style/avoid_perlisms_spec.rb +0 -47
@@ -28,9 +28,9 @@ module Rubocop
28
28
  return unless div_by_2?(receiver)
29
29
 
30
30
  if args == ZERO
31
- add_offence(:convention, node.loc.expression, MSG_EVEN)
31
+ convention(node, :expression, MSG_EVEN)
32
32
  elsif args == ONE
33
- add_offence(:convention, node.loc.expression, MSG_ODD)
33
+ convention(node, :expression, MSG_ODD)
34
34
  end
35
35
  end
36
36
 
@@ -16,9 +16,7 @@ module Rubocop
16
16
 
17
17
  if receiver_node && receiver_node.type == :array &&
18
18
  method_name == :* && arg_nodes[0].type == :str
19
- add_offence(:convention,
20
- node.loc.selector,
21
- MSG)
19
+ convention(node, :selector)
22
20
  end
23
21
  end
24
22
  end
@@ -27,11 +27,15 @@ module Rubocop
27
27
  space = 1
28
28
  total = indentation + body_length + space + kw_length + space +
29
29
  cond_length
30
- total <= LineLength.max && !body_has_comment?(body, comments)
30
+ total <= max_line_length && !body_has_comment?(body, comments)
31
31
  end
32
32
  end
33
33
  end
34
34
 
35
+ def max_line_length
36
+ config.for_cop('LineLength')['Max']
37
+ end
38
+
35
39
  def length(sexp)
36
40
  sexp.loc.expression.source.lines.to_a.size
37
41
  end
@@ -71,7 +75,7 @@ module Rubocop
71
75
  next if if_else?(node)
72
76
 
73
77
  if check(node, processed_source.comments)
74
- add_offence(:convention, node.loc.keyword, error_message)
78
+ convention(node, :keyword, error_message)
75
79
  end
76
80
  end
77
81
  end
@@ -108,7 +112,7 @@ module Rubocop
108
112
  next unless node.loc.end
109
113
 
110
114
  if check(node, processed_source.comments)
111
- add_offence(:convention, node.loc.keyword, MSG)
115
+ convention(node, :keyword)
112
116
  end
113
117
  end
114
118
  end
@@ -17,7 +17,7 @@ module Rubocop
17
17
  if method_name == :% &&
18
18
  ([:str, :dstr].include?(receiver_node.type) ||
19
19
  arg_nodes[0].type == :array)
20
- add_offence(:convention, node.loc.selector, MSG)
20
+ convention(node, :selector)
21
21
  end
22
22
  end
23
23
  end
@@ -15,7 +15,7 @@ module Rubocop
15
15
  if condition.type == :send
16
16
  _object, method = *condition
17
17
  if method == :! && !(node.loc.respond_to?(:else) && node.loc.else)
18
- add_offence(:convention, node.loc.expression, error_message)
18
+ convention(node, :expression, error_message)
19
19
  end
20
20
  end
21
21
  end
@@ -0,0 +1,23 @@
1
+ # encoding: utf-8
2
+
3
+ module Rubocop
4
+ module Cop
5
+ module Style
6
+ # This cop enforces the presence of a final newline in each source file.
7
+ class FinalNewline < Cop
8
+ MSG = 'Source files should end with a newline(\n).'
9
+
10
+ def investigate(processed_source)
11
+ final_line = processed_source.raw_lines.to_a.last
12
+
13
+ unless final_line.end_with?("\n")
14
+ convention(nil,
15
+ source_range(processed_source.buffer,
16
+ processed_source[0...-1],
17
+ final_line.length - 1, 1))
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -4,11 +4,11 @@ module Rubocop
4
4
  module Cop
5
5
  module Style
6
6
  # This cop looks for uses of the *for* keyword.
7
- class AvoidFor < Cop
7
+ class For < Cop
8
8
  MSG = 'Prefer *each* over *for*.'
9
9
 
10
10
  def on_for(node)
11
- add_offence(:convention, node.loc.keyword, MSG)
11
+ convention(node, :keyword)
12
12
  end
13
13
  end
14
14
  end
@@ -5,7 +5,11 @@ module Rubocop
5
5
  module Style
6
6
  # This cops looks for uses of global variables.
7
7
  # It does not report offences for built-in global variables.
8
- class AvoidGlobalVars < Cop
8
+ # Built-in global variables are allowed by default. Additionally
9
+ # users can allow additional variables via the AllowedVariables option.
10
+ #
11
+ # Note that backreferences like $1, $2, etc are not global variables.
12
+ class GlobalVars < Cop
9
13
  MSG = 'Do not introduce global variables.'
10
14
 
11
15
  # predefined global variables their English aliases
@@ -36,8 +40,21 @@ module Rubocop
36
40
  $stdin $stdout $stderr
37
41
  $DEBUG $FILENAME $VERBOSE $SAFE
38
42
  $-0 $-a $-d $-F $-i $-I $-l $-p $-v $-w
43
+ $CLASSPATH $JRUBY_VERSION $JRUBY_REVISION $ENV_JAVA
39
44
  ).map(&:to_sym)
40
45
 
46
+ def user_vars
47
+ if cop_config['AllowedVariables']
48
+ cop_config['AllowedVariables'].map(&:to_sym)
49
+ else
50
+ []
51
+ end
52
+ end
53
+
54
+ def allowed_var?(global_var)
55
+ BUILT_IN_VARS.include?(global_var) || user_vars.include?(global_var)
56
+ end
57
+
41
58
  def on_gvar(node)
42
59
  check(node)
43
60
  end
@@ -49,11 +66,7 @@ module Rubocop
49
66
  def check(node)
50
67
  global_var, = *node
51
68
 
52
- unless BUILT_IN_VARS.include?(global_var)
53
- add_offence(:convention,
54
- node.loc.name,
55
- MSG)
56
- end
69
+ convention(node, :name) unless allowed_var?(global_var)
57
70
  end
58
71
  end
59
72
  end
@@ -14,11 +14,9 @@ module Rubocop
14
14
  _receiver, method_name, *args = *node
15
15
 
16
16
  if args.size == 1 && DEPRECATED_METHODS.include?(method_name)
17
- add_offence(:convention,
18
- node.loc.selector,
19
- MSG.format(method_name,
20
- proper_method_name(method_name)))
21
- do_autocorrect(node)
17
+ convention(node, :selector,
18
+ MSG.format(method_name,
19
+ proper_method_name(method_name)))
22
20
  end
23
21
  end
24
22
 
@@ -18,9 +18,9 @@ module Rubocop
18
18
  if sym_indices
19
19
  pairs.each do |pair|
20
20
  if pair.loc.operator && pair.loc.operator.is?('=>')
21
- add_offence(:convention,
22
- pair.loc.expression.begin.join(pair.loc.operator),
23
- MSG)
21
+ convention(nil,
22
+ pair.loc.expression.begin.join(pair.loc.operator),
23
+ MSG)
24
24
  end
25
25
  end
26
26
  end
@@ -34,7 +34,7 @@ module Rubocop
34
34
  if key.type == :sym
35
35
  sym_name = key.to_a[0]
36
36
 
37
- sym_name =~ /\A\w+\z/
37
+ sym_name =~ /\A[A-Za-z_]\w*\z/
38
38
  else
39
39
  false
40
40
  end
@@ -17,7 +17,7 @@ module Rubocop
17
17
  # We won't check modifier or ternary conditionals.
18
18
  if node.loc.expression.source =~ /\A(if|unless)\b/
19
19
  if offending_line(node)
20
- add_offence(:convention, node.loc.expression, error_message)
20
+ convention(node, :expression, error_message)
21
21
  end
22
22
  end
23
23
  end
@@ -136,10 +136,10 @@ module Rubocop
136
136
  [expr.begin_pos,
137
137
  expr.begin_pos - indentation]
138
138
  end
139
- add_offence(:convention,
140
- Parser::Source::Range.new(expr.source_buffer,
141
- begin_pos, end_pos),
142
- sprintf(MSG, indentation))
139
+ convention(nil,
140
+ Parser::Source::Range.new(expr.source_buffer,
141
+ begin_pos, end_pos),
142
+ sprintf(MSG, indentation))
143
143
  end
144
144
  end
145
145
  end
@@ -24,9 +24,9 @@ module Rubocop
24
24
  lambda_length = lambda_length(node)
25
25
 
26
26
  if selector != '->' && lambda_length == 0
27
- add_offence(:convention, block_method.loc.expression, SINGLE_MSG)
27
+ convention(block_method, :expression, SINGLE_MSG)
28
28
  elsif selector == '->' && lambda_length > 0
29
- add_offence(:convention, block_method.loc.expression, MULTI_MSG)
29
+ convention(block_method, :expression, MULTI_MSG)
30
30
  end
31
31
  end
32
32
  end
@@ -14,7 +14,7 @@ module Rubocop
14
14
  processed_source.comments.each do |comment|
15
15
  if comment.text =~ /^#+[^#\s:+-]/
16
16
  unless comment.text.start_with?('#!') && comment.loc.line == 1
17
- add_offence(:convention, comment.loc.expression, MSG)
17
+ convention(comment, :expression)
18
18
  end
19
19
  end
20
20
  end
@@ -10,20 +10,19 @@ module Rubocop
10
10
 
11
11
  def investigate(processed_source)
12
12
  processed_source.lines.each_with_index do |line, index|
13
- max = LineLength.max
14
13
  if line.length > max
15
14
  message = sprintf(MSG, line.length, max)
16
- add_offence(:convention,
17
- source_range(processed_source.buffer,
18
- processed_source[0...index], max,
19
- line.length - max),
20
- message)
15
+ convention(nil,
16
+ source_range(processed_source.buffer,
17
+ processed_source[0...index], max,
18
+ line.length - max),
19
+ message)
21
20
  end
22
21
  end
23
22
  end
24
23
 
25
- def self.max
26
- LineLength.config['Max']
24
+ def max
25
+ cop_config['Max']
27
26
  end
28
27
  end
29
28
  end
@@ -25,7 +25,7 @@ module Rubocop
25
25
  name = range.source.to_sym
26
26
  next if name =~ SNAKE_CASE || OPERATOR_METHODS.include?(name)
27
27
 
28
- add_offence(:convention, range, MSG)
28
+ convention(n, range)
29
29
  end
30
30
  end
31
31
 
@@ -10,10 +10,7 @@ module Rubocop
10
10
  def on_send(node)
11
11
  _receiver, _method_name, *args = *node
12
12
 
13
- if args.empty? && node.loc.begin
14
- add_offence(:convention, node.loc.begin, MSG)
15
- do_autocorrect(node)
16
- end
13
+ convention(node, :begin) if args.empty? && node.loc.begin
17
14
  end
18
15
 
19
16
  def autocorrect_action(node)
@@ -18,11 +18,11 @@ module Rubocop
18
18
  end
19
19
 
20
20
  def max_length
21
- MethodLength.config['Max']
21
+ cop_config['Max']
22
22
  end
23
23
 
24
24
  def count_comments?
25
- MethodLength.config['CountComments']
25
+ cop_config['CountComments']
26
26
  end
27
27
 
28
28
  private
@@ -32,7 +32,7 @@ module Rubocop
32
32
 
33
33
  if method_length > max_length
34
34
  message = sprintf(MSG, method_length, max_length)
35
- add_offence(:convention, node.loc.keyword, message)
35
+ convention(node, :keyword, message)
36
36
  end
37
37
  end
38
38
 
@@ -41,7 +41,7 @@ module Rubocop
41
41
 
42
42
  return 0 unless lines
43
43
 
44
- lines.map!(&:strip).reject!(&:empty?)
44
+ lines.reject!(&:blank?)
45
45
 
46
46
  lines.reject! { |line| line =~ /^\s*#/ } unless count_comments?
47
47
 
@@ -22,9 +22,7 @@ module Rubocop
22
22
 
23
23
  if body && body.type == :begin
24
24
  body.children.each do |body_node|
25
- if body_node == TARGET_NODE
26
- add_offence(:convention, body_node.loc.expression, MSG)
27
- end
25
+ convention(body_node, :expression) if body_node == TARGET_NODE
28
26
  end
29
27
  end
30
28
  end
@@ -0,0 +1,44 @@
1
+ # encoding: utf-8
2
+
3
+ module Rubocop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for chaining of a block after another block that spans
7
+ # multiple lines.
8
+ #
9
+ # @example
10
+ #
11
+ # Thread.list.find_all do |t|
12
+ # t.alive?
13
+ # end.map do |t|
14
+ # t.object_id
15
+ # end
16
+ class MultilineBlockChain < Cop
17
+ MSG = 'Avoid multi-line chains of blocks.'
18
+
19
+ def on_block(node)
20
+ method, _args, _body = *node
21
+ on_node(:send, method) do |send_node|
22
+ receiver, _method_name, *_args = *send_node
23
+ if receiver && receiver.type == :block
24
+ # The begin and end could also be braces, but we call the
25
+ # variables do... and end...
26
+ do_kw_loc, end_kw_loc = receiver.loc.begin, receiver.loc.end
27
+
28
+ if do_kw_loc.line != end_kw_loc.line
29
+ range =
30
+ Parser::Source::Range.new(end_kw_loc.source_buffer,
31
+ end_kw_loc.begin_pos,
32
+ method.loc.expression.end_pos)
33
+ convention(nil, range)
34
+ # Done. If there are more blocks in the chain, they will be
35
+ # found by subsequent calls to on_block.
36
+ break
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -27,9 +27,7 @@ module Rubocop
27
27
  if OPS.include?(op)
28
28
  _receiver, _method, args = *node
29
29
 
30
- if args == NIL_NODE
31
- add_offence(:convention, node.loc.selector, MSG)
32
- end
30
+ convention(node, :selector) if args == NIL_NODE
33
31
  end
34
32
  end
35
33
  end
@@ -13,7 +13,7 @@ module Rubocop
13
13
  # not does not take any arguments
14
14
  if args.empty? && method_name == :! &&
15
15
  node.loc.selector.is?('not')
16
- add_offence(:convention, node.loc.selector, MSG)
16
+ convention(node, :selector)
17
17
  end
18
18
  end
19
19
  end
@@ -6,19 +6,39 @@ module Rubocop
6
6
  # This cop checks for big numeric literals without _ between groups
7
7
  # of digits in them.
8
8
  class NumericLiterals < Cop
9
- MSG = 'Add underscores to large numeric literals to ' +
10
- 'improve their readability.'
9
+ MSG = 'Separate every 3 digits in the integer portion of a number' \
10
+ 'with underscores(_).'
11
+
12
+ def min_digits
13
+ cop_config['MinDigits']
14
+ end
15
+
16
+ def enough_digits?(number)
17
+ number.to_s.size >= min_digits
18
+ end
11
19
 
12
20
  def on_int(node)
21
+ check(node)
22
+ end
23
+
24
+ def on_fload(node)
25
+ check(node)
26
+ end
27
+
28
+ def check(node)
13
29
  value, = *node
14
30
 
15
- if value > 10000 &&
16
- node.loc.expression.source.split('.').grep(/\d{6}/).any?
17
- add_offence(:convention, node.loc.expression, MSG)
31
+ if enough_digits?(value)
32
+ int = integer_part(node)
33
+ if int =~ /\d{4}/ || int =~ /_\d{1,2}_/
34
+ convention(node, :expression)
35
+ end
18
36
  end
19
37
  end
20
38
 
21
- alias_method :on_float, :on_int
39
+ def integer_part(node)
40
+ node.loc.expression.source.split('.').first
41
+ end
22
42
  end
23
43
  end
24
44
  end