guard-rubocop 1.0.1 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,4 @@
1
1
  guard :rubocop do
2
2
  watch(%r{.+\.rb$})
3
- watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
3
+ watch(%r{(?:.+/)?\.rubocop(?:_todo)?\.yml$}) { |m| File.dirname(m[0]) }
4
4
  end
@@ -1,16 +1,14 @@
1
- # coding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
- module Guard
4
- # A workaround for declaring `class Rubocop`
5
- # before `class Rubocop < Guard` in rubocop.rb
6
- module RubocopVersion
7
- # http://semver.org/
8
- MAJOR = 1
9
- MINOR = 0
10
- PATCH = 1
3
+ # A workaround for declaring `class RuboCop`
4
+ # before `class RuboCop < Guard` in rubocop.rb
5
+ module GuardRuboCopVersion
6
+ # http://semver.org/
7
+ MAJOR = 1
8
+ MINOR = 4
9
+ PATCH = 0
11
10
 
12
- def self.to_s
13
- [MAJOR, MINOR, PATCH].join('.')
14
- end
11
+ def self.to_s
12
+ [MAJOR, MINOR, PATCH].join('.')
15
13
  end
16
14
  end
@@ -1,9 +1,9 @@
1
- # coding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
- require 'spec_helper.rb'
3
+ require 'launchy'
4
4
 
5
- describe Guard::Rubocop::Runner do
6
- subject(:runner) { Guard::Rubocop::Runner.new(options) }
5
+ RSpec.describe Guard::RuboCop::Runner do
6
+ subject(:runner) { Guard::RuboCop::Runner.new(options) }
7
7
  let(:options) { {} }
8
8
 
9
9
  describe '#run' do
@@ -25,14 +25,14 @@ describe Guard::Rubocop::Runner do
25
25
  before do
26
26
  allow(runner).to receive(:system).and_return(true)
27
27
  end
28
- it { should be_true }
28
+ it { should be_truthy }
29
29
  end
30
30
 
31
31
  context 'when RuboCop exited with non 0 status' do
32
32
  before do
33
33
  allow(runner).to receive(:system).and_return(false)
34
34
  end
35
- it { should be_false }
35
+ it { should be_falsey }
36
36
  end
37
37
 
38
38
  shared_examples 'notifies', :notifies do
@@ -77,56 +77,95 @@ describe Guard::Rubocop::Runner do
77
77
 
78
78
  context 'when :notification option is true' do
79
79
  let(:options) { { notification: true } }
80
- include_examples 'notification', { passed: true, failed: true }
80
+ include_examples 'notification', passed: true, failed: true
81
81
  end
82
82
 
83
83
  context 'when :notification option is :failed' do
84
84
  let(:options) { { notification: :failed } }
85
- include_examples 'notification', { passed: false, failed: true }
85
+ include_examples 'notification', passed: false, failed: true
86
86
  end
87
87
 
88
88
  context 'when :notification option is false' do
89
89
  let(:options) { { notification: false } }
90
- include_examples 'notification', { passed: false, failed: false }
90
+ include_examples 'notification', passed: false, failed: false
91
+ end
92
+
93
+ context 'when :launchy option is present' do
94
+ let(:options) { { launchy: 'launchy_path' } }
95
+
96
+ before do
97
+ allow(File).to receive(:exist?).with('launchy_path').and_return(true)
98
+ end
99
+
100
+ it 'opens Launchy' do
101
+ expect(Launchy).to receive(:open).with('launchy_path')
102
+ runner.run(paths)
103
+ end
91
104
  end
92
105
  end
93
106
 
94
107
  describe '#build_command' do
95
108
  subject(:build_command) { runner.build_command(paths) }
96
- let(:options) { { cli: %w(--debug --rails) } }
97
- let(:paths) { %w(file1.rb file2.rb) }
109
+ let(:options) { { cli: %w[--debug --rails] } }
110
+ let(:paths) { %w[file1.rb file2.rb] }
98
111
 
99
- context 'when :cli option includes formatter for console' do
100
- let(:options) { { cli: %w(--format simple) } }
112
+ context 'when :hide_stdout is not set' do
113
+ context 'and :cli option includes formatter for console' do
114
+ before { options[:cli] = %w[--format simple] }
101
115
 
102
- it 'does not add args for the default formatter for console' do
103
- expect(build_command[0..2]).not_to eq(%w(rubocop --format progress))
116
+ it 'does not add args for the default formatter for console' do
117
+ expect(build_command[0..2]).not_to eq(%w[rubocop --format progress])
118
+ end
119
+ end
120
+
121
+ context 'and :cli option does not include formatter for console' do
122
+ before { options[:cli] = %w[--format simple --out simple.txt] }
123
+
124
+ it 'adds args for the default formatter for console' do
125
+ expect(build_command[0..2]).to eq(%w[rubocop --format progress])
126
+ end
104
127
  end
105
128
  end
106
129
 
107
- context 'when :cli option does not include formatter for console' do
108
- let(:options) { { cli: %w(--format simple --out simple.txt) } }
130
+ context 'when :hide_stdout is set' do
131
+ before { options[:hide_stdout] = true }
132
+
133
+ context 'and :cli option includes formatter for console' do
134
+ before { options[:cli] = %w[--format simple] }
135
+
136
+ it 'does not add args for the default formatter for console' do
137
+ expect(build_command[0..2]).not_to eq(%w[rubocop --format progress])
138
+ end
139
+ end
140
+
141
+ context 'and :cli option does not include formatter for console' do
142
+ before { options[:cli] = %w[--format simple --out simple.txt] }
109
143
 
110
- it 'adds args for the default formatter for console' do
111
- expect(build_command[0..2]).to eq(%w(rubocop --format progress))
144
+ it 'does not add args for the default formatter for console' do
145
+ expect(build_command[0..2]).not_to eq(%w[rubocop --format progress])
146
+ end
112
147
  end
113
148
  end
114
149
 
115
- it 'adds args for JSON formatter ' do
116
- expect(build_command[3..4]).to eq(%w(--format json))
150
+ it 'adds args for JSON formatter' do
151
+ expect(build_command[3..4]).to eq(%w[--format json])
117
152
  end
118
153
 
119
- it 'adds args for output file path of JSON formatter ' do
154
+ it 'adds args for output file path of JSON formatter' do
120
155
  expect(build_command[5]).to eq('--out')
121
156
  expect(build_command[6]).not_to be_empty
122
157
  end
123
158
 
159
+ it 'adds --force-exclusion option' do
160
+ expect(build_command[7]).to eq('--force-exclusion')
161
+ end
162
+
124
163
  it 'adds args specified by user' do
125
- expect(build_command[7..8]).to eq(%w(--debug --rails))
164
+ expect(build_command[8..9]).to eq(%w[--debug --rails])
126
165
  end
127
166
 
128
167
  it 'adds the passed paths' do
129
- expect(build_command[9..-1]).to eq(%w(file1.rb file2.rb))
168
+ expect(build_command[10..-1]).to eq(%w[file1.rb file2.rb])
130
169
  end
131
170
  end
132
171
 
@@ -159,7 +198,7 @@ describe Guard::Rubocop::Runner do
159
198
  let(:options) { { cli: { key: 'value' } } }
160
199
 
161
200
  it 'raises error' do
162
- expect { runner.args_specified_by_user }.to raise_error
201
+ expect { runner.args_specified_by_user }.to raise_error(ArgumentError)
163
202
  end
164
203
  end
165
204
  end
@@ -169,86 +208,86 @@ describe Guard::Rubocop::Runner do
169
208
 
170
209
  context 'when the passed args include a -f/--format' do
171
210
  context 'but does not include an -o/--output' do
172
- let(:args) { %w(--format simple --debug) }
211
+ let(:args) { %w[--format simple --debug] }
173
212
 
174
213
  it 'returns true' do
175
- expect(include_formatter_for_console?).to be_true
214
+ expect(include_formatter_for_console?).to be_truthy
176
215
  end
177
216
  end
178
217
 
179
218
  context 'and include an -o/--output just after the -f/--format' do
180
- let(:args) { %w(--format simple --out simple.txt) }
219
+ let(:args) { %w[--format simple --out simple.txt] }
181
220
 
182
221
  it 'returns false' do
183
- expect(include_formatter_for_console?).to be_false
222
+ expect(include_formatter_for_console?).to be_falsey
184
223
  end
185
224
  end
186
225
 
187
226
  context 'and include an -o/--output after the -f/--format across another arg' do
188
- let(:args) { %w(--format simple --debug --out simple.txt) }
227
+ let(:args) { %w[--format simple --debug --out simple.txt] }
189
228
 
190
229
  it 'returns false' do
191
- expect(include_formatter_for_console?).to be_false
230
+ expect(include_formatter_for_console?).to be_falsey
192
231
  end
193
232
  end
194
233
  end
195
234
 
196
235
  context 'when the passed args include a -f with its arg without separator' do
197
236
  context 'but does not include an -o/--output' do
198
- let(:args) { %w(-fs --debug) }
237
+ let(:args) { %w[-fs --debug] }
199
238
 
200
239
  it 'returns true' do
201
- expect(include_formatter_for_console?).to be_true
240
+ expect(include_formatter_for_console?).to be_truthy
202
241
  end
203
242
  end
204
243
 
205
244
  context 'and include an -o with its arg without separator just after the -f/--format' do
206
- let(:args) { %w(-fs -osimple.txt) }
245
+ let(:args) { %w[-fs -osimple.txt] }
207
246
 
208
247
  it 'returns false' do
209
- expect(include_formatter_for_console?).to be_false
248
+ expect(include_formatter_for_console?).to be_falsey
210
249
  end
211
250
  end
212
251
  end
213
252
 
214
253
  context 'when the passed args include multiple -f/--format' do
215
254
  context 'and all -f/--format have associated -o/--out' do
216
- let(:args) { %w(--format simple --out simple.txt --format emacs --out emacs.txt) }
255
+ let(:args) { %w[--format simple --out simple.txt --format emacs --out emacs.txt] }
217
256
 
218
257
  it 'returns false' do
219
- expect(include_formatter_for_console?).to be_false
258
+ expect(include_formatter_for_console?).to be_falsey
220
259
  end
221
260
  end
222
261
 
223
262
  context 'and any -f/--format has associated -o/--out' do
224
- let(:args) { %w(--format simple --format emacs --out emacs.txt) }
263
+ let(:args) { %w[--format simple --format emacs --out emacs.txt] }
225
264
 
226
265
  it 'returns true' do
227
- expect(include_formatter_for_console?).to be_true
266
+ expect(include_formatter_for_console?).to be_truthy
228
267
  end
229
268
  end
230
269
 
231
270
  context 'and no -f/--format has associated -o/--out' do
232
- let(:args) { %w(--format simple --format emacs) }
271
+ let(:args) { %w[--format simple --format emacs] }
233
272
 
234
273
  it 'returns true' do
235
- expect(include_formatter_for_console?).to be_true
274
+ expect(include_formatter_for_console?).to be_truthy
236
275
  end
237
276
  end
238
277
  end
239
278
 
240
279
  context 'when the passed args do not include -f/--format' do
241
- let(:args) { %w(--debug) }
280
+ let(:args) { %w[--debug] }
242
281
 
243
282
  it 'returns false' do
244
- expect(include_formatter_for_console?).to be_false
283
+ expect(include_formatter_for_console?).to be_falsey
245
284
  end
246
285
  end
247
286
  end
248
287
 
249
288
  describe '#json_file_path' do
250
289
  it 'is not world readable' do
251
- expect(File.world_readable?(runner.json_file_path)).to be_false
290
+ expect(File.world_readable?(runner.json_file_path)).to be_falsey
252
291
  end
253
292
  end
254
293
 
@@ -265,10 +304,10 @@ describe Guard::Rubocop::Runner do
265
304
  },
266
305
  "files": [{
267
306
  "path": "lib/foo.rb",
268
- "offences": []
307
+ "offenses": []
269
308
  }, {
270
309
  "path": "lib/bar.rb",
271
- "offences": [{
310
+ "offenses": [{
272
311
  "severity": "convention",
273
312
  "message": "Line is too long. [81/79]",
274
313
  "cop_name": "LineLength",
@@ -289,7 +328,7 @@ describe Guard::Rubocop::Runner do
289
328
  }
290
329
  ],
291
330
  "summary": {
292
- "offence_count": 2,
331
+ "offense_count": 2,
293
332
  "target_file_count": 2,
294
333
  "inspected_file_count": 2
295
334
  }
@@ -301,32 +340,30 @@ describe Guard::Rubocop::Runner do
301
340
 
302
341
  describe '#result', :json_file do
303
342
  it 'parses JSON file' do
304
- expect(runner.result[:summary][:offence_count]).to eq(2)
343
+ expect(runner.result[:summary][:offense_count]).to eq(2)
305
344
  end
306
345
  end
307
346
 
308
347
  describe '#notify' do
309
348
  before do
310
349
  allow(runner).to receive(:result).and_return(
311
- {
312
- summary: {
313
- offence_count: 4,
314
- target_file_count: 3,
315
- inspected_file_count: 2
316
- }
350
+ summary: {
351
+ offense_count: 4,
352
+ target_file_count: 3,
353
+ inspected_file_count: 2
317
354
  }
318
355
  )
319
356
  end
320
357
 
321
358
  it 'notifies summary' do
322
- expect(Guard::Notifier).to receive(:notify) do |message, options|
323
- expect(message).to eq('2 files inspected, 4 offences detected')
359
+ expect(Guard::Notifier).to receive(:notify) do |message, _options|
360
+ expect(message).to eq('2 files inspected, 4 offenses detected')
324
361
  end
325
362
  runner.notify(true)
326
363
  end
327
364
 
328
365
  it 'notifies with title "RuboCop results"' do
329
- expect(Guard::Notifier).to receive(:notify) do |message, options|
366
+ expect(Guard::Notifier).to receive(:notify) do |_message, options|
330
367
  expect(options[:title]).to eq('RuboCop results')
331
368
  end
332
369
  runner.notify(true)
@@ -334,7 +371,7 @@ describe Guard::Rubocop::Runner do
334
371
 
335
372
  context 'when passed' do
336
373
  it 'shows success image' do
337
- expect(Guard::Notifier).to receive(:notify) do |message, options|
374
+ expect(Guard::Notifier).to receive(:notify) do |_message, options|
338
375
  expect(options[:image]).to eq(:success)
339
376
  end
340
377
  runner.notify(true)
@@ -343,7 +380,7 @@ describe Guard::Rubocop::Runner do
343
380
 
344
381
  context 'when failed' do
345
382
  it 'shows failed image' do
346
- expect(Guard::Notifier).to receive(:notify) do |message, options|
383
+ expect(Guard::Notifier).to receive(:notify) do |_message, options|
347
384
  expect(options[:image]).to eq(:failed)
348
385
  end
349
386
  runner.notify(false)
@@ -354,19 +391,17 @@ describe Guard::Rubocop::Runner do
354
391
  describe '#summary_text' do
355
392
  before do
356
393
  allow(runner).to receive(:result).and_return(
357
- {
358
- summary: {
359
- offence_count: offence_count,
360
- target_file_count: target_file_count,
361
- inspected_file_count: inspected_file_count
362
- }
394
+ summary: {
395
+ offense_count: offense_count,
396
+ target_file_count: target_file_count,
397
+ inspected_file_count: inspected_file_count
363
398
  }
364
399
  )
365
400
  end
366
401
 
367
402
  subject(:summary_text) { runner.summary_text }
368
403
 
369
- let(:offence_count) { 0 }
404
+ let(:offense_count) { 0 }
370
405
  let(:target_file_count) { 0 }
371
406
  let(:inspected_file_count) { 0 }
372
407
 
@@ -391,31 +426,86 @@ describe Guard::Rubocop::Runner do
391
426
  end
392
427
  end
393
428
 
394
- context 'when no offences are detected' do
395
- let(:offence_count) { 0 }
396
- it 'includes "no offences"' do
397
- expect(summary_text).to include 'no offences'
429
+ context 'when no offenses are detected' do
430
+ let(:offense_count) { 0 }
431
+ it 'includes "no offenses"' do
432
+ expect(summary_text).to include 'no offenses'
398
433
  end
399
434
  end
400
435
 
401
- context 'when an offence is detected' do
402
- let(:offence_count) { 1 }
403
- it 'includes "1 offence"' do
404
- expect(summary_text).to include '1 offence'
436
+ context 'when an offense is detected' do
437
+ let(:offense_count) { 1 }
438
+ it 'includes "1 offense"' do
439
+ expect(summary_text).to include '1 offense'
405
440
  end
406
441
  end
407
442
 
408
- context 'when 2 offences are detected' do
409
- let(:offence_count) { 2 }
410
- it 'includes "2 offences"' do
411
- expect(summary_text).to include '2 offences'
443
+ context 'when 2 offenses are detected' do
444
+ let(:offense_count) { 2 }
445
+ it 'includes "2 offenses"' do
446
+ expect(summary_text).to include '2 offenses'
447
+ end
448
+ end
449
+
450
+ context 'with spelling "offence" in old RuboCop' do
451
+ before do
452
+ allow(runner).to receive(:result).and_return(
453
+ summary: {
454
+ offence_count: 2,
455
+ target_file_count: 1,
456
+ inspected_file_count: 1
457
+ }
458
+ )
459
+ end
460
+
461
+ it 'handles the spelling' do
462
+ expect(summary_text).to include '2 offenses'
412
463
  end
413
464
  end
414
465
  end
415
466
 
416
467
  describe '#failed_paths', :json_file do
417
- it 'returns file paths which have offences' do
468
+ it 'returns file paths which have offenses' do
418
469
  expect(runner.failed_paths).to eq(['lib/bar.rb'])
419
470
  end
471
+
472
+ context 'with spelling "offence" in old RuboCop' do
473
+ before do
474
+ json = <<-END
475
+ {
476
+ "files": [{
477
+ "path": "lib/foo.rb",
478
+ "offences": []
479
+ }, {
480
+ "path": "lib/bar.rb",
481
+ "offences": [{
482
+ "severity": "convention",
483
+ "message": "Line is too long. [81/79]",
484
+ "cop_name": "LineLength",
485
+ "location": {
486
+ "line": 546,
487
+ "column": 80
488
+ }
489
+ }, {
490
+ "severity": "warning",
491
+ "message": "Unreachable code detected.",
492
+ "cop_name": "UnreachableCode",
493
+ "location": {
494
+ "line": 15,
495
+ "column": 9
496
+ }
497
+ }
498
+ ]
499
+ }
500
+ ]
501
+ }
502
+ END
503
+ File.write(runner.json_file_path, json)
504
+ end
505
+
506
+ it 'handles the spelling' do
507
+ expect(runner.failed_paths).to eq(['lib/bar.rb'])
508
+ end
509
+ end
420
510
  end
421
511
  end