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
@@ -0,0 +1,129 @@
1
+ # encoding: utf-8
2
+
3
+ module Rubocop
4
+ module Cop
5
+ module VariableInspector
6
+ # A VariableTable manages the lifetime of all scopes and local variables
7
+ # in a program.
8
+ # This holds scopes as stack structure, and provides a way to add local
9
+ # variables to current scope and find local variables by considering
10
+ # variable visibility of the current scope.
11
+ class VariableTable
12
+ def initialize(hook_receiver = nil)
13
+ @hook_receiver = hook_receiver
14
+ end
15
+
16
+ def invoke_hook(hook_name, *args)
17
+ @hook_receiver.send(hook_name, *args) if @hook_receiver
18
+ end
19
+
20
+ def scope_stack
21
+ @scope_stack ||= []
22
+ end
23
+
24
+ def push_scope(scope_node)
25
+ scope = Scope.new(scope_node)
26
+ invoke_hook(:before_entering_scope, scope)
27
+ scope_stack.push(scope)
28
+ invoke_hook(:after_entering_scope, scope)
29
+ scope
30
+ end
31
+
32
+ def pop_scope
33
+ scope = current_scope
34
+ invoke_hook(:before_leaving_scope, scope)
35
+ scope_stack.pop
36
+ invoke_hook(:after_leaving_scope, scope)
37
+ scope
38
+ end
39
+
40
+ def current_scope
41
+ scope_stack.last
42
+ end
43
+
44
+ def current_scope_level
45
+ scope_stack.count
46
+ end
47
+
48
+ def declare_variable(name, node)
49
+ variable = Variable.new(name, node, current_scope)
50
+ invoke_hook(:before_declaring_variable, variable)
51
+ current_scope.variables[variable.name] = variable
52
+ invoke_hook(:after_declaring_variable, variable)
53
+ variable
54
+ end
55
+
56
+ def assign_to_variable(name, node)
57
+ variable = find_variable(name)
58
+
59
+ unless variable
60
+ fail "Assigning to undeclared local variable \"#{name}\" " +
61
+ "at #{node.loc.expression}, #{node.inspect}"
62
+ end
63
+
64
+ variable.assign(node)
65
+ mark_variable_as_captured_by_block_if_so(variable)
66
+ end
67
+
68
+ def reference_variable(name, node)
69
+ variable = find_variable(name)
70
+
71
+ # In this code:
72
+ #
73
+ # foo = 1 unless foo
74
+ #
75
+ # (if
76
+ # (lvar :foo) nil
77
+ # (lvasgn :foo
78
+ # (int 1)))
79
+ #
80
+ # Parser knows whether the foo is a variable or method invocation.
81
+ # This means that if a :lvar node is shown in AST, the variable is
82
+ # assumed to be already declared, even if we haven't seen any :lvasgn
83
+ # or :arg node before the :lvar node.
84
+ #
85
+ # We don't invoke #declare_variable here otherwise
86
+ # Variable#declaration_node will be :lvar node, that is actually not.
87
+ # So just skip.
88
+ return unless variable
89
+
90
+ variable.reference!(node)
91
+ mark_variable_as_captured_by_block_if_so(variable)
92
+ end
93
+
94
+ def find_variable(name)
95
+ name = name.to_sym
96
+
97
+ scope_stack.reverse_each do |scope|
98
+ variable = scope.variables[name]
99
+ return variable if variable
100
+ # Only block scope allows referencing outer scope variables.
101
+ return nil unless scope.node.type == :block
102
+ end
103
+
104
+ nil
105
+ end
106
+
107
+ def variable_exist?(name)
108
+ !find_variable(name).nil?
109
+ end
110
+
111
+ def accessible_variables
112
+ scope_stack.reverse_each.reduce([]) do |variables, scope|
113
+ variables.concat(scope.variables.values)
114
+ break variables unless scope.node.type == :block
115
+ variables
116
+ end
117
+ end
118
+
119
+ private
120
+
121
+ def mark_variable_as_captured_by_block_if_so(variable)
122
+ return unless current_scope.node.type == :block
123
+ return if variable.scope == current_scope
124
+ variable.capture_with_block!
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
@@ -13,8 +13,8 @@ module Rubocop
13
13
  super
14
14
  @output_hash = {
15
15
  metadata: metadata_hash,
16
- files: [],
17
- summary: { offence_count: 0 }
16
+ files: [],
17
+ summary: { offence_count: 0 }
18
18
  }
19
19
  end
20
20
 
@@ -35,16 +35,16 @@ module Rubocop
35
35
  def metadata_hash
36
36
  {
37
37
  rubocop_version: Rubocop::Version::STRING,
38
- ruby_engine: RUBY_ENGINE,
39
- ruby_version: RUBY_VERSION,
38
+ ruby_engine: RUBY_ENGINE,
39
+ ruby_version: RUBY_VERSION,
40
40
  ruby_patchlevel: RUBY_PATCHLEVEL.to_s,
41
- ruby_platform: RUBY_PLATFORM
41
+ ruby_platform: RUBY_PLATFORM
42
42
  }
43
43
  end
44
44
 
45
45
  def hash_for_file(file, offences)
46
46
  {
47
- path: relative_path(file),
47
+ path: relative_path(file),
48
48
  offences: offences.map { |o| hash_for_offence(o) }
49
49
  }
50
50
  end
@@ -52,7 +52,7 @@ module Rubocop
52
52
  def hash_for_offence(offence)
53
53
  {
54
54
  severity: offence.severity,
55
- message: offence.message,
55
+ message: offence.message,
56
56
  cop_name: offence.cop_name,
57
57
  location: hash_for_location(offence)
58
58
  }
@@ -61,7 +61,7 @@ module Rubocop
61
61
  # TODO: Consider better solution for Offence#real_column.
62
62
  def hash_for_location(offence)
63
63
  {
64
- line: offence.line,
64
+ line: offence.line,
65
65
  column: offence.real_column
66
66
  }
67
67
  end
@@ -7,11 +7,11 @@ module Rubocop
7
7
  # appends the regular report data in the clang style format.
8
8
  class ProgressFormatter < ClangStyleFormatter
9
9
  COLOR_FOR_SEVERITY = {
10
- refactor: :yellow,
10
+ refactor: :yellow,
11
11
  convention: :yellow,
12
- warning: :magenta,
13
- error: :red,
14
- fatal: :red
12
+ warning: :magenta,
13
+ error: :red,
14
+ fatal: :red
15
15
  }
16
16
 
17
17
  def started(target_files)
@@ -17,11 +17,32 @@ module Rubocop
17
17
  end
18
18
 
19
19
  def lines
20
- @lines ||= @buffer.source.split($RS)
20
+ if @lines
21
+ @lines
22
+ else
23
+ init_lines
24
+ @lines
25
+ end
26
+ end
27
+
28
+ def raw_lines
29
+ if @raw_lines
30
+ @raw_lines
31
+ else
32
+ init_lines
33
+ @raw_lines
34
+ end
21
35
  end
22
36
 
23
37
  def [](*args)
24
38
  lines[*args]
25
39
  end
40
+
41
+ private
42
+
43
+ def init_lines
44
+ @raw_lines = @buffer.source.lines
45
+ @lines = @raw_lines.map(&:chomp)
46
+ end
26
47
  end
27
48
  end
@@ -3,7 +3,7 @@
3
3
  module Rubocop
4
4
  # This module holds the RuboCop version information.
5
5
  module Version
6
- STRING = '0.12.0'
6
+ STRING = '0.13.0'
7
7
 
8
8
  MSG = '%s (using Parser %s, running on %s %s %s)'
9
9
 
@@ -29,7 +29,7 @@ Gem::Specification.new do |s|
29
29
  s.add_runtime_dependency('rainbow', '>= 1.1.4')
30
30
  s.add_runtime_dependency('parser', '~> 2.0.0.pre6')
31
31
  s.add_runtime_dependency('backports', '~> 3.3.3')
32
- s.add_runtime_dependency('powerpack', '~> 0.0.3')
32
+ s.add_runtime_dependency('powerpack', '~> 0.0.6')
33
33
  s.add_development_dependency('rake', '~> 10.1')
34
34
  s.add_development_dependency('rspec', '~> 2.14')
35
35
  s.add_development_dependency('yard', '~> 0.8')
@@ -8,7 +8,7 @@ module Rubocop
8
8
  describe CLI, :isolated_environment do
9
9
  include FileHelper
10
10
 
11
- let(:cli) { CLI.new }
11
+ subject(:cli) { CLI.new }
12
12
 
13
13
  before(:each) do
14
14
  $stdout = StringIO.new
@@ -369,9 +369,6 @@ Usage: rubocop [options] [file1, file2, ...]
369
369
  "\ty",
370
370
  'end'])
371
371
  # IfUnlessModifier depends on the configuration of LineLength.
372
- # That configuration might have been set by other spec examples
373
- # so we reset it to emulate a start from scratch.
374
- Cop::Style::LineLength.config = nil
375
372
 
376
373
  expect(cli.run(['--format', 'simple',
377
374
  '--only', 'IfUnlessModifier', 'example.rb'])).to eq(1)
@@ -390,9 +387,6 @@ Usage: rubocop [options] [file1, file2, ...]
390
387
  "\ty",
391
388
  'end'])
392
389
  # IfUnlessModifier depends on the configuration of LineLength.
393
- # That configuration might have been set by other spec examples
394
- # so we reset it to emulate a start from scratch.
395
- Cop::Style::LineLength.config = nil
396
390
 
397
391
  expect(cli.run(['--format', 'simple', '--lint', 'example.rb'])).to eq(1)
398
392
  expect($stdout.string)
@@ -410,45 +404,51 @@ Usage: rubocop [options] [file1, file2, ...]
410
404
  expect($stderr.string).to eq("Unrecognized cop name: 123.\n")
411
405
  end
412
406
 
413
- context '--show-cops' do
407
+ describe '--show-cops option' do
414
408
  let(:cops) { Cop::Cop.all }
409
+
415
410
  let(:global_conf) do
416
411
  config_path = Rubocop::Config.configuration_file_for(Dir.pwd.to_s)
417
412
  Rubocop::Config.configuration_from_file(config_path)
418
413
  end
414
+
415
+ let(:stdout) { $stdout.string }
416
+
419
417
  before do
420
- cops.each do |cop_class|
421
- cop_class.config = global_conf.for_cop(cop_class.cop_name)
422
- end
418
+ expect { cli.run ['--show-cops'] }.to exit_with_code(0)
423
419
  end
424
420
 
425
- subject do
426
- expect { cli.run ['--show-cops'] }.to exit_with_code(0)
427
- @stdout = $stdout.string
421
+ # Extracts the first line out of the description
422
+ def short_description_of_cop(cop)
423
+ desc = full_description_of_cop(cop)
424
+ desc ? desc.lines.first.strip : ''
425
+ end
426
+
427
+ # Gets the full description of the cop or nil if no description is set.
428
+ def full_description_of_cop(cop)
429
+ cop_config = global_conf.for_cop(cop)
430
+ cop_config['Description']
428
431
  end
432
+
429
433
  it 'prints all available cops and their description' do
430
- subject
431
434
  cops.each do |cop|
432
- expect(@stdout).to include cop.cop_name
433
- expect(@stdout).to include cop.short_description
435
+ expect(stdout).to include cop.cop_name
436
+ expect(stdout).to include short_description_of_cop(cop)
434
437
  end
435
438
  end
436
439
 
437
440
  it 'prints all types' do
438
- subject
439
441
  cops
440
442
  .types
441
- .dup
442
- .map!(&:to_s)
443
- .map!(&:capitalize)
444
- .each { |type| expect(@stdout).to include(type) }
443
+ .map(&:to_s)
444
+ .map(&:capitalize)
445
+ .each { |type| expect(stdout).to include(type) }
445
446
  end
446
447
 
447
448
  it 'prints all cops in their right type listing' do
448
- subject
449
- lines = @stdout.lines
449
+ lines = stdout.lines
450
450
  lines.slice_before(/Type /).each do |slice|
451
- types = cops.types.dup.map!(&:to_s).map!(&:capitalize)
451
+ types = cops.types.map(&:to_s).map(&:capitalize)
452
452
  current = types.delete(slice.shift[/Type '(?<c>[^'']+)'/, 'c'])
453
453
  # all cops in their type listing
454
454
  cops.with_type(current).each do |cop|
@@ -465,14 +465,13 @@ Usage: rubocop [options] [file1, file2, ...]
465
465
  end
466
466
 
467
467
  it 'prints the current configuration' do
468
- subject
469
- out = @stdout.lines.to_a
468
+ out = stdout.lines.to_a
470
469
  cops.each do |cop|
471
470
  conf = global_conf[cop.cop_name].dup
472
471
  confstrt = out.find_index { |i| i.include?("- #{cop.cop_name}") } + 1
473
472
  c = out[confstrt, conf.keys.size].to_s
474
473
  conf.delete('Description')
475
- expect(c).to include(cop.short_description)
474
+ expect(c).to include(short_description_of_cop(cop))
476
475
  conf.each do |k, v|
477
476
  # ugly hack to get hash/array content tested
478
477
  if v.kind_of?(Hash) || v.kind_of?(Array)
@@ -480,7 +479,6 @@ Usage: rubocop [options] [file1, file2, ...]
480
479
  else
481
480
  expect(c).to include "#{k}: #{v}"
482
481
  end
483
-
484
482
  end
485
483
  end
486
484
  end
@@ -792,12 +790,16 @@ Usage: rubocop [options] [file1, file2, ...]
792
790
  it 'registers an offence for Parser warnings' do
793
791
  create_file('example.rb', [
794
792
  '# encoding: utf-8',
795
- 'puts *test'
793
+ 'puts *test',
794
+ 'if a then b else c end'
796
795
  ])
797
796
  expect(cli.run(['--format', 'emacs', 'example.rb'])).to eq(1)
798
797
  expect($stdout.string)
799
798
  .to eq(["#{abs('example.rb')}:2:6: W: " +
800
799
  "`*' interpreted as argument prefix",
800
+ "#{abs('example.rb')}:3:1: C: " +
801
+ 'Favor the ternary operator (?:) over if/then/else/end ' +
802
+ 'constructs.',
801
803
  ''].join("\n"))
802
804
  end
803
805
 
@@ -296,9 +296,8 @@ describe Rubocop::Config do
296
296
  end
297
297
 
298
298
  it 'raises validation error' do
299
- expect do
300
- configuration.validate
301
- end.to raise_error(Rubocop::Config::ValidationError) do |error|
299
+ e = Rubocop::Config::ValidationError
300
+ expect { configuration.validate }.to raise_error(e) do |error|
302
301
  expect(error.message).to start_with('unrecognized cop LyneLenth')
303
302
  end
304
303
  end
@@ -314,9 +313,8 @@ describe Rubocop::Config do
314
313
  end
315
314
 
316
315
  it 'raises validation error' do
317
- expect do
318
- configuration.validate
319
- end.to raise_error(Rubocop::Config::ValidationError) do |error|
316
+ e = Rubocop::Config::ValidationError
317
+ expect { configuration.validate }.to raise_error(e) do |error|
320
318
  expect(error.message).to
321
319
  start_with('unrecognized parameter LineLength:Min')
322
320
  end
@@ -7,8 +7,11 @@ module Rubocop
7
7
  module Cop
8
8
  describe Commissioner do
9
9
  describe '#investigate' do
10
+ let(:cop) { double(Cop, offences: []).as_null_object }
11
+
10
12
  it 'returns all offences found by the cops' do
11
- cop = double(Cop, offences: [1])
13
+ cop.stub(:offences).and_return([1])
14
+
12
15
  commissioner = Commissioner.new([cop])
13
16
  source = []
14
17
  processed_source = parse_source(source)
@@ -17,7 +20,6 @@ module Rubocop
17
20
  end
18
21
 
19
22
  it 'traverses the AST and invoke cops specific callbacks' do
20
- cop = double(Cop, offences: [])
21
23
  cop.should_receive(:on_def)
22
24
 
23
25
  commissioner = Commissioner.new([cop])
@@ -30,7 +32,6 @@ module Rubocop
30
32
  it 'passes the input params to all cops that implement their own #investigate method' do
31
33
  source = []
32
34
  processed_source = parse_source(source)
33
- cop = double(Cop, offences: [])
34
35
  cop.should_receive(:investigate).with(processed_source)
35
36
 
36
37
  commissioner = Commissioner.new([cop])
@@ -39,7 +40,6 @@ module Rubocop
39
40
  end
40
41
 
41
42
  it 'stores all errors raised by the cops' do
42
- cop = double(Cop, offences: [])
43
43
  cop.stub(:on_def) { raise RuntimeError }
44
44
 
45
45
  commissioner = Commissioner.new([cop])
@@ -54,7 +54,6 @@ module Rubocop
54
54
 
55
55
  context 'when passed :raise_error option' do
56
56
  it 're-raises the exception received while processing' do
57
- cop = double(Cop, offences: [])
58
57
  cop.stub(:on_def) { raise RuntimeError }
59
58
 
60
59
  commissioner = Commissioner.new([cop], raise_error: true)