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
@@ -8,16 +8,14 @@ module Rubocop
8
8
  let(:op) { MultilineTernaryOperator.new }
9
9
 
10
10
  it 'registers an offence for a multiline ternary operator expression' do
11
- inspect_source(op, 'file.rb', ['a = cond ?',
12
- ' b : c'])
13
- expect(op.offences.map(&:message)).to eq(
14
- ['Avoid multi-line ?: (the ternary operator); use if/unless ' +
15
- 'instead.'])
11
+ inspect_source(op, ['a = cond ?',
12
+ ' b : c'])
13
+ expect(op.offences.size).to eq(1)
16
14
  end
17
15
 
18
16
  it 'accepts a single line ternary operator expression' do
19
- inspect_source(op, 'file.rb', ['a = cond ? b : c'])
20
- expect(op.offences.map(&:message)).to be_empty
17
+ inspect_source(op, ['a = cond ? b : c'])
18
+ expect(op.offences).to be_empty
21
19
  end
22
20
  end
23
21
 
@@ -25,19 +23,17 @@ module Rubocop
25
23
  let(:op) { NestedTernaryOperator.new }
26
24
 
27
25
  it 'registers an offence for a nested ternary operator expression' do
28
- inspect_source(op, 'file.rb', ['a ? (b ? b1 : b2) : a2'])
29
- expect(op.offences.map(&:message)).to eq(
30
- ['Ternary operators must not be nested. Prefer if/else constructs ' +
31
- 'instead.'])
26
+ inspect_source(op, ['a ? (b ? b1 : b2) : a2'])
27
+ expect(op.offences.size).to eq(1)
32
28
  end
33
29
 
34
30
  it 'accepts a non-nested ternary operator within an if' do
35
- inspect_source(op, 'file.rb', ['a = if x',
36
- ' cond ? b : c',
37
- 'else',
38
- ' d',
39
- 'end'])
40
- expect(op.offences.map(&:message)).to be_empty
31
+ inspect_source(op, ['a = if x',
32
+ ' cond ? b : c',
33
+ 'else',
34
+ ' d',
35
+ 'end'])
36
+ expect(op.offences).to be_empty
41
37
  end
42
38
  end
43
39
  end
@@ -9,17 +9,17 @@ module Rubocop
9
9
 
10
10
  it 'registers an offence for a line ending with space' do
11
11
  source = ['x = 0 ']
12
- tws.inspect('file.rb', source, nil, nil)
12
+ tws.inspect(source, nil, nil, nil)
13
13
  expect(tws.offences.size).to eq(1)
14
14
  end
15
15
 
16
16
  it 'registers an offence for a line ending with tab' do
17
- tws.inspect('file.rb', ["x = 0\t"], nil, nil)
17
+ tws.inspect(["x = 0\t"], nil, nil, nil)
18
18
  expect(tws.offences.size).to eq(1)
19
19
  end
20
20
 
21
21
  it 'accepts a line without trailing whitespace' do
22
- tws.inspect('file.rb', ["x = 0\n"], nil, nil)
22
+ tws.inspect(["x = 0\n"], nil, nil, nil)
23
23
  expect(tws.offences).to be_empty
24
24
  end
25
25
  end
@@ -0,0 +1,329 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module Rubocop
6
+ module Cop
7
+ describe TrivialAccessors do
8
+ let(:trivial_accessors_finder) { TrivialAccessors.new }
9
+
10
+ before :each do
11
+ trivial_accessors_finder.offences.clear
12
+ end
13
+
14
+ it 'finds trivial reader' do
15
+ inspect_source(trivial_accessors_finder,
16
+ ['def foo',
17
+ ' @foo',
18
+ 'end',
19
+ '',
20
+ 'def Foo',
21
+ ' @Foo',
22
+ 'end'])
23
+ expect(trivial_accessors_finder.offences.size).to eq(2)
24
+ expect(trivial_accessors_finder.offences
25
+ .map(&:line_number).sort).to eq([1, 5])
26
+ end
27
+
28
+ it 'finds trivial reader in a class' do
29
+ inspect_source(trivial_accessors_finder,
30
+ ['class TrivialFoo',
31
+ ' def foo',
32
+ ' @foo',
33
+ ' end',
34
+ ' def bar',
35
+ ' !foo',
36
+ ' end',
37
+ 'end'])
38
+ expect(trivial_accessors_finder.offences.size).to eq(1)
39
+ expect(trivial_accessors_finder.offences
40
+ .map(&:line_number).sort).to eq([2])
41
+ end
42
+
43
+ it 'finds trivial reader in a nested class' do
44
+ inspect_source(trivial_accessors_finder,
45
+ ['class TrivialFoo',
46
+ ' class Nested',
47
+ ' def foo',
48
+ ' @foo',
49
+ ' end',
50
+ ' end',
51
+ 'end'])
52
+ expect(trivial_accessors_finder.offences.size).to eq(1)
53
+ expect(trivial_accessors_finder.offences
54
+ .map(&:line_number).sort).to eq([3])
55
+ end
56
+
57
+ it 'finds trivial readers in a little less trivial class' do
58
+ inspect_source(trivial_accessors_finder,
59
+ ['class TrivialFoo',
60
+ ' def foo',
61
+ ' @foo',
62
+ ' end',
63
+ ' def foo_and_bar',
64
+ ' @foo_bar = @foo + @bar',
65
+ ' end',
66
+ ' def foo_bar',
67
+ ' @foo_bar',
68
+ ' end',
69
+ ' def foo?',
70
+ ' foo.present?',
71
+ ' end',
72
+ ' def bar?',
73
+ ' !bar',
74
+ ' end',
75
+ ' def foobar',
76
+ ' foo? ? foo.value : "bar"',
77
+ ' end',
78
+ ' def bar',
79
+ ' foo.bar',
80
+ ' end',
81
+ ' def foo_required?',
82
+ ' super && !bar_required?',
83
+ ' end',
84
+ ' def self.from_omniauth(auth)',
85
+ ' foobars.each do |f|',
86
+ ' # do stuff',
87
+ ' end',
88
+ ' end',
89
+ ' def regex',
90
+ ' %r{\A#{visit node}\Z}',
91
+ ' end',
92
+ ' def array',
93
+ ' [foo, bar].join',
94
+ ' end',
95
+ ' def string',
96
+ ' "string"',
97
+ ' end',
98
+ ' def class',
99
+ ' Foo.class',
100
+ ' end',
101
+ ' def with_return',
102
+ ' return foo',
103
+ ' end',
104
+ ' def captures',
105
+ ' (length - 1).times.map { |i| self[i + 1] }',
106
+ ' end',
107
+ ' def foo val',
108
+ ' super',
109
+ ' @val',
110
+ ' end',
111
+ 'end'])
112
+ expect(trivial_accessors_finder.offences.size).to eq(2)
113
+ expect(trivial_accessors_finder.offences
114
+ .map(&:line_number).sort).to eq([2, 8])
115
+ end
116
+
117
+ it 'finds trivial reader with braces' do
118
+ inspect_source(trivial_accessors_finder,
119
+ ['class Test',
120
+ ' # trivial reader with braces',
121
+ ' def name()',
122
+ ' @name',
123
+ ' end',
124
+ 'end'])
125
+ expect(trivial_accessors_finder.offences.size).to eq(1)
126
+ expect(trivial_accessors_finder.offences
127
+ .map(&:line_number).sort).to eq([3])
128
+ end
129
+
130
+ it 'finds trivial writer without braces' do
131
+ inspect_source(trivial_accessors_finder,
132
+ ['class Test',
133
+ ' # trivial writer without braces',
134
+ ' def name= name',
135
+ ' @name = name',
136
+ ' end',
137
+ 'end'])
138
+ expect(trivial_accessors_finder.offences.size).to eq(1)
139
+ expect(trivial_accessors_finder.offences
140
+ .map(&:line_number).sort).to eq([3])
141
+ end
142
+
143
+ it 'does not find trivial writer with function calls' do
144
+ inspect_source(trivial_accessors_finder,
145
+ ['class TrivialTest',
146
+ ' def test=(val)',
147
+ ' @test = val',
148
+ ' some_function_call',
149
+ ' or_more_of_them',
150
+ ' end',
151
+ 'end'])
152
+ expect(trivial_accessors_finder.offences).to be_empty
153
+ end
154
+
155
+ it 'finds trivials with less peculiar methods' do
156
+ inspect_source(trivial_accessors_finder,
157
+ ['class NilStats',
158
+ 'def most_traded_pair',
159
+ 'end',
160
+ 'def win_ratio',
161
+ 'end',
162
+ 'def win_ratio_percentage()',
163
+ 'end',
164
+ 'def pips_won',
165
+ ' 0.0',
166
+ 'end',
167
+ 'def gain_at(date)',
168
+ ' 1',
169
+ 'end',
170
+ 'def gain_percentage',
171
+ ' 0',
172
+ 'end',
173
+ 'def gain_breakdown(options = {})',
174
+ ' []',
175
+ 'end',
176
+ 'def copy_to_all_ratio',
177
+ ' nil',
178
+ 'end',
179
+ 'def trade_population',
180
+ ' {}',
181
+ 'end',
182
+ 'def average_leverage',
183
+ ' 1',
184
+ 'end',
185
+ 'def with_yield',
186
+ ' yield',
187
+ 'rescue Error => e',
188
+ ' #do stuff',
189
+ 'end',
190
+ 'end'])
191
+ expect(trivial_accessors_finder.offences).to be_empty
192
+ end
193
+
194
+ it 'finds oneliner trivials' do
195
+ inspect_source(trivial_accessors_finder,
196
+ ['class Oneliner',
197
+ ' def foo; @foo; end',
198
+ ' def foo= foo; @foo = foo; end',
199
+ 'end'])
200
+ expect(trivial_accessors_finder.offences.size).to eq(2)
201
+ expect(trivial_accessors_finder.offences
202
+ .map(&:line_number).sort).to eq([2, 3])
203
+ end
204
+
205
+ it 'does not find a trivial reader' do
206
+ inspect_source(trivial_accessors_finder,
207
+ ['def bar',
208
+ ' @bar + foo',
209
+ 'end'])
210
+ expect(trivial_accessors_finder.offences).to be_empty
211
+ end
212
+
213
+ it 'finds trivial writer' do
214
+ inspect_source(trivial_accessors_finder,
215
+ ['def foo=(val)',
216
+ ' @foo = val',
217
+ 'end'])
218
+ expect(trivial_accessors_finder.offences.size).to eq(1)
219
+ expect(trivial_accessors_finder.offences
220
+ .map(&:line_number).sort).to eq([1])
221
+ end
222
+
223
+ it 'finds trivial writer in a class' do
224
+ inspect_source(trivial_accessors_finder,
225
+ ['class TrivialFoo',
226
+ ' def foo=(val)',
227
+ ' @foo = val',
228
+ ' end',
229
+ ' def void(no_value)',
230
+ ' end',
231
+ ' def inspect(sexp)',
232
+ ' each(:def, sexp) do |item|',
233
+ ' #do stuff',
234
+ ' end',
235
+ ' end',
236
+ ' def if_method(foo)',
237
+ ' if true',
238
+ ' unless false',
239
+ ' #do stuff',
240
+ ' end',
241
+ ' end',
242
+ ' end',
243
+ 'end'])
244
+ expect(trivial_accessors_finder.offences.size).to eq(1)
245
+ expect(trivial_accessors_finder.offences
246
+ .map(&:line_number).sort).to eq([2])
247
+ end
248
+
249
+ it 'finds trivial accessors in a little less trivial class' do
250
+ inspect_source(trivial_accessors_finder,
251
+ ['class TrivialFoo',
252
+ ' def foo',
253
+ ' @foo',
254
+ ' end',
255
+ ' def foo_and_bar',
256
+ ' @foo_bar = @foo + @bar',
257
+ ' end',
258
+ ' def foo_bar',
259
+ ' @foo_bar',
260
+ ' end',
261
+ ' def bar=(bar_value)',
262
+ ' @bar = bar_value',
263
+ ' end',
264
+ 'end'])
265
+ expect(trivial_accessors_finder.offences.size).to eq(3)
266
+ expect(trivial_accessors_finder.offences
267
+ .map(&:line_number).sort).to eq([2, 8, 11])
268
+ end
269
+
270
+ it 'does not find a trivial writer' do
271
+ inspect_source(trivial_accessors_finder,
272
+ ['def bar=(value)',
273
+ ' @bar = value + 42',
274
+ 'end'])
275
+ expect(trivial_accessors_finder.offences).to be_empty
276
+ end
277
+
278
+ it 'finds trivial writers in a little less trivial class' do
279
+ inspect_source(trivial_accessors_finder,
280
+ ['class TrivialFoo',
281
+ ' def foo_bar=(foo, bar)',
282
+ ' @foo_bar = foo + bar',
283
+ ' end',
284
+ ' def universal=(answer=42)',
285
+ ' @universal = answer',
286
+ ' end',
287
+ ' def bar=(bar_value)',
288
+ ' @bar = bar_value',
289
+ ' end',
290
+ 'end'])
291
+ expect(trivial_accessors_finder.offences.size).to eq(2)
292
+ expect(trivial_accessors_finder.offences
293
+ .map(&:line_number).sort).to eq([5, 8])
294
+ end
295
+
296
+ it 'does not find trivial accessors with method calls' do
297
+ inspect_source(trivial_accessors_finder,
298
+ ['class TrivialFoo',
299
+ ' def foo_bar(foo)',
300
+ ' foo_bar = foo + 42',
301
+ ' end',
302
+ ' def foo(value)',
303
+ ' foo = []',
304
+ ' # do stuff',
305
+ ' foo',
306
+ ' end',
307
+ ' def bar',
308
+ ' foo_method',
309
+ ' end',
310
+ 'end'])
311
+ expect(trivial_accessors_finder.offences).to be_empty
312
+ end
313
+
314
+ it 'does not find trivial writer with exceptions' do
315
+ inspect_source(trivial_accessors_finder,
316
+ [' def expiration_formatted=(value)',
317
+ ' begin',
318
+ ' @expiration = foo_stuff',
319
+ ' rescue ArgumentError',
320
+ ' @expiration = nil',
321
+ ' end',
322
+ ' self[:expiration] = @expiration',
323
+ ' end'])
324
+ expect(trivial_accessors_finder.offences).to be_empty
325
+ end
326
+
327
+ end # describe TrivialAccessors
328
+ end # Cop
329
+ end # Rubocop
@@ -8,20 +8,20 @@ module Rubocop
8
8
  let(:ue) { UnlessElse.new }
9
9
 
10
10
  it 'registers an offence for an unless with else' do
11
- inspect_source(ue, 'file.rb', ['unless x',
12
- ' a = 1',
13
- 'else',
14
- ' a = 0',
15
- 'end'])
11
+ inspect_source(ue, ['unless x',
12
+ ' a = 1',
13
+ 'else',
14
+ ' a = 0',
15
+ 'end'])
16
16
  expect(ue.offences.map(&:message)).to eq(
17
17
  ['Never use unless with else. Rewrite these with the ' +
18
18
  'positive case first.'])
19
19
  end
20
20
 
21
21
  it 'accepts an unless without else' do
22
- inspect_source(ue, 'file.rb', ['unless x',
23
- ' a = 1',
24
- 'end'])
22
+ inspect_source(ue, ['unless x',
23
+ ' a = 1',
24
+ 'end'])
25
25
  expect(ue.offences.map(&:message)).to be_empty
26
26
  end
27
27
  end
@@ -0,0 +1,49 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module Rubocop
6
+ module Cop
7
+ describe VariableInterpolation do
8
+ let(:vi) { VariableInterpolation.new }
9
+
10
+ it 'registers an offence for interpolated global variables' do
11
+ inspect_source(vi,
12
+ ['puts "this is a #$test"'])
13
+ expect(vi.offences.size).to eq(1)
14
+ expect(vi.offences.map(&:message))
15
+ .to eq(['Replace interpolated var $test with expression #{$test}.'])
16
+ end
17
+
18
+ it 'registers an offence for interpolated regexp back references' do
19
+ inspect_source(vi,
20
+ ['puts "this is a #$1"'])
21
+ expect(vi.offences.size).to eq(1)
22
+ expect(vi.offences.map(&:message))
23
+ .to eq(['Replace interpolated var $1 with expression #{$1}.'])
24
+ end
25
+
26
+ it 'registers an offence for interpolated instance variables' do
27
+ inspect_source(vi,
28
+ ['puts "this is a #@test"'])
29
+ expect(vi.offences.size).to eq(1)
30
+ expect(vi.offences.map(&:message))
31
+ .to eq(['Replace interpolated var @test with expression #{@test}.'])
32
+ end
33
+
34
+ it 'registers an offence for interpolated class variables' do
35
+ inspect_source(vi,
36
+ ['puts "this is a #@@t"'])
37
+ expect(vi.offences.size).to eq(1)
38
+ expect(vi.offences.map(&:message))
39
+ .to eq(['Replace interpolated var @@t with expression #{@@t}.'])
40
+ end
41
+
42
+ it 'does not register an offence for variables in expressions' do
43
+ inspect_source(vi,
44
+ ['puts "this is a #{@test} #{@@t} #{$t} #{$1}"'])
45
+ expect(vi.offences).to be_empty
46
+ end
47
+ end
48
+ end
49
+ end
@@ -8,29 +8,29 @@ module Rubocop
8
8
  let(:wt) { WhenThen.new }
9
9
 
10
10
  it 'registers an offence for when x;' do
11
- inspect_source(wt, 'file.rb', ['case a',
12
- 'when b; c',
13
- 'end'])
11
+ inspect_source(wt, ['case a',
12
+ 'when b; c',
13
+ 'end'])
14
14
  expect(wt.offences.map(&:message)).to eq(
15
15
  ['Never use "when x;". Use "when x then" instead.'])
16
16
  end
17
17
 
18
18
  it 'accepts when x then' do
19
- inspect_source(wt, 'file.rb', ['case a',
20
- 'when b then c',
21
- 'end'])
19
+ inspect_source(wt, ['case a',
20
+ 'when b then c',
21
+ 'end'])
22
22
  expect(wt.offences.map(&:message)).to be_empty
23
23
  end
24
24
 
25
25
  it 'accepts ; separating statements in the body of when' do
26
- inspect_source(wt, 'file.rb', ['case a',
27
- 'when b then c; d',
28
- 'end',
29
- '',
30
- 'case e',
31
- 'when f',
32
- ' g; h',
33
- 'end'])
26
+ inspect_source(wt, ['case a',
27
+ 'when b then c; d',
28
+ 'end',
29
+ '',
30
+ 'case e',
31
+ 'when f',
32
+ ' g; h',
33
+ 'end'])
34
34
  expect(wt.offences.map(&:message)).to be_empty
35
35
  end
36
36
  end
@@ -0,0 +1,47 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module Rubocop
6
+ module Cop
7
+ describe WordArray do
8
+ let(:wa) { WordArray.new }
9
+
10
+ it 'registers an offence for arrays of single quoted strings' do
11
+ inspect_source(wa,
12
+ ["['one', 'two', 'three']"])
13
+ expect(wa.offences.size).to eq(1)
14
+ end
15
+
16
+ it 'registers an offence for arrays of double quoted strings' do
17
+ inspect_source(wa,
18
+ ['["one", "two", "three"]'])
19
+ expect(wa.offences.size).to eq(1)
20
+ end
21
+
22
+ it 'does not register an offence for array of non-words' do
23
+ inspect_source(wa,
24
+ ['["one space", "two", "three"]'])
25
+ expect(wa.offences).to be_empty
26
+ end
27
+
28
+ it 'does not register an offence for array starting with %w' do
29
+ inspect_source(wa,
30
+ ['%w(one two three)'])
31
+ expect(wa.offences).to be_empty
32
+ end
33
+
34
+ it 'does not register an offence for array with one element' do
35
+ inspect_source(wa,
36
+ ['["three"]'])
37
+ expect(wa.offences).to be_empty
38
+ end
39
+
40
+ it 'does not register an offence for array with empty strings' do
41
+ inspect_source(wa,
42
+ ['["", "two", "three"]'])
43
+ expect(wa.offences).to be_empty
44
+ end
45
+ end
46
+ end
47
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,8 +1,17 @@
1
1
  # encoding: utf-8
2
2
 
3
- if ENV['COVERAGE']
3
+ if ENV['TRAVIS'] || ENV['COVERAGE']
4
4
  require 'simplecov'
5
- SimpleCov.start
5
+
6
+ if ENV['TRAVIS']
7
+ require 'coveralls'
8
+ SimpleCov.formatter = Coveralls::SimpleCov::Formatter
9
+ end
10
+
11
+ SimpleCov.start do
12
+ add_filter '/spec/'
13
+ add_filter '/vendor/bundle/'
14
+ end
6
15
  end
7
16
 
8
17
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
@@ -11,9 +20,8 @@ require 'rspec'
11
20
  require 'rubocop'
12
21
  require 'rubocop/cli'
13
22
 
14
- # Requires supporting files with custom matchers and macros, etc,
15
- # in ./support/ and its subdirectories.
16
- Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
23
+ # disable colors in specs
24
+ Sickill::Rainbow.enabled = false
17
25
 
18
26
  module ExitCodeMatchers
19
27
  RSpec::Matchers.define :exit_with_code do |code|
@@ -41,6 +49,8 @@ end
41
49
 
42
50
  RSpec.configure do |config|
43
51
  config.filter_run_excluding ruby: ->(v) { !RUBY_VERSION.start_with?(v.to_s) }
52
+ config.filter_run_excluding broken: true
53
+ config.treat_symbols_as_metadata_keys_with_true_values = true
44
54
 
45
55
  config.expect_with :rspec do |c|
46
56
  c.syntax = :expect # disables `should`
@@ -49,8 +59,19 @@ RSpec.configure do |config|
49
59
  config.include(ExitCodeMatchers)
50
60
  end
51
61
 
52
- def inspect_source(cop, file, source)
53
- tokens, sexp, correlations = Rubocop::CLI.rip_source(source)
54
- cop.correlations = correlations
55
- cop.inspect(file, source, tokens, sexp)
62
+ # Requires supporting files with custom matchers and macros, etc,
63
+ # in ./support/ and its subdirectories.
64
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
65
+
66
+ def inspect_source(cop, source)
67
+ ast, comments, tokens, _ = Rubocop::CLI.parse('(string)') do |source_buffer|
68
+ source_buffer.source = source.join($RS)
69
+ end
70
+ cop.inspect(source, tokens, ast, comments)
71
+ end
72
+
73
+ class Rubocop::Cop::Cop
74
+ def messages
75
+ offences.map(&:message)
76
+ end
56
77
  end
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+
3
+ require 'fileutils'
4
+
5
+ module FileHelper
6
+ def create_file(file_path, content)
7
+ file_path = File.expand_path(file_path)
8
+
9
+ dir_path = File.dirname(file_path)
10
+ FileUtils.makedirs dir_path unless File.exists?(dir_path)
11
+
12
+ File.open(file_path, 'w') do |file|
13
+ case content
14
+ when String
15
+ file.puts content
16
+ when Array
17
+ file.puts content.join("\n")
18
+ end
19
+ end
20
+ end
21
+ end