delta_test 1.0.0 → 1.0.1
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 +6 -0
- data/README.md +3 -4
- data/lib/delta_test.rb +1 -1
- data/lib/delta_test/cli/command_base.rb +5 -3
- data/lib/delta_test/cli/exec_command.rb +57 -51
- data/lib/delta_test/cli/help_command.rb +2 -2
- data/lib/delta_test/configuration.rb +15 -20
- data/lib/delta_test/stats.rb +29 -9
- data/lib/delta_test/version.rb +1 -1
- data/spec/lib/delta_test/cli/command_base_spec.rb +3 -3
- data/spec/lib/delta_test/cli/exec_command_spec.rb +5 -4
- data/spec/lib/delta_test/cli/specs_command_spec.rb +1 -0
- data/spec/lib/delta_test/stats_spec.rb +42 -4
- data/spec/lib/delta_test_spec.rb +1 -1
- data/spec/rails/Gemfile.lock +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 47f4e1eb57e82c65b8a07fa27ac74a5317abe77d
|
4
|
+
data.tar.gz: 3f4f42d81b721b034d38a205cb16b1c833d9c766
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 57d222b76717aa98fffb62a447a488af498b51e9dd678b8d2a48198e48e1f52c4f44ff0b83bd0846635ca96f20dd72f64e4543c4d43c86ea1bc69b8a0f3589af
|
7
|
+
data.tar.gz: 22cd884b4a5907bfe680a711568548c7011925b05a6433c5737aad31d3fdd159b17f17f74c80315502934671645ab3b459b7a8e37eb51bae49d4691b002091ef
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -63,8 +63,7 @@ Usage
|
|
63
63
|
```bash
|
64
64
|
$ git clone git@example.com:sample/sample_stats.git tmp/delta_test_stats
|
65
65
|
$ delta_test stats:clean
|
66
|
-
$ delta_test exec rspec
|
67
|
-
$ delta_test exec rspec spec/controllers
|
66
|
+
$ delta_test exec rspec
|
68
67
|
$ delta_test stats:save
|
69
68
|
```
|
70
69
|
|
@@ -81,9 +80,9 @@ options:
|
|
81
80
|
--verbose Print more output.
|
82
81
|
|
83
82
|
commands:
|
84
|
-
exec [--force
|
83
|
+
exec [--force] <script> -- <files...>
|
85
84
|
Execute test script using delta_test.
|
86
|
-
--force
|
85
|
+
--force to force DeltaTest to run full test in profile mode.
|
87
86
|
|
88
87
|
specs List related spec files for changes.
|
89
88
|
|
data/lib/delta_test.rb
CHANGED
@@ -8,9 +8,9 @@ module DeltaTest
|
|
8
8
|
class CommandBase
|
9
9
|
|
10
10
|
DEFAULT_OPTIONS = {
|
11
|
-
'verbose'
|
12
|
-
'force
|
13
|
-
'no-sync'
|
11
|
+
'verbose' => false,
|
12
|
+
'force' => false,
|
13
|
+
'no-sync' => false,
|
14
14
|
}.freeze
|
15
15
|
|
16
16
|
attr_reader(*%i[
|
@@ -87,6 +87,8 @@ module DeltaTest
|
|
87
87
|
# @params {Integer|Nil} status
|
88
88
|
###
|
89
89
|
def exec_with_data(args, ary, status = nil)
|
90
|
+
$stdout.sync = true
|
91
|
+
|
90
92
|
Open3.popen3(args) do |i, o, e, w|
|
91
93
|
i.write(ary.join("\n")) if ary
|
92
94
|
i.close
|
@@ -10,53 +10,79 @@ module DeltaTest
|
|
10
10
|
SPLITTER = '--'.freeze
|
11
11
|
|
12
12
|
def invoke!
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
retrive_spec_files
|
14
|
+
extract_arg_files
|
15
|
+
filter_spec_files
|
16
|
+
run_command
|
17
|
+
end
|
17
18
|
|
18
|
-
|
19
|
-
|
19
|
+
def stats
|
20
|
+
@stats ||= Stats.new
|
21
|
+
end
|
20
22
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
list.retrive_changed_files!(stats.base_commit)
|
23
|
+
def list
|
24
|
+
@list ||= RelatedSpecList.new
|
25
|
+
end
|
25
26
|
|
26
|
-
|
27
|
+
def profile_mode?
|
28
|
+
return @profile_mode if defined?(@profile_mode)
|
29
|
+
@profile_mode = !stats.base_commit || !!@options['force']
|
30
|
+
end
|
31
|
+
|
32
|
+
def retrive_spec_files
|
33
|
+
return if profile_mode?
|
34
|
+
|
35
|
+
puts 'Base commit: %s' % [stats.base_commit]
|
36
|
+
puts
|
37
|
+
|
38
|
+
list.load_table!(stats.table_file_path)
|
39
|
+
list.retrive_changed_files!(stats.base_commit)
|
27
40
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
rescue TableNotFoundError
|
33
|
-
# force profile mode cuz we don't have a table
|
34
|
-
@profile_mode = true
|
41
|
+
@spec_files = list.related_spec_files.to_a
|
42
|
+
|
43
|
+
if @spec_files.empty?
|
44
|
+
exit_with_message(0, 'Nothing to test')
|
35
45
|
end
|
46
|
+
rescue TableNotFoundError
|
47
|
+
# force profile mode cuz we don't have a table
|
48
|
+
@profile_mode = true
|
49
|
+
end
|
36
50
|
|
51
|
+
def extract_arg_files
|
37
52
|
@args.map! { |arg| Shellwords.escape(arg) }
|
38
53
|
|
39
|
-
|
40
|
-
|
54
|
+
splitter = @args.index(SPLITTER)
|
55
|
+
return unless splitter
|
56
|
+
|
57
|
+
@arg_files = @args.drop(splitter + 1)
|
58
|
+
if @arg_files && @arg_files.any?
|
41
59
|
@args = @args.take(splitter)
|
60
|
+
else
|
61
|
+
@arg_files = nil
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def filter_spec_files
|
66
|
+
return unless @arg_files
|
42
67
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
spec_files = files
|
50
|
-
end
|
51
|
-
end
|
68
|
+
if @spec_files
|
69
|
+
pattern = @arg_files.map { |file| Regexp.escape(file) }
|
70
|
+
pattern = '^(%s)' % pattern.join('|')
|
71
|
+
@spec_files = @spec_files.grep(pattern)
|
72
|
+
else
|
73
|
+
@spec_files = @arg_files
|
52
74
|
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def run_command
|
78
|
+
args = []
|
53
79
|
|
54
80
|
if profile_mode?
|
55
81
|
args << ('%s=%s' % [VERBOSE_FLAG, true]) if DeltaTest.verbose?
|
56
82
|
args << ('%s=%s' % [ACTIVE_FLAG, true])
|
57
83
|
end
|
58
84
|
|
59
|
-
if spec_files
|
85
|
+
if @spec_files
|
60
86
|
args.unshift('cat', '|')
|
61
87
|
args << 'xargs'
|
62
88
|
end
|
@@ -67,27 +93,7 @@ module DeltaTest
|
|
67
93
|
|
68
94
|
args += @args
|
69
95
|
|
70
|
-
|
71
|
-
|
72
|
-
exec_with_data(args.join(' '), spec_files)
|
73
|
-
end
|
74
|
-
|
75
|
-
def stats
|
76
|
-
@stats ||= Stats.new
|
77
|
-
end
|
78
|
-
|
79
|
-
def list
|
80
|
-
@list ||= RelatedSpecList.new
|
81
|
-
end
|
82
|
-
|
83
|
-
###
|
84
|
-
# Whether run full test or not
|
85
|
-
#
|
86
|
-
# @return {Boolean}
|
87
|
-
###
|
88
|
-
def profile_mode?
|
89
|
-
return @profile_mode if defined?(@profile_mode)
|
90
|
-
@profile_mode = !stats.base_commit && !@options['force-run']
|
96
|
+
exec_with_data(args.join(' '), @spec_files)
|
91
97
|
end
|
92
98
|
|
93
99
|
end
|
@@ -11,9 +11,9 @@ options:
|
|
11
11
|
--verbose Print more output.
|
12
12
|
|
13
13
|
commands:
|
14
|
-
exec [--force
|
14
|
+
exec [--force] <script> -- <files...>
|
15
15
|
Execute test script using delta_test.
|
16
|
-
--force
|
16
|
+
--force to force DeltaTest to run full test in profile mode.
|
17
17
|
|
18
18
|
specs List related spec files for changes.
|
19
19
|
|
@@ -44,17 +44,15 @@ module DeltaTest
|
|
44
44
|
CONFIG_FILES = [
|
45
45
|
'delta_test.yml',
|
46
46
|
'delta_test.yaml',
|
47
|
-
].freeze
|
48
|
-
|
49
|
-
PART_FILE_EXT = '.part-%s'
|
47
|
+
].map(&:freeze).freeze
|
50
48
|
|
51
49
|
attr_accessor(*%i[
|
52
50
|
base_path
|
53
|
-
files
|
54
|
-
|
55
51
|
stats_path
|
56
52
|
stats_life
|
57
53
|
|
54
|
+
files
|
55
|
+
|
58
56
|
patterns
|
59
57
|
exclude_patterns
|
60
58
|
full_test_patterns
|
@@ -74,14 +72,6 @@ module DeltaTest
|
|
74
72
|
Git.new(self.base_path).git_repo?
|
75
73
|
end
|
76
74
|
|
77
|
-
validate :files, 'need to be an array' do
|
78
|
-
self.files.is_a?(Array)
|
79
|
-
end
|
80
|
-
|
81
|
-
validate :patterns, 'need to be an array' do
|
82
|
-
self.patterns.is_a?(Array)
|
83
|
-
end
|
84
|
-
|
85
75
|
validate :stats_path, 'need to be an absolute path' do
|
86
76
|
self.stats_path.absolute? rescue false
|
87
77
|
end
|
@@ -94,6 +84,14 @@ module DeltaTest
|
|
94
84
|
self.stats_life.is_a?(Integer) && self.stats_life > 0
|
95
85
|
end
|
96
86
|
|
87
|
+
validate :files, 'need to be an array' do
|
88
|
+
self.files.is_a?(Array)
|
89
|
+
end
|
90
|
+
|
91
|
+
validate :patterns, 'need to be an array' do
|
92
|
+
self.patterns.is_a?(Array)
|
93
|
+
end
|
94
|
+
|
97
95
|
validate :exclude_patterns, 'need to be an array' do
|
98
96
|
self.exclude_patterns.is_a?(Array)
|
99
97
|
end
|
@@ -112,12 +110,12 @@ module DeltaTest
|
|
112
110
|
|
113
111
|
def initialize
|
114
112
|
update(validate: false) do |c|
|
115
|
-
c.base_path
|
116
|
-
c.files = []
|
117
|
-
|
113
|
+
c.base_path = File.expand_path('.')
|
118
114
|
c.stats_path = File.expand_path('tmp/delta_test_stats')
|
119
115
|
c.stats_life = 1000 # commits
|
120
116
|
|
117
|
+
c.files = []
|
118
|
+
|
121
119
|
c.patterns = []
|
122
120
|
c.exclude_patterns = []
|
123
121
|
c.full_test_patterns = []
|
@@ -171,10 +169,7 @@ module DeltaTest
|
|
171
169
|
filtered_files = self.files
|
172
170
|
.map { |f| Utils.regulate_filepath(f, self.base_path) }
|
173
171
|
.uniq
|
174
|
-
|
175
|
-
filtered_files = Utils.files_grep(filtered_files, self.patterns, self.exclude_patterns)
|
176
|
-
|
177
|
-
@filtered_files = Set.new(filtered_files)
|
172
|
+
@filtered_files = Utils.files_grep(filtered_files, self.patterns, self.exclude_patterns).to_set
|
178
173
|
|
179
174
|
@stats_path = Pathname.new(File.absolute_path(self.stats_path, self.base_path))
|
180
175
|
end
|
data/lib/delta_test/stats.rb
CHANGED
@@ -6,24 +6,31 @@ module DeltaTest
|
|
6
6
|
attr_reader :base_git
|
7
7
|
attr_reader :stats_git
|
8
8
|
|
9
|
-
|
9
|
+
TABLE_FILENAME_TPL = '%s.table'.freeze
|
10
|
+
TABLE_FILENAME_PATTERN = '*.table'.freeze
|
10
11
|
|
11
12
|
def initialize(head: false)
|
13
|
+
@head = !!head
|
14
|
+
|
12
15
|
@base_git = Git.new(DeltaTest.config.base_path)
|
13
16
|
@stats_git = Git.new(DeltaTest.config.stats_path)
|
14
|
-
|
15
|
-
@base_commit = @base_git.rev_parse('HEAD') if head
|
16
17
|
end
|
17
18
|
|
18
19
|
def base_commit
|
19
20
|
return @base_commit if defined?(@base_commit)
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
|
22
|
+
if @head
|
23
|
+
@base_commit = @base_git.rev_parse('HEAD')
|
24
|
+
else
|
25
|
+
indexes = @stats_git.ls_files
|
26
|
+
.map { |f| f.split('/').take(2).join('') }
|
27
|
+
.to_set
|
28
|
+
|
29
|
+
@base_commit = @base_git.ls_hashes(DeltaTest.config.stats_life)
|
30
|
+
.find { |h| indexes.include?(h) }
|
31
|
+
end
|
24
32
|
|
25
|
-
@base_commit
|
26
|
-
.find { |h| indexes.include?(h) }
|
33
|
+
@base_commit
|
27
34
|
end
|
28
35
|
|
29
36
|
def commit_dir
|
@@ -34,7 +41,20 @@ module DeltaTest
|
|
34
41
|
end
|
35
42
|
|
36
43
|
def table_file_path
|
37
|
-
|
44
|
+
return unless commit_dir
|
45
|
+
return @table_file_path if defined?(@table_file_path)
|
46
|
+
|
47
|
+
if @head
|
48
|
+
@table_file_path = commit_dir.join(TABLE_FILENAME_TPL % [DeltaTest.tester_id])
|
49
|
+
else
|
50
|
+
file = Dir.glob(commit_dir.join(TABLE_FILENAME_PATTERN)).max do |f|
|
51
|
+
File.basename(f).split('-').take(2).join('.').to_f
|
52
|
+
end
|
53
|
+
@table_file_path = file
|
54
|
+
@table_file_path = Pathname.new(file) if file
|
55
|
+
end
|
56
|
+
|
57
|
+
@table_file_path
|
38
58
|
end
|
39
59
|
|
40
60
|
end
|
data/lib/delta_test/version.rb
CHANGED
@@ -100,17 +100,17 @@ describe DeltaTest::CLI::CommandBase do
|
|
100
100
|
|
101
101
|
expect(options).to be_a(Hash)
|
102
102
|
|
103
|
-
expect(options['force
|
103
|
+
expect(options['force']).to eq(false)
|
104
104
|
expect(options['verbose']).to eq(false)
|
105
105
|
end
|
106
106
|
|
107
107
|
it 'should be able to overwrite default options' do
|
108
|
-
args = ['--force
|
108
|
+
args = ['--force', '--verbose']
|
109
109
|
options = command_base.parse_options!(args)
|
110
110
|
|
111
111
|
expect(options).to be_a(Hash)
|
112
112
|
|
113
|
-
expect(options['force
|
113
|
+
expect(options['force']).to eq(true)
|
114
114
|
expect(options['verbose']).to eq(true)
|
115
115
|
end
|
116
116
|
|
@@ -26,6 +26,7 @@ describe DeltaTest::CLI::ExecCommand do
|
|
26
26
|
allow(command.list).to receive(:related_spec_files).and_return(related_spec_files)
|
27
27
|
|
28
28
|
allow(command.stats).to receive(:base_commit).and_return(base_commit)
|
29
|
+
allow(command.stats).to receive(:table_file_path).and_return(nil)
|
29
30
|
end
|
30
31
|
|
31
32
|
describe '#profile_mode?' do
|
@@ -45,13 +46,13 @@ describe DeltaTest::CLI::ExecCommand do
|
|
45
46
|
expect(command.profile_mode?).to be(true)
|
46
47
|
end
|
47
48
|
|
48
|
-
context 'with --force
|
49
|
+
context 'with --force' do
|
49
50
|
|
50
|
-
let(:args) { ['--force
|
51
|
+
let(:args) { ['--force', 'bundle', 'exec', 'rspec'] }
|
51
52
|
|
52
|
-
it 'should always return
|
53
|
+
it 'should always return true' do
|
53
54
|
allow(command.stats).to receive(:base_commit).and_return(nil)
|
54
|
-
expect(command.profile_mode?).to be(
|
55
|
+
expect(command.profile_mode?).to be(true)
|
55
56
|
end
|
56
57
|
|
57
58
|
end
|
@@ -18,6 +18,7 @@ describe DeltaTest::CLI::SpecsCommand do
|
|
18
18
|
allow(command.list).to receive(:related_spec_files).and_return(related_spec_files)
|
19
19
|
|
20
20
|
allow(command.stats).to receive(:base_commit).and_return(base_commit)
|
21
|
+
allow(command.stats).to receive(:table_file_path).and_return(nil)
|
21
22
|
end
|
22
23
|
|
23
24
|
describe '#invoke!' do
|
@@ -30,9 +30,10 @@ describe DeltaTest::Stats do
|
|
30
30
|
let(:files) do
|
31
31
|
[
|
32
32
|
'11/11111111111111111111111111111111111111/foo.txt',
|
33
|
-
'11/11111111111111111111111111111111111111/table
|
33
|
+
'11/11111111111111111111111111111111111111/1000000000-1000000-100.table',
|
34
34
|
'33/33333333333333333333333333333333333333/bar.txt',
|
35
|
-
'33/33333333333333333333333333333333333333/table
|
35
|
+
'33/33333333333333333333333333333333333333/2000000000-1000000-100.table',
|
36
|
+
'33/33333333333333333333333333333333333333/1000000000-1000000-100.table',
|
36
37
|
]
|
37
38
|
end
|
38
39
|
|
@@ -41,6 +42,11 @@ describe DeltaTest::Stats do
|
|
41
42
|
.with(DeltaTest.config.stats_life)
|
42
43
|
.and_return(commit_hashes)
|
43
44
|
allow_any_instance_of(DeltaTest::Git).to receive(:ls_files).and_return([])
|
45
|
+
|
46
|
+
files.each do |file|
|
47
|
+
file = DeltaTest.config.stats_path.join(file)
|
48
|
+
FakeFS::FileSystem.add(file, FakeFS::FakeFile.new)
|
49
|
+
end
|
44
50
|
end
|
45
51
|
|
46
52
|
describe '#base_commit' do
|
@@ -73,9 +79,9 @@ describe DeltaTest::Stats do
|
|
73
79
|
|
74
80
|
describe '#table_file_path' do
|
75
81
|
|
76
|
-
let(:table_file_path) { DeltaTest.config.stats_path.join('33/33333333333333333333333333333333333333/table
|
82
|
+
let(:table_file_path) { DeltaTest.config.stats_path.join('33/33333333333333333333333333333333333333/2000000000-1000000-100.table') }
|
77
83
|
|
78
|
-
it 'should return a path of table file' do
|
84
|
+
it 'should return a path of the newest table file' do
|
79
85
|
allow_any_instance_of(DeltaTest::Git).to receive(:ls_files).and_return(files)
|
80
86
|
expect(stats.table_file_path).to eq(table_file_path)
|
81
87
|
end
|
@@ -86,4 +92,36 @@ describe DeltaTest::Stats do
|
|
86
92
|
|
87
93
|
end
|
88
94
|
|
95
|
+
context 'head: true' do
|
96
|
+
|
97
|
+
let(:stats) { DeltaTest::Stats.new(head: true) }
|
98
|
+
|
99
|
+
let(:head_commit) { '4444444444444444444444444444444444444444' }
|
100
|
+
|
101
|
+
before do
|
102
|
+
allow_any_instance_of(DeltaTest::Git).to receive(:rev_parse)
|
103
|
+
.with('HEAD')
|
104
|
+
.and_return(head_commit)
|
105
|
+
end
|
106
|
+
|
107
|
+
describe '#base_commit' do
|
108
|
+
|
109
|
+
it 'should return a commit hash of HEAD' do
|
110
|
+
expect(stats.base_commit).to eq(head_commit)
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
|
115
|
+
describe '#table_file_path' do
|
116
|
+
|
117
|
+
let(:table_file_path) { DeltaTest.config.stats_path.join('44/44444444444444444444444444444444444444/%s.table' % [DeltaTest.tester_id]) }
|
118
|
+
|
119
|
+
it 'should return a path of the current tester_id' do
|
120
|
+
expect(stats.table_file_path).to eq(table_file_path)
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
126
|
+
|
89
127
|
end
|
data/spec/lib/delta_test_spec.rb
CHANGED
@@ -120,7 +120,7 @@ describe DeltaTest do
|
|
120
120
|
|
121
121
|
it 'should return an unique id for process' do
|
122
122
|
expect(DeltaTest.tester_id).to be_a(String)
|
123
|
-
expect(DeltaTest.tester_id).to match(/\
|
123
|
+
expect(DeltaTest.tester_id).to match(/\A\d+-\d+-\d+\z/)
|
124
124
|
end
|
125
125
|
|
126
126
|
end
|
data/spec/rails/Gemfile.lock
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: delta_test
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yuki Iwanaga
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-11-
|
11
|
+
date: 2015-11-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|