xcode-result-bundle-processor 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +23 -0
  3. data/.csslintrc +34 -0
  4. data/.eslintrc +253 -0
  5. data/.gitignore +6 -0
  6. data/.rspec +2 -0
  7. data/.rubocop.yml +1171 -0
  8. data/.ruby-gemset +1 -0
  9. data/.ruby-version +1 -0
  10. data/.travis.yml +8 -0
  11. data/Gemfile +4 -0
  12. data/Gemfile.lock +83 -0
  13. data/LICENSE +36 -0
  14. data/README.md +72 -0
  15. data/Rakefile +50 -0
  16. data/bin/xcode-result-bundle-processor +37 -0
  17. data/lib/xcoderesultbundleprocessor.rb +28 -0
  18. data/lib/xcoderesultbundleprocessor/activity_log_formatter.rb +20 -0
  19. data/lib/xcoderesultbundleprocessor/element_snapshot.rb +81 -0
  20. data/lib/xcoderesultbundleprocessor/indented_string_buffer.rb +33 -0
  21. data/lib/xcoderesultbundleprocessor/keyword_struct.rb +10 -0
  22. data/lib/xcoderesultbundleprocessor/log_deserializer.rb +26 -0
  23. data/lib/xcoderesultbundleprocessor/results_bundle.rb +45 -0
  24. data/lib/xcoderesultbundleprocessor/slf0/class_name_resolver.rb +26 -0
  25. data/lib/xcoderesultbundleprocessor/slf0/deserializer.rb +45 -0
  26. data/lib/xcoderesultbundleprocessor/slf0/model/dvtdocumentlocation.rb +16 -0
  27. data/lib/xcoderesultbundleprocessor/slf0/model/dvttextdocumentlocation.rb +23 -0
  28. data/lib/xcoderesultbundleprocessor/slf0/model/ideactivitylogmessage.rb +26 -0
  29. data/lib/xcoderesultbundleprocessor/slf0/model/ideactivitylogsection.rb +29 -0
  30. data/lib/xcoderesultbundleprocessor/slf0/model/ideactivitylogunittestsection.rb +24 -0
  31. data/lib/xcoderesultbundleprocessor/slf0/model/ideconsoleitem.rb +16 -0
  32. data/lib/xcoderesultbundleprocessor/slf0/tokenizer.rb +82 -0
  33. data/lib/xcoderesultbundleprocessor/snapshot_summary.rb +47 -0
  34. data/lib/xcoderesultbundleprocessor/test_summaries/html_report.rb +156 -0
  35. data/lib/xcoderesultbundleprocessor/test_summaries/test_summaries.rb +84 -0
  36. data/lib/xcoderesultbundleprocessor/test_summaries/text_report.rb +40 -0
  37. data/lib/xcoderesultbundleprocessor/version.rb +3 -0
  38. data/static/report.css +30 -0
  39. data/static/report.js +14 -0
  40. data/xcode-result-bundle-processor.gemspec +30 -0
  41. metadata +225 -0
@@ -0,0 +1,84 @@
1
+ module XcodeResultBundleProcessor
2
+ module TestSummaries
3
+ class TestResult < KeywordStruct.new(:identifier, :passed?, :failure_summaries, :activities)
4
+ def self.parse(test_result)
5
+ TestResult.new(
6
+ identifier: test_result['TestIdentifier'],
7
+ passed?: test_result['TestStatus'] == 'Success',
8
+ failure_summaries: Array(test_result['FailureSummaries']).map { |failure_summary| FailureSummary.parse(failure_summary) },
9
+ activities: Array(test_result['ActivitySummaries']).map { |activity_summary| Activity.parse(activity_summary) }
10
+ )
11
+ end
12
+
13
+ def summary
14
+ identifier + ' ' + if passed?
15
+ 'Passed'
16
+ else
17
+ 'Failed'
18
+ end
19
+ end
20
+ end
21
+
22
+ class FailureSummary < KeywordStruct.new(:file_name, :line_number, :message)
23
+ def self.parse(failure_summary)
24
+ FailureSummary.new(
25
+ file_name: failure_summary['FileName'],
26
+ line_number: failure_summary['LineNumber'],
27
+ message: failure_summary['Message']
28
+ )
29
+ end
30
+
31
+ def location
32
+ "#{file_name}:#{line_number}"
33
+ end
34
+ end
35
+
36
+ class Activity < KeywordStruct.new(:title, :screenshot_path, :snapshot_path, :subactivities)
37
+ def self.parse(activity_summary)
38
+ screenshot = Array(activity_summary['Attachments']).find { |attachment| attachment['Name'] == 'Screenshot' }
39
+ screenshot_path = nil
40
+ unless screenshot.nil?
41
+ screenshot_path = screenshot['FileName']
42
+ end
43
+
44
+ snapshot = Array(activity_summary['Attachments']).find { |attachment| attachment['Name'] == 'Snapshot' }
45
+ snapshot_path = nil
46
+ unless snapshot.nil?
47
+ snapshot_path = snapshot['FileName']
48
+ end
49
+
50
+ Activity.new(
51
+ title: activity_summary['Title'],
52
+ screenshot_path: screenshot_path,
53
+ snapshot_path: snapshot_path,
54
+ subactivities: Array(activity_summary['SubActivities']).map { |subactivity| Activity.parse(subactivity) }
55
+ )
56
+ end
57
+ end
58
+
59
+ class TestSummaries
60
+ attr_reader :tests
61
+
62
+ def initialize(test_summaries)
63
+ raise "FormatVersion is unsupported: <#{test_summaries['FormatVersion']}>" unless test_summaries['FormatVersion'] == '1.1'
64
+
65
+ @tests = Array(test_summaries['TestableSummaries']).map do |testable_summary|
66
+ Array(testable_summary['Tests']).map { |test| self._parse_test(test) }
67
+ end.flatten.compact
68
+ end
69
+
70
+ def failed_tests
71
+ tests.find_all { |test| !test.passed? }
72
+ end
73
+
74
+ def _parse_test(test)
75
+ subtests = Array(test['Subtests'])
76
+ if subtests.empty?
77
+ TestResult.parse(test)
78
+ else
79
+ subtests.map { |subtest| self._parse_test(subtest) }
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,40 @@
1
+ module XcodeResultBundleProcessor
2
+ module TestSummaries
3
+ module TextReport
4
+ include Methadone::CLILogging
5
+
6
+ def self.format(results_bundle)
7
+ test_summaries = TestSummaries.new(results_bundle.read_plist('TestSummaries.plist'))
8
+
9
+ buffer = IndentedStringBuffer.new
10
+
11
+ test_summaries.tests.each { |test| self._format_test(test, buffer) }
12
+
13
+ tests_passed_count = test_summaries.tests.group_by(&:passed?)[true].length
14
+
15
+ info "#{tests_passed_count} / #{test_summaries.tests.length} tests passed"
16
+
17
+ buffer.to_s
18
+ end
19
+
20
+ private
21
+
22
+ def self._format_test(test, buffer)
23
+ buffer << test.summary
24
+
25
+ test.failure_summaries.each { |failure_summary| self._format_failure_summary(failure_summary, buffer.indent) }
26
+
27
+ unless test.activities.empty?
28
+ buffer.indent << 'Timeline:'
29
+
30
+ buffer.indent.indent << test.activities.map(&:title)
31
+ end
32
+ end
33
+
34
+ def self._format_failure_summary(failure_summary, buffer)
35
+ buffer << "Failure at #{failure_summary.location}"
36
+ buffer.indent << failure_summary.message.each_line
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,3 @@
1
+ module XcodeResultBundleProcessor
2
+ VERSION = '1.0.0'
3
+ end
@@ -0,0 +1,30 @@
1
+ table {
2
+ border-collapse: collapse;
3
+ top: 4em;
4
+ }
5
+
6
+ .timelineContainer {
7
+ overflow-x: scroll;
8
+ }
9
+
10
+ pre {
11
+ overflow-x: scroll;
12
+ }
13
+
14
+ td {
15
+ border: 1px solid black;
16
+ padding: 20px;
17
+ vertical-align: top;
18
+ }
19
+
20
+ img {
21
+ width: 250px;
22
+ }
23
+
24
+ .testFailed {
25
+ color: #ff6600;
26
+ }
27
+
28
+ .snapshot {
29
+ display: none;
30
+ }
@@ -0,0 +1,14 @@
1
+ document.addEventListener('click', function(e) {
2
+ if (!e.target.matches('a.viewSnapshot')) {
3
+ return;
4
+ }
5
+
6
+ var snapshot = e.target.parentElement.querySelector('pre.snapshot');
7
+
8
+ var w = window.open('about:blank', 'snapshot',
9
+ 'dependent=1,width=800,height=500,left=' + (e.screenX - 80) + ',top=' + (e.screenY - 80));
10
+ w.document.body.appendChild(snapshot);
11
+
12
+ e.preventDefault();
13
+ return false;
14
+ });
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'xcoderesultbundleprocessor/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'xcode-result-bundle-processor'
8
+ spec.version = XcodeResultBundleProcessor::VERSION
9
+ spec.authors = ['Manuel Wudka-Robles']
10
+ spec.email = ['mwudka@me.com']
11
+ spec.summary = %q{xcode-result-bundle-processor converts Xcode test result bundles into friendly HTML reports}
12
+ spec.homepage = 'https://github.com/americanexpress/xcode-result-bundle-processor'
13
+ spec.license = 'coil'
14
+
15
+ spec.files = `git ls-files -z`.split("\x0").reject { |file| file =~ %r{^(test|spec|features)/} }
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.require_paths = ['lib']
18
+
19
+ spec.add_development_dependency('bundler', '~> 1.6')
20
+ spec.add_development_dependency('rake', '~> 10.4')
21
+ spec.add_development_dependency('rdoc', '~> 4.2')
22
+ spec.add_development_dependency('aruba', '~> 0.10')
23
+ spec.add_development_dependency('rspec', '~> 3.3')
24
+ spec.add_development_dependency('codeclimate-test-reporter', '~> 0.4')
25
+
26
+ spec.add_dependency('methadone', '~> 1.9.2')
27
+ spec.add_dependency('awesome_print', '~> 1.6')
28
+ spec.add_dependency('markaby', '~> 0.8')
29
+ spec.add_dependency('CFPropertyList', '~> 2.2')
30
+ end
metadata ADDED
@@ -0,0 +1,225 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: xcode-result-bundle-processor
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Manuel Wudka-Robles
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-11-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.4'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.4'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rdoc
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '4.2'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '4.2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: aruba
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.10'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.10'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.3'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.3'
83
+ - !ruby/object:Gem::Dependency
84
+ name: codeclimate-test-reporter
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.4'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.4'
97
+ - !ruby/object:Gem::Dependency
98
+ name: methadone
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 1.9.2
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 1.9.2
111
+ - !ruby/object:Gem::Dependency
112
+ name: awesome_print
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '1.6'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '1.6'
125
+ - !ruby/object:Gem::Dependency
126
+ name: markaby
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '0.8'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '0.8'
139
+ - !ruby/object:Gem::Dependency
140
+ name: CFPropertyList
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '2.2'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '2.2'
153
+ description:
154
+ email:
155
+ - mwudka@me.com
156
+ executables:
157
+ - xcode-result-bundle-processor
158
+ extensions: []
159
+ extra_rdoc_files: []
160
+ files:
161
+ - ".codeclimate.yml"
162
+ - ".csslintrc"
163
+ - ".eslintrc"
164
+ - ".gitignore"
165
+ - ".rspec"
166
+ - ".rubocop.yml"
167
+ - ".ruby-gemset"
168
+ - ".ruby-version"
169
+ - ".travis.yml"
170
+ - Gemfile
171
+ - Gemfile.lock
172
+ - LICENSE
173
+ - README.md
174
+ - Rakefile
175
+ - bin/xcode-result-bundle-processor
176
+ - lib/xcoderesultbundleprocessor.rb
177
+ - lib/xcoderesultbundleprocessor/activity_log_formatter.rb
178
+ - lib/xcoderesultbundleprocessor/element_snapshot.rb
179
+ - lib/xcoderesultbundleprocessor/indented_string_buffer.rb
180
+ - lib/xcoderesultbundleprocessor/keyword_struct.rb
181
+ - lib/xcoderesultbundleprocessor/log_deserializer.rb
182
+ - lib/xcoderesultbundleprocessor/results_bundle.rb
183
+ - lib/xcoderesultbundleprocessor/slf0/class_name_resolver.rb
184
+ - lib/xcoderesultbundleprocessor/slf0/deserializer.rb
185
+ - lib/xcoderesultbundleprocessor/slf0/model/dvtdocumentlocation.rb
186
+ - lib/xcoderesultbundleprocessor/slf0/model/dvttextdocumentlocation.rb
187
+ - lib/xcoderesultbundleprocessor/slf0/model/ideactivitylogmessage.rb
188
+ - lib/xcoderesultbundleprocessor/slf0/model/ideactivitylogsection.rb
189
+ - lib/xcoderesultbundleprocessor/slf0/model/ideactivitylogunittestsection.rb
190
+ - lib/xcoderesultbundleprocessor/slf0/model/ideconsoleitem.rb
191
+ - lib/xcoderesultbundleprocessor/slf0/tokenizer.rb
192
+ - lib/xcoderesultbundleprocessor/snapshot_summary.rb
193
+ - lib/xcoderesultbundleprocessor/test_summaries/html_report.rb
194
+ - lib/xcoderesultbundleprocessor/test_summaries/test_summaries.rb
195
+ - lib/xcoderesultbundleprocessor/test_summaries/text_report.rb
196
+ - lib/xcoderesultbundleprocessor/version.rb
197
+ - static/report.css
198
+ - static/report.js
199
+ - xcode-result-bundle-processor.gemspec
200
+ homepage: https://github.com/americanexpress/xcode-result-bundle-processor
201
+ licenses:
202
+ - coil
203
+ metadata: {}
204
+ post_install_message:
205
+ rdoc_options: []
206
+ require_paths:
207
+ - lib
208
+ required_ruby_version: !ruby/object:Gem::Requirement
209
+ requirements:
210
+ - - ">="
211
+ - !ruby/object:Gem::Version
212
+ version: '0'
213
+ required_rubygems_version: !ruby/object:Gem::Requirement
214
+ requirements:
215
+ - - ">="
216
+ - !ruby/object:Gem::Version
217
+ version: '0'
218
+ requirements: []
219
+ rubyforge_project:
220
+ rubygems_version: 2.4.5.1
221
+ signing_key:
222
+ specification_version: 4
223
+ summary: xcode-result-bundle-processor converts Xcode test result bundles into friendly
224
+ HTML reports
225
+ test_files: []