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,35 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module Rubocop
6
+ module Cop
7
+ module Lint
8
+ describe EndInMethod do
9
+ let(:cop) { EndInMethod.new }
10
+
11
+ it 'reports an offence for def with an END inside' do
12
+ src = ['def test',
13
+ ' END { something }',
14
+ 'end']
15
+ inspect_source(cop, src)
16
+ expect(cop.offences.size).to eq(1)
17
+ end
18
+
19
+ it 'reports an offence for defs with an END inside' do
20
+ src = ['def self.test',
21
+ ' END { something }',
22
+ 'end']
23
+ inspect_source(cop, src)
24
+ expect(cop.offences.size).to eq(1)
25
+ end
26
+
27
+ it 'accepts END outside of def(s)' do
28
+ src = ['END { something }']
29
+ inspect_source(cop, src)
30
+ expect(cop.offences).to be_empty
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,37 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module Rubocop
6
+ module Cop
7
+ module Lint
8
+ describe EnsureReturn do
9
+ let(:er) { EnsureReturn.new }
10
+
11
+ it 'registers an offence for return in ensure' do
12
+ inspect_source(er,
13
+ ['begin',
14
+ ' something',
15
+ 'ensure',
16
+ ' file.close',
17
+ ' return',
18
+ 'end'])
19
+ expect(er.offences.size).to eq(1)
20
+ expect(er.offences.map(&:message))
21
+ .to eq([EnsureReturn::MSG])
22
+ end
23
+
24
+ it 'does not register an offence for return outside ensure' do
25
+ inspect_source(er,
26
+ ['begin',
27
+ ' something',
28
+ ' return',
29
+ 'ensure',
30
+ ' file.close',
31
+ 'end'])
32
+ expect(er.offences).to be_empty
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,41 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module Rubocop
6
+ module Cop
7
+ module Lint
8
+ describe Eval do
9
+ let(:a) { Eval.new }
10
+
11
+ it 'registers an offence for eval as function' do
12
+ inspect_source(a,
13
+ ['eval(something)'])
14
+ expect(a.offences.size).to eq(1)
15
+ expect(a.offences.map(&:message))
16
+ .to eq([Eval::MSG])
17
+ end
18
+
19
+ it 'registers an offence for eval as command' do
20
+ inspect_source(a,
21
+ ['eval something'])
22
+ expect(a.offences.size).to eq(1)
23
+ expect(a.offences.map(&:message))
24
+ .to eq([Eval::MSG])
25
+ end
26
+
27
+ it 'does not register an offence for eval as variable' do
28
+ inspect_source(a,
29
+ ['eval = something'])
30
+ expect(a.offences).to be_empty
31
+ end
32
+
33
+ it 'does not register an offence for eval as method' do
34
+ inspect_source(a,
35
+ ['something.eval'])
36
+ expect(a.offences).to be_empty
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,36 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module Rubocop
6
+ module Cop
7
+ module Lint
8
+ describe HandleExceptions do
9
+ let(:he) { HandleExceptions.new }
10
+
11
+ it 'registers an offence for empty rescue block' do
12
+ inspect_source(he,
13
+ ['begin',
14
+ ' something',
15
+ 'rescue',
16
+ ' #do nothing',
17
+ 'end'])
18
+ expect(he.offences.size).to eq(1)
19
+ expect(he.offences.map(&:message))
20
+ .to eq([HandleExceptions::MSG])
21
+ end
22
+
23
+ it 'does not register an offence for rescue with body' do
24
+ inspect_source(he,
25
+ ['begin',
26
+ ' something',
27
+ ' return',
28
+ 'rescue',
29
+ ' file.close',
30
+ 'end'])
31
+ expect(he.offences).to be_empty
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,42 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module Rubocop
6
+ module Cop
7
+ module Lint
8
+ describe LiteralInCondition do
9
+ let(:cop) { LiteralInCondition.new }
10
+
11
+ %w(1 2.0 [1] {}).each do |lit|
12
+ it "registers an offence for literal #{lit} in condition" do
13
+ inspect_source(cop,
14
+ ["if x && #{lit}",
15
+ ' top',
16
+ 'end'
17
+ ])
18
+ expect(cop.offences.size).to eq(1)
19
+ end
20
+
21
+ it "accepts literal #{lit} if it's not an and/or operand" do
22
+ inspect_source(cop,
23
+ ["if test(#{lit})",
24
+ ' top',
25
+ 'end'
26
+ ])
27
+ expect(cop.offences).to be_empty
28
+ end
29
+
30
+ it "accepts literal #{lit} in non-toplevel and/or" do
31
+ inspect_source(cop,
32
+ ["if (a || #{lit}).something",
33
+ ' top',
34
+ 'end'
35
+ ])
36
+ expect(cop.offences).to be_empty
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,33 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module Rubocop
6
+ module Cop
7
+ module Lint
8
+ describe Loop do
9
+ let(:loop) { Loop.new }
10
+
11
+ it 'registers an offence for begin/end/while' do
12
+ inspect_source(loop, ['begin something; top; end while test'])
13
+ expect(loop.offences.size).to eq(1)
14
+ end
15
+
16
+ it 'registers an offence for begin/end/until' do
17
+ inspect_source(loop, ['begin something; top; end until test'])
18
+ expect(loop.offences.size).to eq(1)
19
+ end
20
+
21
+ it 'accepts normal while' do
22
+ inspect_source(loop, ['while test; one; two; end'])
23
+ expect(loop.offences).to be_empty
24
+ end
25
+
26
+ it 'accepts normal until' do
27
+ inspect_source(loop, ['until test; one; two; end'])
28
+ expect(loop.offences).to be_empty
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,127 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module Rubocop
6
+ module Cop
7
+ module Lint
8
+ describe RescueException do
9
+ let(:re) { RescueException.new }
10
+
11
+ it 'registers an offence for rescue from Exception' do
12
+ inspect_source(re,
13
+ ['begin',
14
+ ' something',
15
+ 'rescue Exception',
16
+ ' #do nothing',
17
+ 'end'])
18
+ expect(re.offences.size).to eq(1)
19
+ expect(re.offences.map(&:message))
20
+ .to eq([RescueException::MSG])
21
+ end
22
+
23
+ it 'registers an offence for rescue with ::Exception' do
24
+ inspect_source(re,
25
+ ['begin',
26
+ ' something',
27
+ 'rescue ::Exception',
28
+ ' #do nothing',
29
+ 'end'])
30
+ expect(re.offences.size).to eq(1)
31
+ expect(re.offences.map(&:message))
32
+ .to eq([RescueException::MSG])
33
+ end
34
+
35
+ it 'registers an offence for rescue with StandardError, Exception' do
36
+ inspect_source(re,
37
+ ['begin',
38
+ ' something',
39
+ 'rescue StandardError, Exception',
40
+ ' #do nothing',
41
+ 'end'])
42
+ expect(re.offences.size).to eq(1)
43
+ expect(re.offences.map(&:message))
44
+ .to eq([RescueException::MSG])
45
+ end
46
+
47
+ it 'registers an offence for rescue with Exception => e' do
48
+ inspect_source(re,
49
+ ['begin',
50
+ ' something',
51
+ 'rescue Exception => e',
52
+ ' #do nothing',
53
+ 'end'])
54
+ expect(re.offences.size).to eq(1)
55
+ expect(re.offences.map(&:message))
56
+ .to eq([RescueException::MSG])
57
+ end
58
+
59
+ it 'does not register an offence for rescue with no class' do
60
+ inspect_source(re,
61
+ ['begin',
62
+ ' something',
63
+ ' return',
64
+ 'rescue',
65
+ ' file.close',
66
+ 'end'])
67
+ expect(re.offences).to be_empty
68
+ end
69
+
70
+ it 'does not register an offence for rescue with no class and => e' do
71
+ inspect_source(re,
72
+ ['begin',
73
+ ' something',
74
+ ' return',
75
+ 'rescue => e',
76
+ ' file.close',
77
+ 'end'])
78
+ expect(re.offences).to be_empty
79
+ end
80
+
81
+ it 'does not register an offence for rescue with other class' do
82
+ inspect_source(re,
83
+ ['begin',
84
+ ' something',
85
+ ' return',
86
+ 'rescue ArgumentError => e',
87
+ ' file.close',
88
+ 'end'])
89
+ expect(re.offences).to be_empty
90
+ end
91
+
92
+ it 'does not register an offence for rescue with other classes' do
93
+ inspect_source(re,
94
+ ['begin',
95
+ ' something',
96
+ ' return',
97
+ 'rescue EOFError, ArgumentError => e',
98
+ ' file.close',
99
+ 'end'])
100
+ expect(re.offences).to be_empty
101
+ end
102
+
103
+ it 'does not register an offence for rescue with a module prefix' do
104
+ inspect_source(re,
105
+ ['begin',
106
+ ' something',
107
+ ' return',
108
+ 'rescue Test::Exception => e',
109
+ ' file.close',
110
+ 'end'])
111
+ expect(re.offences).to be_empty
112
+ end
113
+
114
+ it 'does not crash when the splat operator is used in a rescue' do
115
+ inspect_source(re,
116
+ ['ERRORS = [Exception]',
117
+ 'begin',
118
+ ' a = 3 / 0',
119
+ 'rescue *ERRORS',
120
+ ' puts e',
121
+ 'end'])
122
+ expect(re.offences).to be_empty
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,243 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module Rubocop
6
+ module Cop
7
+ module Lint
8
+ describe ShadowingOuterLocalVariable do
9
+ subject(:cop) { ShadowingOuterLocalVariable.new }
10
+
11
+ context 'when a block argument has same name ' +
12
+ 'as an outer scope variable' do
13
+ let(:source) do
14
+ [
15
+ 'def some_method',
16
+ ' foo = 1',
17
+ ' puts foo',
18
+ ' 1.times do |foo|',
19
+ ' end',
20
+ 'end'
21
+ ]
22
+ end
23
+
24
+ it 'registers an offence' do
25
+ inspect_source(cop, source)
26
+ expect(cop.offences).to have(1).item
27
+ expect(cop.offences.first.message)
28
+ .to include('Shadowing outer local variable - foo')
29
+ expect(cop.offences.first.line).to eq(4)
30
+ end
31
+
32
+ include_examples 'mimics MRI 2.0'
33
+ end
34
+
35
+ context 'when a splat block argument has same name ' +
36
+ 'as an outer scope variable' do
37
+ let(:source) do
38
+ [
39
+ 'def some_method',
40
+ ' foo = 1',
41
+ ' puts foo',
42
+ ' 1.times do |*foo|',
43
+ ' end',
44
+ 'end'
45
+ ]
46
+ end
47
+
48
+ it 'registers an offence' do
49
+ inspect_source(cop, source)
50
+ expect(cop.offences).to have(1).item
51
+ expect(cop.offences.first.message)
52
+ .to include('Shadowing outer local variable - foo')
53
+ expect(cop.offences.first.line).to eq(4)
54
+ end
55
+
56
+ include_examples 'mimics MRI 2.0'
57
+ end
58
+
59
+ context 'when a block block argument has same name ' +
60
+ 'as an outer scope variable' do
61
+ let(:source) do
62
+ [
63
+ 'def some_method',
64
+ ' foo = 1',
65
+ ' puts foo',
66
+ ' proc_taking_block = proc do |&foo|',
67
+ ' end',
68
+ ' proc_taking_block.call do',
69
+ ' end',
70
+ 'end'
71
+ ]
72
+ end
73
+
74
+ it 'registers an offence' do
75
+ inspect_source(cop, source)
76
+ expect(cop.offences).to have(1).item
77
+ expect(cop.offences.first.message)
78
+ .to include('Shadowing outer local variable - foo')
79
+ expect(cop.offences.first.line).to eq(4)
80
+ end
81
+
82
+ include_examples 'mimics MRI 2.0'
83
+ end
84
+
85
+ context 'when a block local variable has same name ' +
86
+ 'as an outer scope variable' do
87
+ let(:source) do
88
+ [
89
+ 'def some_method',
90
+ ' foo = 1',
91
+ ' puts foo',
92
+ ' 1.times do |i; foo|',
93
+ ' puts foo',
94
+ ' end',
95
+ 'end'
96
+ ]
97
+ end
98
+
99
+ it 'registers an offence' do
100
+ inspect_source(cop, source)
101
+ expect(cop.offences).to have(1).item
102
+ expect(cop.offences.first.message)
103
+ .to include('Shadowing outer local variable - foo')
104
+ expect(cop.offences.first.line).to eq(4)
105
+ end
106
+
107
+ include_examples 'mimics MRI 2.0', 'shadowing'
108
+ end
109
+
110
+ context 'when a block argument has different name ' +
111
+ 'with outer scope variables' do
112
+ let(:source) do
113
+ [
114
+ 'def some_method',
115
+ ' foo = 1',
116
+ ' puts foo',
117
+ ' 1.times do |bar|',
118
+ ' end',
119
+ 'end'
120
+ ]
121
+ end
122
+
123
+ include_examples 'accepts'
124
+ include_examples 'mimics MRI 2.0'
125
+ end
126
+
127
+ context 'when an outer scope variable is reassigned in a block' do
128
+ let(:source) do
129
+ [
130
+ 'def some_method',
131
+ ' foo = 1',
132
+ ' puts foo',
133
+ ' 1.times do',
134
+ ' foo = 2',
135
+ ' end',
136
+ 'end'
137
+ ]
138
+ end
139
+
140
+ include_examples 'accepts'
141
+ include_examples 'mimics MRI 2.0'
142
+ end
143
+
144
+ context 'when an outer scope variable is referenced in a block' do
145
+ let(:source) do
146
+ [
147
+ 'def some_method',
148
+ ' foo = 1',
149
+ ' puts foo',
150
+ ' 1.times do',
151
+ ' puts foo',
152
+ ' end',
153
+ 'end'
154
+ ]
155
+ end
156
+
157
+ include_examples 'accepts'
158
+ include_examples 'mimics MRI 2.0'
159
+ end
160
+
161
+ context 'when multiple block arguments have same name "_"' do
162
+ let(:source) do
163
+ [
164
+ 'def some_method',
165
+ ' 1.times do |_, foo, _|',
166
+ ' end',
167
+ 'end'
168
+ ]
169
+ end
170
+
171
+ include_examples 'accepts'
172
+ include_examples 'mimics MRI 2.0'
173
+ end
174
+
175
+ context 'when multiple block arguments have ' +
176
+ 'a same name starts with "_"' do
177
+ let(:source) do
178
+ [
179
+ 'def some_method',
180
+ ' 1.times do |_foo, bar, _foo|',
181
+ ' end',
182
+ 'end'
183
+ ]
184
+ end
185
+
186
+ include_examples 'accepts'
187
+ include_examples 'mimics MRI 2.0'
188
+ end
189
+
190
+ context 'when a block argument has same name "_" ' +
191
+ 'as outer scope variable "_"' do
192
+ let(:source) do
193
+ [
194
+ 'def some_method',
195
+ ' _ = 1',
196
+ ' puts _',
197
+ ' 1.times do |_|',
198
+ ' end',
199
+ 'end'
200
+ ]
201
+ end
202
+
203
+ include_examples 'accepts'
204
+ include_examples 'mimics MRI 2.0'
205
+ end
206
+
207
+ context 'when a block argument has a same name starts with "_" ' +
208
+ 'as an outer scope variable' do
209
+ let(:source) do
210
+ [
211
+ 'def some_method',
212
+ ' _foo = 1',
213
+ ' puts _foo',
214
+ ' 1.times do |_foo|',
215
+ ' end',
216
+ 'end'
217
+ ]
218
+ end
219
+
220
+ include_examples 'accepts'
221
+ include_examples 'mimics MRI 2.0'
222
+ end
223
+
224
+ context 'when a method argument has same name ' +
225
+ 'as an outer scope variable' do
226
+ let(:source) do
227
+ [
228
+ 'class SomeClass',
229
+ ' foo = 1',
230
+ ' puts foo',
231
+ ' def some_method(foo)',
232
+ ' end',
233
+ 'end'
234
+ ]
235
+ end
236
+
237
+ include_examples 'accepts'
238
+ include_examples 'mimics MRI 2.0'
239
+ end
240
+ end
241
+ end
242
+ end
243
+ end