tailor 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. data/.tailor +1 -0
  2. data/Gemfile.lock +1 -1
  3. data/History.rdoc +34 -0
  4. data/README.rdoc +17 -1
  5. data/features/valid_ruby.feature +1 -1
  6. data/lib/ext/string_ext.rb +0 -4
  7. data/lib/tailor/cli/options.rb +9 -2
  8. data/lib/tailor/configuration.rb +103 -150
  9. data/lib/tailor/configuration/file_set.rb +110 -0
  10. data/lib/tailor/formatters/text.rb +108 -79
  11. data/lib/tailor/rake_task.rb +148 -0
  12. data/lib/tailor/tailorrc.erb +1 -1
  13. data/lib/tailor/version.rb +1 -1
  14. data/spec/functional/configuration_spec.rb +244 -0
  15. data/spec/functional/horizontal_spacing/braces_spec.rb +238 -0
  16. data/spec/functional/horizontal_spacing/brackets_spec.rb +88 -0
  17. data/spec/functional/horizontal_spacing/comma_spacing_spec.rb +68 -0
  18. data/spec/functional/horizontal_spacing/hard_tabs_spec.rb +110 -0
  19. data/spec/functional/horizontal_spacing/long_lines_spec.rb +51 -0
  20. data/spec/functional/horizontal_spacing/parens_spec.rb +102 -0
  21. data/spec/functional/horizontal_spacing/trailing_whitespace_spec.rb +66 -0
  22. data/spec/functional/horizontal_spacing_spec.rb +59 -0
  23. data/spec/functional/indentation_spacing/bad_indentation_spec.rb +372 -0
  24. data/spec/functional/indentation_spacing_spec.rb +85 -0
  25. data/spec/functional/naming/camel_case_methods_spec.rb +56 -0
  26. data/spec/functional/naming/screaming_snake_case_classes_spec.rb +83 -0
  27. data/spec/functional/naming_spec.rb +35 -0
  28. data/spec/functional/vertical_spacing/class_length_spec.rb +67 -0
  29. data/spec/functional/vertical_spacing/method_length_spec.rb +61 -0
  30. data/spec/functional/vertical_spacing_spec.rb +35 -0
  31. data/spec/support/bad_indentation_cases.rb +265 -0
  32. data/{features/support/file_cases/indentation_cases.rb → spec/support/good_indentation_cases.rb} +6 -266
  33. data/spec/support/horizontal_spacing_cases.rb +136 -0
  34. data/spec/support/naming_cases.rb +26 -0
  35. data/{features/support/file_cases → spec/support}/vertical_spacing_cases.rb +0 -33
  36. data/spec/{tailor → unit/tailor}/cli_spec.rb +1 -1
  37. data/spec/{tailor → unit/tailor}/composite_observable_spec.rb +1 -1
  38. data/spec/unit/tailor/configuration/file_set_spec.rb +65 -0
  39. data/spec/{tailor → unit/tailor}/configuration/style_spec.rb +1 -1
  40. data/spec/{tailor → unit/tailor}/configuration_spec.rb +1 -59
  41. data/spec/{tailor → unit/tailor}/critic_spec.rb +1 -1
  42. data/spec/{tailor → unit/tailor}/formatter_spec.rb +1 -1
  43. data/spec/{tailor → unit/tailor}/lexed_line_spec.rb +1 -1
  44. data/spec/{tailor → unit/tailor}/lexer/token_spec.rb +1 -1
  45. data/spec/{tailor → unit/tailor}/lexer_spec.rb +1 -2
  46. data/spec/{tailor → unit/tailor}/options_spec.rb +1 -1
  47. data/spec/{tailor → unit/tailor}/problem_spec.rb +1 -1
  48. data/spec/{tailor → unit/tailor}/reporter_spec.rb +1 -1
  49. data/spec/{tailor → unit/tailor}/ruler_spec.rb +1 -1
  50. data/spec/{tailor → unit/tailor}/rulers/indentation_spaces_ruler/indentation_manager_spec.rb +1 -1
  51. data/spec/{tailor → unit/tailor}/rulers/indentation_spaces_ruler_spec.rb +1 -1
  52. data/spec/{tailor → unit/tailor}/rulers/spaces_after_comma_ruler_spec.rb +1 -1
  53. data/spec/{tailor → unit/tailor}/rulers/spaces_after_lbrace_ruler_spec.rb +1 -1
  54. data/spec/{tailor → unit/tailor}/rulers/spaces_before_lbrace_ruler_spec.rb +1 -1
  55. data/spec/{tailor → unit/tailor}/rulers/spaces_before_rbrace_ruler_spec.rb +1 -1
  56. data/spec/{tailor → unit/tailor}/rulers_spec.rb +1 -1
  57. data/spec/unit/tailor/version_spec.rb +6 -0
  58. data/spec/{tailor_spec.rb → unit/tailor_spec.rb} +1 -1
  59. data/tasks/spec.rake +8 -3
  60. metadata +121 -93
  61. data/features/horizontal_spacing.feature +0 -263
  62. data/features/indentation/bad_files_with_no_trailing_newline.feature +0 -91
  63. data/features/indentation/good_files_with_no_trailing_newline.feature +0 -219
  64. data/features/name_detection.feature +0 -72
  65. data/features/support/file_cases/horizontal_spacing_cases.rb +0 -266
  66. data/features/support/file_cases/naming_cases.rb +0 -51
  67. data/features/vertical_spacing.feature +0 -135
  68. data/m.rb +0 -15
  69. data/spec/tailor/version_spec.rb +0 -6
@@ -0,0 +1,59 @@
1
+ require_relative '../spec_helper'
2
+ require_relative '../support/horizontal_spacing_cases'
3
+ require 'tailor/critic'
4
+ require 'tailor/configuration/style'
5
+
6
+ describe "Horizontal Space problem detection" do
7
+ before do
8
+ Tailor::Logger.stub(:log)
9
+ FakeFS.activate!
10
+ end
11
+
12
+ let(:critic) do
13
+ Tailor::Critic.new
14
+ end
15
+
16
+ let(:style) do
17
+ style = Tailor::Configuration::Style.new
18
+ style.trailing_newlines 0, level: :off
19
+ style.allow_invalid_ruby true, level: :off
20
+
21
+ style
22
+ end
23
+
24
+ H_SPACING_OK.each do |file_name, contents|
25
+ before do
26
+ FileUtils.touch file_name.to_s
27
+ File.open(file_name.to_s, 'w') { |f| f.write contents }
28
+ end
29
+
30
+ it "should be OK" do
31
+ critic.check_file(file_name.to_s, style.to_hash)
32
+ critic.problems.should == { file_name.to_s => [] }
33
+ end
34
+ end
35
+
36
+ context "line ends with a backslash" do
37
+ let(:file_name) { :line_split_by_backslash }
38
+
39
+ let(:contents) do
40
+ %Q{execute 'myscript' do
41
+ command \\
42
+ '/some/really/long/path/that/would/be/over/eighty/chars.sh'
43
+ only_if { something }
44
+ end}
45
+ end
46
+
47
+ before do
48
+ FileUtils.touch file_name.to_s
49
+ File.open(file_name.to_s, 'w') { |f| f.write contents }
50
+ end
51
+
52
+ it "is OK" do
53
+ pending "Fix of gh-101"
54
+
55
+ critic.check_file(file_name.to_s, style.to_hash)
56
+ critic.problems.should == { file_name.to_s => [] }
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,372 @@
1
+ require_relative '../../spec_helper'
2
+ require_relative '../../support/bad_indentation_cases'
3
+ require 'tailor/critic'
4
+ require 'tailor/configuration/style'
5
+
6
+
7
+ describe "Detection of method length" do
8
+ before do
9
+ Tailor::Logger.stub(:log)
10
+ FakeFS.activate!
11
+ File.open(file_name.to_s, 'w') { |f| f.write contents }
12
+ critic.check_file(file_name.to_s, style.to_hash)
13
+ end
14
+
15
+ let(:critic) do
16
+ Tailor::Critic.new
17
+ end
18
+
19
+ let(:contents) { INDENT_1[file_name] }
20
+
21
+ let(:style) do
22
+ style = Tailor::Configuration::Style.new
23
+ style.trailing_newlines 0, level: :off
24
+ style.allow_invalid_ruby true, level: :off
25
+
26
+ style
27
+ end
28
+
29
+ context "simple classes" do
30
+ context "empty with an indented end" do
31
+ let(:file_name) { :class_indented_end }
32
+ specify { critic.problems[file_name.to_s].size.should be 1 }
33
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
34
+ specify { critic.problems[file_name.to_s].first[:line].should be 2 }
35
+ specify { critic.problems[file_name.to_s].first[:column].should be 1 }
36
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
37
+ end
38
+
39
+ context "body extra indented" do
40
+ let(:file_name) { :class_indented_single_statement }
41
+ specify { critic.problems[file_name.to_s].size.should be 1 }
42
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
43
+ specify { critic.problems[file_name.to_s].first[:line].should be 2 }
44
+ specify { critic.problems[file_name.to_s].first[:column].should be 3 }
45
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
46
+ end
47
+
48
+ context "body extra indented, trailing comment" do
49
+ let(:file_name) { :class_indented_single_statement_trailing_comment }
50
+ specify { critic.problems[file_name.to_s].size.should be 1 }
51
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
52
+ specify { critic.problems[file_name.to_s].first[:line].should be 2 }
53
+ specify { critic.problems[file_name.to_s].first[:column].should be 3 }
54
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
55
+ end
56
+
57
+ context "body extra outdented" do
58
+ let(:file_name) { :class_outdented_single_statement }
59
+ specify { critic.problems[file_name.to_s].size.should be 1 }
60
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
61
+ specify { critic.problems[file_name.to_s].first[:line].should be 2 }
62
+ specify { critic.problems[file_name.to_s].first[:column].should be 1 }
63
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
64
+ end
65
+ end
66
+
67
+ context "simple methods" do
68
+ context "empty with an indented end" do
69
+ let(:file_name) { :def_indented_end }
70
+ specify { critic.problems[file_name.to_s].size.should be 1 }
71
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
72
+ specify { critic.problems[file_name.to_s].first[:line].should be 2 }
73
+ specify { critic.problems[file_name.to_s].first[:column].should be 1 }
74
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
75
+ end
76
+
77
+ context "body and end extra indented" do
78
+ let(:file_name) { :def_content_indented_end }
79
+ specify { critic.problems[file_name.to_s].size.should be 1 }
80
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
81
+ specify { critic.problems[file_name.to_s].first[:line].should be 3 }
82
+ specify { critic.problems[file_name.to_s].first[:column].should be 1 }
83
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
84
+ end
85
+
86
+ context "in a class, end outdented" do
87
+ let(:file_name) { :class_def_content_outdented_end }
88
+ specify { critic.problems[file_name.to_s].size.should be 1 }
89
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
90
+ specify { critic.problems[file_name.to_s].first[:line].should be 4 }
91
+ specify { critic.problems[file_name.to_s].first[:column].should be 1 }
92
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
93
+ end
94
+
95
+ context "in a class, body outdented" do
96
+ let(:file_name) { :class_def_outdented_content }
97
+ specify { critic.problems[file_name.to_s].size.should be 1 }
98
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
99
+ specify { critic.problems[file_name.to_s].first[:line].should be 3 }
100
+ specify { critic.problems[file_name.to_s].first[:column].should be 3 }
101
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
102
+ end
103
+
104
+ context "class method outdented, in a class" do
105
+ let(:file_name) { :class_method_def_using_self_outdented }
106
+ specify do
107
+ pending "Fix of gh-109"
108
+ critic.problems[file_name.to_s].size.should be 1
109
+ end
110
+ =begin
111
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
112
+ specify { critic.problems[file_name.to_s].first[:line].should be 2 }
113
+ specify { critic.problems[file_name.to_s].first[:column].should be 1 }
114
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
115
+ =end
116
+ end
117
+ end
118
+
119
+ context "case statements" do
120
+ context "case extra indented" do
121
+ let(:file_name) { :case_indented_whens_level }
122
+ specify { critic.problems[file_name.to_s].size.should be 1 }
123
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
124
+ specify { critic.problems[file_name.to_s].first[:line].should be 2 }
125
+ specify { critic.problems[file_name.to_s].first[:column].should be 3 }
126
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
127
+ end
128
+
129
+ context "case extra indented, trailing comment" do
130
+ let(:file_name) { :case_indented_whens_level_trailing_comment }
131
+ specify { critic.problems[file_name.to_s].size.should be 1 }
132
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
133
+ specify { critic.problems[file_name.to_s].first[:line].should be 2 }
134
+ specify { critic.problems[file_name.to_s].first[:column].should be 3 }
135
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
136
+ end
137
+
138
+ context "case extra outdented" do
139
+ let(:file_name) { :case_outdented_whens_level }
140
+ specify { critic.problems[file_name.to_s].size.should be 1 }
141
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
142
+ specify { critic.problems[file_name.to_s].first[:line].should be 2 }
143
+ specify { critic.problems[file_name.to_s].first[:column].should be 1 }
144
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
145
+ end
146
+
147
+ context "when extra intdented" do
148
+ let(:file_name) { :case_when_indented_whens_level }
149
+ specify { critic.problems[file_name.to_s].size.should be 1 }
150
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
151
+ specify { critic.problems[file_name.to_s].first[:line].should be 3 }
152
+ specify { critic.problems[file_name.to_s].first[:column].should be 3 }
153
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
154
+ end
155
+
156
+ context "when extra outdented" do
157
+ let(:file_name) { :case_when_outdented_whens_level }
158
+ specify { critic.problems[file_name.to_s].size.should be 1 }
159
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
160
+ specify { critic.problems[file_name.to_s].first[:line].should be 3 }
161
+ specify { critic.problems[file_name.to_s].first[:column].should be 1 }
162
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
163
+ end
164
+
165
+ context "case extra indented" do
166
+ pending "Implementation of option to allow whens in"
167
+
168
+ =begin
169
+ let(:file_name) { :case_indented_whens_in }
170
+ specify { critic.problems[file_name.to_s].size.should be 1 }
171
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
172
+ specify { critic.problems[file_name.to_s].first[:line].should be 2 }
173
+ specify { critic.problems[file_name.to_s].first[:column].should be 1 }
174
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
175
+ =end
176
+ end
177
+ end
178
+
179
+ context "while/do loops" do
180
+ context "while/do indented" do
181
+ let(:file_name) { :while_do_indented }
182
+ specify { critic.problems[file_name.to_s].size.should be 1 }
183
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
184
+ specify { critic.problems[file_name.to_s].first[:line].should be 1 }
185
+ specify { critic.problems[file_name.to_s].first[:column].should be 1 }
186
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
187
+ end
188
+
189
+ context "while/do outdented" do
190
+ let(:file_name) { :while_do_outdented }
191
+ specify { critic.problems[file_name.to_s].size.should be 1 }
192
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
193
+ specify { critic.problems[file_name.to_s].first[:line].should be 2 }
194
+ specify { critic.problems[file_name.to_s].first[:column].should be 1 }
195
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
196
+ end
197
+
198
+ context "while/do content outdented" do
199
+ let(:file_name) { :while_do_content_outdented }
200
+ specify { critic.problems[file_name.to_s].size.should be 1 }
201
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
202
+ specify { critic.problems[file_name.to_s].first[:line].should be 3 }
203
+ specify { critic.problems[file_name.to_s].first[:column].should be 3 }
204
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
205
+ end
206
+
207
+ context "while/do content indented" do
208
+ let(:file_name) { :while_do_content_indented }
209
+ specify { critic.problems[file_name.to_s].size.should be 1 }
210
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
211
+ specify { critic.problems[file_name.to_s].first[:line].should be 3 }
212
+ specify { critic.problems[file_name.to_s].first[:column].should be 5 }
213
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
214
+ end
215
+
216
+ context "another while/do indented" do
217
+ let(:file_name) { :while_do_indented2 }
218
+ specify { critic.problems[file_name.to_s].size.should be 1 }
219
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
220
+ specify { critic.problems[file_name.to_s].first[:line].should be 4 }
221
+ specify { critic.problems[file_name.to_s].first[:column].should be 1 }
222
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
223
+ end
224
+
225
+ context "another while/do indented, trailing comment" do
226
+ let(:file_name) { :while_do_indented2_trailing_comment }
227
+ specify { critic.problems[file_name.to_s].size.should be 1 }
228
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
229
+ specify { critic.problems[file_name.to_s].first[:line].should be 4 }
230
+ specify { critic.problems[file_name.to_s].first[:column].should be 1 }
231
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
232
+ end
233
+ end
234
+
235
+ context "until/do loops" do
236
+ context "until indented" do
237
+ let(:file_name) { :until_do_indented }
238
+ specify { critic.problems[file_name.to_s].size.should be 1 }
239
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
240
+ specify { critic.problems[file_name.to_s].first[:line].should be 4 }
241
+ specify { critic.problems[file_name.to_s].first[:column].should be 1 }
242
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
243
+ end
244
+ end
245
+
246
+ context "for/do loops" do
247
+ context "for indented" do
248
+ let(:file_name) { :for_do_indented }
249
+ specify { critic.problems[file_name.to_s].size.should be 1 }
250
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
251
+ specify { critic.problems[file_name.to_s].first[:line].should be 1 }
252
+ specify { critic.problems[file_name.to_s].first[:column].should be 1 }
253
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
254
+ end
255
+ end
256
+
257
+ context "loop/do loops" do
258
+ context "loop indented" do
259
+ let(:file_name) { :loop_do_indented }
260
+ specify { critic.problems[file_name.to_s].size.should be 1 }
261
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
262
+ specify { critic.problems[file_name.to_s].first[:line].should be 1 }
263
+ specify { critic.problems[file_name.to_s].first[:column].should be 1 }
264
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
265
+ end
266
+ end
267
+
268
+ context "if statements" do
269
+ context "first line extra indented" do
270
+ let(:file_name) { :if_line_indented }
271
+ specify { critic.problems[file_name.to_s].size.should be 1 }
272
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
273
+ specify { critic.problems[file_name.to_s].first[:line].should be 2 }
274
+ specify { critic.problems[file_name.to_s].first[:column].should be 3 }
275
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
276
+ end
277
+
278
+ context "first line extra indented, trailing comment" do
279
+ let(:file_name) { :if_line_indented_trailing_comment }
280
+ specify { critic.problems[file_name.to_s].size.should be 1 }
281
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
282
+ specify { critic.problems[file_name.to_s].first[:line].should be 2 }
283
+ specify { critic.problems[file_name.to_s].first[:column].should be 3 }
284
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
285
+ end
286
+ end
287
+
288
+ context "multi_line_tstring" do
289
+ let(:file_name) { :multi_line_tstring }
290
+ specify { critic.problems[file_name.to_s].size.should be 1 }
291
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
292
+ specify { critic.problems[file_name.to_s].first[:line].should be 2 }
293
+ specify { critic.problems[file_name.to_s].first[:column].should be 0 }
294
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
295
+ end
296
+
297
+ context "operators" do
298
+ context "multi-line &&, first line indented" do
299
+ let(:file_name) { :multi_line_andop_first_line_indented }
300
+ specify { critic.problems[file_name.to_s].size.should be 1 }
301
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
302
+ specify { critic.problems[file_name.to_s].first[:line].should be 2 }
303
+ specify { critic.problems[file_name.to_s].first[:column].should be 3 }
304
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
305
+ end
306
+
307
+ context "multi-line &&, first line indented, trailing comment" do
308
+ let(:file_name) { :multi_line_andop_first_line_indented_trailing_comment }
309
+ specify { critic.problems[file_name.to_s].size.should be 1 }
310
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
311
+ specify { critic.problems[file_name.to_s].first[:line].should be 2 }
312
+ specify { critic.problems[file_name.to_s].first[:column].should be 3 }
313
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
314
+ end
315
+
316
+ context "multi-line &&, second line indented" do
317
+ let(:file_name) { :multi_line_andop_second_line_indented }
318
+ specify { critic.problems[file_name.to_s].size.should be 1 }
319
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
320
+ specify { critic.problems[file_name.to_s].first[:line].should be 3 }
321
+ specify { critic.problems[file_name.to_s].first[:column].should be 5 }
322
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
323
+ end
324
+
325
+ context "multi-line string concat, second line outdented" do
326
+ let(:file_name) { :multi_line_string_concat_with_plus_out }
327
+ specify { critic.problems[file_name.to_s].size.should be 1 }
328
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
329
+ specify { critic.problems[file_name.to_s].first[:line].should be 2 }
330
+ specify { critic.problems[file_name.to_s].first[:column].should be 1 }
331
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
332
+ end
333
+ end
334
+
335
+ context "combinations of stuff" do
336
+ context "multi-line if with end in" do
337
+ let(:file_name) { :multi_line_method_call_end_in }
338
+ specify { critic.problems[file_name.to_s].size.should be 1 }
339
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
340
+ specify { critic.problems[file_name.to_s].first[:line].should be 5 }
341
+ specify { critic.problems[file_name.to_s].first[:column].should be 3 }
342
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
343
+ end
344
+
345
+ context "multi-line chained methods with 2nd line in" do
346
+ let(:file_name) { :multi_line_method_call_ends_with_period_2nd_line_in }
347
+ specify { critic.problems[file_name.to_s].size.should be 1 }
348
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
349
+ specify { critic.problems[file_name.to_s].first[:line].should be 4 }
350
+ specify { critic.problems[file_name.to_s].first[:column].should be 5 }
351
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
352
+ end
353
+
354
+ context "multi-line chained methods with 3rd line in" do
355
+ let(:file_name) { :multi_line_method_call_ends_with_many_periods_last_in }
356
+ specify { critic.problems[file_name.to_s].size.should be 1 }
357
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
358
+ specify { critic.problems[file_name.to_s].first[:line].should be 3 }
359
+ specify { critic.problems[file_name.to_s].first[:column].should be 4 }
360
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
361
+ end
362
+
363
+ context "multi-line chained methods with 3rd line in, trailing comment" do
364
+ let(:file_name) { :multi_line_method_call_ends_with_many_periods_last_in_trailing_comment }
365
+ specify { critic.problems[file_name.to_s].size.should be 1 }
366
+ specify { critic.problems[file_name.to_s].first[:type].should == "indentation_spaces" }
367
+ specify { critic.problems[file_name.to_s].first[:line].should be 3 }
368
+ specify { critic.problems[file_name.to_s].first[:column].should be 4 }
369
+ specify { critic.problems[file_name.to_s].first[:level].should be :error }
370
+ end
371
+ end
372
+ end
@@ -0,0 +1,85 @@
1
+ require_relative '../spec_helper'
2
+ require_relative '../support/good_indentation_cases'
3
+ require 'tailor/critic'
4
+ require 'tailor/configuration/style'
5
+
6
+ describe "Indentation spacing problem detection" do
7
+ before do
8
+ Tailor::Logger.stub(:log)
9
+ FakeFS.activate!
10
+ end
11
+
12
+ let(:critic) do
13
+ Tailor::Critic.new
14
+ end
15
+
16
+ let(:style) do
17
+ style = Tailor::Configuration::Style.new
18
+ style.trailing_newlines 0, level: :off
19
+ style.allow_invalid_ruby true, level: :off
20
+
21
+ style
22
+ end
23
+
24
+ let(:contents) { INDENT_1[file_name] }
25
+
26
+ INDENT_OK.each do |file_name, contents|
27
+ before do
28
+ FileUtils.touch file_name.to_s
29
+ File.open(file_name.to_s, 'w') { |f| f.write contents }
30
+ end
31
+
32
+ it "should be OK" do
33
+ critic.check_file(file_name.to_s, style.to_hash)
34
+ critic.problems.should == { file_name.to_s => [] }
35
+ end
36
+ end
37
+
38
+ context "case statement with indented whens" do
39
+ let(:file_name) { :case_whens_in }
40
+
41
+ let(:contents) do
42
+ %Q{def my_method
43
+ case true
44
+ when true
45
+ puts "stuff"
46
+ when false
47
+ puts "blah blah"
48
+ end
49
+ end}
50
+ end
51
+
52
+ it "is OK" do
53
+ pending "Implementation of the option to allow for this"
54
+ end
55
+ end
56
+
57
+ context "method with rparen on following line" do
58
+ let(:file_name) { :method_closing_lonely_paren }
59
+
60
+ let(:contents) do
61
+ %Q{def your_thing(one
62
+ )
63
+ end}
64
+ end
65
+
66
+ it "is OK" do
67
+ pending
68
+ end
69
+ end
70
+
71
+ context "lonely rparen and do on the same line" do
72
+ let(:file_name) { :rparen_and_do_same_line }
73
+
74
+ let(:contents) do
75
+ %Q{opt.on('-c', '--config-file FILE',
76
+ "Use a specific config file.") do |config|
77
+ options.config_file = config
78
+ end}
79
+ end
80
+
81
+ it "is OK" do
82
+ pending
83
+ end
84
+ end
85
+ end