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,147 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module Rubocop
6
+ module Cop
7
+ describe MethodLength do
8
+ let(:method_length) { MethodLength.new }
9
+ before { MethodLength.config = { 'Max' => 5, 'CountComments' => false } }
10
+
11
+ it 'rejects a method with more than 5 lines' do
12
+ inspect_source(method_length, ['def m()',
13
+ ' a = 1',
14
+ ' a = 2',
15
+ ' a = 3',
16
+ ' a = 4',
17
+ ' a = 5',
18
+ ' a = 6',
19
+ 'end'])
20
+ expect(method_length.offences.size).to eq(1)
21
+ expect(method_length.offences.map(&:line_number).sort).to eq([1])
22
+ end
23
+
24
+ it 'accepts a method with less than 5 lines' do
25
+ inspect_source(method_length, ['def m()',
26
+ ' a = 1',
27
+ ' a = 2',
28
+ ' a = 3',
29
+ ' a = 4',
30
+ 'end'])
31
+ expect(method_length.offences).to be_empty
32
+ end
33
+
34
+ it 'does not count blank lines' do
35
+ inspect_source(method_length, ['def m()',
36
+ ' a = 1',
37
+ ' a = 2',
38
+ ' a = 3',
39
+ ' a = 4',
40
+ '',
41
+ '',
42
+ ' a = 7',
43
+ 'end'])
44
+ expect(method_length.offences).to be_empty
45
+ end
46
+
47
+ it 'accepts empty methods' do
48
+ inspect_source(method_length, ['def m()',
49
+ 'end'])
50
+ expect(method_length.offences).to be_empty
51
+ end
52
+
53
+ it 'is not fooled by one-liner methods, syntax #1' do
54
+ inspect_source(method_length, ['def one_line; 10 end',
55
+ 'def self.m()',
56
+ ' a = 1',
57
+ ' a = 2',
58
+ ' a = 4',
59
+ ' a = 5',
60
+ ' a = 6',
61
+ 'end'])
62
+ expect(method_length.offences).to be_empty
63
+ end
64
+
65
+ it 'is not fooled by one-liner methods, syntax #2' do
66
+ inspect_source(method_length, ['def one_line(test) 10 end',
67
+ 'def self.m()',
68
+ ' a = 1',
69
+ ' a = 2',
70
+ ' a = 4',
71
+ ' a = 5',
72
+ ' a = 6',
73
+ 'end'])
74
+ expect(method_length.offences).to be_empty
75
+ end
76
+
77
+ it 'checks class methods, syntax #1' do
78
+ inspect_source(method_length, ['def self.m()',
79
+ ' a = 1',
80
+ ' a = 2',
81
+ ' a = 3',
82
+ ' a = 4',
83
+ ' a = 5',
84
+ ' a = 6',
85
+ 'end'])
86
+ expect(method_length.offences.size).to eq(1)
87
+ expect(method_length.offences.map(&:line_number).sort).to eq([1])
88
+ end
89
+
90
+ it 'checks class methods, syntax #2' do
91
+ inspect_source(method_length, ['class K',
92
+ ' class << self',
93
+ ' def m()',
94
+ ' a = 1',
95
+ ' a = 2',
96
+ ' a = 3',
97
+ ' a = 4',
98
+ ' a = 5',
99
+ ' a = 6',
100
+ ' end',
101
+ ' end',
102
+ 'end'])
103
+ expect(method_length.offences.size).to eq(1)
104
+ expect(method_length.offences.map(&:line_number).sort).to eq([3])
105
+ end
106
+
107
+ it 'properly counts lines when method ends with block' do
108
+ inspect_source(method_length, ['def m()',
109
+ ' something do',
110
+ ' a = 2',
111
+ ' a = 3',
112
+ ' a = 4',
113
+ ' a = 5',
114
+ ' end',
115
+ 'end'])
116
+ expect(method_length.offences.size).to eq(1)
117
+ expect(method_length.offences.map(&:line_number).sort).to eq([1])
118
+ end
119
+
120
+ it 'does not count commented lines by default' do
121
+ inspect_source(method_length, ['def m()',
122
+ ' a = 1',
123
+ ' #a = 2',
124
+ ' a = 3',
125
+ ' #a = 4',
126
+ ' a = 5',
127
+ ' a = 6',
128
+ 'end'])
129
+ expect(method_length.offences).to be_empty
130
+ end
131
+
132
+ it 'has the option of counting commented lines' do
133
+ MethodLength.config['CountComments'] = true
134
+ inspect_source(method_length, ['def m()',
135
+ ' a = 1',
136
+ ' #a = 2',
137
+ ' a = 3',
138
+ ' #a = 4',
139
+ ' a = 5',
140
+ ' a = 6',
141
+ 'end'])
142
+ expect(method_length.offences.size).to eq(1)
143
+ expect(method_length.offences.map(&:line_number).sort).to eq([1])
144
+ end
145
+ end
146
+ end
147
+ end
@@ -10,25 +10,25 @@ module Rubocop
10
10
  # if
11
11
 
12
12
  it 'registers an offence for then in multiline if' do
13
- inspect_source(mit, '', ['if cond then',
14
- 'end',
15
- "if cond then\t",
16
- 'end',
17
- 'if cond then ',
18
- 'end',
19
- 'if cond then # bad',
20
- 'end'])
13
+ inspect_source(mit, ['if cond then',
14
+ 'end',
15
+ "if cond then\t",
16
+ 'end',
17
+ 'if cond then ',
18
+ 'end',
19
+ 'if cond then # bad',
20
+ 'end'])
21
21
  expect(mit.offences.map(&:line_number)).to eq([1, 3, 5, 7])
22
22
  end
23
23
 
24
24
  it 'accepts multiline if without then' do
25
- inspect_source(mit, '', ['if cond',
26
- 'end'])
25
+ inspect_source(mit, ['if cond',
26
+ 'end'])
27
27
  expect(mit.offences.map(&:message)).to be_empty
28
28
  end
29
29
 
30
30
  it 'accepts table style if/then/elsif/ends' do
31
- inspect_source(mit, '',
31
+ inspect_source(mit,
32
32
  ['if @io == $stdout then str << "$stdout"',
33
33
  'elsif @io == $stdin then str << "$stdin"',
34
34
  'elsif @io == $stderr then str << "$stderr"',
@@ -40,15 +40,15 @@ module Rubocop
40
40
  # unless
41
41
 
42
42
  it 'registers an offence for then in multiline unless' do
43
- inspect_source(mit, '', ['unless cond then',
44
- 'end'])
43
+ inspect_source(mit, ['unless cond then',
44
+ 'end'])
45
45
  expect(mit.offences.map(&:message)).to eq(
46
46
  ['Never use then for multi-line if/unless.'])
47
47
  end
48
48
 
49
49
  it 'accepts multiline unless without then' do
50
- inspect_source(mit, '', ['unless cond',
51
- 'end'])
50
+ inspect_source(mit, ['unless cond',
51
+ 'end'])
52
52
  expect(mit.offences.map(&:message)).to be_empty
53
53
  end
54
54
  end
@@ -8,15 +8,14 @@ module Rubocop
8
8
  let(:lambda_literal) { NewLambdaLiteral.new }
9
9
 
10
10
  it 'registers an offence for an old lambda call' do
11
- inspect_source(lambda_literal, 'file.rb', ['f = lambda { |x| x }'])
12
- expect(lambda_literal.offences.map(&:message)).to eq(
13
- ['The new lambda literal syntax is preferred in Ruby 1.9.'])
11
+ inspect_source(lambda_literal, ['f = lambda { |x| x }'])
12
+ expect(lambda_literal.offences.size).to eq(1)
14
13
  end
15
14
 
16
15
  it 'accepts the new lambda literal' do
17
- inspect_source(lambda_literal, 'file.rb', ['lambda = ->(x) { x }',
18
- 'lambda.(1)'])
19
- expect(lambda_literal.offences.map(&:message)).to be_empty
16
+ inspect_source(lambda_literal, ['lambda = ->(x) { x }',
17
+ 'lambda.(1)'])
18
+ expect(lambda_literal.offences).to be_empty
20
19
  end
21
20
  end
22
21
  end
@@ -0,0 +1,31 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module Rubocop
6
+ module Cop
7
+ describe Not do
8
+ let(:a) { Not.new }
9
+
10
+ it 'registers an offence for not' do
11
+ inspect_source(a,
12
+ ['not test'])
13
+ expect(a.offences.size).to eq(1)
14
+ expect(a.offences.map(&:message))
15
+ .to eq([Not::MSG])
16
+ end
17
+
18
+ it 'does not register an offence for !' do
19
+ inspect_source(a,
20
+ ['!test'])
21
+ expect(a.offences).to be_empty
22
+ end
23
+
24
+ it 'does not register an offence for :not' do
25
+ inspect_source(a,
26
+ ['[:not, :if, :else]'])
27
+ expect(a.offences).to be_empty
28
+ end
29
+ end
30
+ end
31
+ end
@@ -8,40 +8,40 @@ module Rubocop
8
8
  let(:num) { NumericLiterals.new }
9
9
 
10
10
  it 'registers an offence for a long integer without underscores' do
11
- inspect_source(num, 'file.rb', ['a = 123456'])
11
+ inspect_source(num, ['a = 123456'])
12
12
  expect(num.offences.map(&:message)).to eq(
13
13
  ['Add underscores to large numeric literals to improve their ' +
14
14
  'readability.'])
15
15
  end
16
16
 
17
17
  it 'registers an offence for an integer with not enough underscores' do
18
- inspect_source(num, 'file.rb', ['a = 123456_789000'])
18
+ inspect_source(num, ['a = 123456_789000'])
19
19
  expect(num.offences.map(&:message)).to eq(
20
20
  ['Add underscores to large numeric literals to improve their ' +
21
21
  'readability.'])
22
22
  end
23
23
 
24
- it 'registers an offence for a long float without underscores' do
25
- inspect_source(num, 'file.rb', ['a = 1.234567'])
26
- expect(num.offences.map(&:message)).to eq(
27
- ['Add underscores to large numeric literals to improve their ' +
28
- 'readability.'])
29
- end
24
+ # it 'registers an offence for a long float without underscores' do
25
+ # inspect_source(num, ['a = 1.234567'])
26
+ # expect(num.offences.map(&:message)).to eq(
27
+ # ['Add underscores to large numeric literals to improve their ' +
28
+ # 'readability.'])
29
+ # end
30
30
 
31
31
  it 'accepts long numbers with underscore' do
32
- inspect_source(num, 'file.rb', ['a = 123_456',
33
- 'b = 1.234_56'])
32
+ inspect_source(num, ['a = 123_456',
33
+ 'b = 1.234_56'])
34
34
  expect(num.offences.map(&:message)).to be_empty
35
35
  end
36
36
 
37
37
  it 'accepts a short integer without underscore' do
38
- inspect_source(num, 'file.rb', ['a = 123'])
38
+ inspect_source(num, ['a = 123'])
39
39
  expect(num.offences.map(&:message)).to be_empty
40
40
  end
41
41
 
42
42
  it 'accepts short numbers without underscore' do
43
- inspect_source(num, 'file.rb', ['a = 123',
44
- 'b = 123.456'])
43
+ inspect_source(num, ['a = 123',
44
+ 'b = 123.456'])
45
45
  expect(num.offences.map(&:message)).to be_empty
46
46
  end
47
47
  end
@@ -18,6 +18,19 @@ module Rubocop
18
18
 
19
19
  expect(offence.to_s).to eq('C: 1: message')
20
20
  end
21
+
22
+ it 'does not blow up if a message contains %' do
23
+ offence = Offence.new(:convention, 1, 'message % test')
24
+
25
+ expect(offence.to_s).to eq('C: 1: message % test')
26
+ end
27
+
28
+ it 'redefines == to compare offences based on their contents' do
29
+ o1 = Offence.new(:test, 1, 'message')
30
+ o2 = Offence.new(:test, 1, 'message')
31
+
32
+ expect(o1 == o2).to be_true
33
+ end
21
34
  end
22
35
  end
23
36
  end
@@ -8,7 +8,7 @@ module Rubocop
8
8
  let(:olc) { OneLineConditional.new }
9
9
 
10
10
  it 'registers an offence for one line if/then/end' do
11
- inspect_source(olc, '', ['if cond then run else dont end'])
11
+ inspect_source(olc, ['if cond then run else dont end'])
12
12
  expect(olc.offences.map(&:message)).to eq([olc.error_message])
13
13
  end
14
14
  end
@@ -0,0 +1,78 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module Rubocop
6
+ module Cop
7
+ describe OpMethod do
8
+ let(:om) { OpMethod.new }
9
+
10
+ it 'registers an offence for arg not named other' do
11
+ inspect_source(om,
12
+ ['def +(another)',
13
+ ' another',
14
+ 'end'])
15
+ expect(om.offences.size).to eq(1)
16
+ expect(om.offences.map(&:message))
17
+ .to eq([sprintf(OpMethod::MSG, '+')])
18
+ end
19
+
20
+ it 'works properly even if the argument is not surrounded with braces' do
21
+ inspect_source(om,
22
+ ['def + another',
23
+ ' another',
24
+ 'end'])
25
+ expect(om.offences.size).to eq(1)
26
+ expect(om.offences.map(&:message))
27
+ .to eq([sprintf(OpMethod::MSG, '+')])
28
+ end
29
+
30
+ it 'does not register an offence for arg named other' do
31
+ inspect_source(om,
32
+ ['def +(other)',
33
+ ' other',
34
+ 'end'])
35
+ expect(om.offences).to be_empty
36
+ end
37
+
38
+ it 'does not register an offence for []' do
39
+ inspect_source(om,
40
+ ['def [](index)',
41
+ ' other',
42
+ 'end'])
43
+ expect(om.offences).to be_empty
44
+ end
45
+
46
+ it 'does not register an offence for []=' do
47
+ inspect_source(om,
48
+ ['def []=(index, value)',
49
+ ' other',
50
+ 'end'])
51
+ expect(om.offences).to be_empty
52
+ end
53
+
54
+ it 'does not register an offence for <<' do
55
+ inspect_source(om,
56
+ ['def <<(cop)',
57
+ ' other',
58
+ 'end'])
59
+ expect(om.offences).to be_empty
60
+ end
61
+
62
+ it 'does not register an offence for non binary operators' do
63
+ inspect_source(om,
64
+ ['def -@', # Unary minus
65
+ 'end',
66
+ '',
67
+ # This + is not a unary operator. It can only be
68
+ # called with dot notation.
69
+ 'def +',
70
+ 'end',
71
+ '',
72
+ 'def *(a, b)', # Quite strange, but legal ruby.
73
+ 'end'])
74
+ expect(om.offences).to be_empty
75
+ end
76
+ end
77
+ end
78
+ end
@@ -8,16 +8,16 @@ module Rubocop
8
8
  let(:list) { ParameterLists.new }
9
9
 
10
10
  it 'registers an offence for a method def with 5 parameters' do
11
- inspect_source(list, 'file.rb', ['def meth(a, b, c, d, e)',
12
- 'end'])
13
- expect(list.offences.map(&:message)).to eq(
14
- ['Avoid parameter lists longer than four parameters.'])
11
+ inspect_source(list, ['def meth(a, b, c, d, e)',
12
+ 'end'])
13
+ expect(list.messages).to eq(
14
+ ['Avoid parameter lists longer than 4 parameters.'])
15
15
  end
16
16
 
17
17
  it 'accepts a method def with 4 parameters' do
18
- inspect_source(list, 'file.rb', ['def meth(a, b, c, d)',
19
- 'end'])
20
- expect(list.offences.map(&:message)).to be_empty
18
+ inspect_source(list, ['def meth(a, b, c, d)',
19
+ 'end'])
20
+ expect(list.offences).to be_empty
21
21
  end
22
22
  end
23
23
  end
@@ -8,57 +8,54 @@ module Rubocop
8
8
  let(:pac) { ParenthesesAroundCondition.new }
9
9
 
10
10
  it 'registers an offence for parentheses around condition' do
11
- inspect_source(pac, 'file.rb', ['if (x > 10)',
12
- 'elsif (x < 3)',
13
- 'end',
14
- 'unless (x > 10)',
15
- 'end',
16
- 'while (x > 10)',
17
- 'end',
18
- 'until (x > 10)',
19
- 'end',
20
- 'x += 1 if (x < 10)',
21
- 'x += 1 unless (x < 10)',
22
- 'x += 1 while (x < 10)',
23
- 'x += 1 until (x < 10)',
24
- ])
25
- expect(pac.offences.map(&:message)).to eq(
26
- ["Don't use parentheses around the condition of an if/unless/" +
27
- 'while/until, unless the condition contains an assignment.'] * 9)
11
+ inspect_source(pac, ['if (x > 10)',
12
+ 'elsif (x < 3)',
13
+ 'end',
14
+ 'unless (x > 10)',
15
+ 'end',
16
+ 'while (x > 10)',
17
+ 'end',
18
+ 'until (x > 10)',
19
+ 'end',
20
+ 'x += 1 if (x < 10)',
21
+ 'x += 1 unless (x < 10)',
22
+ 'x += 1 while (x < 10)',
23
+ 'x += 1 until (x < 10)',
24
+ ])
25
+ expect(pac.offences.size).to eq(9)
28
26
  end
29
27
 
30
28
  it 'accepts condition without parentheses' do
31
- inspect_source(pac, 'file.rb', ['if x > 10',
32
- 'end',
33
- 'unless x > 10',
34
- 'end',
35
- 'while x > 10',
36
- 'end',
37
- 'until x > 10',
38
- 'end',
39
- 'x += 1 if x < 10',
40
- 'x += 1 unless x < 10',
41
- 'x += 1 while x < 10',
42
- 'x += 1 until x < 10',
43
- ])
44
- expect(pac.offences.map(&:message)).to be_empty
29
+ inspect_source(pac, ['if x > 10',
30
+ 'end',
31
+ 'unless x > 10',
32
+ 'end',
33
+ 'while x > 10',
34
+ 'end',
35
+ 'until x > 10',
36
+ 'end',
37
+ 'x += 1 if x < 10',
38
+ 'x += 1 unless x < 10',
39
+ 'x += 1 while x < 10',
40
+ 'x += 1 until x < 10',
41
+ ])
42
+ expect(pac.offences).to be_empty
45
43
  end
46
44
 
47
- # Parentheses are sometimes used to help the editor make nice
48
- # indentation of conditions spanning several lines.
49
- it 'accepts parentheses around multiline conditions' do
50
- inspect_source(pac, 'file.rb', ['if (@lex_state != EXPR_BEG &&',
51
- ' @lex_state != EXPR_FNAME &&',
52
- ' trans[1])',
53
- 'end'])
54
- expect(pac.offences.map(&:message)).to be_empty
45
+ it 'is not confused by leading brace in subexpression' do
46
+ inspect_source(pac, ['(a > b) && other ? one : two'])
47
+ expect(pac.offences).to be_empty
55
48
  end
56
49
 
57
- it 'accepts parentheses around assignment' do
58
- inspect_source(pac, 'file.rb', ['if (x = self.next_value)',
59
- 'end'])
60
- expect(pac.offences.map(&:message)).to be_empty
61
- end
50
+ # Parentheses are sometimes used to help the editor make nice
51
+ # indentation of conditions spanning several lines.
52
+ # it 'accepts parentheses around multiline conditions' do
53
+ # inspect_source(pac, ['if (@lex_state != EXPR_BEG &&',
54
+ # ' @lex_state != EXPR_FNAME &&',
55
+ # ' trans[1])',
56
+ # 'end'])
57
+ # expect(pac.offences.map(&:message)).to be_empty
58
+ # end
62
59
  end
63
60
  end
64
61
  end
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module Rubocop
6
+ module Cop
7
+ describe PercentR do
8
+ let(:apr) { PercentR.new }
9
+
10
+ it 'registers an offence for %r with zero or one slash in regexp' do
11
+ inspect_source(apr, ['x =~ %r(/home)',
12
+ 'y =~ %r(etc)'])
13
+ expect(apr.offences.map(&:message))
14
+ .to eq([PercentR::MSG] * 2)
15
+ end
16
+
17
+ it 'accepts %r with at least two slashes in regexp' do
18
+ inspect_source(apr, ['x =~ %r(/home/)',
19
+ 'y =~ %r(/////)'])
20
+ expect(apr.offences.map(&:message)).to be_empty
21
+ end
22
+
23
+ it 'accepts slash delimiters for regexp' do
24
+ inspect_source(apr, ['x =~ /\/home/'])
25
+ expect(apr.offences.map(&:message)).to be_empty
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,57 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module Rubocop
6
+ module Cop
7
+ describe ReduceArguments do
8
+ let(:reduce_arguments) { ReduceArguments.new }
9
+
10
+ it 'find wrong argument names in calls with different syntax' do
11
+ inspect_source(reduce_arguments,
12
+ ['def m',
13
+ ' [0, 1].reduce { |c, d| c + d }',
14
+ ' [0, 1].reduce{ |c, d| c + d }',
15
+ ' [0, 1].reduce(5) { |c, d| c + d }',
16
+ ' [0, 1].reduce(5){ |c, d| c + d }',
17
+ ' [0, 1].reduce (5) { |c, d| c + d }',
18
+ ' [0, 1].reduce(5) { |c, d| c + d }',
19
+ 'end'])
20
+ expect(reduce_arguments.offences.size).to eq(6)
21
+ expect(reduce_arguments.offences
22
+ .map(&:line_number).sort).to eq((2..7).to_a)
23
+ end
24
+
25
+ it 'allows calls with proper argument names' do
26
+ inspect_source(reduce_arguments,
27
+ ['def m',
28
+ ' [0, 1].reduce { |a, e| a + e }',
29
+ ' [0, 1].reduce{ |a, e| a + e }',
30
+ ' [0, 1].reduce(5) { |a, e| a + e }',
31
+ ' [0, 1].reduce(5){ |a, e| a + e }',
32
+ ' [0, 1].reduce (5) { |a, e| a + e }',
33
+ ' [0, 1].reduce(5) { |a, e| a + e }',
34
+ 'end'])
35
+ expect(reduce_arguments.offences).to be_empty
36
+ end
37
+
38
+ it 'ignores do..end blocks' do
39
+ inspect_source(reduce_arguments,
40
+ ['def m',
41
+ ' [0, 1].reduce do |c, d|',
42
+ ' c + d',
43
+ ' end',
44
+ 'end'])
45
+ expect(reduce_arguments.offences).to be_empty
46
+ end
47
+
48
+ it 'ignores :reduce symbols' do
49
+ inspect_source(reduce_arguments,
50
+ ['def m',
51
+ ' call_method(:reduce) { |a, b| a + b}',
52
+ 'end'])
53
+ expect(reduce_arguments.offences).to be_empty
54
+ end
55
+ end
56
+ end
57
+ end