delta_test 0.2.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -0
  3. data/README.md +22 -34
  4. data/Rakefile +5 -2
  5. data/bin/delta_test +1 -1
  6. data/circle.yml +5 -1
  7. data/delta_test.gemspec +1 -1
  8. data/lib/delta_test/cli/command_base.rb +114 -0
  9. data/lib/delta_test/cli/exec_command.rb +95 -0
  10. data/lib/delta_test/cli/help_command.rb +38 -0
  11. data/lib/delta_test/cli/specs_command.rb +43 -0
  12. data/lib/delta_test/cli/stats_clean_command.rb +20 -0
  13. data/lib/delta_test/cli/stats_save_command.rb +67 -0
  14. data/lib/delta_test/cli/stats_show_command.rb +46 -0
  15. data/lib/delta_test/cli/version_command.rb +13 -0
  16. data/lib/delta_test/cli.rb +22 -296
  17. data/lib/delta_test/configuration.rb +57 -42
  18. data/lib/delta_test/errors.rb +24 -0
  19. data/lib/delta_test/generator.rb +4 -24
  20. data/lib/delta_test/git.rb +161 -80
  21. data/lib/delta_test/profiler.rb +8 -0
  22. data/lib/delta_test/related_spec_list.rb +14 -9
  23. data/lib/delta_test/stats.rb +41 -0
  24. data/lib/delta_test/version.rb +2 -2
  25. data/lib/delta_test.rb +14 -9
  26. data/spec/lib/delta_test/cli/command_base_spec.rb +164 -0
  27. data/spec/lib/delta_test/cli/exec_command_spec.rb +128 -0
  28. data/spec/lib/delta_test/cli/help_command_spec.rb +17 -0
  29. data/spec/lib/delta_test/cli/specs_command_spec.rb +54 -0
  30. data/spec/lib/delta_test/cli/stats_clean_command_spec.rb +39 -0
  31. data/spec/lib/delta_test/cli/stats_save_command_spec.rb +207 -0
  32. data/spec/lib/delta_test/cli/stats_show_command_spec.rb +52 -0
  33. data/spec/lib/delta_test/cli/version_command_spec.rb +17 -0
  34. data/spec/lib/delta_test/cli_spec.rb +47 -386
  35. data/spec/lib/delta_test/configuration_spec.rb +99 -47
  36. data/spec/lib/delta_test/dependencies_table_spec.rb +1 -1
  37. data/spec/lib/delta_test/generator_spec.rb +3 -3
  38. data/spec/lib/delta_test/git_spec.rb +291 -50
  39. data/spec/lib/delta_test/profiler_spec.rb +3 -3
  40. data/spec/lib/delta_test/related_spec_list_spec.rb +12 -14
  41. data/spec/lib/delta_test/stats_spec.rb +89 -0
  42. data/spec/lib/delta_test/utils_spec.rb +4 -4
  43. data/spec/lib/delta_test_spec.rb +13 -4
  44. data/spec/rails/Gemfile.lock +5 -2
  45. data/spec/rails/app/models/category.rb +4 -0
  46. data/spec/rails/delta_test.yml +4 -3
  47. data/spec/rails/spec/models/category_spec.rb +4 -0
  48. data/spec/spec_helper.rb +9 -2
  49. data/spec/supports/create_table_file.rb +11 -1
  50. data/visual.jpg +0 -0
  51. metadata +32 -4
@@ -1,441 +1,102 @@
1
1
  require 'delta_test/cli'
2
- require 'delta_test/git'
2
+ require 'delta_test/cli/exec_command'
3
+ require 'delta_test/cli/specs_command'
4
+ require 'delta_test/cli/stats_clean_command'
5
+ require 'delta_test/cli/stats_show_command'
6
+ require 'delta_test/cli/stats_save_command'
7
+ require 'delta_test/cli/version_command'
8
+ require 'delta_test/cli/help_command'
3
9
 
4
10
  describe DeltaTest::CLI do
5
11
 
6
- let(:cli) { DeltaTest::CLI.new }
7
-
8
- before do
9
- DeltaTest::CLI.class_eval do
10
- attr_writer :args
11
- attr_writer :options
12
- attr_writer :command
13
- attr_reader :list
14
- end
15
-
16
- # ignore outputs
17
- allow($stdout).to receive(:puts).with(any_args).and_return(nil)
18
- allow($stderr).to receive(:puts).with(any_args).and_return(nil)
19
- end
20
-
21
12
  describe '#run' do
22
13
 
23
- before do
24
- allow(cli).to receive(:invoke).with(no_args).and_return(nil)
25
- end
26
-
27
- it 'should set the first argument as command' do
28
- args = ['command', 'foo', 'bar']
29
- cli.run(args)
30
- expect(cli.command).to eq(args[0])
31
- end
32
-
33
- it 'should call `parse_options!` and `invoke`' do
34
- expect(cli).to receive(:parse_options!).with(no_args).and_return({}).once.ordered
35
- expect(cli).to receive(:invoke).with(no_args).once.ordered
36
-
37
- args = ['command', 'foo', 'bar']
38
- cli.run(args)
39
- end
40
-
41
- end
42
-
43
- describe '#parse_options!' do
44
-
45
- it 'should parse short options' do
46
- cli.args = ['-a', '-b']
47
-
48
- options = cli.parse_options!
49
-
50
- expect(cli.args).to be_empty
51
- expect(options).to be_a(Hash)
52
- expect(options['a']).to be(true)
53
- expect(options['b']).to be(true)
54
- end
55
-
56
- it 'should parse long options' do
57
- cli.args = ['--long-a', '--long-b']
58
-
59
- options = cli.parse_options!
60
-
61
- expect(cli.args).to be_empty
62
- expect(options).to be_a(Hash)
63
- expect(options['long-a']).to be(true)
64
- expect(options['long-b']).to be(true)
65
- end
66
-
67
- it 'should parse long options with value' do
68
- cli.args = ['--long-a=value-of-a', '--long-b=value-of-b']
69
-
70
- options = cli.parse_options!
71
-
72
- expect(cli.args).to be_empty
73
- expect(options).to be_a(Hash)
74
- expect(options['long-a']).to eq('value-of-a')
75
- expect(options['long-b']).to eq('value-of-b')
76
- end
77
-
78
- it 'should not parse options after once non-option args appears' do
79
- cli.args = ['-a', '--long-a', 'non-option', '--long-b=value-of-b']
80
-
81
- options = cli.parse_options!
82
-
83
- expect(cli.args).to eq(['non-option', '--long-b=value-of-b'])
84
- expect(options).to be_a(Hash)
85
- expect(options['a']).to be(true)
86
- expect(options['long-a']).to be(true)
87
- expect(options['long-b']).to be_nil
88
- end
89
-
90
- describe 'Defaults' do
91
-
92
- it 'should set default options' do
93
- cli.args = []
94
-
95
- options = cli.parse_options!
14
+ describe 'exec' do
96
15
 
97
- expect(options).to be_a(Hash)
16
+ it 'should call invoke on ExecCommand' do
17
+ expect(DeltaTest::CLI::ExecCommand).to receive(:new).with(['echo']).and_call_original
18
+ expect_any_instance_of(DeltaTest::CLI::ExecCommand).to receive(:invoke).and_return(nil)
98
19
 
99
- expect(options['base']).to eq('master')
100
- expect(options['head']).to eq('HEAD')
101
- end
102
-
103
- it 'should be able to overwrite default options' do
104
- cli.args = ['--base=develop', '--head=feature/foo']
105
-
106
- options = cli.parse_options!
107
-
108
- expect(options).to be_a(Hash)
109
-
110
- expect(options['base']).to eq('develop')
111
- expect(options['head']).to eq('feature/foo')
20
+ DeltaTest::CLI.new(['exec', 'echo']).run
112
21
  end
113
22
 
114
23
  end
115
24
 
116
- end
117
-
118
- describe '#exit_with_message' do
119
-
120
- let(:message) { 'a message' }
121
- let(:message_regexp) { /a message/ }
122
-
123
- context 'With status code of zero' do
25
+ describe 'specs' do
124
26
 
125
- let(:status) { 0 }
27
+ it 'should call invoke on SpecsCommand' do
28
+ expect(DeltaTest::CLI::SpecsCommand).to receive(:new).with([]).and_call_original
29
+ expect_any_instance_of(DeltaTest::CLI::SpecsCommand).to receive(:invoke).and_return(nil)
126
30
 
127
- it 'should print a message to stdout and exit' do
128
- expect {
129
- begin
130
- cli.exit_with_message(status, message)
131
- rescue SystemExit => e
132
- expect(e.status).to eq(status)
133
- end
134
- }.to output(message_regexp).to_stdout
31
+ DeltaTest::CLI.new(['specs']).run
135
32
  end
136
33
 
137
34
  end
138
35
 
139
- context 'With status code of non-zero' do
36
+ describe 'stats:clean' do
140
37
 
141
- let(:status) { 1 }
38
+ it 'should call invoke on StatsCleanCommand' do
39
+ expect(DeltaTest::CLI::StatsCleanCommand).to receive(:new).with([]).and_call_original
40
+ expect_any_instance_of(DeltaTest::CLI::StatsCleanCommand).to receive(:invoke).and_return(nil)
142
41
 
143
- it 'should print a message to stderr and exit' do
144
- expect {
145
- begin
146
- cli.exit_with_message(status, message)
147
- rescue SystemExit => e
148
- expect(e.status).to eq(status)
149
- end
150
- }.to output(message_regexp).to_stderr
42
+ DeltaTest::CLI.new(['stats:clean']).run
151
43
  end
152
44
 
153
45
  end
154
46
 
155
- end
156
-
157
- describe '#profile_mode?' do
158
-
159
- let(:map) do
160
- {
161
- 'master' => '0000000000000000000000000000000000000000',
162
- 'feature/foo' => '1111111111111111111111111111111111111111',
163
- }
164
- end
47
+ describe 'stats:show' do
165
48
 
166
- before do
167
- map.each do |name, commit_id|
168
- allow(DeltaTest::Git).to receive(:rev_parse).with(name).and_return(commit_id)
169
- end
170
- end
49
+ it 'should call invoke on StatsShowCommand' do
50
+ expect(DeltaTest::CLI::StatsShowCommand).to receive(:new).with([]).and_call_original
51
+ expect_any_instance_of(DeltaTest::CLI::StatsShowCommand).to receive(:invoke).and_return(nil)
171
52
 
172
- context 'When base and head is the same commit' do
173
-
174
- before do
175
- cli.options = {
176
- 'base' => 'master',
177
- 'head' => 'master',
178
- }
179
- end
180
-
181
- it 'should return true' do
182
- expect(cli.profile_mode?).to be(true)
53
+ DeltaTest::CLI.new(['stats:show']).run
183
54
  end
184
55
 
185
56
  end
186
57
 
187
- context 'When base and head is a different commit' do
58
+ describe 'stats:save' do
188
59
 
189
- before do
190
- cli.options = {
191
- 'base' => 'master',
192
- 'head' => 'feature/foo',
193
- }
194
- end
60
+ it 'should call invoke on StatsSaveCommand' do
61
+ expect(DeltaTest::CLI::StatsSaveCommand).to receive(:new).with([]).and_call_original
62
+ expect_any_instance_of(DeltaTest::CLI::StatsSaveCommand).to receive(:invoke).and_return(nil)
195
63
 
196
- it 'should return false' do
197
- expect(cli.profile_mode?).to be(false)
64
+ DeltaTest::CLI.new(['stats:save']).run
198
65
  end
199
66
 
200
67
  end
201
68
 
202
- end
203
-
204
- context 'Commands' do
205
-
206
- describe '#do_table' do
207
-
208
- let(:table) do
209
- {
210
- 'spec/foo_spec.rb' => ['lib/foo.rb']
211
- }
212
- end
213
-
214
- before do
215
- allow(cli).to receive(:invoke).with(no_args).and_return(nil)
69
+ describe 'version' do
216
70
 
217
- cli.run([])
71
+ it 'should call invoke on VersionCommand' do
72
+ expect(DeltaTest::CLI::VersionCommand).to receive(:new).with([]).and_call_original
73
+ expect_any_instance_of(DeltaTest::CLI::VersionCommand).to receive(:invoke).and_return(nil)
218
74
 
219
- allow(cli.list).to receive(:load_table!).with(no_args).and_return(nil)
220
- allow(cli.list).to receive(:table).with(no_args).and_return(table)
221
- end
222
-
223
- it 'should load a table file' do
224
- expect(cli.list).to receive(:load_table!).with(no_args).once.ordered
225
- expect(cli.list).to receive(:table).with(no_args).once.ordered
226
-
227
- expect {
228
- cli.do_table
229
- }.not_to raise_error
230
- end
231
-
232
- it 'should show the table contents' do
233
- expect(cli.list).to receive(:load_table!).with(no_args).once.ordered
234
- expect(cli.list).to receive(:table).with(no_args).once.ordered
235
-
236
- expect {
237
- cli.do_table
238
- }.to output(/foo_spec\.rb/).to_stdout
75
+ DeltaTest::CLI.new(['version']).run
239
76
  end
240
77
 
241
78
  end
242
79
 
243
- describe '#do_list' do
244
-
245
- let(:related_spec_files) do
246
- [
247
- 'spec/foo_spec.rb',
248
- ]
249
- end
80
+ describe 'help' do
250
81
 
251
- before do
252
- allow(cli).to receive(:invoke).with(no_args).and_return(nil)
82
+ it 'should call invoke on HelpCommand' do
83
+ expect(DeltaTest::CLI::HelpCommand).to receive(:new).with([]).and_call_original
84
+ expect_any_instance_of(DeltaTest::CLI::HelpCommand).to receive(:invoke).and_return(nil)
253
85
 
254
- cli.run([])
255
-
256
- allow(cli.list).to receive(:load_table!).with(no_args).and_return(nil)
257
- allow(cli.list).to receive(:retrive_changed_files!).with(any_args).and_return(nil)
258
- allow(cli.list).to receive(:related_spec_files).with(no_args).and_return(related_spec_files)
259
- end
260
-
261
- it 'should load a table file and retrive changed files' do
262
- expect(cli.list).to receive(:load_table!).with(no_args).once.ordered
263
- expect(cli.list).to receive(:retrive_changed_files!).with(any_args).once.ordered
264
-
265
- expect {
266
- cli.do_list
267
- }.not_to raise_error
268
- end
269
-
270
- it 'should show a list of related spec files' do
271
- expect(cli.list).to receive(:load_table!).with(no_args).once.ordered
272
- expect(cli.list).to receive(:retrive_changed_files!).with(any_args).once.ordered
273
- expect(cli.list).to receive(:related_spec_files).with(no_args).once.ordered
274
-
275
- expect {
276
- cli.do_list
277
- }.to output(/foo_spec\.rb/).to_stdout
86
+ DeltaTest::CLI.new(['help']).run
278
87
  end
279
88
 
280
89
  end
281
90
 
282
- describe '#do_exec' do
91
+ describe '(other)' do
283
92
 
284
- let(:args) do
285
- ['exec', 'bundle', 'exec', 'rspec']
286
- end
93
+ it 'should call invoke on HelpCommand' do
94
+ expect(DeltaTest::CLI::HelpCommand).to receive(:new).with([]).and_call_original
95
+ expect_any_instance_of(DeltaTest::CLI::HelpCommand).to receive(:invoke).and_return(nil)
287
96
 
288
- let(:related_spec_files) do
289
- [
290
- 'spec/foo_spec.rb',
291
- ]
97
+ DeltaTest::CLI.new(['foo']).run
292
98
  end
293
99
 
294
- before do
295
- allow(cli).to receive(:invoke).with(no_args).and_return(nil)
296
-
297
- cli.run(args)
298
-
299
- allow(cli.list).to receive(:load_table!).with(no_args).and_return(nil)
300
- allow(cli.list).to receive(:retrive_changed_files!).with(any_args).and_return(nil)
301
- allow(cli.list).to receive(:related_spec_files).with(no_args).and_return(related_spec_files)
302
-
303
- allow(Open3).to receive(:popen3).with(any_args).and_return(nil)
304
- end
305
-
306
- context 'Full tests' do
307
-
308
- before do
309
- allow(cli).to receive(:profile_mode?).with(no_args).and_return(true)
310
- end
311
-
312
- it 'should run script with a flag' do
313
- expect(cli.list).not_to receive(:related_spec_files).with(no_args)
314
-
315
- _args = ['%s=%s' % [DeltaTest::ACTIVE_FLAG, true], *args[1..-1]].join(' ')
316
- expect(Open3).to receive(:popen3).with(_args)
317
-
318
- expect {
319
- cli.do_exec
320
- }.not_to raise_error
321
- end
322
-
323
- end
324
-
325
- context 'Partial tests' do
326
-
327
- before do
328
- allow(cli).to receive(:profile_mode?).with(no_args).and_return(false)
329
- end
330
-
331
- context 'Any related files' do
332
-
333
- it 'should run script with related spec files' do
334
- expect(cli.list).to receive(:related_spec_files).with(no_args)
335
-
336
- _args = ['cat', '|', 'xargs', *args[1..-1]].join(' ')
337
- expect(Open3).to receive(:popen3).with(_args)
338
-
339
- expect {
340
- cli.do_exec
341
- }.not_to raise_error
342
- end
343
-
344
- end
345
-
346
- context 'No related files' do
347
-
348
- let(:related_spec_files) { [] }
349
-
350
- it 'should not run script and exit with a message' do
351
- expect(cli.list).to receive(:related_spec_files).with(no_args)
352
-
353
- expect {
354
- begin
355
- cli.do_exec
356
- rescue SystemExit => e
357
- expect(e.status).to eq(0)
358
- end
359
- }.to output(/Nothing/).to_stdout
360
- end
361
-
362
- end
363
-
364
- end
365
-
366
- end
367
-
368
- describe '#do_clear' do
369
-
370
- before do
371
- allow(Open3).to receive(:capture3).and_return(nil)
372
- end
373
-
374
- let(:table_file_path) { '/path/to/table' }
375
-
376
- it 'should remove table files' do
377
- allow(DeltaTest.config).to receive(:table_file_path).and_return(table_file_path)
378
- expect(DeltaTest.config).to receive(:table_file_path).with('')
379
- expect(Open3).to receive(:capture3).with('rm %s*' % table_file_path)
380
-
381
- expect {
382
- cli.do_clear
383
- }.not_to raise_error
384
- end
385
-
386
- end
387
-
388
- describe '#do_help' do
389
-
390
- it 'should print help' do
391
- expect {
392
- cli.do_help
393
- }.to output(/usage/).to_stdout
394
- end
395
-
396
- end
397
-
398
- describe '#do_version' do
399
-
400
- it 'should print gem version' do
401
- expect {
402
- cli.do_version
403
- }.to output(/v\d+\.\d+.\d+/).to_stdout
404
- end
405
-
406
- end
407
-
408
- end
409
-
410
- describe '#invoke' do
411
-
412
- let(:commands) do
413
- {
414
- 'list' => 'do_list',
415
- 'table' => 'do_table',
416
- 'exec' => 'do_exec',
417
- 'clear' => 'do_clear',
418
- 'help' => 'do_help',
419
- '-v' => 'do_version',
420
- }
421
- end
422
-
423
- before do
424
- commands.each do |_, action|
425
- allow(cli).to receive(action).with(no_args).and_return(nil)
426
- end
427
- end
428
-
429
- it 'should invoke method for a command' do
430
- commands.each do |command, action|
431
- expect(cli).to receive(action).with(no_args)
432
-
433
- cli.command = command
434
-
435
- expect {
436
- cli.invoke
437
- }.not_to raise_error
438
- end
439
100
  end
440
101
 
441
102
  end