rubocop 0.4.0 → 0.8.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 (190) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +50 -0
  3. data/.rubocop.yml +5 -127
  4. data/.travis.yml +7 -1
  5. data/CHANGELOG.md +157 -0
  6. data/CONTRIBUTING.md +13 -6
  7. data/Gemfile +3 -8
  8. data/README.md +160 -9
  9. data/Rakefile +3 -17
  10. data/bin/rubocop +16 -10
  11. data/config/default.yml +46 -0
  12. data/config/disabled.yml +5 -0
  13. data/config/enabled.yml +322 -0
  14. data/lib/rubocop/cli.rb +248 -93
  15. data/lib/rubocop/config.rb +205 -0
  16. data/lib/rubocop/config_store.rb +37 -0
  17. data/lib/rubocop/cop/access_control.rb +41 -0
  18. data/lib/rubocop/cop/alias.rb +17 -0
  19. data/lib/rubocop/cop/align_parameters.rb +20 -95
  20. data/lib/rubocop/cop/and_or.rb +26 -0
  21. data/lib/rubocop/cop/ascii_comments.rb +13 -0
  22. data/lib/rubocop/cop/ascii_identifiers.rb +19 -0
  23. data/lib/rubocop/cop/avoid_class_vars.rb +15 -0
  24. data/lib/rubocop/cop/avoid_for.rb +17 -0
  25. data/lib/rubocop/cop/avoid_global_vars.rb +61 -0
  26. data/lib/rubocop/cop/avoid_perl_backrefs.rb +17 -0
  27. data/lib/rubocop/cop/avoid_perlisms.rb +47 -0
  28. data/lib/rubocop/cop/block_comments.rb +15 -0
  29. data/lib/rubocop/cop/blocks.rb +11 -47
  30. data/lib/rubocop/cop/case_indentation.rb +22 -0
  31. data/lib/rubocop/cop/class_and_module_camel_case.rb +20 -11
  32. data/lib/rubocop/cop/class_methods.rb +15 -0
  33. data/lib/rubocop/cop/collection_methods.rb +16 -16
  34. data/lib/rubocop/cop/colon_method_call.rb +20 -0
  35. data/lib/rubocop/cop/constant_name.rb +24 -0
  36. data/lib/rubocop/cop/cop.rb +34 -47
  37. data/lib/rubocop/cop/def_parentheses.rb +43 -35
  38. data/lib/rubocop/cop/empty_line_between_defs.rb +22 -0
  39. data/lib/rubocop/cop/empty_lines.rb +21 -13
  40. data/lib/rubocop/cop/empty_literal.rb +47 -0
  41. data/lib/rubocop/cop/encoding.rb +3 -3
  42. data/lib/rubocop/cop/end_of_line.rb +3 -3
  43. data/lib/rubocop/cop/ensure_return.rb +19 -0
  44. data/lib/rubocop/cop/eval.rb +19 -0
  45. data/lib/rubocop/cop/favor_join.rb +22 -0
  46. data/lib/rubocop/cop/favor_modifier.rb +38 -48
  47. data/lib/rubocop/cop/favor_percent_r.rb +19 -0
  48. data/lib/rubocop/cop/favor_sprintf.rb +21 -0
  49. data/lib/rubocop/cop/favor_unless_over_negated_if.rb +19 -17
  50. data/lib/rubocop/cop/handle_exceptions.rb +17 -0
  51. data/lib/rubocop/cop/hash_syntax.rb +29 -14
  52. data/lib/rubocop/cop/if_then_else.rb +32 -29
  53. data/lib/rubocop/cop/leading_comment_space.rb +17 -0
  54. data/lib/rubocop/cop/line_continuation.rb +15 -0
  55. data/lib/rubocop/cop/line_length.rb +4 -4
  56. data/lib/rubocop/cop/loop.rb +33 -0
  57. data/lib/rubocop/cop/method_and_variable_snake_case.rb +41 -17
  58. data/lib/rubocop/cop/method_length.rb +52 -0
  59. data/lib/rubocop/cop/new_lambda_literal.rb +8 -6
  60. data/lib/rubocop/cop/not.rb +21 -0
  61. data/lib/rubocop/cop/numeric_literals.rb +9 -7
  62. data/lib/rubocop/cop/offence.rb +12 -1
  63. data/lib/rubocop/cop/op_method.rb +26 -0
  64. data/lib/rubocop/cop/parameter_lists.rb +12 -6
  65. data/lib/rubocop/cop/parentheses_around_condition.rb +11 -11
  66. data/lib/rubocop/cop/percent_r.rb +19 -0
  67. data/lib/rubocop/cop/reduce_arguments.rb +29 -0
  68. data/lib/rubocop/cop/rescue_exception.rb +26 -0
  69. data/lib/rubocop/cop/rescue_modifier.rb +17 -0
  70. data/lib/rubocop/cop/semicolon.rb +31 -0
  71. data/lib/rubocop/cop/single_line_methods.rb +44 -0
  72. data/lib/rubocop/cop/space_after_comma_etc.rb +30 -10
  73. data/lib/rubocop/cop/space_after_control_keyword.rb +29 -0
  74. data/lib/rubocop/cop/string_literals.rb +9 -23
  75. data/lib/rubocop/cop/surrounding_space.rb +223 -83
  76. data/lib/rubocop/cop/symbol_array.rb +31 -0
  77. data/lib/rubocop/cop/symbol_name.rb +23 -0
  78. data/lib/rubocop/cop/syntax.rb +35 -5
  79. data/lib/rubocop/cop/tab.rb +3 -3
  80. data/lib/rubocop/cop/ternary_operator.rb +26 -24
  81. data/lib/rubocop/cop/trailing_whitespace.rb +3 -5
  82. data/lib/rubocop/cop/trivial_accessors.rb +26 -0
  83. data/lib/rubocop/cop/unless_else.rb +11 -7
  84. data/lib/rubocop/cop/util.rb +26 -0
  85. data/lib/rubocop/cop/variable_interpolation.rb +29 -0
  86. data/lib/rubocop/cop/when_then.rb +6 -14
  87. data/lib/rubocop/cop/word_array.rb +37 -0
  88. data/lib/rubocop/report/emacs_style.rb +2 -2
  89. data/lib/rubocop/report/plain_text.rb +1 -1
  90. data/lib/rubocop/version.rb +3 -1
  91. data/lib/rubocop.rb +48 -8
  92. data/rubocop.gemspec +32 -151
  93. data/spec/project_spec.rb +27 -0
  94. data/spec/rubocop/cli_spec.rb +573 -200
  95. data/spec/rubocop/config_spec.rb +409 -0
  96. data/spec/rubocop/config_store_spec.rb +66 -0
  97. data/spec/rubocop/cops/access_control_spec.rb +129 -0
  98. data/spec/rubocop/cops/alias_spec.rb +39 -0
  99. data/spec/rubocop/cops/align_parameters_spec.rb +66 -70
  100. data/spec/rubocop/cops/and_or_spec.rb +37 -0
  101. data/spec/rubocop/cops/ascii_comments_spec.rb +26 -0
  102. data/spec/rubocop/cops/ascii_identifiers_spec.rb +26 -0
  103. data/spec/rubocop/cops/avoid_class_vars_spec.rb +25 -0
  104. data/spec/rubocop/cops/avoid_for_spec.rb +35 -0
  105. data/spec/rubocop/cops/avoid_global_vars_spec.rb +32 -0
  106. data/spec/rubocop/cops/avoid_perl_backrefs_spec.rb +18 -0
  107. data/spec/rubocop/cops/avoid_perlisms_spec.rb +44 -0
  108. data/spec/rubocop/cops/block_comments_spec.rb +25 -0
  109. data/spec/rubocop/cops/blocks_spec.rb +33 -0
  110. data/spec/rubocop/cops/{indentation_spec.rb → case_indentation_spec.rb} +7 -7
  111. data/spec/rubocop/cops/class_and_module_camel_case_spec.rb +15 -5
  112. data/spec/rubocop/cops/class_methods_spec.rb +49 -0
  113. data/spec/rubocop/cops/collection_methods_spec.rb +9 -4
  114. data/spec/rubocop/cops/colon_method_call_spec.rb +53 -0
  115. data/spec/rubocop/cops/constant_name_spec.rb +42 -0
  116. data/spec/rubocop/cops/def_with_parentheses_spec.rb +13 -8
  117. data/spec/rubocop/cops/def_without_parentheses_spec.rb +11 -5
  118. data/spec/rubocop/cops/empty_line_between_defs_spec.rb +83 -0
  119. data/spec/rubocop/cops/empty_lines_spec.rb +14 -59
  120. data/spec/rubocop/cops/empty_literal_spec.rb +90 -0
  121. data/spec/rubocop/cops/encoding_spec.rb +11 -11
  122. data/spec/rubocop/cops/end_of_line_spec.rb +2 -2
  123. data/spec/rubocop/cops/ensure_return_spec.rb +35 -0
  124. data/spec/rubocop/cops/eval_spec.rb +39 -0
  125. data/spec/rubocop/cops/favor_join_spec.rb +35 -0
  126. data/spec/rubocop/cops/favor_modifier_spec.rb +16 -14
  127. data/spec/rubocop/cops/favor_percent_r_spec.rb +29 -0
  128. data/spec/rubocop/cops/favor_sprintf_spec.rb +51 -0
  129. data/spec/rubocop/cops/favor_unless_over_negated_if_spec.rb +4 -4
  130. data/spec/rubocop/cops/favor_until_over_negated_while_spec.rb +3 -3
  131. data/spec/rubocop/cops/handle_exceptions_spec.rb +34 -0
  132. data/spec/rubocop/cops/hash_syntax_spec.rb +11 -6
  133. data/spec/rubocop/cops/if_with_semicolon_spec.rb +7 -1
  134. data/spec/rubocop/cops/leading_comment_space_spec.rb +54 -0
  135. data/spec/rubocop/cops/line_continuation_spec.rb +24 -0
  136. data/spec/rubocop/cops/line_length_spec.rb +3 -2
  137. data/spec/rubocop/cops/loop_spec.rb +31 -0
  138. data/spec/rubocop/cops/method_and_variable_snake_case_spec.rb +55 -9
  139. data/spec/rubocop/cops/method_length_spec.rb +147 -0
  140. data/spec/rubocop/cops/multiline_if_then_spec.rb +15 -15
  141. data/spec/rubocop/cops/new_lambda_literal_spec.rb +5 -6
  142. data/spec/rubocop/cops/not_spec.rb +31 -0
  143. data/spec/rubocop/cops/numeric_literals_spec.rb +13 -13
  144. data/spec/rubocop/cops/offence_spec.rb +13 -0
  145. data/spec/rubocop/cops/one_line_conditional_spec.rb +1 -1
  146. data/spec/rubocop/cops/op_method_spec.rb +78 -0
  147. data/spec/rubocop/cops/parameter_lists_spec.rb +7 -7
  148. data/spec/rubocop/cops/parentheses_around_condition_spec.rb +41 -44
  149. data/spec/rubocop/cops/percent_r_spec.rb +29 -0
  150. data/spec/rubocop/cops/reduce_arguments_spec.rb +57 -0
  151. data/spec/rubocop/cops/rescue_exception_spec.rb +125 -0
  152. data/spec/rubocop/cops/rescue_modifier_spec.rb +37 -0
  153. data/spec/rubocop/cops/semicolon_spec.rb +88 -0
  154. data/spec/rubocop/cops/single_line_methods_spec.rb +50 -0
  155. data/spec/rubocop/cops/space_after_colon_spec.rb +3 -3
  156. data/spec/rubocop/cops/space_after_comma_spec.rb +14 -2
  157. data/spec/rubocop/cops/space_after_control_keyword_spec.rb +67 -0
  158. data/spec/rubocop/cops/space_after_semicolon_spec.rb +6 -1
  159. data/spec/rubocop/cops/space_around_braces_spec.rb +18 -3
  160. data/spec/rubocop/cops/space_around_equals_in_default_parameter_spec.rb +12 -2
  161. data/spec/rubocop/cops/space_around_operators_spec.rb +88 -26
  162. data/spec/rubocop/cops/space_inside_brackets_spec.rb +13 -7
  163. data/spec/rubocop/cops/space_inside_hash_literal_braces_spec.rb +79 -0
  164. data/spec/rubocop/cops/space_inside_parens_spec.rb +7 -3
  165. data/spec/rubocop/cops/string_literals_spec.rb +21 -6
  166. data/spec/rubocop/cops/symbol_array_spec.rb +41 -0
  167. data/spec/rubocop/cops/symbol_name_spec.rb +119 -0
  168. data/spec/rubocop/cops/syntax_spec.rb +28 -5
  169. data/spec/rubocop/cops/tab_spec.rb +2 -2
  170. data/spec/rubocop/cops/ternary_operator_spec.rb +13 -17
  171. data/spec/rubocop/cops/trailing_whitespace_spec.rb +3 -3
  172. data/spec/rubocop/cops/trivial_accessors_spec.rb +329 -0
  173. data/spec/rubocop/cops/unless_else_spec.rb +8 -8
  174. data/spec/rubocop/cops/variable_interpolation_spec.rb +49 -0
  175. data/spec/rubocop/cops/when_then_spec.rb +14 -14
  176. data/spec/rubocop/cops/word_array_spec.rb +47 -0
  177. data/spec/spec_helper.rb +30 -9
  178. data/spec/support/file_helper.rb +21 -0
  179. data/spec/support/isolated_environment.rb +27 -0
  180. metadata +235 -76
  181. data/.document +0 -5
  182. data/Gemfile.lock +0 -41
  183. data/VERSION +0 -1
  184. data/lib/rubocop/cop/ampersands_pipes_vs_and_or.rb +0 -25
  185. data/lib/rubocop/cop/grammar.rb +0 -135
  186. data/lib/rubocop/cop/indentation.rb +0 -44
  187. data/spec/rubocop/cops/ampersands_pipes_vs_and_or_spec.rb +0 -57
  188. data/spec/rubocop/cops/grammar_spec.rb +0 -71
  189. data/spec/rubocop/cops/multiline_blocks_spec.rb +0 -24
  190. data/spec/rubocop/cops/single_line_blocks_spec.rb +0 -22
@@ -0,0 +1,49 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module Rubocop
6
+ module Cop
7
+ describe ClassMethods do
8
+ let(:cm) { ClassMethods.new }
9
+
10
+ it 'registers an offence for methods using a class name' do
11
+ inspect_source(cm,
12
+ ['class Test',
13
+ ' def Test.some_method',
14
+ ' do_something',
15
+ ' end',
16
+ 'end'])
17
+ expect(cm.offences.size).to eq(1)
18
+ end
19
+
20
+ it 'registers an offence for methods using a module name' do
21
+ inspect_source(cm,
22
+ ['module Test',
23
+ ' def Test.some_method',
24
+ ' do_something',
25
+ ' end',
26
+ 'end'])
27
+ expect(cm.offences.size).to eq(1)
28
+ end
29
+
30
+ it 'does not register an offence for methods using self' do
31
+ inspect_source(cm,
32
+ ['module Test',
33
+ ' def self.some_method',
34
+ ' do_something',
35
+ ' end',
36
+ 'end'])
37
+ expect(cm.offences).to be_empty
38
+ end
39
+
40
+ it 'does not register an offence outside class/module bodies' do
41
+ inspect_source(cm,
42
+ ['def self.some_method',
43
+ ' do_something',
44
+ 'end'])
45
+ expect(cm.offences).to be_empty
46
+ end
47
+ end
48
+ end
49
+ end
@@ -8,32 +8,37 @@ module Rubocop
8
8
  let(:cm) { CollectionMethods.new }
9
9
 
10
10
  it 'registers an offence for collect' do
11
- inspect_source(cm, 'file.rb', ['[1, 2, 3].collect { |e| e + 1 }'])
11
+ inspect_source(cm, ['[1, 2, 3].collect { |e| e + 1 }'])
12
12
  expect(cm.offences.size).to eq(1)
13
13
  expect(cm.offences.map(&:message))
14
14
  .to eq(['Prefer map over collect.'])
15
15
  end
16
16
 
17
17
  it 'registers an offence for inject' do
18
- inspect_source(cm, 'file.rb', ['[1, 2, 3].inject { |e| e + 1 }'])
18
+ inspect_source(cm, ['[1, 2, 3].inject { |e| e + 1 }'])
19
19
  expect(cm.offences.size).to eq(1)
20
20
  expect(cm.offences.map(&:message))
21
21
  .to eq(['Prefer reduce over inject.'])
22
22
  end
23
23
 
24
24
  it 'registers an offence for detect' do
25
- inspect_source(cm, 'file.rb', ['[1, 2, 3].detect { |e| e + 1 }'])
25
+ inspect_source(cm, ['[1, 2, 3].detect { |e| e + 1 }'])
26
26
  expect(cm.offences.size).to eq(1)
27
27
  expect(cm.offences.map(&:message))
28
28
  .to eq(['Prefer find over detect.'])
29
29
  end
30
30
 
31
31
  it 'registers an offence for find_all' do
32
- inspect_source(cm, 'file.rb', ['[1, 2, 3].find_all { |e| e + 1 }'])
32
+ inspect_source(cm, ['[1, 2, 3].find_all { |e| e + 1 }'])
33
33
  expect(cm.offences.size).to eq(1)
34
34
  expect(cm.offences.map(&:message))
35
35
  .to eq(['Prefer select over find_all.'])
36
36
  end
37
+
38
+ it 'ignores find_all without an explicit receiver' do
39
+ inspect_source(cm, ['find_all { |e| e + 1 }'])
40
+ expect(cm.offences).to be_empty
41
+ end
37
42
  end
38
43
  end
39
44
  end
@@ -0,0 +1,53 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module Rubocop
6
+ module Cop
7
+ describe ColonMethodCall do
8
+ let(:smc) { ColonMethodCall.new }
9
+
10
+ it 'registers an offence for instance method call' do
11
+ inspect_source(smc,
12
+ ['test::method_name'])
13
+ expect(smc.offences.size).to eq(1)
14
+ end
15
+
16
+ it 'registers an offence for instance method call with arg' do
17
+ inspect_source(smc,
18
+ ['test::method_name(arg)'])
19
+ expect(smc.offences.size).to eq(1)
20
+ end
21
+
22
+ it 'registers an offence for class method call' do
23
+ inspect_source(smc,
24
+ ['Class::method_name'])
25
+ expect(smc.offences.size).to eq(1)
26
+ end
27
+
28
+ it 'registers an offence for class method call with arg' do
29
+ inspect_source(smc,
30
+ ['Class::method_name(arg, arg2)'])
31
+ expect(smc.offences.size).to eq(1)
32
+ end
33
+
34
+ it 'does not register an offence for constant access' do
35
+ inspect_source(smc,
36
+ ['Tip::Top::SOME_CONST'])
37
+ expect(smc.offences).to be_empty
38
+ end
39
+
40
+ it 'does not register an offence for nested class' do
41
+ inspect_source(smc,
42
+ ['Tip::Top.some_method'])
43
+ expect(smc.offences).to be_empty
44
+ end
45
+
46
+ it 'does not register an offence for op methods' do
47
+ inspect_source(smc,
48
+ ['Tip::Top.some_method[3]'])
49
+ expect(smc.offences).to be_empty
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,42 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module Rubocop
6
+ module Cop
7
+ describe ConstantName do
8
+ let(:const) { ConstantName.new }
9
+
10
+ it 'registers an offence for camel case in const name' do
11
+ inspect_source(const,
12
+ ['TopCase = 5'])
13
+ expect(const.offences.size).to eq(1)
14
+ end
15
+
16
+ it 'registers an offence for snake case in const name' do
17
+ inspect_source(const,
18
+ ['TOP_test = 5'])
19
+ expect(const.offences.size).to eq(1)
20
+ end
21
+
22
+ it 'allows screaming snake case in const name' do
23
+ inspect_source(const,
24
+ ['TOP_TEST = 5'])
25
+ expect(const.offences).to be_empty
26
+ end
27
+
28
+ it 'does not check names if rhs is a method call' do
29
+ inspect_source(const,
30
+ ['AnythingGoes = test'])
31
+ expect(const.offences).to be_empty
32
+ end
33
+
34
+ it 'checks qualified const names' do
35
+ inspect_source(const,
36
+ ['::AnythingGoes = 30',
37
+ 'a::Bar_foo = 10'])
38
+ expect(const.offences.size).to eq(2)
39
+ end
40
+ end
41
+ end
42
+ end
@@ -10,23 +10,28 @@ module Rubocop
10
10
  it 'reports an offence for def with empty parens' do
11
11
  src = ['def func()',
12
12
  'end']
13
- inspect_source(def_par, '', src)
14
- expect(def_par.offences.map(&:message)).to eq(
15
- ["Omit the parentheses in defs when the method doesn't accept any " +
16
- 'arguments.'])
13
+ inspect_source(def_par, src)
14
+ expect(def_par.offences.size).to eq(1)
15
+ end
16
+
17
+ it 'reports an offence for class def with empty parens' do
18
+ src = ['def Test.func()',
19
+ 'end']
20
+ inspect_source(def_par, src)
21
+ expect(def_par.offences.size).to eq(1)
17
22
  end
18
23
 
19
24
  it 'accepts def with arg and parens' do
20
25
  src = ['def func(a)',
21
26
  'end']
22
- inspect_source(def_par, '', src)
23
- expect(def_par.offences.map(&:message)).to be_empty
27
+ inspect_source(def_par, src)
28
+ expect(def_par.offences).to be_empty
24
29
  end
25
30
 
26
31
  it 'accepts empty parentheses in one liners' do
27
32
  src = ["def to_s() join '/' end"]
28
- inspect_source(def_par, '', src)
29
- expect(def_par.offences.map(&:message)).to be_empty
33
+ inspect_source(def_par, src)
34
+ expect(def_par.offences).to be_empty
30
35
  end
31
36
  end
32
37
  end
@@ -10,16 +10,22 @@ module Rubocop
10
10
  it 'reports an offence for def with parameters but no parens' do
11
11
  src = ['def func a, b',
12
12
  'end']
13
- inspect_source(def_par, '', src)
14
- expect(def_par.offences.map(&:message)).to eq(
15
- ['Use def with parentheses when there are arguments.'])
13
+ inspect_source(def_par, src)
14
+ expect(def_par.offences.size).to eq(1)
15
+ end
16
+
17
+ it 'reports an offence for class def with parameters but no parens' do
18
+ src = ['def Test.func a, b',
19
+ 'end']
20
+ inspect_source(def_par, src)
21
+ expect(def_par.offences.size).to eq(1)
16
22
  end
17
23
 
18
24
  it 'accepts def with no args and no parens' do
19
25
  src = ['def func',
20
26
  'end']
21
- inspect_source(def_par, '', src)
22
- expect(def_par.offences.map(&:message)).to be_empty
27
+ inspect_source(def_par, src)
28
+ expect(def_par.offences).to be_empty
23
29
  end
24
30
  end
25
31
  end
@@ -0,0 +1,83 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module Rubocop
6
+ module Cop
7
+ describe EmptyLineBetweenDefs do
8
+ let(:empty_lines) { EmptyLineBetweenDefs.new }
9
+
10
+ it 'finds offences in inner classes' do
11
+ inspect_source(empty_lines, ['class K',
12
+ ' def m',
13
+ ' end',
14
+ ' class J',
15
+ ' def n',
16
+ ' end',
17
+ ' def o',
18
+ ' end',
19
+ ' end',
20
+ ' # checks something',
21
+ ' def p',
22
+ ' end',
23
+ 'end'])
24
+ expect(empty_lines.offences.size).to eq(1)
25
+ expect(empty_lines.offences.map(&:line_number).sort).to eq([7])
26
+ end
27
+
28
+ # Only one def, so rule about empty line *between* defs does not
29
+ # apply.
30
+ it 'accepts a def that follows a line with code' do
31
+ inspect_source(empty_lines, ['x = 0',
32
+ 'def m',
33
+ 'end'])
34
+ expect(empty_lines.offences).to be_empty
35
+ end
36
+
37
+ # Only one def, so rule about empty line *between* defs does not
38
+ # apply.
39
+ it 'accepts a def that follows code and a comment' do
40
+ inspect_source(empty_lines, [' x = 0',
41
+ ' # 123',
42
+ ' def m',
43
+ ' end'])
44
+ expect(empty_lines.offences).to be_empty
45
+ end
46
+
47
+ it 'accepts the first def without leading empty line in a class' do
48
+ inspect_source(empty_lines, ['class K',
49
+ ' def m',
50
+ ' end',
51
+ 'end'])
52
+ expect(empty_lines.offences).to be_empty
53
+ end
54
+
55
+ it 'accepts a def that follows an empty line and then a comment' do
56
+ inspect_source(empty_lines, ['class A',
57
+ ' # calculates value',
58
+ ' def m',
59
+ ' end',
60
+ '',
61
+ ' private',
62
+ ' # calculates size',
63
+ ' def n',
64
+ ' end',
65
+ 'end',
66
+ ])
67
+ expect(empty_lines.offences).to be_empty
68
+ end
69
+
70
+ it 'accepts a def that is the first of a module' do
71
+ source = ['module Util',
72
+ ' public',
73
+ ' #',
74
+ ' def html_escape(s)',
75
+ ' end',
76
+ 'end',
77
+ ]
78
+ inspect_source(empty_lines, source)
79
+ expect(empty_lines.offences.map(&:message)).to be_empty
80
+ end
81
+ end
82
+ end
83
+ end
@@ -7,76 +7,31 @@ module Rubocop
7
7
  describe EmptyLines do
8
8
  let(:empty_lines) { EmptyLines.new }
9
9
 
10
- it 'finds offences in inner classes' do
11
- inspect_source(empty_lines, '', ['class K',
12
- ' def m',
13
- ' end',
14
- ' class J',
15
- ' def n',
16
- ' end',
17
- ' def o',
18
- ' end',
19
- ' end',
20
- ' # checks something',
21
- ' def p',
22
- ' end',
23
- 'end'])
10
+ it 'registers an offence for consecutive empty lines' do
11
+ inspect_source(empty_lines,
12
+ ['test = 5', '', '', '', 'top'])
24
13
  expect(empty_lines.offences.size).to eq(2)
25
- expect(empty_lines.offences.map(&:line_number).sort).to eq([7, 11])
26
14
  end
27
15
 
28
- # Only one def, so rule about empty line *between* defs does not
29
- # apply.
30
- it 'accepts a def that follows a line with code' do
31
- inspect_source(empty_lines, '', ['x = 0',
32
- 'def m',
33
- 'end'])
16
+ it 'works when there are no tokens' do
17
+ inspect_source(empty_lines,
18
+ ['#comment'])
34
19
  expect(empty_lines.offences).to be_empty
35
20
  end
36
21
 
37
- # Only one def, so rule about empty line *between* defs does not
38
- # apply.
39
- it 'accepts a def that follows code and a comment' do
40
- inspect_source(empty_lines, '', [' x = 0',
41
- ' # 123',
42
- ' def m',
43
- ' end'])
22
+ it 'handles comments' do
23
+ inspect_source(empty_lines,
24
+ ['test', '', '#comment', 'top'])
44
25
  expect(empty_lines.offences).to be_empty
45
26
  end
46
27
 
47
- it 'accepts the first def without leading empty line in a class' do
48
- inspect_source(empty_lines, '', ['class K',
49
- ' def m',
50
- ' end',
51
- 'end'])
52
- expect(empty_lines.offences).to be_empty
53
- end
28
+ it 'does not register an offence for empty lines in a string' do
29
+ inspect_source(empty_lines, ['result = "test
30
+
54
31
 
55
- it 'accepts a def that follows an empty line and then a comment' do
56
- inspect_source(empty_lines, '', ['class A',
57
- ' # calculates value',
58
- ' def m',
59
- ' end',
60
- '',
61
- ' private',
62
- ' # calculates size',
63
- ' def n',
64
- ' end',
65
- 'end',
66
- ])
67
- expect(empty_lines.offences).to be_empty
68
- end
69
32
 
70
- it 'accepts a def that is the first of a module' do
71
- source = ['module Util',
72
- ' public',
73
- ' #',
74
- ' def html_escape(s)',
75
- ' end',
76
- 'end',
77
- ]
78
- inspect_source(empty_lines, '', source)
79
- expect(empty_lines.offences.map(&:message)).to be_empty
33
+ string"'])
34
+ expect(empty_lines.offences).to be_empty
80
35
  end
81
36
  end
82
37
  end
@@ -0,0 +1,90 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module Rubocop
6
+ module Cop
7
+ describe EmptyLiteral do
8
+ let(:a) { EmptyLiteral.new }
9
+
10
+ describe 'Empty Array' do
11
+ it 'registers an offence for Array.new()' do
12
+ inspect_source(a,
13
+ ['test = Array.new()'])
14
+ expect(a.offences.size).to eq(1)
15
+ expect(a.offences.map(&:message))
16
+ .to eq([EmptyLiteral::ARR_MSG])
17
+ end
18
+
19
+ it 'registers an offence for Array.new' do
20
+ inspect_source(a,
21
+ ['test = Array.new'])
22
+ expect(a.offences.size).to eq(1)
23
+ expect(a.offences.map(&:message))
24
+ .to eq([EmptyLiteral::ARR_MSG])
25
+ end
26
+
27
+ it 'does not register an offence for Array.new(3)' do
28
+ inspect_source(a,
29
+ ['test = Array.new(3)'])
30
+ expect(a.offences).to be_empty
31
+ end
32
+ end
33
+
34
+ describe 'Empty Hash' do
35
+ it 'registers an offence for Hash.new()' do
36
+ inspect_source(a,
37
+ ['test = Hash.new()'])
38
+ expect(a.offences.size).to eq(1)
39
+ expect(a.offences.map(&:message))
40
+ .to eq([EmptyLiteral::HASH_MSG])
41
+ end
42
+
43
+ it 'registers an offence for Hash.new' do
44
+ inspect_source(a,
45
+ ['test = Hash.new'])
46
+ expect(a.offences.size).to eq(1)
47
+ expect(a.offences.map(&:message))
48
+ .to eq([EmptyLiteral::HASH_MSG])
49
+ end
50
+
51
+ it 'does not register an offence for Hash.new(3)' do
52
+ inspect_source(a,
53
+ ['test = Hash.new(3)'])
54
+ expect(a.offences).to be_empty
55
+ end
56
+
57
+ it 'does not register an offence for Hash.new { block }' do
58
+ inspect_source(a,
59
+ ['test = Hash.new { block }'])
60
+ expect(a.offences).to be_empty
61
+ end
62
+ end
63
+
64
+ describe 'Empty String' do
65
+ it 'registers an offence for String.new()' do
66
+ inspect_source(a,
67
+ ['test = String.new()'])
68
+ expect(a.offences.size).to eq(1)
69
+ expect(a.offences.map(&:message))
70
+ .to eq([EmptyLiteral::STR_MSG])
71
+ end
72
+
73
+ it 'registers an offence for String.new' do
74
+ inspect_source(a,
75
+ ['test = String.new'])
76
+ expect(a.offences.size).to eq(1)
77
+ expect(a.offences.map(&:message))
78
+ .to eq([EmptyLiteral::STR_MSG])
79
+ end
80
+
81
+ it 'does not register an offence for String.new("top")' do
82
+ inspect_source(a,
83
+ ['test = String.new("top")'])
84
+ expect(a.offences).to be_empty
85
+ end
86
+ end
87
+
88
+ end
89
+ end
90
+ end
@@ -8,37 +8,37 @@ module Rubocop
8
8
  let(:encoding) { Encoding.new }
9
9
 
10
10
  it 'registers an offence when no encoding present', ruby: 1.9 do
11
- inspect_source(encoding, 'file.rb', ['def foo() end'])
11
+ inspect_source(encoding, ['def foo() end'])
12
12
 
13
13
  expect(encoding.offences.map(&:message)).to eq(
14
- ['Missing encoding comment.'])
14
+ ['Missing utf-8 encoding comment.'])
15
15
  end
16
16
 
17
17
  it 'accepts encoding on first line', ruby: 1.9 do
18
- inspect_source(encoding, 'file.rb', ['# encoding: utf-8',
19
- 'def foo() end'])
18
+ inspect_source(encoding, ['# encoding: utf-8',
19
+ 'def foo() end'])
20
20
 
21
21
  expect(encoding.offences).to be_empty
22
22
  end
23
23
 
24
24
  it 'accepts encoding on second line when shebang present', ruby: 1.9 do
25
- inspect_source(encoding, 'file.rb', ['#!/usr/bin/env ruby',
26
- '# encoding: utf-8',
27
- 'def foo() end'])
25
+ inspect_source(encoding, ['#!/usr/bin/env ruby',
26
+ '# encoding: utf-8',
27
+ 'def foo() end'])
28
28
 
29
29
  expect(encoding.offences.map(&:message)).to be_empty
30
30
  end
31
31
 
32
32
  it 'books an offence when encoding is in the wrong place', ruby: 1.9 do
33
- inspect_source(encoding, 'file.rb', ['def foo() end',
34
- '# encoding: utf-8'])
33
+ inspect_source(encoding, ['def foo() end',
34
+ '# encoding: utf-8'])
35
35
 
36
36
  expect(encoding.offences.map(&:message)).to eq(
37
- ['Missing encoding comment.'])
37
+ ['Missing utf-8 encoding comment.'])
38
38
  end
39
39
 
40
40
  it 'does not register an offence on Ruby 2.0', ruby: 2.0 do
41
- inspect_source(encoding, 'file.rb', ['def foo() end'])
41
+ inspect_source(encoding, ['def foo() end'])
42
42
 
43
43
  expect(encoding.offences).to be_empty
44
44
  end
@@ -8,13 +8,13 @@ module Rubocop
8
8
  let(:eol) { EndOfLine.new }
9
9
 
10
10
  it 'registers an offence for CR+LF' do
11
- inspect_source(eol, 'file.rb', ["x=0\r", ''])
11
+ inspect_source(eol, ["x=0\r", ''])
12
12
  expect(eol.offences.map(&:message)).to eq(
13
13
  ['Carriage return character detected.'])
14
14
  end
15
15
 
16
16
  it 'registers an offence for CR at end of file' do
17
- inspect_source(eol, 'file.rb', ["x=0\r"])
17
+ inspect_source(eol, ["x=0\r"])
18
18
  expect(eol.offences.map(&:message)).to eq(
19
19
  ['Carriage return character detected.'])
20
20
  end
@@ -0,0 +1,35 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module Rubocop
6
+ module Cop
7
+ describe EnsureReturn do
8
+ let(:er) { EnsureReturn.new }
9
+
10
+ it 'registers an offence for return in ensure' do
11
+ inspect_source(er,
12
+ ['begin',
13
+ ' something',
14
+ 'ensure',
15
+ ' file.close',
16
+ ' return',
17
+ 'end'])
18
+ expect(er.offences.size).to eq(1)
19
+ expect(er.offences.map(&:message))
20
+ .to eq([EnsureReturn::MSG])
21
+ end
22
+
23
+ it 'does not register an offence for return outside ensure' do
24
+ inspect_source(er,
25
+ ['begin',
26
+ ' something',
27
+ ' return',
28
+ 'ensure',
29
+ ' file.close',
30
+ 'end'])
31
+ expect(er.offences).to be_empty
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,39 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module Rubocop
6
+ module Cop
7
+ describe Eval do
8
+ let(:a) { Eval.new }
9
+
10
+ it 'registers an offence for eval as function' do
11
+ inspect_source(a,
12
+ ['eval(something)'])
13
+ expect(a.offences.size).to eq(1)
14
+ expect(a.offences.map(&:message))
15
+ .to eq([Eval::MSG])
16
+ end
17
+
18
+ it 'registers an offence for eval as command' do
19
+ inspect_source(a,
20
+ ['eval something'])
21
+ expect(a.offences.size).to eq(1)
22
+ expect(a.offences.map(&:message))
23
+ .to eq([Eval::MSG])
24
+ end
25
+
26
+ it 'does not register an offence for eval as variable' do
27
+ inspect_source(a,
28
+ ['eval = something'])
29
+ expect(a.offences).to be_empty
30
+ end
31
+
32
+ it 'does not register an offence for eval as method' do
33
+ inspect_source(a,
34
+ ['something.eval'])
35
+ expect(a.offences).to be_empty
36
+ end
37
+ end
38
+ end
39
+ end