junit_merge 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +5 -0
- data/lib/junit_merge/app.rb +40 -26
- data/lib/junit_merge/version.rb +1 -1
- data/test/junit_merge/test_app.rb +34 -3
- 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: 7c5988839b9f2e70c06f6c8537422507866f45f9
|
4
|
+
data.tar.gz: 433480317edd29129dfeea288ae73e66780e9e2c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4976b5600a486350cd924e8dce075a69a15d1ac6b17ca18a58a28c455687aebf14079c8f50eee1c48a47dde9b9b6753b8a823ac2e27ce67c88c657be0120c969
|
7
|
+
data.tar.gz: 7f8430c30a18fb3d1f145f064199e96cc617c5a9f99ba002a67dfdbc28397553249963564b5d829ee8865f08996c5bce139701cacacec72924210449577c1ec6
|
data/CHANGELOG
CHANGED
data/lib/junit_merge/app.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'optparse'
|
1
2
|
require 'find'
|
2
3
|
require 'fileutils'
|
3
4
|
require 'nokogiri'
|
@@ -10,35 +11,41 @@ module JunitMerge
|
|
10
11
|
@stdin = options[:stdin ] || STDIN
|
11
12
|
@stdout = options[:stdout] || STDOUT
|
12
13
|
@stderr = options[:stderr] || STDERR
|
14
|
+
@update_only = false
|
13
15
|
end
|
14
16
|
|
15
17
|
attr_reader :stdin, :stdout, :stderr
|
16
18
|
|
17
19
|
def run(*args)
|
18
|
-
|
20
|
+
*source_paths, target_path = parse_args(args)
|
21
|
+
all_paths = [*source_paths, target_path]
|
19
22
|
|
20
|
-
not_found =
|
23
|
+
not_found = all_paths.select { |path| !File.exist?(path) }
|
21
24
|
not_found.empty? or
|
22
|
-
raise Error, "no such file: #{not_found.join(', ')}"
|
23
|
-
|
24
|
-
if
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
if File.
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
25
|
+
raise Error, "no such file(s): #{not_found.join(', ')}"
|
26
|
+
|
27
|
+
if source_paths.empty?
|
28
|
+
stderr.puts "warning: no source files given"
|
29
|
+
else
|
30
|
+
source_paths.each do |source_path|
|
31
|
+
if File.directory?(source_path)
|
32
|
+
Find.find(source_path) do |source_file_path|
|
33
|
+
next if !File.file?(source_file_path)
|
34
|
+
target_file_path = source_file_path.sub(source_path, target_path)
|
35
|
+
if File.exist?(target_file_path)
|
36
|
+
merge_file(source_file_path, target_file_path)
|
37
|
+
else
|
38
|
+
FileUtils.mkdir_p(File.dirname(target_file_path))
|
39
|
+
FileUtils.cp(source_file_path, target_file_path)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
else File.exist?(source_path)
|
43
|
+
merge_file(source_path, target_path)
|
33
44
|
end
|
34
45
|
end
|
35
|
-
elsif File.exist?(source_path)
|
36
|
-
merge_file(source_path, target_path)
|
37
|
-
else
|
38
|
-
raise Error, "no such file: #{source_path}"
|
39
46
|
end
|
40
47
|
0
|
41
|
-
rescue Error => error
|
48
|
+
rescue Error, OptionParser::ParseError => error
|
42
49
|
stderr.puts error.message
|
43
50
|
1
|
44
51
|
end
|
@@ -63,7 +70,6 @@ module JunitMerge
|
|
63
70
|
|
64
71
|
source.xpath("//testsuite/testcase").each do |node|
|
65
72
|
summary_diff = SummaryDiff.new
|
66
|
-
summary_diff.add(node, 1)
|
67
73
|
|
68
74
|
predicates = [
|
69
75
|
attribute_predicate('classname', node['classname']),
|
@@ -72,9 +78,11 @@ module JunitMerge
|
|
72
78
|
original = target.xpath("testsuite/testcase[#{predicates}]").first
|
73
79
|
|
74
80
|
if original
|
81
|
+
summary_diff.add(node, 1)
|
75
82
|
summary_diff.add(original, -1)
|
76
83
|
original.replace(node)
|
77
|
-
|
84
|
+
elsif !@update_only
|
85
|
+
summary_diff.add(node, 1)
|
78
86
|
testsuite = target.xpath("testsuite").first
|
79
87
|
testsuite.add_child(node)
|
80
88
|
end
|
@@ -121,13 +129,19 @@ module JunitMerge
|
|
121
129
|
end
|
122
130
|
|
123
131
|
def parse_args(args)
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
132
|
+
parser = OptionParser.new do |parser|
|
133
|
+
parser.banner = "USAGE: #$0 [options] SOURCES ... TARGET"
|
134
|
+
parser.on '-u', '--update-only', "Only update nodes, don't append new nodes in the source." do
|
135
|
+
@update_only = true
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
parser.parse!(args)
|
128
140
|
|
129
|
-
|
130
|
-
|
141
|
+
args.size >= 1 or
|
142
|
+
raise Error, parser.banner
|
143
|
+
|
144
|
+
args
|
131
145
|
end
|
132
146
|
end
|
133
147
|
end
|
data/lib/junit_merge/version.rb
CHANGED
@@ -95,7 +95,7 @@ describe JunitMerge::App do
|
|
95
95
|
stderr.string.must_equal('')
|
96
96
|
end
|
97
97
|
|
98
|
-
it "appends nodes only in the source" do
|
98
|
+
it "appends nodes only in the source by default" do
|
99
99
|
create_file("#{tmp}/source.xml", 'a.a' => :fail, 'a.b' => :error)
|
100
100
|
create_file("#{tmp}/target.xml", 'a.a' => :pass)
|
101
101
|
app.run("#{tmp}/source.xml", "#{tmp}/target.xml").must_equal 0
|
@@ -106,6 +106,17 @@ describe JunitMerge::App do
|
|
106
106
|
stderr.string.must_equal('')
|
107
107
|
end
|
108
108
|
|
109
|
+
it "skips nodes only in the source if --update is given" do
|
110
|
+
create_file("#{tmp}/source.xml", 'a.a' => :fail, 'a.b' => :error)
|
111
|
+
create_file("#{tmp}/target.xml", 'a.a' => :pass)
|
112
|
+
app.run('--update-only', "#{tmp}/source.xml", "#{tmp}/target.xml").must_equal 0
|
113
|
+
document = parse_file("#{tmp}/target.xml")
|
114
|
+
results(document).must_equal([['a.a', :fail]])
|
115
|
+
summaries(document).must_equal([{tests: 1, failures: 1, errors: 0, skipped: 0}])
|
116
|
+
stdout.string.must_equal('')
|
117
|
+
stderr.string.must_equal('')
|
118
|
+
end
|
119
|
+
|
109
120
|
it "correctly merges tests with metacharacters in the name" do
|
110
121
|
create_file("#{tmp}/source.xml", 'a\'"a.b"\'b' => :pass)
|
111
122
|
create_file("#{tmp}/target.xml", 'a\'"a.b"\'b' => :fail)
|
@@ -184,9 +195,29 @@ describe JunitMerge::App do
|
|
184
195
|
stderr.string.must_match /no such file/
|
185
196
|
end
|
186
197
|
|
187
|
-
it "
|
198
|
+
it "exits with a warning if no source files are given" do
|
199
|
+
create_file("#{tmp}/target.xml", 'a.a' => :pass, 'a.b' => :fail)
|
200
|
+
app.run("#{tmp}/target.xml").must_equal 0
|
201
|
+
document = parse_file("#{tmp}/target.xml")
|
202
|
+
results(document).must_equal([['a.a', :pass], ['a.b', :fail]])
|
203
|
+
stdout.string.must_equal('')
|
204
|
+
stderr.string.must_equal("warning: no source files given\n")
|
205
|
+
end
|
206
|
+
|
207
|
+
it "can merge multiple source files into the target in order" do
|
208
|
+
create_file("#{tmp}/source1.xml", 'a.a' => :fail, 'a.b' => :fail)
|
209
|
+
create_file("#{tmp}/source2.xml", 'a.a' => :pass)
|
210
|
+
create_file("#{tmp}/target.xml", 'a.a' => :error, 'a.b' => :error, 'a.c' => :error)
|
211
|
+
app.run("#{tmp}/source1.xml", "#{tmp}/source2.xml", "#{tmp}/target.xml").must_equal 0
|
212
|
+
document = parse_file("#{tmp}/target.xml")
|
213
|
+
results(document).must_equal([['a.a', :pass], ['a.b', :fail], ['a.c', :error]])
|
214
|
+
stdout.string.must_equal('')
|
215
|
+
stderr.string.must_equal('')
|
216
|
+
end
|
217
|
+
|
218
|
+
it "errors with a usage message if no args aren't given" do
|
188
219
|
FileUtils.touch "#{tmp}/source.xml"
|
189
|
-
app.run
|
220
|
+
app.run.must_equal 1
|
190
221
|
File.read("#{tmp}/source.xml").must_equal('')
|
191
222
|
stdout.string.must_equal('')
|
192
223
|
stderr.string.must_match /USAGE/
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: junit_merge
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- George Ogata
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-04-
|
11
|
+
date: 2014-04-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|