golden_rose 0.1.0 → 1.0.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +10 -5
- data/golden_rose.gemspec +3 -1
- data/lib/golden_rose/build_log/build_section.rb +56 -0
- data/lib/golden_rose/build_log/build_target.rb +21 -0
- data/lib/golden_rose/build_log/parser.rb +40 -0
- data/lib/golden_rose/build_log.rb +3 -0
- data/lib/golden_rose/child_item.rb +91 -9
- data/lib/golden_rose/class_configurator.rb +49 -0
- data/lib/golden_rose/cli/app.rb +12 -3
- data/lib/golden_rose/execution_details.rb +22 -42
- data/lib/golden_rose/file_resource.rb +98 -0
- data/lib/golden_rose/generators/html_format.rb +70 -7
- data/lib/golden_rose/info.rb +11 -0
- data/lib/golden_rose/parser.rb +28 -30
- data/lib/golden_rose/results_filterer.rb +4 -54
- data/lib/golden_rose/templates/_build_logs.haml +24 -0
- data/lib/golden_rose/templates/_footer.haml +5 -0
- data/lib/golden_rose/templates/_test_logs.haml +9 -0
- data/lib/golden_rose/templates/_tests.haml +52 -0
- data/lib/golden_rose/templates/assets/javascript/main.js.haml +48 -0
- data/lib/golden_rose/templates/assets/styles/main.css.haml +203 -0
- data/lib/golden_rose/templates/assets/styles/test_logs.css.haml +101 -0
- data/lib/golden_rose/templates/index.haml +23 -116
- data/lib/golden_rose/templates/test_logs/index.haml +38 -0
- data/lib/golden_rose/testable_summary.rb +90 -0
- data/lib/golden_rose/version.rb +1 -1
- data/lib/golden_rose/xcactivitylog_reader.rb +54 -0
- data/lib/golden_rose.rb +20 -5
- metadata +51 -6
@@ -2,122 +2,29 @@
|
|
2
2
|
%html
|
3
3
|
%head
|
4
4
|
%meta{:charset => "UTF-8"}
|
5
|
-
%title= @details.
|
5
|
+
%title= @details ? @details.project_name: 'Goldenrose'
|
6
6
|
%link{:href => "https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,600&subset=latin,latin-ext", :rel => "stylesheet", :type => "text/css"}
|
7
|
-
:css
|
8
|
-
|
9
|
-
#container { max-width: 1170px; margin: auto;}
|
10
|
-
h1 {
|
11
|
-
color: #ff7726;
|
12
|
-
font-size: 48px;
|
13
|
-
font-weight: 600;
|
14
|
-
line-height: 18px;
|
15
|
-
text-align: left;
|
16
|
-
margin: 73px 0 24px 0;
|
17
|
-
}
|
18
|
-
#details {
|
19
|
-
color: #4e4e4e;
|
20
|
-
margin: 0 0 60px 0;
|
21
|
-
font-size: 18px;
|
22
|
-
line-height: 18px;
|
23
|
-
}
|
24
|
-
#results { margin-right: 34px; }
|
25
|
-
input[type=checkbox], input[type=checkbox] + ol > li { display: none; }
|
26
|
-
input[type=checkbox]:checked + ol > li { display: block; }
|
27
|
-
ol, li { position: relative; }
|
28
|
-
ol { margin: 0; padding: 0 0 0 34px; }
|
29
|
-
ol#collapsible { padding: 0; }
|
30
|
-
ol::before {
|
31
|
-
content: "▶";
|
32
|
-
position: absolute;
|
33
|
-
top: -33px; left: 15px;
|
34
|
-
font-size: 10px;
|
35
|
-
color: #ff7726;
|
36
|
-
}
|
37
|
-
ol#collapsible::before { display: none; }
|
38
|
-
input[type=checkbox]:checked + ol::before { content: "▼"; }
|
39
|
-
li { list-style: none; }
|
40
|
-
label { cursor: pointer; }
|
41
|
-
label, .success, .failure {
|
42
|
-
padding: 13.5px 0 13.5px 34px;
|
43
|
-
width: 100%;
|
44
|
-
display: block;
|
45
|
-
background: #f6f6f6;
|
46
|
-
border-bottom: 3px #fff solid;
|
47
|
-
color: #4e4e4e;
|
48
|
-
letter-spacing: -0.32px;
|
49
|
-
line-height: 18px;
|
50
|
-
}
|
51
|
-
.time, .failures-count {
|
52
|
-
float: right;
|
53
|
-
width: 90px;
|
54
|
-
}
|
55
|
-
.failures-count { color: #a80000; }
|
56
|
-
.success {
|
57
|
-
background: #ccffcc;
|
58
|
-
color: #005e37;
|
59
|
-
padding: 8.5px 0 8.5px 34px;
|
60
|
-
font-weight: 400;
|
61
|
-
}
|
62
|
-
.failure {
|
63
|
-
background: #ffcfcf;
|
64
|
-
color: #a80000;
|
65
|
-
}
|
66
|
-
.failure-message, .failure-details {
|
67
|
-
clear: both;
|
68
|
-
display: block;
|
69
|
-
font-size: 14px;
|
70
|
-
letter-spacing: -0.28px;
|
71
|
-
margin-right: 34px;
|
72
|
-
}
|
73
|
-
#footer {
|
74
|
-
color: #4e4e4e;
|
75
|
-
font-size: 14px;
|
76
|
-
margin-top: 40px;
|
77
|
-
}
|
78
|
-
.heart { color: #ff7726 }
|
79
|
-
#footer a { color: #ff7726; text-decoration: none }
|
7
|
+
= render_asset('main.css.haml', type: :css)
|
8
|
+
|
80
9
|
%body
|
81
10
|
#container
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
%span.failures-count
|
103
|
-
= "Failures: "
|
104
|
-
= item[:failures_count]
|
105
|
-
%input(type="checkbox" id="#{item[:node_id]}")
|
106
|
-
%ol
|
107
|
-
- item[:subtests].each do |subtest|
|
108
|
-
%li
|
109
|
-
%span(class="#{subtest[:status]}")
|
110
|
-
= subtest[:name]
|
111
|
-
%span.time
|
112
|
-
= subtest[:time]
|
113
|
-
- if subtest[:failures]
|
114
|
-
- subtest[:failures].each do |failure|
|
115
|
-
.failure-message
|
116
|
-
= failure[:message]
|
117
|
-
.failure-details
|
118
|
-
#{failure[:file_name]}:#{failure[:line_number]}
|
119
|
-
#footer
|
120
|
-
Made with
|
121
|
-
%span.heart ❤
|
122
|
-
by
|
123
|
-
%a(title="PGS Software" href="https://pgs-soft.com")PGS Software
|
11
|
+
#tabs
|
12
|
+
%ul.tab
|
13
|
+
%li
|
14
|
+
%a#default-open.tablinks{href: "javascript:void(0)", onclick: "openTab(event, 'tests-id')"} Tests
|
15
|
+
%li
|
16
|
+
%a.tablinks{href: "javascript:void(0)", onclick: "openTab(event, 'build-logs-id')"} Build logs
|
17
|
+
|
18
|
+
#tests-id.tabcontent
|
19
|
+
-if @details
|
20
|
+
= render_partial '_tests.haml'
|
21
|
+
-else
|
22
|
+
%p.no-results-info No results to display!
|
23
|
+
|
24
|
+
#build-logs-id.tabcontent
|
25
|
+
= render_partial '_build_logs.haml'
|
26
|
+
|
27
|
+
|
28
|
+
= render_partial '_footer.haml'
|
29
|
+
|
30
|
+
= render_asset('main.js.haml', type: :js)
|
@@ -0,0 +1,38 @@
|
|
1
|
+
!!!
|
2
|
+
%html
|
3
|
+
%head
|
4
|
+
%meta{:charset => "UTF-8"}
|
5
|
+
%title= testable_summary_name
|
6
|
+
%link{:href => "https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,600&subset=latin,latin-ext", :rel => "stylesheet", :type => "text/css"}
|
7
|
+
= render_asset('main.css.haml', type: :css)
|
8
|
+
= render_asset('test_logs.css.haml', type: :css)
|
9
|
+
|
10
|
+
%body
|
11
|
+
#container
|
12
|
+
#results
|
13
|
+
%ol#collapsible
|
14
|
+
%li
|
15
|
+
%label(for="#{item[:node_id]}")
|
16
|
+
= item[:name]
|
17
|
+
%ol
|
18
|
+
%li
|
19
|
+
%span(class="#{subtest[:status]}")
|
20
|
+
= subtest[:name]
|
21
|
+
%span.time
|
22
|
+
= subtest[:time]
|
23
|
+
- if subtest[:failures]
|
24
|
+
- subtest[:failures].each do |failure|
|
25
|
+
.failure-message
|
26
|
+
= failure[:message]
|
27
|
+
.failure-details
|
28
|
+
#{failure[:file_name]}:#{failure[:line_number]}
|
29
|
+
#test-logs
|
30
|
+
%table.table-fill
|
31
|
+
%thead
|
32
|
+
%th.text-left Started at
|
33
|
+
%th.text-left Finished at
|
34
|
+
%th.text-left Title
|
35
|
+
= render_subactivities(subtest[:activity_summaries])
|
36
|
+
|
37
|
+
|
38
|
+
= render_partial '_footer.haml'
|
@@ -0,0 +1,90 @@
|
|
1
|
+
module GoldenRose
|
2
|
+
class TestableSummary
|
3
|
+
def initialize(testable_summary)
|
4
|
+
@testable_summary = testable_summary
|
5
|
+
end
|
6
|
+
|
7
|
+
def items
|
8
|
+
@items ||= compact_results(iterate_subtests(tests))
|
9
|
+
end
|
10
|
+
|
11
|
+
def tests
|
12
|
+
raise GeneratingError, 'Tests not present.' unless @testable_summary['Tests']
|
13
|
+
@testable_summary['Tests']
|
14
|
+
end
|
15
|
+
|
16
|
+
def name
|
17
|
+
@testable_summary['TestName']
|
18
|
+
end
|
19
|
+
|
20
|
+
def formatted_time
|
21
|
+
hours = total_time / (60 * 60)
|
22
|
+
minutes = (total_time / 60) % 60
|
23
|
+
seconds = total_time % 60
|
24
|
+
|
25
|
+
"".tap do |time|
|
26
|
+
time << "#{pluralized(hours, 'hour')}, " if hours > 0
|
27
|
+
time << "#{pluralized(minutes, 'minute')} and " if minutes > 0
|
28
|
+
time << "#{pluralized(seconds, 'second')}"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def failures_count
|
33
|
+
@failures_count ||= items.reduce(0) { |count, item| count + item[:failures_count].to_i }
|
34
|
+
end
|
35
|
+
|
36
|
+
def total_tests_count
|
37
|
+
@total_tests_count ||= items.reduce(0) do |count, item|
|
38
|
+
count + (item[:subtests] ? item[:subtests].count : 0)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def passing_count
|
43
|
+
total_tests_count - failures_count
|
44
|
+
end
|
45
|
+
|
46
|
+
def total_time
|
47
|
+
@total_time ||= items.reduce(0) do |time, item|
|
48
|
+
subtests_time =
|
49
|
+
if item[:subtests]
|
50
|
+
item[:subtests].reduce(0) { |time, item| time + item[:time].to_f }
|
51
|
+
else
|
52
|
+
0
|
53
|
+
end
|
54
|
+
time + subtests_time
|
55
|
+
end.round
|
56
|
+
end
|
57
|
+
|
58
|
+
def pluralized(number, noun)
|
59
|
+
"#{number} #{noun}#{'s' if number != 1}"
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
def iterate_subtests(items)
|
65
|
+
items.map do |subtest|
|
66
|
+
child_subtests = subtest["Subtests"]
|
67
|
+
next if child_subtests && child_subtests.empty?
|
68
|
+
|
69
|
+
if child_subtests
|
70
|
+
ParentItem.new(subtest).tap do |item|
|
71
|
+
item.subtests = iterate_subtests(child_subtests)
|
72
|
+
end.to_h
|
73
|
+
else
|
74
|
+
ChildItem.new(subtest).to_h
|
75
|
+
end
|
76
|
+
end.compact
|
77
|
+
end
|
78
|
+
|
79
|
+
def compact_results(items)
|
80
|
+
items.map do |subtest|
|
81
|
+
subtests = subtest[:subtests]
|
82
|
+
if subtests.any?{|sbt| sbt[:subtests]}
|
83
|
+
compact_results(subtests)
|
84
|
+
else
|
85
|
+
subtest
|
86
|
+
end
|
87
|
+
end.flatten.compact
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
data/lib/golden_rose/version.rb
CHANGED
@@ -0,0 +1,54 @@
|
|
1
|
+
module GoldenRose
|
2
|
+
class XcactivitylogReader
|
3
|
+
def initialize(source_path)
|
4
|
+
@source_path = source_path
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.read(source_path)
|
8
|
+
new(source_path).read
|
9
|
+
end
|
10
|
+
|
11
|
+
def read
|
12
|
+
fail XcactivitylogExtensionError.new(extension, @source_path) unless xcactivitylog_file?
|
13
|
+
Zlib::GzipReader.open(@source_path, &:read)
|
14
|
+
rescue Zlib::GzipFile::Error, Errno::ENOENT => e
|
15
|
+
raise XcactivitylogNotFound.new(@source_path, error: e)
|
16
|
+
end
|
17
|
+
|
18
|
+
def xcactivitylog_file?
|
19
|
+
'xcactivitylog' == extension
|
20
|
+
end
|
21
|
+
|
22
|
+
def extension
|
23
|
+
@extension ||= @source_path.split('.').last
|
24
|
+
end
|
25
|
+
|
26
|
+
class XcactivitylogExtensionError < StandardError
|
27
|
+
attr_reader :file_extension, :path
|
28
|
+
|
29
|
+
def initialize(file_extension, path)
|
30
|
+
@file_extension = file_extension
|
31
|
+
@path = path
|
32
|
+
super "File under path #{path} has not correct .xcactivity extension!"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class XcactivitylogNotFound < StandardError
|
37
|
+
attr_reader :path, :options
|
38
|
+
|
39
|
+
def initialize(path, options = {})
|
40
|
+
@path = path
|
41
|
+
@options = options
|
42
|
+
@msg = error_msg(path, options[:error])
|
43
|
+
super @msg
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def error_msg(path, error)
|
49
|
+
return "#{error.message} path => #{path}" if error
|
50
|
+
"File not found or it is not archive! path => #{path}"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/lib/golden_rose.rb
CHANGED
@@ -5,18 +5,33 @@ require "golden_rose/child_item"
|
|
5
5
|
require "golden_rose/parser"
|
6
6
|
require "golden_rose/execution_details"
|
7
7
|
require "golden_rose/results_filterer"
|
8
|
+
require "golden_rose/testable_summary"
|
8
9
|
require "golden_rose/generators/html_format"
|
9
10
|
require "golden_rose/cli/app"
|
11
|
+
require "golden_rose/build_log"
|
12
|
+
require "golden_rose/xcactivitylog_reader"
|
13
|
+
require "golden_rose/file_resource"
|
14
|
+
require "golden_rose/info"
|
15
|
+
require "golden_rose/class_configurator"
|
16
|
+
|
17
|
+
|
10
18
|
|
11
19
|
module GoldenRose
|
12
|
-
def self.generate(folder_path, output_path, format: :html)
|
13
|
-
|
14
|
-
|
20
|
+
def self.generate(folder_path, output_path, force_save, format: :html)
|
21
|
+
parser = Parser.new(folder_path)
|
22
|
+
ClassConfigurator.configure(parser.source_type, folder_path, output_path)
|
23
|
+
|
24
|
+
parsed_data = parser.parse!
|
25
|
+
|
26
|
+
parsed_plist = parsed_data.parsed_test_summaries_plist
|
27
|
+
test_results = ResultsFilterer.new(parsed_plist).filter!
|
28
|
+
|
29
|
+
build_log = parsed_data.parsed_build_logs
|
15
30
|
|
16
31
|
case format
|
17
32
|
when :html
|
18
|
-
Generators::HtmlFormat.new(
|
19
|
-
else
|
33
|
+
Generators::HtmlFormat.new(test_results, build_log, output_path, force_save).output
|
34
|
+
else
|
20
35
|
raise GeneratingError, "Format not supported."
|
21
36
|
end
|
22
37
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: golden_rose
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0.pre
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Róża Szylar (PGS Software)
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-06-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: haml
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rubytree
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.9.7
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.9.7
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: bundler
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -122,6 +136,20 @@ dependencies:
|
|
122
136
|
- - ">="
|
123
137
|
- !ruby/object:Gem::Version
|
124
138
|
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: pry
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
125
153
|
description: |-
|
126
154
|
A tool for generating reports from Xcode results bundle.
|
127
155
|
Analyze results bundle directory created by Xcode during building, testing, running and generates HTML report with results.
|
@@ -145,17 +173,34 @@ files:
|
|
145
173
|
- exe/golden_rose
|
146
174
|
- golden_rose.gemspec
|
147
175
|
- lib/golden_rose.rb
|
176
|
+
- lib/golden_rose/build_log.rb
|
177
|
+
- lib/golden_rose/build_log/build_section.rb
|
178
|
+
- lib/golden_rose/build_log/build_target.rb
|
179
|
+
- lib/golden_rose/build_log/parser.rb
|
148
180
|
- lib/golden_rose/child_item.rb
|
181
|
+
- lib/golden_rose/class_configurator.rb
|
149
182
|
- lib/golden_rose/cli/app.rb
|
150
183
|
- lib/golden_rose/execution_details.rb
|
184
|
+
- lib/golden_rose/file_resource.rb
|
151
185
|
- lib/golden_rose/generators/html_format.rb
|
186
|
+
- lib/golden_rose/info.rb
|
152
187
|
- lib/golden_rose/parent_item.rb
|
153
188
|
- lib/golden_rose/parser.rb
|
154
189
|
- lib/golden_rose/results_filterer.rb
|
155
190
|
- lib/golden_rose/subtest_item.rb
|
191
|
+
- lib/golden_rose/templates/_build_logs.haml
|
192
|
+
- lib/golden_rose/templates/_footer.haml
|
193
|
+
- lib/golden_rose/templates/_test_logs.haml
|
194
|
+
- lib/golden_rose/templates/_tests.haml
|
195
|
+
- lib/golden_rose/templates/assets/javascript/main.js.haml
|
196
|
+
- lib/golden_rose/templates/assets/styles/main.css.haml
|
197
|
+
- lib/golden_rose/templates/assets/styles/test_logs.css.haml
|
156
198
|
- lib/golden_rose/templates/index.haml
|
199
|
+
- lib/golden_rose/templates/test_logs/index.haml
|
200
|
+
- lib/golden_rose/testable_summary.rb
|
157
201
|
- lib/golden_rose/version.rb
|
158
|
-
|
202
|
+
- lib/golden_rose/xcactivitylog_reader.rb
|
203
|
+
homepage: https://github.com/PGSSoft/GoldenRose
|
159
204
|
licenses:
|
160
205
|
- MIT
|
161
206
|
metadata: {}
|
@@ -170,12 +215,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
170
215
|
version: '0'
|
171
216
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
172
217
|
requirements:
|
173
|
-
- - "
|
218
|
+
- - ">"
|
174
219
|
- !ruby/object:Gem::Version
|
175
|
-
version:
|
220
|
+
version: 1.3.1
|
176
221
|
requirements: []
|
177
222
|
rubyforge_project:
|
178
|
-
rubygems_version: 2.
|
223
|
+
rubygems_version: 2.6.11
|
179
224
|
signing_key:
|
180
225
|
specification_version: 4
|
181
226
|
summary: A tool for generating reports from Xcode results bundle.
|