sabat-rubocop 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. data/.gitignore +50 -0
  2. data/.rspec +1 -0
  3. data/.rubocop.yml +7 -0
  4. data/.travis.yml +7 -0
  5. data/.yardopts +2 -0
  6. data/CHANGELOG.md +268 -0
  7. data/CONTRIBUTING.md +16 -0
  8. data/Gemfile +7 -0
  9. data/LICENSE.txt +20 -0
  10. data/README.md +324 -0
  11. data/Rakefile +29 -0
  12. data/bin/rubocop +22 -0
  13. data/config/default.yml +58 -0
  14. data/config/disabled.yml +5 -0
  15. data/config/enabled.yml +403 -0
  16. data/lib/rubocop.rb +116 -0
  17. data/lib/rubocop/cli.rb +407 -0
  18. data/lib/rubocop/config.rb +250 -0
  19. data/lib/rubocop/config_store.rb +39 -0
  20. data/lib/rubocop/cop/cop.rb +138 -0
  21. data/lib/rubocop/cop/lint/assignment_in_condition.rb +54 -0
  22. data/lib/rubocop/cop/lint/end_alignment.rb +189 -0
  23. data/lib/rubocop/cop/lint/end_in_method.rb +30 -0
  24. data/lib/rubocop/cop/lint/ensure_return.rb +22 -0
  25. data/lib/rubocop/cop/lint/eval.rb +22 -0
  26. data/lib/rubocop/cop/lint/handle_exceptions.rb +20 -0
  27. data/lib/rubocop/cop/lint/literal_in_condition.rb +81 -0
  28. data/lib/rubocop/cop/lint/loop.rb +29 -0
  29. data/lib/rubocop/cop/lint/rescue_exception.rb +29 -0
  30. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +34 -0
  31. data/lib/rubocop/cop/lint/unreachable_code.rb +35 -0
  32. data/lib/rubocop/cop/lint/unused_local_variable.rb +32 -0
  33. data/lib/rubocop/cop/lint/void.rb +58 -0
  34. data/lib/rubocop/cop/offence.rb +136 -0
  35. data/lib/rubocop/cop/rails/validation.rb +30 -0
  36. data/lib/rubocop/cop/style/access_control.rb +58 -0
  37. data/lib/rubocop/cop/style/alias.rb +28 -0
  38. data/lib/rubocop/cop/style/align_parameters.rb +39 -0
  39. data/lib/rubocop/cop/style/and_or.rb +45 -0
  40. data/lib/rubocop/cop/style/ascii_comments.rb +21 -0
  41. data/lib/rubocop/cop/style/ascii_identifiers.rb +22 -0
  42. data/lib/rubocop/cop/style/attr.rb +20 -0
  43. data/lib/rubocop/cop/style/avoid_class_vars.rb +20 -0
  44. data/lib/rubocop/cop/style/avoid_for.rb +18 -0
  45. data/lib/rubocop/cop/style/avoid_global_vars.rb +65 -0
  46. data/lib/rubocop/cop/style/avoid_perl_backrefs.rb +21 -0
  47. data/lib/rubocop/cop/style/avoid_perlisms.rb +50 -0
  48. data/lib/rubocop/cop/style/begin_block.rb +18 -0
  49. data/lib/rubocop/cop/style/block_comments.rb +20 -0
  50. data/lib/rubocop/cop/style/block_nesting.rb +47 -0
  51. data/lib/rubocop/cop/style/blocks.rb +27 -0
  52. data/lib/rubocop/cop/style/case_equality.rb +22 -0
  53. data/lib/rubocop/cop/style/case_indentation.rb +28 -0
  54. data/lib/rubocop/cop/style/character_literal.rb +37 -0
  55. data/lib/rubocop/cop/style/class_and_module_camel_case.rb +33 -0
  56. data/lib/rubocop/cop/style/class_methods.rb +22 -0
  57. data/lib/rubocop/cop/style/collection_methods.rb +56 -0
  58. data/lib/rubocop/cop/style/colon_method_call.rb +29 -0
  59. data/lib/rubocop/cop/style/constant_name.rb +31 -0
  60. data/lib/rubocop/cop/style/def_parentheses.rb +70 -0
  61. data/lib/rubocop/cop/style/documentation.rb +58 -0
  62. data/lib/rubocop/cop/style/dot_position.rb +25 -0
  63. data/lib/rubocop/cop/style/empty_line_between_defs.rb +26 -0
  64. data/lib/rubocop/cop/style/empty_lines.rb +40 -0
  65. data/lib/rubocop/cop/style/empty_literal.rb +53 -0
  66. data/lib/rubocop/cop/style/encoding.rb +29 -0
  67. data/lib/rubocop/cop/style/end_block.rb +18 -0
  68. data/lib/rubocop/cop/style/end_of_line.rb +23 -0
  69. data/lib/rubocop/cop/style/favor_join.rb +29 -0
  70. data/lib/rubocop/cop/style/favor_modifier.rb +118 -0
  71. data/lib/rubocop/cop/style/favor_sprintf.rb +28 -0
  72. data/lib/rubocop/cop/style/favor_unless_over_negated_if.rb +54 -0
  73. data/lib/rubocop/cop/style/hash_syntax.rb +47 -0
  74. data/lib/rubocop/cop/style/if_then_else.rb +29 -0
  75. data/lib/rubocop/cop/style/if_with_semicolon.rb +20 -0
  76. data/lib/rubocop/cop/style/lambda.rb +47 -0
  77. data/lib/rubocop/cop/style/leading_comment_space.rb +25 -0
  78. data/lib/rubocop/cop/style/line_continuation.rb +26 -0
  79. data/lib/rubocop/cop/style/line_length.rb +30 -0
  80. data/lib/rubocop/cop/style/method_and_variable_snake_case.rb +61 -0
  81. data/lib/rubocop/cop/style/method_call_parentheses.rb +22 -0
  82. data/lib/rubocop/cop/style/method_length.rb +57 -0
  83. data/lib/rubocop/cop/style/multiline_if_then.rb +47 -0
  84. data/lib/rubocop/cop/style/not.rb +24 -0
  85. data/lib/rubocop/cop/style/numeric_literals.rb +25 -0
  86. data/lib/rubocop/cop/style/one_line_conditional.rb +20 -0
  87. data/lib/rubocop/cop/style/op_method.rb +29 -0
  88. data/lib/rubocop/cop/style/parameter_lists.rb +42 -0
  89. data/lib/rubocop/cop/style/parentheses_around_condition.rb +42 -0
  90. data/lib/rubocop/cop/style/proc.rb +30 -0
  91. data/lib/rubocop/cop/style/reduce_arguments.rb +34 -0
  92. data/lib/rubocop/cop/style/regexp_literal.rb +39 -0
  93. data/lib/rubocop/cop/style/rescue_modifier.rb +55 -0
  94. data/lib/rubocop/cop/style/semicolon.rb +51 -0
  95. data/lib/rubocop/cop/style/single_line_methods.rb +48 -0
  96. data/lib/rubocop/cop/style/space_after_comma_etc.rb +69 -0
  97. data/lib/rubocop/cop/style/space_after_control_keyword.rb +32 -0
  98. data/lib/rubocop/cop/style/string_literals.rb +36 -0
  99. data/lib/rubocop/cop/style/surrounding_space.rb +314 -0
  100. data/lib/rubocop/cop/style/symbol_array.rb +31 -0
  101. data/lib/rubocop/cop/style/symbol_name.rb +27 -0
  102. data/lib/rubocop/cop/style/tab.rb +25 -0
  103. data/lib/rubocop/cop/style/ternary_operator.rb +49 -0
  104. data/lib/rubocop/cop/style/trailing_whitespace.rb +24 -0
  105. data/lib/rubocop/cop/style/trivial_accessors.rb +32 -0
  106. data/lib/rubocop/cop/style/unless_else.rb +26 -0
  107. data/lib/rubocop/cop/style/variable_interpolation.rb +32 -0
  108. data/lib/rubocop/cop/style/when_then.rb +25 -0
  109. data/lib/rubocop/cop/style/while_until_do.rb +45 -0
  110. data/lib/rubocop/cop/style/word_array.rb +44 -0
  111. data/lib/rubocop/cop/util.rb +27 -0
  112. data/lib/rubocop/cop/variable_inspector.rb +280 -0
  113. data/lib/rubocop/formatter/base_formatter.rb +119 -0
  114. data/lib/rubocop/formatter/clang_style_formatter.rb +21 -0
  115. data/lib/rubocop/formatter/emacs_style_formatter.rb +17 -0
  116. data/lib/rubocop/formatter/formatter_set.rb +77 -0
  117. data/lib/rubocop/formatter/json_formatter.rb +76 -0
  118. data/lib/rubocop/formatter/progress_formatter.rb +63 -0
  119. data/lib/rubocop/formatter/simple_text_formatter.rb +62 -0
  120. data/lib/rubocop/version.rb +21 -0
  121. data/rubocop.gemspec +36 -0
  122. data/spec/.rubocop.yml +5 -0
  123. data/spec/project_spec.rb +24 -0
  124. data/spec/rubocop/cli_spec.rb +906 -0
  125. data/spec/rubocop/config_spec.rb +470 -0
  126. data/spec/rubocop/config_store_spec.rb +66 -0
  127. data/spec/rubocop/cops/cop_spec.rb +38 -0
  128. data/spec/rubocop/cops/lint/assignment_in_condition_spec.rb +111 -0
  129. data/spec/rubocop/cops/lint/end_alignment_spec.rb +333 -0
  130. data/spec/rubocop/cops/lint/end_in_method_spec.rb +35 -0
  131. data/spec/rubocop/cops/lint/ensure_return_spec.rb +37 -0
  132. data/spec/rubocop/cops/lint/eval_spec.rb +41 -0
  133. data/spec/rubocop/cops/lint/handle_exceptions_spec.rb +36 -0
  134. data/spec/rubocop/cops/lint/literal_in_condition_spec.rb +42 -0
  135. data/spec/rubocop/cops/lint/loop_spec.rb +33 -0
  136. data/spec/rubocop/cops/lint/rescue_exception_spec.rb +127 -0
  137. data/spec/rubocop/cops/lint/shadowing_outer_local_variable_spec.rb +243 -0
  138. data/spec/rubocop/cops/lint/unreachable_code_spec.rb +69 -0
  139. data/spec/rubocop/cops/lint/unused_local_variable_spec.rb +497 -0
  140. data/spec/rubocop/cops/lint/void_spec.rb +63 -0
  141. data/spec/rubocop/cops/offence_spec.rb +133 -0
  142. data/spec/rubocop/cops/rails/validation_spec.rb +27 -0
  143. data/spec/rubocop/cops/style/access_control_spec.rb +142 -0
  144. data/spec/rubocop/cops/style/alias_spec.rb +47 -0
  145. data/spec/rubocop/cops/style/align_parameters_spec.rb +199 -0
  146. data/spec/rubocop/cops/style/and_or_spec.rb +39 -0
  147. data/spec/rubocop/cops/style/ascii_comments_spec.rb +28 -0
  148. data/spec/rubocop/cops/style/ascii_identifiers_spec.rb +28 -0
  149. data/spec/rubocop/cops/style/attr_spec.rb +20 -0
  150. data/spec/rubocop/cops/style/avoid_class_vars_spec.rb +27 -0
  151. data/spec/rubocop/cops/style/avoid_for_spec.rb +37 -0
  152. data/spec/rubocop/cops/style/avoid_global_vars_spec.rb +34 -0
  153. data/spec/rubocop/cops/style/avoid_perl_backrefs_spec.rb +20 -0
  154. data/spec/rubocop/cops/style/avoid_perlisms_spec.rb +47 -0
  155. data/spec/rubocop/cops/style/begin_block_spec.rb +19 -0
  156. data/spec/rubocop/cops/style/block_comments_spec.rb +27 -0
  157. data/spec/rubocop/cops/style/block_nesting_spec.rb +159 -0
  158. data/spec/rubocop/cops/style/blocks_spec.rb +35 -0
  159. data/spec/rubocop/cops/style/case_equality_spec.rb +18 -0
  160. data/spec/rubocop/cops/style/case_indentation_spec.rb +88 -0
  161. data/spec/rubocop/cops/style/character_literal_spec.rb +28 -0
  162. data/spec/rubocop/cops/style/class_and_module_camel_case_spec.rb +46 -0
  163. data/spec/rubocop/cops/style/class_methods_spec.rb +51 -0
  164. data/spec/rubocop/cops/style/collection_methods_spec.rb +41 -0
  165. data/spec/rubocop/cops/style/colon_method_call_spec.rb +55 -0
  166. data/spec/rubocop/cops/style/constant_name_spec.rb +56 -0
  167. data/spec/rubocop/cops/style/def_with_parentheses_spec.rb +40 -0
  168. data/spec/rubocop/cops/style/def_without_parentheses_spec.rb +34 -0
  169. data/spec/rubocop/cops/style/documentation_spec.rb +79 -0
  170. data/spec/rubocop/cops/style/dot_position_spec.rb +30 -0
  171. data/spec/rubocop/cops/style/empty_line_between_defs_spec.rb +85 -0
  172. data/spec/rubocop/cops/style/empty_lines_spec.rb +40 -0
  173. data/spec/rubocop/cops/style/empty_literal_spec.rb +91 -0
  174. data/spec/rubocop/cops/style/encoding_spec.rb +49 -0
  175. data/spec/rubocop/cops/style/end_block_spec.rb +19 -0
  176. data/spec/rubocop/cops/style/end_of_line_spec.rb +25 -0
  177. data/spec/rubocop/cops/style/favor_join_spec.rb +37 -0
  178. data/spec/rubocop/cops/style/favor_modifier_spec.rb +160 -0
  179. data/spec/rubocop/cops/style/favor_sprintf_spec.rb +53 -0
  180. data/spec/rubocop/cops/style/favor_unless_over_negated_if_spec.rb +64 -0
  181. data/spec/rubocop/cops/style/favor_until_over_negated_while_spec.rb +47 -0
  182. data/spec/rubocop/cops/style/hash_syntax_spec.rb +51 -0
  183. data/spec/rubocop/cops/style/if_with_semicolon_spec.rb +25 -0
  184. data/spec/rubocop/cops/style/lambda_spec.rb +45 -0
  185. data/spec/rubocop/cops/style/leading_comment_space_spec.rb +65 -0
  186. data/spec/rubocop/cops/style/line_continuation_spec.rb +26 -0
  187. data/spec/rubocop/cops/style/line_length_spec.rb +25 -0
  188. data/spec/rubocop/cops/style/method_and_variable_snake_case_spec.rb +95 -0
  189. data/spec/rubocop/cops/style/method_call_parentheses_spec.rb +25 -0
  190. data/spec/rubocop/cops/style/method_length_spec.rb +151 -0
  191. data/spec/rubocop/cops/style/multiline_if_then_spec.rb +97 -0
  192. data/spec/rubocop/cops/style/not_spec.rb +28 -0
  193. data/spec/rubocop/cops/style/numeric_literals_spec.rb +51 -0
  194. data/spec/rubocop/cops/style/one_line_conditional_spec.rb +18 -0
  195. data/spec/rubocop/cops/style/op_method_spec.rb +80 -0
  196. data/spec/rubocop/cops/style/parameter_lists_spec.rb +49 -0
  197. data/spec/rubocop/cops/style/parentheses_around_condition_spec.rb +59 -0
  198. data/spec/rubocop/cops/style/proc_spec.rb +28 -0
  199. data/spec/rubocop/cops/style/reduce_arguments_spec.rb +59 -0
  200. data/spec/rubocop/cops/style/regexp_literal_spec.rb +83 -0
  201. data/spec/rubocop/cops/style/rescue_modifier_spec.rb +122 -0
  202. data/spec/rubocop/cops/style/semicolon_spec.rb +95 -0
  203. data/spec/rubocop/cops/style/single_line_methods_spec.rb +54 -0
  204. data/spec/rubocop/cops/style/space_after_colon_spec.rb +29 -0
  205. data/spec/rubocop/cops/style/space_after_comma_spec.rb +31 -0
  206. data/spec/rubocop/cops/style/space_after_control_keyword_spec.rb +69 -0
  207. data/spec/rubocop/cops/style/space_after_semicolon_spec.rb +24 -0
  208. data/spec/rubocop/cops/style/space_around_braces_spec.rb +49 -0
  209. data/spec/rubocop/cops/style/space_around_equals_in_default_parameter_spec.rb +34 -0
  210. data/spec/rubocop/cops/style/space_around_operators_spec.rb +216 -0
  211. data/spec/rubocop/cops/style/space_inside_brackets_spec.rb +51 -0
  212. data/spec/rubocop/cops/style/space_inside_hash_literal_braces_spec.rb +99 -0
  213. data/spec/rubocop/cops/style/space_inside_parens_spec.rb +33 -0
  214. data/spec/rubocop/cops/style/string_literals_spec.rb +62 -0
  215. data/spec/rubocop/cops/style/symbol_array_spec.rb +45 -0
  216. data/spec/rubocop/cops/style/symbol_name_spec.rb +122 -0
  217. data/spec/rubocop/cops/style/tab_spec.rb +23 -0
  218. data/spec/rubocop/cops/style/ternary_operator_spec.rb +42 -0
  219. data/spec/rubocop/cops/style/trailing_whitespace_spec.rb +29 -0
  220. data/spec/rubocop/cops/style/trivial_accessors_spec.rb +338 -0
  221. data/spec/rubocop/cops/style/unless_else_spec.rb +31 -0
  222. data/spec/rubocop/cops/style/variable_interpolation_spec.rb +53 -0
  223. data/spec/rubocop/cops/style/when_then_spec.rb +40 -0
  224. data/spec/rubocop/cops/style/while_until_do_spec.rb +47 -0
  225. data/spec/rubocop/cops/style/word_array_spec.rb +61 -0
  226. data/spec/rubocop/cops/variable_inspector_spec.rb +374 -0
  227. data/spec/rubocop/formatter/base_formatter_spec.rb +190 -0
  228. data/spec/rubocop/formatter/clang_style_formatter_spec.rb +70 -0
  229. data/spec/rubocop/formatter/emacs_style_formatter_spec.rb +32 -0
  230. data/spec/rubocop/formatter/formatter_set_spec.rb +132 -0
  231. data/spec/rubocop/formatter/json_formatter_spec.rb +142 -0
  232. data/spec/rubocop/formatter/progress_formatter_spec.rb +196 -0
  233. data/spec/rubocop/formatter/simple_text_formatter_spec.rb +74 -0
  234. data/spec/spec_helper.rb +92 -0
  235. data/spec/support/file_helper.rb +21 -0
  236. data/spec/support/isolated_environment.rb +27 -0
  237. data/spec/support/mri_syntax_checker.rb +69 -0
  238. data/spec/support/shared_examples.rb +33 -0
  239. metadata +517 -0
@@ -0,0 +1,69 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module Rubocop
6
+ module Cop
7
+ module Lint
8
+ describe UnreachableCode do
9
+ let(:uc) { UnreachableCode.new }
10
+
11
+ UnreachableCode::NODE_TYPES.each do |t|
12
+ it "registers an offence for #{t} before other statements" do
13
+ inspect_source(uc,
14
+ ['foo = 5',
15
+ "#{t}",
16
+ 'bar'
17
+ ])
18
+ expect(uc.offences.size).to eq(1)
19
+ end
20
+
21
+ it "accepts code with conditional #{t}" do
22
+ inspect_source(uc,
23
+ ['foo = 5',
24
+ "#{t} if test",
25
+ 'bar'
26
+ ])
27
+ expect(uc.offences).to be_empty
28
+ end
29
+
30
+ it "accepts #{t} as the final expression" do
31
+ inspect_source(uc,
32
+ ['foo = 5',
33
+ "#{t} if test"
34
+ ])
35
+ expect(uc.offences).to be_empty
36
+ end
37
+ end
38
+
39
+ UnreachableCode::FLOW_COMMANDS.each do |t|
40
+ it "registers an offence for #{t} before other statements" do
41
+ inspect_source(uc,
42
+ ['foo = 5',
43
+ "#{t} something",
44
+ 'bar'
45
+ ])
46
+ expect(uc.offences.size).to eq(1)
47
+ end
48
+
49
+ it "accepts code with conditional #{t}" do
50
+ inspect_source(uc,
51
+ ['foo = 5',
52
+ "#{t} something if test",
53
+ 'bar'
54
+ ])
55
+ expect(uc.offences).to be_empty
56
+ end
57
+
58
+ it "accepts #{t} as the final expression" do
59
+ inspect_source(uc,
60
+ ['foo = 5',
61
+ "#{t} something if test"
62
+ ])
63
+ expect(uc.offences).to be_empty
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,497 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module Rubocop
6
+ module Cop
7
+ module Lint
8
+ describe UnusedLocalVariable do
9
+ subject(:cop) { UnusedLocalVariable.new }
10
+
11
+ context 'when a variable is assigned and unreferenced in a method' do
12
+ let(:source) do
13
+ [
14
+ 'class SomeClass',
15
+ ' foo = 1',
16
+ ' puts foo',
17
+ ' def some_method',
18
+ ' foo = 2',
19
+ ' bar = 3',
20
+ ' puts bar',
21
+ ' end',
22
+ 'end'
23
+ ]
24
+ end
25
+
26
+ it 'registers an offence' do
27
+ inspect_source(cop, source)
28
+ expect(cop.offences).to have(1).item
29
+ expect(cop.offences.first.message)
30
+ .to include('unused variable - foo')
31
+ expect(cop.offences.first.line).to eq(5)
32
+ end
33
+
34
+ include_examples 'mimics MRI 2.0'
35
+ end
36
+
37
+ context 'when a variable is assigned and unreferenced ' +
38
+ 'in a singleton method defined with self keyword' do
39
+ let(:source) do
40
+ [
41
+ 'class SomeClass',
42
+ ' foo = 1',
43
+ ' puts foo',
44
+ ' def self.some_method',
45
+ ' foo = 2',
46
+ ' bar = 3',
47
+ ' puts bar',
48
+ ' end',
49
+ 'end'
50
+ ]
51
+ end
52
+
53
+ it 'registers an offence' do
54
+ inspect_source(cop, source)
55
+ expect(cop.offences).to have(1).item
56
+ expect(cop.offences.first.message)
57
+ .to include('unused variable - foo')
58
+ expect(cop.offences.first.line).to eq(5)
59
+ end
60
+
61
+ include_examples 'mimics MRI 2.0'
62
+ end
63
+
64
+ context 'when a variable is assigned and unreferenced ' +
65
+ 'in a singleton method defined with variable name' do
66
+ let(:source) do
67
+ [
68
+ '1.times do',
69
+ ' foo = 1',
70
+ ' puts foo',
71
+ ' instance = Object.new',
72
+ ' def instance.some_method',
73
+ ' foo = 2',
74
+ ' bar = 3',
75
+ ' puts bar',
76
+ ' end',
77
+ 'end'
78
+ ]
79
+ end
80
+
81
+ it 'registers an offence' do
82
+ inspect_source(cop, source)
83
+ expect(cop.offences).to have(1).item
84
+ expect(cop.offences.first.message)
85
+ .to include('unused variable - foo')
86
+ expect(cop.offences.first.line).to eq(6)
87
+ end
88
+
89
+ include_examples 'mimics MRI 2.0'
90
+ end
91
+
92
+ context 'when a variable is assigned and unreferenced in a class' do
93
+ let(:source) do
94
+ [
95
+ '1.times do',
96
+ ' foo = 1',
97
+ ' puts foo',
98
+ ' class SomeClass',
99
+ ' foo = 2',
100
+ ' bar = 3',
101
+ ' puts bar',
102
+ ' end',
103
+ 'end'
104
+ ]
105
+ end
106
+
107
+ it 'registers an offence' do
108
+ inspect_source(cop, source)
109
+ expect(cop.offences).to have(1).item
110
+ expect(cop.offences.first.message)
111
+ .to include('unused variable - foo')
112
+ expect(cop.offences.first.line).to eq(5)
113
+ end
114
+
115
+ include_examples 'mimics MRI 2.0'
116
+ end
117
+
118
+ context 'when a variable is assigned and unreferenced ' +
119
+ 'in a singleton class' do
120
+ let(:source) do
121
+ [
122
+ '1.times do',
123
+ ' foo = 1',
124
+ ' puts foo',
125
+ ' instance = Object.new',
126
+ ' class << instance',
127
+ ' foo = 2',
128
+ ' bar = 3',
129
+ ' puts bar',
130
+ ' end',
131
+ 'end'
132
+ ]
133
+ end
134
+
135
+ it 'registers an offence' do
136
+ inspect_source(cop, source)
137
+ expect(cop.offences).to have(1).item
138
+ expect(cop.offences.first.message)
139
+ .to include('unused variable - foo')
140
+ expect(cop.offences.first.line).to eq(6)
141
+ end
142
+
143
+ include_examples 'mimics MRI 2.0'
144
+ end
145
+
146
+ context 'when a variable is assigned and unreferenced in a module' do
147
+ let(:source) do
148
+ [
149
+ '1.times do',
150
+ ' foo = 1',
151
+ ' puts foo',
152
+ ' module SomeModule',
153
+ ' foo = 2',
154
+ ' bar = 3',
155
+ ' puts bar',
156
+ ' end',
157
+ 'end'
158
+ ]
159
+ end
160
+
161
+ it 'registers an offence' do
162
+ inspect_source(cop, source)
163
+ expect(cop.offences).to have(1).item
164
+ expect(cop.offences.first.message)
165
+ .to include('unused variable - foo')
166
+ expect(cop.offences.first.line).to eq(5)
167
+ end
168
+
169
+ include_examples 'mimics MRI 2.0'
170
+ end
171
+
172
+ context 'when a variable is assigned and unreferenced in top level' do
173
+ let(:source) do
174
+ [
175
+ 'foo = 1',
176
+ 'bar = 2',
177
+ 'puts bar'
178
+ ]
179
+ end
180
+
181
+ it 'registers an offence' do
182
+ inspect_source(cop, source)
183
+ expect(cop.offences).to have(1).item
184
+ expect(cop.offences.first.message)
185
+ .to include('unused variable - foo')
186
+ expect(cop.offences.first.line).to eq(1)
187
+ end
188
+
189
+ include_examples 'mimics MRI 2.0'
190
+ end
191
+
192
+ context 'when a variable is assigned multiple times ' +
193
+ 'but unreferenced' do
194
+ let(:source) do
195
+ [
196
+ 'def some_method',
197
+ ' foo = 1',
198
+ ' bar = 2',
199
+ ' foo = 3',
200
+ ' puts bar',
201
+ 'end'
202
+ ]
203
+ end
204
+
205
+ include_examples 'accepts'
206
+ include_examples 'mimics MRI 2.0'
207
+ end
208
+
209
+ context 'when an unreferenced variable is reassigned in a block' do
210
+ let(:source) do
211
+ [
212
+ 'def some_method',
213
+ ' foo = 1',
214
+ ' 1.times do',
215
+ ' foo = 2',
216
+ ' end',
217
+ 'end'
218
+ ]
219
+ end
220
+
221
+ include_examples 'accepts'
222
+ include_examples 'mimics MRI 2.0'
223
+ end
224
+
225
+ context 'when a referenced variable in reassigned in a block' do
226
+ let(:source) do
227
+ [
228
+ 'def some_method',
229
+ ' foo = 1',
230
+ ' puts foo',
231
+ ' 1.times do',
232
+ ' foo = 2',
233
+ ' end',
234
+ 'end'
235
+ ]
236
+ end
237
+
238
+ include_examples 'accepts'
239
+ include_examples 'mimics MRI 2.0'
240
+ end
241
+
242
+ context 'when a block local variable is declared but not assigned' do
243
+ let(:source) do
244
+ [
245
+ '1.times do |i; foo|',
246
+ 'end'
247
+ ]
248
+ end
249
+
250
+ it 'registers an offence' do
251
+ inspect_source(cop, source)
252
+ expect(cop.offences).to have(1).item
253
+ expect(cop.offences.first.message)
254
+ .to include('unused variable - foo')
255
+ expect(cop.offences.first.line).to eq(1)
256
+ end
257
+
258
+ include_examples 'mimics MRI 2.0'
259
+ end
260
+
261
+ context 'when a block local variable is assigned and unreferenced' do
262
+ let(:source) do
263
+ [
264
+ '1.times do |i; foo|',
265
+ ' foo = 2',
266
+ 'end'
267
+ ]
268
+ end
269
+
270
+ include_examples 'accepts'
271
+ include_examples 'mimics MRI 2.0'
272
+ end
273
+
274
+ context 'when a variable is assigned in begin ' +
275
+ 'and referenced outside' do
276
+ let(:source) do
277
+ [
278
+ 'def some_method',
279
+ ' begin',
280
+ ' foo = 1',
281
+ ' end',
282
+ ' puts foo',
283
+ 'end'
284
+ ]
285
+ end
286
+
287
+ include_examples 'accepts'
288
+ include_examples 'mimics MRI 2.0'
289
+ end
290
+
291
+ context 'when a variable is shadowed by a block argument ' +
292
+ 'and unreferenced' do
293
+ let(:source) do
294
+ [
295
+ 'def some_method',
296
+ ' foo = 1',
297
+ ' 1.times do |foo|',
298
+ ' puts foo',
299
+ ' end',
300
+ 'end'
301
+ ]
302
+ end
303
+
304
+ it 'registers an offence' do
305
+ inspect_source(cop, source)
306
+ expect(cop.offences).to have(1).item
307
+ expect(cop.offences.first.message)
308
+ .to include('unused variable - foo')
309
+ expect(cop.offences.first.line).to eq(2)
310
+ end
311
+
312
+ include_examples 'mimics MRI 2.0', 'unused variable'
313
+ end
314
+
315
+ context 'when a variable is not used and the name starts with _' do
316
+ let(:source) do
317
+ [
318
+ 'def some_method',
319
+ ' _foo = 1',
320
+ ' bar = 2',
321
+ ' puts bar',
322
+ 'end'
323
+ ]
324
+ end
325
+
326
+ include_examples 'accepts'
327
+ include_examples 'mimics MRI 2.0'
328
+ end
329
+
330
+ context 'when a method argument is not used' do
331
+ let(:source) do
332
+ [
333
+ 'def some_method(arg)',
334
+ 'end'
335
+ ]
336
+ end
337
+
338
+ include_examples 'accepts'
339
+ include_examples 'mimics MRI 2.0'
340
+ end
341
+
342
+ context 'when an optional method argument is not used' do
343
+ let(:source) do
344
+ [
345
+ 'def some_method(arg = nil)',
346
+ 'end'
347
+ ]
348
+ end
349
+
350
+ include_examples 'accepts'
351
+ include_examples 'mimics MRI 2.0'
352
+ end
353
+
354
+ context 'when a block method argument is not used' do
355
+ let(:source) do
356
+ [
357
+ 'def some_method(&block)',
358
+ 'end'
359
+ ]
360
+ end
361
+
362
+ include_examples 'accepts'
363
+ include_examples 'mimics MRI 2.0'
364
+ end
365
+
366
+ context 'when a splat method argument is not used' do
367
+ let(:source) do
368
+ [
369
+ 'def some_method(*args)',
370
+ 'end'
371
+ ]
372
+ end
373
+
374
+ include_examples 'accepts'
375
+ include_examples 'mimics MRI 2.0'
376
+ end
377
+
378
+ context 'when a optional keyword method argument is not used' do
379
+ let(:source) do
380
+ [
381
+ 'def some_method(name: value)',
382
+ 'end'
383
+ ]
384
+ end
385
+
386
+ include_examples 'accepts'
387
+ include_examples 'mimics MRI 2.0'
388
+ end
389
+
390
+ context 'when a keyword splat method argument is used' do
391
+ let(:source) do
392
+ [
393
+ 'def some_method(name: value, **rest_keywords)',
394
+ ' p rest_keywords',
395
+ 'end'
396
+ ]
397
+ end
398
+
399
+ include_examples 'accepts'
400
+ include_examples 'mimics MRI 2.0'
401
+ end
402
+
403
+ context 'when a keyword splat method argument is not used' do
404
+ let(:source) do
405
+ [
406
+ 'def some_method(name: value, **rest_keywords)',
407
+ 'end'
408
+ ]
409
+ end
410
+
411
+ include_examples 'accepts'
412
+ include_examples 'mimics MRI 2.0'
413
+ end
414
+
415
+ context 'when a block argument is not used' do
416
+ let(:source) do
417
+ [
418
+ '1.times do |i|',
419
+ 'end'
420
+ ]
421
+ end
422
+
423
+ include_examples 'accepts'
424
+ include_examples 'mimics MRI 2.0'
425
+ end
426
+
427
+ context 'when there is only one AST node and it is unused variable' do
428
+ let(:source) do
429
+ [
430
+ 'foo = 1'
431
+ ]
432
+ end
433
+
434
+ it 'registers an offence' do
435
+ inspect_source(cop, source)
436
+ expect(cop.offences).to have(1).item
437
+ expect(cop.offences.first.message)
438
+ .to include('unused variable - foo')
439
+ expect(cop.offences.first.line).to eq(1)
440
+ end
441
+
442
+ include_examples 'mimics MRI 2.0'
443
+ end
444
+
445
+ context 'when a variable is assigned ' +
446
+ 'while being passed to a method taking block' do
447
+
448
+ context 'and the variable is used' do
449
+ let(:source) do
450
+ [
451
+ 'some_method(foo = 1) do',
452
+ 'end',
453
+ 'puts foo'
454
+ ]
455
+ end
456
+
457
+ include_examples 'accepts'
458
+ include_examples 'mimics MRI 2.0'
459
+ end
460
+
461
+ context 'and the variable is not used' do
462
+ let(:source) do
463
+ [
464
+ 'some_method(foo = 1) do',
465
+ 'end'
466
+ ]
467
+ end
468
+
469
+ it 'registers an offence' do
470
+ inspect_source(cop, source)
471
+ expect(cop.offences).to have(1).item
472
+ expect(cop.offences.first.message)
473
+ .to include('unused variable - foo')
474
+ expect(cop.offences.first.line).to eq(1)
475
+ end
476
+
477
+ include_examples 'mimics MRI 2.0'
478
+ end
479
+ end
480
+
481
+ context 'when a variabled is assigned ' +
482
+ 'and passed to a method followed by method taking block' do
483
+ let(:source) do
484
+ [
485
+ "pattern = '*.rb'",
486
+ 'Dir.glob(pattern).map do |path|',
487
+ 'end'
488
+ ]
489
+ end
490
+
491
+ include_examples 'accepts'
492
+ include_examples 'mimics MRI 2.0'
493
+ end
494
+ end
495
+ end
496
+ end
497
+ end