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,11 +8,18 @@ module Rubocop
8
8
  let(:space) { SpaceAroundOperators.new }
9
9
 
10
10
  it 'registers an offence for assignment without space on both sides' do
11
- inspect_source(space, 'file.rb', ['x=0', 'y= 0', 'z =0'])
11
+ inspect_source(space, ['x=0', 'y= 0', 'z =0'])
12
12
  expect(space.offences.map(&:message)).to eq(
13
13
  ["Surrounding space missing for operator '='."] * 3)
14
14
  end
15
15
 
16
+ it 'registers an offence for ternary operator without space' do
17
+ inspect_source(space, ['x == 0?1:2'])
18
+ expect(space.offences.map(&:message)).to eq(
19
+ ["Surrounding space missing for operator '?'.",
20
+ "Surrounding space missing for operator ':'."])
21
+ end
22
+
16
23
  it 'registers an offence in presence of modifier if statement' do
17
24
  check_modifier('if')
18
25
  end
@@ -32,14 +39,14 @@ module Rubocop
32
39
  def check_modifier(keyword)
33
40
  src = ["a=1 #{keyword} condition",
34
41
  'c=2']
35
- inspect_source(space, 'file.rb', src)
42
+ inspect_source(space, src)
36
43
  expect(space.offences.map(&:line_number)).to eq([1, 2])
37
44
  expect(space.offences.map(&:message)).to eq(
38
45
  ["Surrounding space missing for operator '='."] * 2)
39
46
  end
40
47
 
41
48
  it 'registers an offence for binary operators that could be unary' do
42
- inspect_source(space, 'file.rb', ['a-3', 'x&0xff', 'z+0'])
49
+ inspect_source(space, ['a-3', 'x&0xff', 'z+0'])
43
50
  expect(space.offences.map(&:message)).to eq(
44
51
  ["Surrounding space missing for operator '-'.",
45
52
  "Surrounding space missing for operator '&'.",
@@ -47,99 +54,154 @@ module Rubocop
47
54
  end
48
55
 
49
56
  it 'registers an offence for arguments to a method' do
50
- inspect_source(space, 'file.rb', ['puts 1+2'])
57
+ inspect_source(space, ['puts 1+2'])
51
58
  expect(space.offences.map(&:message)).to eq(
52
59
  ["Surrounding space missing for operator '+'."])
53
60
  end
54
61
 
55
62
  it 'accepts operator symbols' do
56
- inspect_source(space, 'file.rb', ['func(:-)'])
63
+ inspect_source(space, ['func(:-)'])
57
64
  expect(space.offences.map(&:message)).to be_empty
58
65
  end
59
66
 
60
67
  it 'accepts ranges' do
61
- inspect_source(space, 'file.rb', ['a, b = (1..2), (1...3)'])
68
+ inspect_source(space, ['a, b = (1..2), (1...3)'])
62
69
  expect(space.offences.map(&:message)).to be_empty
63
70
  end
64
71
 
65
72
  it 'accepts scope operator' do
66
73
  source = ['@io.class == Zlib::GzipWriter']
67
- inspect_source(space, 'file.rb', source)
74
+ inspect_source(space, source)
68
75
  expect(space.offences.map(&:message)).to be_empty
69
76
  end
70
77
 
71
78
  it 'accepts ::Kernel::raise' do
72
79
  source = ['::Kernel::raise IllegalBlockError.new']
73
- inspect_source(space, 'file.rb', source)
80
+ inspect_source(space, source)
74
81
  expect(space.offences.map(&:message)).to be_empty
75
82
  end
76
83
 
77
84
  it 'accepts exclamation point negation' do
78
- inspect_source(space, 'file.rb', ['x = !a&&!b'])
85
+ inspect_source(space, ['x = !a&&!b'])
79
86
  expect(space.offences.map(&:message)).to eq(
80
87
  ["Surrounding space missing for operator '&&'."])
81
88
  end
82
89
 
83
90
  it 'accepts exclamation point definition' do
84
- inspect_source(space, 'file.rb', [' def !',
85
- ' !__getobj__',
86
- ' end'])
91
+ inspect_source(space, [' def !',
92
+ ' !__getobj__',
93
+ ' end'])
87
94
  expect(space.offences).to be_empty
88
95
  expect(space.offences.map(&:message)).to be_empty
89
96
  end
90
97
 
91
98
  it 'accepts a unary' do
92
- inspect_source(space, 'file.rb',
99
+ inspect_source(space,
93
100
  [' def bm(label_width = 0, *labels, &blk)',
94
101
  ' benchmark(CAPTION, label_width, FORMAT,',
95
102
  ' *labels, &blk)',
96
103
  ' end',
104
+ '',
105
+ ' def each &block',
106
+ ' end',
107
+ '',
108
+ ' def each *args',
109
+ ' end',
97
110
  ''])
98
111
  expect(space.offences.map(&:message)).to be_empty
99
112
  end
100
113
 
101
114
  it 'accepts splat operator' do
102
- inspect_source(space, 'file.rb', ['return *list if options'])
115
+ inspect_source(space, ['return *list if options'])
103
116
  expect(space.offences.map(&:message)).to be_empty
104
117
  end
105
118
 
106
119
  it 'accepts def of operator' do
107
- inspect_source(space, 'file.rb', ['def +(other); end'])
120
+ inspect_source(space, ['def +(other); end',
121
+ 'def self.===(other); end'])
108
122
  expect(space.offences.map(&:message)).to be_empty
109
123
  end
110
124
 
125
+ it 'accepts an operator at the end of a line' do
126
+ inspect_source(space,
127
+ ["['Favor unless over if for negative ' +",
128
+ " 'conditions.'] * 2"])
129
+ expect(space.offences.map(&:message)).to eq([])
130
+ end
131
+
111
132
  it 'accepts an assignment with spaces' do
112
- inspect_source(space, 'file.rb', ['x = 0'])
133
+ inspect_source(space, ['x = 0'])
113
134
  expect(space.offences).to be_empty
114
135
  end
115
136
 
137
+ it 'registers an offence for operators without spaces' do
138
+ inspect_source(space,
139
+ ['x+= a+b-c*d/e%f^g|h&i||j',
140
+ 'y -=k&&l'])
141
+ expect(space.offences.map(&:message))
142
+ .to eq(["Surrounding space missing for operator '+='.",
143
+ "Surrounding space missing for operator '+'.",
144
+ "Surrounding space missing for operator '-'.",
145
+ "Surrounding space missing for operator '*'.",
146
+ "Surrounding space missing for operator '/'.",
147
+ "Surrounding space missing for operator '%'.",
148
+ "Surrounding space missing for operator '^'.",
149
+ "Surrounding space missing for operator '|'.",
150
+ "Surrounding space missing for operator '&'.",
151
+ "Surrounding space missing for operator '||'.",
152
+ "Surrounding space missing for operator '-='.",
153
+ "Surrounding space missing for operator '&&'."])
154
+ end
155
+
156
+ it 'accepts operators with spaces' do
157
+ inspect_source(space,
158
+ ['x += a + b - c * d / e % f ^ g | h & i || j',
159
+ 'y -= k && l'])
160
+ expect(space.offences.map(&:message)).to eq([])
161
+ end
162
+
116
163
  it "accepts some operators that are exceptions and don't need spaces" do
117
- inspect_source(space, 'file.rb', ['(1..3)',
118
- 'ActionController::Base',
119
- 'each { |s, t| }'])
120
- expect(space.offences.map(&:message)).to be_empty
164
+ inspect_source(space, ['(1..3)',
165
+ 'ActionController::Base',
166
+ 'each { |s, t| }'])
167
+ expect(space.offences.map(&:message)).to eq([])
121
168
  end
122
169
 
123
170
  it 'accepts an assignment followed by newline' do
124
- inspect_source(space, 'file.rb', ['x =\n 0'])
171
+ inspect_source(space, ['x =', '0'])
125
172
  expect(space.offences).to be_empty
126
173
  end
127
174
 
128
175
  it 'registers an offences for exponent operator with spaces' do
129
- inspect_source(space, 'file.rb', ['x = a * b ** 2'])
176
+ inspect_source(space, ['x = a * b ** 2'])
130
177
  expect(space.offences.map(&:message)).to eq(
131
178
  ['Space around operator ** detected.'])
132
179
  end
133
180
 
134
181
  it 'accepts exponent operator without spaces' do
135
- inspect_source(space, 'file.rb', ['x = a * b**2'])
182
+ inspect_source(space, ['x = a * b**2'])
136
183
  expect(space.offences).to be_empty
137
184
  end
138
185
 
139
186
  it 'accepts unary operators without space' do
140
- inspect_source(space, 'file.rb', ['[].map(&:size)',
141
- '-3',
142
- 'x = +2'])
187
+ inspect_source(space, ['[].map(&:size)',
188
+ '-3',
189
+ 'x = +2'])
190
+ expect(space.offences.map(&:message)).to eq([])
191
+ end
192
+
193
+ it 'accepts argument default values without space' do
194
+ # These are handled by SpaceAroundEqualsInParameterDefault,
195
+ # so SpaceAroundOperators leaves them alone.
196
+ inspect_source(space,
197
+ ['def init(name=nil)',
198
+ 'end'])
199
+ expect(space.offences.map(&:message)).to be_empty
200
+ end
201
+
202
+ it 'accepts the construct class <<self with no space after <<' do
203
+ inspect_source(space, ['class <<self',
204
+ 'end'])
143
205
  expect(space.offences.map(&:message)).to be_empty
144
206
  end
145
207
  end
@@ -8,33 +8,39 @@ module Rubocop
8
8
  let(:space) { SpaceInsideBrackets.new }
9
9
 
10
10
  it 'registers an offence for an array literal with spaces inside' do
11
- inspect_source(space, 'file.rb', ['a = [1, 2 ]',
11
+ inspect_source(space, ['a = [1, 2 ]',
12
12
  'b = [ 1, 2]'])
13
13
  expect(space.offences.map(&:message)).to eq(
14
14
  ['Space inside square brackets detected.',
15
15
  'Space inside square brackets detected.'])
16
16
  end
17
17
 
18
+ it 'accepts space inside strings within square brackets' do
19
+ inspect_source(space, ["['Encoding:',",
20
+ " ' Enabled: false']"])
21
+ expect(space.offences.map(&:message)).to be_empty
22
+ end
23
+
18
24
  it 'accepts space inside square brackets if on its own row' do
19
- inspect_source(space, 'file.rb', ['a = [',
20
- ' 1, 2',
21
- ' ]'])
25
+ inspect_source(space, ['a = [',
26
+ ' 1, 2',
27
+ ' ]'])
22
28
  expect(space.offences.map(&:message)).to be_empty
23
29
  end
24
30
 
25
31
  it 'accepts square brackets as method name' do
26
- inspect_source(space, 'file.rb', ['def Vector.[](*array)',
32
+ inspect_source(space, ['def Vector.[](*array)',
27
33
  'end'])
28
34
  expect(space.offences.map(&:message)).to be_empty
29
35
  end
30
36
 
31
37
  it 'accepts square brackets called with method call syntax' do
32
- inspect_source(space, 'file.rb', ['subject.[](0)'])
38
+ inspect_source(space, ['subject.[](0)'])
33
39
  expect(space.offences.map(&:message)).to be_empty
34
40
  end
35
41
 
36
42
  it 'only reports a single space once' do
37
- inspect_source(space, 'file.rb', ['[ ]'])
43
+ inspect_source(space, ['[ ]'])
38
44
  expect(space.offences.map(&:message)).to eq(
39
45
  ['Space inside square brackets detected.'])
40
46
  end
@@ -0,0 +1,79 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module Rubocop
6
+ module Cop
7
+ describe SpaceInsideHashLiteralBraces do
8
+ let(:sihlb) { SpaceInsideHashLiteralBraces.new }
9
+ before do
10
+ SpaceInsideHashLiteralBraces.config = {
11
+ 'EnforcedStyleIsWithSpaces' => true
12
+ }
13
+ end
14
+
15
+ it 'registers an offence for hashes with no spaces by default' do
16
+ inspect_source(sihlb,
17
+ ['h = {a: 1, b: :two}',
18
+ 'h = {a => 1 }'])
19
+ expect(sihlb.offences.map(&:message)).to eq(
20
+ ['Space inside hash literal braces missing.'] * 3)
21
+ end
22
+
23
+ it 'registers an offence for hashes with no spaces if so configured' do
24
+ inspect_source(sihlb,
25
+ ['h = {a: 1, b: 2}',
26
+ 'h = {a => 1 }'])
27
+ expect(sihlb.offences.map(&:message)).to eq(
28
+ ['Space inside hash literal braces missing.'] * 3)
29
+ end
30
+
31
+ it 'registers an offence for hashes with spaces if so configured' do
32
+ SpaceInsideHashLiteralBraces.config['EnforcedStyleIsWithSpaces'] =
33
+ false
34
+ inspect_source(sihlb,
35
+ ['h = { a: 1, b: 2 }'])
36
+ expect(sihlb.offences.map(&:message)).to eq(
37
+ ['Space inside hash literal braces detected.'] * 2)
38
+ end
39
+
40
+ it 'accepts hashes with spaces by default' do
41
+ inspect_source(sihlb,
42
+ ['h = { a: 1, b: 2 }',
43
+ 'h = { a => 1 }'])
44
+ expect(sihlb.offences.map(&:message)).to be_empty
45
+ end
46
+
47
+ it 'accepts hashes with no spaces if so configured' do
48
+ SpaceInsideHashLiteralBraces.config['EnforcedStyleIsWithSpaces'] =
49
+ false
50
+ inspect_source(sihlb,
51
+ ['h = {a: 1, b: 2}',
52
+ 'h = {a => 1}'])
53
+ expect(sihlb.offences.map(&:message)).to be_empty
54
+ end
55
+
56
+ it 'accepts empty hashes without spaces by default' do
57
+ inspect_source(sihlb, ['h = {}'])
58
+ expect(sihlb.offences).to be_empty
59
+ end
60
+
61
+ it 'accepts empty hashes without spaces if configured false' do
62
+ SpaceInsideHashLiteralBraces.config['EnforcedStyleIsWithSpaces'] =
63
+ false
64
+ inspect_source(sihlb, ['h = {}'])
65
+ expect(sihlb.offences).to be_empty
66
+ end
67
+
68
+ it 'accepts empty hashes without spaces even if configured true' do
69
+ inspect_source(sihlb, ['h = {}'])
70
+ expect(sihlb.offences).to be_empty
71
+ end
72
+
73
+ it 'accepts hash literals with no braces' do
74
+ inspect_source(sihlb, ['x(a: b.c)'])
75
+ expect(sihlb.offences).to be_empty
76
+ end
77
+ end
78
+ end
79
+ end
@@ -8,20 +8,24 @@ module Rubocop
8
8
  let(:space) { SpaceInsideParens.new }
9
9
 
10
10
  it 'registers an offence for spaces inside parens' do
11
- inspect_source(space, 'file.rb', ['f( 3)',
12
- 'g(3 )'])
11
+ inspect_source(space, ['f( 3)',
12
+ 'g(3 )'])
13
13
  expect(space.offences.map(&:message)).to eq(
14
14
  ['Space inside parentheses detected.',
15
15
  'Space inside parentheses detected.'])
16
16
  end
17
17
 
18
18
  it 'accepts parentheses in block parameter list' do
19
- inspect_source(space, 'file.rb',
19
+ inspect_source(space,
20
20
  ['list.inject(Tms.new) { |sum, (label, item)|',
21
21
  '}'])
22
22
  expect(space.offences.map(&:message)).to be_empty
23
23
  end
24
24
 
25
+ it 'accepts parentheses with no spaces' do
26
+ inspect_source(space, ['split("\n")'])
27
+ expect(space.offences.map(&:message)).to be_empty
28
+ end
25
29
  end
26
30
  end
27
31
  end
@@ -8,7 +8,7 @@ module Rubocop
8
8
  let(:sl) { StringLiterals.new }
9
9
 
10
10
  it 'registers an offence for double quotes when single quotes suffice' do
11
- inspect_source(sl, 'file.rb', ['s = "abc"'])
11
+ inspect_source(sl, ['s = "abc"'])
12
12
  expect(sl.offences.map(&:message)).to eq(
13
13
  ["Prefer single-quoted strings when you don't need string " +
14
14
  'interpolation or special symbols.'])
@@ -17,16 +17,31 @@ module Rubocop
17
17
  it 'accepts double quotes when they are needed' do
18
18
  src = ['a = "\n"',
19
19
  'b = "#{encode_severity}:#{sprintf("%3d", line_number)}: #{m}"',
20
- 'c = "\'"']
21
- inspect_source(sl, 'file.rb', src)
20
+ 'c = "\'"',
21
+ 'd = "#@test"',
22
+ 'e = "#$test"',
23
+ 'f = "#@@test"']
24
+ inspect_source(sl, src)
22
25
  expect(sl.offences.map(&:message)).to be_empty
23
26
  end
24
27
 
25
- it 'can handle double quotes within embedded expression' do
26
- src = ['"#{"A"}"']
27
- inspect_source(sl, 'file.rb', src)
28
+ it 'accepts double quotes with some other special symbols' do
29
+ pending
30
+ # "Substitutions in double-quoted strings"
31
+ # http://www.ruby-doc.org/docs/ProgrammingRuby/html/language.html
32
+ src = ['g = "\xf9"']
33
+ inspect_source(sl, src)
28
34
  expect(sl.offences.map(&:message)).to be_empty
29
35
  end
36
+
37
+ it 'can handle double quotes within embedded expression' do
38
+ # This seems to be a Parser bug
39
+ pending do
40
+ src = ['"#{"A"}"']
41
+ inspect_source(sl, src)
42
+ expect(sl.offences.map(&:message)).to be_empty
43
+ end
44
+ end
30
45
  end
31
46
  end
32
47
  end
@@ -0,0 +1,41 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module Rubocop
6
+ module Cop
7
+ describe SymbolArray do
8
+ let(:sa) { SymbolArray.new }
9
+
10
+ it 'registers an offence for arrays of symbols', { ruby: 2.0 } do
11
+ inspect_source(sa,
12
+ ['[:one, :two, :three]'])
13
+ expect(sa.offences.size).to eq(1)
14
+ end
15
+
16
+ it 'does not reg an offence for array with non-syms', { ruby: 2.0 } do
17
+ inspect_source(sa,
18
+ ['[:one, :two, "three"]'])
19
+ expect(sa.offences).to be_empty
20
+ end
21
+
22
+ it 'does not reg an offence for array starting with %i', { ruby: 2.0 } do
23
+ inspect_source(sa,
24
+ ['%i(one two three)'])
25
+ expect(sa.offences).to be_empty
26
+ end
27
+
28
+ it 'does not reg an offence for array with one element', { ruby: 2.0 } do
29
+ inspect_source(sa,
30
+ ['[:three]'])
31
+ expect(sa.offences).to be_empty
32
+ end
33
+
34
+ it 'does nothing on Ruby 1.9', { ruby: 1.9 } do
35
+ inspect_source(sa,
36
+ ['[:one, :two, :three]'])
37
+ expect(sa.offences).to be_empty
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,119 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module Rubocop
6
+ module Cop
7
+ describe SymbolName do
8
+ let(:symbol_name) { SymbolName.new }
9
+
10
+ before do
11
+ SymbolName.config = Config.default_configuration.for_cop('SymbolName')
12
+ end
13
+
14
+ context 'when AllowCamelCase is true' do
15
+ before do
16
+ SymbolName.config = {
17
+ 'AllowCamelCase' => true
18
+ }
19
+ end
20
+
21
+ it 'does not register an offence for camel case in names' do
22
+ inspect_source(symbol_name,
23
+ ['test = :BadIdea'])
24
+ expect(symbol_name.offences).to be_empty
25
+ end
26
+ end
27
+
28
+ context 'when AllowCamelCase is false' do
29
+ before do
30
+ SymbolName.config = {
31
+ 'AllowCamelCase' => false
32
+ }
33
+ end
34
+
35
+ it 'registers an offence for camel case in names' do
36
+ inspect_source(symbol_name,
37
+ ['test = :BadIdea'])
38
+ expect(symbol_name.offences.map(&:message)).to eq(
39
+ ['Use snake_case for symbols.'])
40
+ end
41
+ end
42
+
43
+ it 'registers an offence for symbol used as hash label' do
44
+ inspect_source(symbol_name,
45
+ ['{ KEY_ONE: 1, KEY_TWO: 2 }'])
46
+ expect(symbol_name.offences.map(&:message)).to eq(
47
+ ['Use snake_case for symbols.'] * 2)
48
+ end
49
+
50
+ it 'accepts snake case in names' do
51
+ inspect_source(symbol_name,
52
+ ['test = :good_idea'])
53
+ expect(symbol_name.offences).to be_empty
54
+ end
55
+
56
+ it 'accepts snake case in hash label names' do
57
+ inspect_source(symbol_name,
58
+ ['{ one: 1, one_more_3: 2 }'])
59
+ expect(symbol_name.offences).to be_empty
60
+ end
61
+
62
+ it 'accepts snake case with a prefix @ in names' do
63
+ inspect_source(symbol_name,
64
+ ['test = :@good_idea'])
65
+ expect(symbol_name.offences).to be_empty
66
+ end
67
+
68
+ it 'accepts snake case with ? suffix' do
69
+ inspect_source(symbol_name,
70
+ ['test = :good_idea?'])
71
+ expect(symbol_name.offences).to be_empty
72
+ end
73
+
74
+ it 'accepts snake case with ! suffix' do
75
+ inspect_source(symbol_name,
76
+ ['test = :good_idea!'])
77
+ expect(symbol_name.offences).to be_empty
78
+ end
79
+
80
+ it 'accepts snake case with = suffix' do
81
+ inspect_source(symbol_name,
82
+ ['test = :good_idea='])
83
+ expect(symbol_name.offences).to be_empty
84
+ end
85
+
86
+ it 'accepts special cases - !, [] and **' do
87
+ inspect_source(symbol_name,
88
+ ['test = :**',
89
+ 'test = :!',
90
+ 'test = :[]',
91
+ 'test = :[]='])
92
+ expect(symbol_name.offences).to be_empty
93
+ end
94
+
95
+ it 'accepts special cases - ==, <=>, >, <, >=, <=' do
96
+ inspect_source(symbol_name,
97
+ ['test = :==',
98
+ 'test = :<=>',
99
+ 'test = :>',
100
+ 'test = :<',
101
+ 'test = :>=',
102
+ 'test = :<='])
103
+ expect(symbol_name.offences).to be_empty
104
+ end
105
+
106
+ it 'can handle an alias of and operator without crashing' do
107
+ inspect_source(symbol_name,
108
+ ['alias + add'])
109
+ expect(symbol_name.offences).to be_empty
110
+ end
111
+
112
+ it 'registers an offence for SCREAMING_symbol_name' do
113
+ inspect_source(symbol_name,
114
+ ['test = :BAD_IDEA'])
115
+ expect(symbol_name.offences.size).to eq(1)
116
+ end
117
+ end
118
+ end
119
+ end
@@ -7,11 +7,34 @@ module Rubocop
7
7
  describe Syntax do
8
8
  let(:sc) { Syntax.new }
9
9
 
10
- it 'registers an offence for unused variables', ruby: 2.0 do
11
- sc.inspect('file.rb', ['x = 5', 'puts 10'], nil, nil)
12
- expect(sc.offences.size).to eq(1)
13
- expect(sc.offences.first.message)
14
- .to eq('Assigned but unused variable - x')
10
+ if RUBY_ENGINE == 'ruby'
11
+ it 'registers an offence for unused variables', ruby: 2.0 do
12
+ source = "x = 5\nputs 10"
13
+ Dir.mktmpdir do |tmpdir|
14
+ path = File.join(tmpdir, 'file.rb')
15
+ File.open(path, 'w') { |f| f.write(source) }
16
+ sc.inspect_file(path)
17
+ end
18
+ expect(sc.offences.size).to eq(1)
19
+ expect(sc.offences.first.message)
20
+ .to eq('Assigned but unused variable - x')
21
+ end
22
+
23
+ describe '#process_line' do
24
+ it 'processes warnings correctly' do
25
+ l, s, m = sc.process_line('admin.rb:1: warning: possibly useless')
26
+ expect(l).to eq(1)
27
+ expect(s).to eq(:warning)
28
+ expect(m).to eq('Possibly useless')
29
+ end
30
+
31
+ it 'processes errors correctly' do
32
+ l, s, m = sc.process_line('admin.rb:1: unterminated string meets')
33
+ expect(l).to eq(1)
34
+ expect(s).to eq(:error)
35
+ expect(m).to eq('Unterminated string meets')
36
+ end
37
+ end
15
38
  end
16
39
  end
17
40
  end
@@ -8,12 +8,12 @@ module Rubocop
8
8
  let(:tab) { Tab.new }
9
9
 
10
10
  it 'registers an offence for a line indented with tab' do
11
- tab.inspect('file.rb', ["\tx = 0"], nil, nil)
11
+ tab.inspect(["\tx = 0"], nil, nil, nil)
12
12
  expect(tab.offences.size).to eq(1)
13
13
  end
14
14
 
15
15
  it 'accepts a line with tab in a string' do
16
- tab.inspect('file.rb', [%Q(x = "\t")], nil, nil)
16
+ tab.inspect(["(x = \"\t\")"], nil, nil, nil)
17
17
  expect(tab.offences).to be_empty
18
18
  end
19
19
  end