delta_test 0.1.0 → 0.2.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +32 -0
- data/README.md +63 -14
- data/Rakefile +16 -3
- data/circle.yml +8 -1
- data/delta_test.gemspec +4 -3
- data/ext/delta_test/delta_test_native.c +154 -0
- data/ext/delta_test/delta_test_native.h +15 -0
- data/ext/delta_test/extconf.rb +12 -0
- data/lib/delta_test.rb +8 -2
- data/lib/delta_test/cli.rb +108 -21
- data/lib/delta_test/configuration.rb +91 -35
- data/lib/delta_test/dependencies_table.rb +15 -1
- data/lib/delta_test/generator.rb +42 -29
- data/lib/delta_test/profiler.rb +5 -0
- data/lib/delta_test/related_spec_list.rb +67 -8
- data/lib/delta_test/spec_helpers.rb +9 -7
- data/lib/delta_test/version.rb +1 -1
- data/spec/lib/delta_test/cli_spec.rb +26 -5
- data/spec/lib/delta_test/configuration_spec.rb +12 -0
- data/spec/lib/delta_test/dependencies_table_spec.rb +35 -0
- data/spec/lib/delta_test/generator_spec.rb +34 -17
- data/spec/lib/delta_test/profiler_spec.rb +121 -0
- data/spec/lib/delta_test/related_spec_list_spec.rb +150 -34
- data/spec/lib/delta_test/spec_helpers_spec.rb +11 -5
- data/spec/rails/Gemfile +8 -2
- data/spec/rails/Gemfile.lock +37 -3
- data/spec/rails/app/models/category.rb +14 -0
- data/spec/rails/app/models/comment.rb +20 -0
- data/spec/rails/app/models/post.rb +23 -0
- data/spec/rails/app/models/post_categorizing.rb +14 -0
- data/spec/rails/app/models/user.rb +15 -0
- data/spec/rails/db/migrate/20150518052022_create_users.rb +9 -0
- data/spec/rails/db/migrate/20150518052057_create_posts.rb +11 -0
- data/spec/rails/db/migrate/20150518052332_create_comments.rb +11 -0
- data/spec/rails/db/migrate/20150518052523_create_categories.rb +9 -0
- data/spec/rails/db/migrate/20150518052604_create_post_categorizings.rb +10 -0
- data/spec/rails/db/schema.rb +59 -0
- data/spec/rails/spec/factories/categories.rb +5 -0
- data/spec/rails/spec/factories/comments.rb +8 -0
- data/spec/rails/spec/factories/post_categorizings.rb +6 -0
- data/spec/rails/spec/factories/posts.rb +7 -0
- data/spec/rails/spec/factories/users.rb +5 -0
- data/spec/rails/spec/models/category_spec.rb +3 -0
- data/spec/rails/spec/models/comment_spec.rb +3 -0
- data/spec/rails/spec/models/post_categorizing_spec.rb +3 -0
- data/spec/rails/spec/models/post_spec.rb +3 -0
- data/spec/rails/spec/models/user_spec.rb +20 -0
- data/spec/rails/spec/spec_helper.rb +53 -9
- data/spec/spec_helper.rb +2 -0
- metadata +79 -19
- data/lib/delta_test/analyzer.rb +0 -47
- data/spec/lib/delta_test/analyzer_spec.rb +0 -126
@@ -37,27 +37,86 @@ module DeltaTest
|
|
37
37
|
end
|
38
38
|
|
39
39
|
###
|
40
|
-
#
|
40
|
+
# Return if full tests are related
|
41
41
|
#
|
42
|
-
# @return {
|
42
|
+
# @return {Boolean}
|
43
43
|
###
|
44
|
-
def
|
45
|
-
|
44
|
+
def full_tests?
|
45
|
+
return false unless @changed_files
|
46
|
+
|
47
|
+
@full_tests ||= if DeltaTest.config.full_test_patterns.empty?
|
48
|
+
false
|
49
|
+
else
|
50
|
+
Utils.files_grep(
|
51
|
+
@changed_files,
|
52
|
+
DeltaTest.config.full_test_patterns
|
53
|
+
).any?
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
###
|
58
|
+
# Dependent spec files
|
59
|
+
#
|
60
|
+
# @return {Set|Nil}
|
61
|
+
###
|
62
|
+
def dependents
|
63
|
+
return nil unless @changed_files && @table
|
64
|
+
|
65
|
+
return @dependents if @dependents
|
66
|
+
@dependents = Set.new
|
46
67
|
|
47
68
|
@table.each do |spec_file, dependencies|
|
48
|
-
|
69
|
+
dependent = @changed_files.include?(spec_file) \
|
49
70
|
|| (dependencies & @changed_files).any?
|
50
71
|
|
51
|
-
|
72
|
+
@dependents << spec_file if dependent
|
52
73
|
end
|
53
74
|
|
75
|
+
@dependents
|
76
|
+
end
|
77
|
+
|
78
|
+
###
|
79
|
+
# Custom spec files
|
80
|
+
#
|
81
|
+
# @return {Set|Nil}
|
82
|
+
###
|
83
|
+
def customs
|
84
|
+
return nil unless @changed_files
|
85
|
+
|
86
|
+
return @customs if @customs
|
87
|
+
@customs = Set.new
|
88
|
+
|
54
89
|
DeltaTest.config.custom_mappings.each do |spec_file, patterns|
|
55
90
|
if Utils.files_grep(@changed_files, patterns).any?
|
56
|
-
|
91
|
+
@customs << spec_file
|
57
92
|
end
|
58
93
|
end
|
59
94
|
|
60
|
-
|
95
|
+
@customs
|
96
|
+
end
|
97
|
+
|
98
|
+
###
|
99
|
+
# Full spec files
|
100
|
+
#
|
101
|
+
# @return {Set|Nil}
|
102
|
+
###
|
103
|
+
def full
|
104
|
+
return nil unless @table
|
105
|
+
|
106
|
+
@full ||= Set.new(@table.keys)
|
107
|
+
end
|
108
|
+
|
109
|
+
###
|
110
|
+
# Calculate related spec files
|
111
|
+
#
|
112
|
+
# @return {Set<String>}
|
113
|
+
###
|
114
|
+
def related_spec_files
|
115
|
+
if full_tests?
|
116
|
+
full
|
117
|
+
else
|
118
|
+
dependents | customs
|
119
|
+
end
|
61
120
|
end
|
62
121
|
|
63
122
|
end
|
@@ -4,19 +4,21 @@ module DeltaTest
|
|
4
4
|
module SpecHelpers
|
5
5
|
|
6
6
|
###
|
7
|
-
# Setup generator and hook
|
7
|
+
# Setup generator and hook profiler on contexts
|
8
8
|
###
|
9
9
|
def use_delta_test(example)
|
10
|
-
|
11
|
-
|
10
|
+
generator = DeltaTest::GeneratorSingleton.instance
|
11
|
+
generator.setup!
|
12
12
|
|
13
|
-
example.before(:
|
14
|
-
|
13
|
+
example.before(:all) do
|
14
|
+
generator.start!(example.file_path)
|
15
15
|
end
|
16
16
|
|
17
|
-
example.after(:
|
18
|
-
|
17
|
+
example.after(:all) do
|
18
|
+
generator.stop!
|
19
19
|
end
|
20
|
+
|
21
|
+
generator.hook_on_exit
|
20
22
|
end
|
21
23
|
|
22
24
|
###
|
data/lib/delta_test/version.rb
CHANGED
@@ -154,7 +154,7 @@ describe DeltaTest::CLI do
|
|
154
154
|
|
155
155
|
end
|
156
156
|
|
157
|
-
describe '#
|
157
|
+
describe '#profile_mode?' do
|
158
158
|
|
159
159
|
let(:map) do
|
160
160
|
{
|
@@ -179,7 +179,7 @@ describe DeltaTest::CLI do
|
|
179
179
|
end
|
180
180
|
|
181
181
|
it 'should return true' do
|
182
|
-
expect(cli.
|
182
|
+
expect(cli.profile_mode?).to be(true)
|
183
183
|
end
|
184
184
|
|
185
185
|
end
|
@@ -194,7 +194,7 @@ describe DeltaTest::CLI do
|
|
194
194
|
end
|
195
195
|
|
196
196
|
it 'should return false' do
|
197
|
-
expect(cli.
|
197
|
+
expect(cli.profile_mode?).to be(false)
|
198
198
|
end
|
199
199
|
|
200
200
|
end
|
@@ -306,7 +306,7 @@ describe DeltaTest::CLI do
|
|
306
306
|
context 'Full tests' do
|
307
307
|
|
308
308
|
before do
|
309
|
-
|
309
|
+
allow(cli).to receive(:profile_mode?).with(no_args).and_return(true)
|
310
310
|
end
|
311
311
|
|
312
312
|
it 'should run script with a flag' do
|
@@ -325,7 +325,7 @@ describe DeltaTest::CLI do
|
|
325
325
|
context 'Partial tests' do
|
326
326
|
|
327
327
|
before do
|
328
|
-
|
328
|
+
allow(cli).to receive(:profile_mode?).with(no_args).and_return(false)
|
329
329
|
end
|
330
330
|
|
331
331
|
context 'Any related files' do
|
@@ -365,6 +365,26 @@ describe DeltaTest::CLI do
|
|
365
365
|
|
366
366
|
end
|
367
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
|
+
|
368
388
|
describe '#do_help' do
|
369
389
|
|
370
390
|
it 'should print help' do
|
@@ -394,6 +414,7 @@ describe DeltaTest::CLI do
|
|
394
414
|
'list' => 'do_list',
|
395
415
|
'table' => 'do_table',
|
396
416
|
'exec' => 'do_exec',
|
417
|
+
'clear' => 'do_clear',
|
397
418
|
'help' => 'do_help',
|
398
419
|
'-v' => 'do_version',
|
399
420
|
}
|
@@ -218,6 +218,18 @@ describe DeltaTest::Configuration do
|
|
218
218
|
expect(configuration.table_file_path).to eq(Pathname.new('/somewhere/table_file'))
|
219
219
|
end
|
220
220
|
|
221
|
+
context 'With part' do
|
222
|
+
|
223
|
+
it 'should return a path with a part extension' do
|
224
|
+
configuration.base_path = '/base_path'
|
225
|
+
configuration.table_file = 'somewhere/table_file'
|
226
|
+
|
227
|
+
configuration.precalculate!
|
228
|
+
expect(configuration.table_file_path(1)).to eq(Pathname.new('/base_path/somewhere/table_file.part-1'))
|
229
|
+
end
|
230
|
+
|
231
|
+
end
|
232
|
+
|
221
233
|
end
|
222
234
|
|
223
235
|
end
|
@@ -53,6 +53,41 @@ describe DeltaTest::DependenciesTable do
|
|
53
53
|
|
54
54
|
end
|
55
55
|
|
56
|
+
describe '#reverse_merge!' do
|
57
|
+
|
58
|
+
let(:one_table) { DeltaTest::DependenciesTable.new }
|
59
|
+
let(:other_table) { DeltaTest::DependenciesTable.new }
|
60
|
+
|
61
|
+
it 'should raise an error if other is not an instance of DependenciesTable' do
|
62
|
+
expect {
|
63
|
+
one_table.reverse_merge!({})
|
64
|
+
}.to raise_error(TypeError)
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'should merge other table into self' do
|
68
|
+
one_table[:foo] << 1
|
69
|
+
one_table[:foo] << 2
|
70
|
+
one_table[:bar] << 3
|
71
|
+
one_table[:one] << 4
|
72
|
+
|
73
|
+
other_table[:foo] << 10
|
74
|
+
other_table[:foo] << 20
|
75
|
+
other_table[:bar] << 30
|
76
|
+
other_table[:other] << 40
|
77
|
+
|
78
|
+
expect {
|
79
|
+
one_table.reverse_merge!(other_table)
|
80
|
+
}.not_to raise_error
|
81
|
+
|
82
|
+
expect(one_table.keys).to eq(one_table.keys | other_table.keys)
|
83
|
+
expect(one_table[:foo]).to eq(Set[1, 2, 10, 20])
|
84
|
+
expect(one_table[:bar]).to eq(Set[3, 30])
|
85
|
+
expect(one_table[:one]).to eq(Set[4])
|
86
|
+
expect(one_table[:other]).to eq(Set[40])
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
|
56
91
|
describe '#without_default_proc' do
|
57
92
|
|
58
93
|
it 'should reset default_proc temporary inside a block' do
|
@@ -31,14 +31,14 @@ describe DeltaTest::Generator do
|
|
31
31
|
|
32
32
|
after do
|
33
33
|
DeltaTest.active = false
|
34
|
-
|
34
|
+
DeltaTest::Profiler.clean!
|
35
35
|
end
|
36
36
|
|
37
37
|
describe '#setup!' do
|
38
38
|
|
39
39
|
it 'should setup a generator' do
|
40
40
|
expect {
|
41
|
-
generator.setup!
|
41
|
+
generator.setup!
|
42
42
|
}.not_to raise_error
|
43
43
|
|
44
44
|
expect(generator).to be_respond_to(:table)
|
@@ -50,17 +50,17 @@ describe DeltaTest::Generator do
|
|
50
50
|
describe '#start!' do
|
51
51
|
|
52
52
|
before do
|
53
|
-
generator.setup!
|
53
|
+
generator.setup!
|
54
54
|
end
|
55
55
|
|
56
|
-
it 'should start
|
57
|
-
expect(
|
56
|
+
it 'should start the profiler' do
|
57
|
+
expect(DeltaTest::Profiler.running?).to be(false)
|
58
58
|
|
59
59
|
expect {
|
60
60
|
generator.start!(spec_file)
|
61
61
|
}.not_to raise_error
|
62
62
|
|
63
|
-
expect(
|
63
|
+
expect(DeltaTest::Profiler.running?).to be(true)
|
64
64
|
end
|
65
65
|
|
66
66
|
describe '#current_spec_file' do
|
@@ -84,15 +84,15 @@ describe DeltaTest::Generator do
|
|
84
84
|
describe '#stop!' do
|
85
85
|
|
86
86
|
before do
|
87
|
-
generator.setup!
|
87
|
+
generator.setup!
|
88
88
|
end
|
89
89
|
|
90
|
-
it 'should stop
|
91
|
-
expect(
|
90
|
+
it 'should stop the profiler' do
|
91
|
+
expect(DeltaTest::Profiler.running?).to be(false)
|
92
92
|
generator.start!(spec_file)
|
93
|
-
expect(
|
93
|
+
expect(DeltaTest::Profiler.running?).to be(true)
|
94
94
|
generator.stop!
|
95
|
-
expect(
|
95
|
+
expect(DeltaTest::Profiler.running?).to be(false)
|
96
96
|
end
|
97
97
|
|
98
98
|
it 'should unset current_spec_file' do
|
@@ -108,7 +108,7 @@ describe DeltaTest::Generator do
|
|
108
108
|
describe '#table' do
|
109
109
|
|
110
110
|
before do
|
111
|
-
generator.setup!
|
111
|
+
generator.setup!
|
112
112
|
end
|
113
113
|
|
114
114
|
it 'should return a set of source files' do
|
@@ -168,15 +168,15 @@ describe DeltaTest::Generator do
|
|
168
168
|
context 'When `setup!` is called' do
|
169
169
|
|
170
170
|
before do
|
171
|
-
generator.setup!
|
171
|
+
generator.setup!
|
172
172
|
end
|
173
173
|
|
174
|
-
it 'should stop
|
175
|
-
expect(
|
174
|
+
it 'should stop the profiler if running' do
|
175
|
+
expect(DeltaTest::Profiler.running?).to be(false)
|
176
176
|
generator.start!(spec_file)
|
177
|
-
expect(
|
177
|
+
expect(DeltaTest::Profiler.running?).to be(true)
|
178
178
|
generator.teardown!
|
179
|
-
expect(
|
179
|
+
expect(DeltaTest::Profiler.running?).to be(false)
|
180
180
|
end
|
181
181
|
|
182
182
|
it 'should save the table into a file' do
|
@@ -198,4 +198,21 @@ describe DeltaTest::Generator do
|
|
198
198
|
|
199
199
|
end
|
200
200
|
|
201
|
+
describe '#hook_on_exit' do
|
202
|
+
|
203
|
+
before do
|
204
|
+
allow(Kernel).to receive(:at_exit).and_return(nil)
|
205
|
+
end
|
206
|
+
|
207
|
+
it 'should call at_exit' do
|
208
|
+
# FIXME
|
209
|
+
# expect(Kernel).to receive(:at_exit)
|
210
|
+
|
211
|
+
expect {
|
212
|
+
generator.hook_on_exit
|
213
|
+
}.not_to raise_error
|
214
|
+
end
|
215
|
+
|
216
|
+
end
|
217
|
+
|
201
218
|
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
require 'delta_test/profiler'
|
2
|
+
|
3
|
+
describe DeltaTest::Profiler do
|
4
|
+
|
5
|
+
after do
|
6
|
+
DeltaTest::Profiler.clean!
|
7
|
+
end
|
8
|
+
|
9
|
+
describe '::start!' do
|
10
|
+
|
11
|
+
it 'should start profiler' do
|
12
|
+
expect(DeltaTest::Profiler.running?).to be(false)
|
13
|
+
|
14
|
+
expect {
|
15
|
+
DeltaTest::Profiler.start!
|
16
|
+
}.not_to raise_error
|
17
|
+
|
18
|
+
expect(DeltaTest::Profiler.running?).to be(true)
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
describe '::stop!' do
|
24
|
+
|
25
|
+
it 'should not raise error if the profiler not yet started' do
|
26
|
+
expect {
|
27
|
+
DeltaTest::Profiler.stop!
|
28
|
+
}.not_to raise_error
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should set result' do
|
32
|
+
expect(DeltaTest::Profiler.last_result).to be_a(Array)
|
33
|
+
|
34
|
+
DeltaTest::Profiler.start!
|
35
|
+
|
36
|
+
expect {
|
37
|
+
DeltaTest::Profiler.stop!
|
38
|
+
}.not_to raise_error
|
39
|
+
|
40
|
+
expect(DeltaTest::Profiler.last_result).to be_a(Array)
|
41
|
+
expect(DeltaTest::Profiler.last_result).not_to be_empty
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
describe '::last_result' do
|
47
|
+
|
48
|
+
it 'should retrun an array if not yet started' do
|
49
|
+
files = DeltaTest::Profiler.last_result
|
50
|
+
expect(files).to be_a(Array)
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'should return nil if running' do
|
54
|
+
DeltaTest::Profiler.start!
|
55
|
+
|
56
|
+
files = DeltaTest::Profiler.last_result
|
57
|
+
expect(files).to be_nil
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should return an array of source files' do
|
61
|
+
DeltaTest::Profiler.start!
|
62
|
+
DeltaTest::Profiler.stop!
|
63
|
+
files = DeltaTest::Profiler.last_result
|
64
|
+
expect(files).to be_a(Array)
|
65
|
+
end
|
66
|
+
|
67
|
+
describe 'Source files' do
|
68
|
+
|
69
|
+
context 'Instantiated class in a file' do
|
70
|
+
|
71
|
+
it 'should not include the file' do
|
72
|
+
DeltaTest::Profiler.start!
|
73
|
+
Sample::Alpha.new
|
74
|
+
DeltaTest::Profiler.stop!
|
75
|
+
expect(DeltaTest::Profiler.last_result).not_to include(fixture_path('sample/alpha.rb'))
|
76
|
+
expect(DeltaTest::Profiler.last_result).not_to include(fixture_path('sample/beta.rb'))
|
77
|
+
expect(DeltaTest::Profiler.last_result).not_to include(fixture_path('sample/gamma.rb'))
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
context 'Called some instance methods of a class in the file' do
|
83
|
+
|
84
|
+
it 'should include the file' do
|
85
|
+
DeltaTest::Profiler.start!
|
86
|
+
Sample::Alpha.new.alpha
|
87
|
+
DeltaTest::Profiler.stop!
|
88
|
+
expect(DeltaTest::Profiler.last_result).to include(fixture_path('sample/alpha.rb'))
|
89
|
+
expect(DeltaTest::Profiler.last_result).not_to include(fixture_path('sample/beta.rb'))
|
90
|
+
expect(DeltaTest::Profiler.last_result).not_to include(fixture_path('sample/gamma.rb'))
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
|
95
|
+
context 'Called methods that uses extarnal classes' do
|
96
|
+
|
97
|
+
it 'should include a extarnal file' do
|
98
|
+
DeltaTest::Profiler.start!
|
99
|
+
Sample::Alpha.new.beta
|
100
|
+
DeltaTest::Profiler.stop!
|
101
|
+
expect(DeltaTest::Profiler.last_result).to include(fixture_path('sample/alpha.rb'))
|
102
|
+
expect(DeltaTest::Profiler.last_result).to include(fixture_path('sample/beta.rb'))
|
103
|
+
expect(DeltaTest::Profiler.last_result).not_to include(fixture_path('sample/gamma.rb'))
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'should include extarnal files even if nested' do
|
107
|
+
DeltaTest::Profiler.start!
|
108
|
+
Sample::Alpha.new.beta_gamma
|
109
|
+
DeltaTest::Profiler.stop!
|
110
|
+
expect(DeltaTest::Profiler.last_result).to include(fixture_path('sample/alpha.rb'))
|
111
|
+
expect(DeltaTest::Profiler.last_result).to include(fixture_path('sample/beta.rb'))
|
112
|
+
expect(DeltaTest::Profiler.last_result).to include(fixture_path('sample/gamma.rb'))
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|