fastlane-plugin-test_center 3.3.0 → 3.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 893544a3b0cd2e53515d862eb0fda5c3e55f6894
4
- data.tar.gz: 4fb54967fc84179a6de35c8314d7018396b5170a
3
+ metadata.gz: '083be0187ece34a8f7019e4992c1fa2330b4732d'
4
+ data.tar.gz: 364b206944566949934477d518853537f27cdabb
5
5
  SHA512:
6
- metadata.gz: 888c640ec758d5916be8414d1f7a5940c51c28736bdd172e3ceda86fbbf6b50ea74071c07397b4bae3ca2e5ddc9f18f853f3fd11b074eb9b26db894e1f9b67e3
7
- data.tar.gz: 3b65a9bb1175eaedd4ba0fb937ea62538a037ff785f3837cd6f1061f22a52d2ac06633691ad85021fe43f6b30e7586ffce4ac14cb662fb489032c4923fe24163
6
+ metadata.gz: 64532eb3e5dfe6afdf6b49fe27555e58d052fc60cf3d57363becf437704e0519a696889032f0106fabafabaf5ab808f0f713b059af75a38f0e9aecc44e8f2cde
7
+ data.tar.gz: 301e3e7946ab86b32aa310fd73b01cb2b222c00b99d1a255575964c1bed55ca864bf66b55ff2d50690776ff399d3c57335ac3d6737de2262c50a720a565af0e5
data/README.md CHANGED
@@ -69,6 +69,7 @@ This fastlane plugin includes the following actions:
69
69
  - [`tests_from_xctestrun`](#tests_from_xctestrun): from an xctestrun file, returns a list of tests for each of its test targets.
70
70
  - [`collate_junit_reports`](#collate_junit_reports): combines multiple junit test reports into one report.
71
71
  - [`collate_html_reports`](#collate_html_reports): combines multiple html test reports into one report.
72
+ - [`collate_json_reports`](#collate_json_reports): combines multiple json test reports into one report.
72
73
 
73
74
  ### multi_scan 🎉
74
75
 
@@ -202,7 +203,8 @@ multi_scan(
202
203
  skip_build: true,
203
204
  clean: true,
204
205
  try_count: 3,
205
- result_bundle: true
206
+ result_bundle: true,
207
+ fail_build: false
206
208
  )
207
209
 
208
210
  ```
@@ -235,7 +237,25 @@ multi_scan(
235
237
  workspace: File.absolute_path('../AtomicBoy/AtomicBoy.xcworkspace'),
236
238
  scheme: 'AtomicBoy',
237
239
  try_count: 3,
238
- only_testing: ['AtomicBoyTests']
240
+ only_testing: ['AtomicBoyTests'],
241
+ fail_build: false
242
+ )
243
+
244
+ ```
245
+
246
+ ```ruby
247
+
248
+ UI.important(
249
+ 'example: ' \
250
+ 'multi_scan also works with json.'
251
+ )
252
+ multi_scan(
253
+ workspace: File.absolute_path('../AtomicBoy/AtomicBoy.xcworkspace'),
254
+ scheme: 'AtomicBoy',
255
+ try_count: 3,
256
+ output_types: 'json',
257
+ output_files: 'report.json',
258
+ fail_build: false
239
259
  )
240
260
 
241
261
  ```
@@ -328,6 +348,23 @@ suppress_tests(
328
348
  scheme: 'Professor'
329
349
  )
330
350
 
351
+ ```
352
+
353
+ ```ruby
354
+
355
+ UI.important(
356
+ 'example: ' \
357
+ 'suppress some tests in one Scheme from a workspace'
358
+ )
359
+ suppress_tests(
360
+ workspace: 'AtomicBoy/AtomicBoy.xcworkspace',
361
+ tests: [
362
+ 'AtomicBoyUITests/HappyNapperTests/testBeepingNonExistentFriendDisplaysError',
363
+ 'AtomicBoyUITests/GrumpyWorkerTests'
364
+ ],
365
+ scheme: 'Professor'
366
+ )
367
+
331
368
  ```
332
369
  <!-- suppress_tests examples: end -->
333
370
  </details>
@@ -364,6 +401,20 @@ UI.message(
364
401
  "Suppressed tests for project: #{suppressed_tests(xcodeproj: 'AtomicBoy/AtomicBoy.xcodeproj')}"
365
402
  )
366
403
 
404
+ ```
405
+
406
+ ```ruby
407
+
408
+ UI.important(
409
+ 'example: ' \
410
+ 'get the tests that are suppressed in all Schemes in a workspace'
411
+ )
412
+ tests = suppressed_tests(
413
+ workspace: File.absolute_path('../AtomicBoy/AtomicBoy.xcworkspace'),
414
+ scheme: 'Professor'
415
+ )
416
+ UI.message("tests: #{tests}")
417
+
367
418
  ```
368
419
  <!-- suppressed_tests examples: end -->
369
420
  </details>
@@ -438,10 +489,11 @@ Do you have multiple junit test reports coming in from different sources and nee
438
489
 
439
490
  UI.important(
440
491
  'example: ' \
441
- 'collate the xml reports to a temporary file 'result.xml''
492
+ 'collate the xml reports to a temporary file "result.xml"'
442
493
  )
494
+ reports = Dir['../spec/fixtures/*.xml'].map { |relpath| File.absolute_path(relpath) }
443
495
  collate_junit_reports(
444
- reports: Dir['./spec/fixtures/*.xml'],
496
+ reports: reports,
445
497
  collated_report: File.join(Dir.mktmpdir, 'result.xml')
446
498
  )
447
499
 
@@ -461,10 +513,11 @@ Do you have multiple html test reports coming in from different sources and need
461
513
 
462
514
  UI.important(
463
515
  'example: ' \
464
- 'collate the html reports to a temporary file 'result.html''
516
+ 'collate the html reports to a temporary file "result.html"'
465
517
  )
518
+ reports = Dir['../spec/fixtures/*.html'].map { |relpath| File.absolute_path(relpath) }
466
519
  collate_html_reports(
467
- reports: Dir['./spec/fixtures/*.html'],
520
+ reports: reports,
468
521
  collated_report: File.join(Dir.mktmpdir, 'result.html')
469
522
  )
470
523
 
@@ -472,6 +525,30 @@ collate_html_reports(
472
525
  <!-- collate_html_reports examples: end -->
473
526
  </details>
474
527
 
528
+ ### collate_json_reports
529
+
530
+ Do you have multiple json test reports coming in from different sources and need it combined? Use this action to collate all the tests performed for a given test target into one report file.
531
+
532
+ <details>
533
+ <summary>Example Code:</summary>
534
+ <!-- collate_json_reports examples: begin -->
535
+
536
+ ```ruby
537
+
538
+ UI.important(
539
+ 'example: ' \
540
+ 'collate the json reports to a temporary file "result.json"'
541
+ )
542
+ reports = Dir['../spec/fixtures/report*.json'].map { |relpath| File.absolute_path(relpath) }
543
+ collate_json_reports(
544
+ reports: reports,
545
+ collated_report: File.join(Dir.mktmpdir, 'result.json')
546
+ )
547
+
548
+ ```
549
+ <!-- collate_json_reports examples: end -->
550
+ </details>
551
+
475
552
  ## Run tests for this plugin
476
553
 
477
554
  To run both the tests, and code style validation, run
@@ -0,0 +1,168 @@
1
+ module Fastlane
2
+ module Actions
3
+ class CollateJsonReportsAction < Action
4
+ require 'json'
5
+
6
+ def self.run(params)
7
+ report_filepaths = params[:reports]
8
+ if report_filepaths.size == 1
9
+ FileUtils.cp(report_filepaths[0], params[:collated_report])
10
+ else
11
+ base_report_json = JSON.parse(File.read(report_filepaths.shift))
12
+ report_filepaths.each do |report_file|
13
+ report_json = JSON.parse(File.read(report_file))
14
+ update_previous_test_failures(base_report_json)
15
+ merge_reports(base_report_json, report_json)
16
+ end
17
+ File.open(params[:collated_report], 'w') do |f|
18
+ f.write(JSON.pretty_generate(base_report_json))
19
+ end
20
+ end
21
+ end
22
+
23
+ def self.merge_reports(base_report, other_report)
24
+ base_report.each_key do |key|
25
+ unless %w(previous_tests_failures tests_failures tests_summary_messages).include?(key)
26
+ base_report[key].concat(other_report[key])
27
+ end
28
+ end
29
+ base_report["tests_failures"] = other_report["tests_failures"]
30
+ update_failed_tests_count(base_report, other_report)
31
+ update_time(base_report, other_report)
32
+ update_unexpected_failures(base_report, other_report)
33
+ end
34
+
35
+ def self.update_time(base_report, other_report)
36
+ base_test_time, base_total_time = times_from_summary(base_report['tests_summary_messages'][0])
37
+ other_test_time, other_total_time = times_from_summary(other_report['tests_summary_messages'][0])
38
+ time_regex = '(?:\d|\.)+'
39
+
40
+ test_time_sum = (base_test_time + other_test_time).round(3)
41
+ total_time_sum = (base_total_time + other_total_time).round(3)
42
+ base_report['tests_summary_messages'][0].sub!(
43
+ /in #{time_regex} \(#{time_regex}\) seconds/,
44
+ "in #{test_time_sum} (#{total_time_sum}) seconds"
45
+ )
46
+ end
47
+
48
+ def self.update_unexpected_failures(base_report, other_report)
49
+ base_unexpected_failures = unexpected_failures_from_summary(base_report['tests_summary_messages'][0])
50
+ other_unexpected_failures = unexpected_failures_from_summary(other_report['tests_summary_messages'][0])
51
+ base_report['tests_summary_messages'][0].sub!(
52
+ /\(\d+ unexpected\)/,
53
+ "(#{base_unexpected_failures + other_unexpected_failures} unexpected)"
54
+ )
55
+ end
56
+
57
+ def self.unexpected_failures_from_summary(summary)
58
+ /\((?<unexpected_failures>\d+) unexpected\)/ =~ summary
59
+ unexpected_failures.to_i
60
+ end
61
+
62
+ def self.times_from_summary(summary)
63
+ time_regex = '(?:\d|\.)+'
64
+ match = /in (?<test_time>#{time_regex}) \((?<total_time>#{time_regex})\) seconds/.match(summary)
65
+ return [
66
+ match['test_time'].to_f,
67
+ match['total_time'].to_f
68
+ ]
69
+ end
70
+
71
+ def self.update_failed_tests_count(base_report, other_report)
72
+ /\s+Executed \d+ tests?, with (?<failed_test_count>\d+) failures?/ =~ other_report['tests_summary_messages'][0]
73
+
74
+ base_report['tests_summary_messages'][0].sub!(
75
+ /(\d+) failure/,
76
+ "#{failed_test_count} failure"
77
+ )
78
+ end
79
+
80
+ def self.update_previous_test_failures(base_report)
81
+ previous_tests_failures = base_report['previous_tests_failures']
82
+ if previous_tests_failures
83
+ tests_failures = base_report['tests_failures']
84
+ tests_failures.each do |failure_suite, failures|
85
+ if previous_tests_failures.key?(failure_suite)
86
+ previous_tests_failures[failure_suite].concat(failures)
87
+ else
88
+ previous_tests_failures[failure_suite] = failures
89
+ end
90
+ end
91
+ else
92
+ base_report['previous_tests_failures'] = base_report['tests_failures'] || {}
93
+ end
94
+ base_report.delete('tests_failures')
95
+ end
96
+
97
+ #####################################################
98
+ # @!group Documentation
99
+ #####################################################
100
+
101
+ def self.description
102
+ "Combines and combines tests from multiple json report files"
103
+ end
104
+
105
+ def self.details
106
+ "The first JSON report is used as the base report. Due to the nature of " \
107
+ "xcpretty JSON reports, only the failing test cases are recorded. " \
108
+ "Testcases that failed in previous reports that no longer appear in " \
109
+ "later reports are assumed to have passed in a re-run, thus not appearing " \
110
+ "in the collated report. " \
111
+ "This is done because it is assumed that fragile tests, when " \
112
+ "re-run will often succeed due to less interference from other " \
113
+ "tests and the subsequent JSON reports will have fewer failing tests." \
114
+ ""
115
+ end
116
+
117
+ def self.available_options
118
+ [
119
+ FastlaneCore::ConfigItem.new(
120
+ key: :reports,
121
+ env_name: 'COLLATE_JSON_REPORTS_REPORTS',
122
+ description: 'An array of JSON reports to collate. The first report is used as the base into which other reports are merged in',
123
+ optional: false,
124
+ type: Array,
125
+ verify_block: proc do |reports|
126
+ UI.user_error!('No JSON report files found') if reports.empty?
127
+ reports.each do |report|
128
+ UI.user_error!("Error: JSON report not found: '#{report}'") unless File.exist?(report)
129
+ end
130
+ end
131
+ ),
132
+ FastlaneCore::ConfigItem.new(
133
+ key: :collated_report,
134
+ env_name: 'COLLATE_JSON_REPORTS_COLLATED_REPORT',
135
+ description: 'The final JSON report file where all testcases will be merged into',
136
+ optional: true,
137
+ default_value: 'result.json',
138
+ type: String
139
+ )
140
+ ]
141
+ end
142
+
143
+ def self.example_code
144
+ [
145
+ "
146
+ UI.important(
147
+ 'example: ' \\
148
+ 'collate the json reports to a temporary file \"result.json\"'
149
+ )
150
+ reports = Dir['../spec/fixtures/report*.json'].map { |relpath| File.absolute_path(relpath) }
151
+ collate_json_reports(
152
+ reports: reports,
153
+ collated_report: File.join(Dir.mktmpdir, 'result.json')
154
+ )
155
+ "
156
+ ]
157
+ end
158
+
159
+ def self.authors
160
+ ["lyndsey-ferguson/@lyndseydf"]
161
+ end
162
+
163
+ def self.is_supported?(platform)
164
+ platform == :ios
165
+ end
166
+ end
167
+ end
168
+ end
@@ -58,6 +58,11 @@ module Fastlane
58
58
  File.absolute_path(relative_filepath)
59
59
  end
60
60
  end
61
+ if reportnamer.includes_json?
62
+ report_files += Dir.glob("#{scan_options[:output_directory]}/**/#{reportnamer.json_fileglob}").map do |relative_filepath|
63
+ File.absolute_path(relative_filepath)
64
+ end
65
+ end
61
66
  {
62
67
  result: tests_passed,
63
68
  total_tests: passing_testcount + failed_tests.size,
@@ -76,6 +81,8 @@ module Fastlane
76
81
  batch_count
77
82
  testrun_completed_block
78
83
  test_without_building
84
+ output_types
85
+ output_files
79
86
  ]
80
87
  config = FastlaneCore::Configuration.create(
81
88
  Fastlane::Actions::ScanAction.available_options,
@@ -118,7 +125,7 @@ module Fastlane
118
125
  end
119
126
 
120
127
  def self.scan_options
121
- ScanAction.available_options
128
+ ScanAction.available_options.reject { |config| config.key == :output_types }
122
129
  end
123
130
 
124
131
  def self.available_options
@@ -143,6 +150,13 @@ module Fastlane
143
150
  UI.user_error!("Error: Batch counts must be greater than zero") unless count > 0
144
151
  end
145
152
  ),
153
+ FastlaneCore::ConfigItem.new(
154
+ key: :output_types,
155
+ short_option: "-f",
156
+ env_name: "SCAN_OUTPUT_TYPES",
157
+ description: "Comma separated list of the output types (e.g. html, junit, json, json-compilation-database)",
158
+ default_value: "html,junit"
159
+ ),
146
160
  FastlaneCore::ConfigItem.new(
147
161
  key: :testrun_completed_block,
148
162
  description: 'A block invoked each time a test run completes',
@@ -286,7 +300,22 @@ module Fastlane
286
300
  workspace: File.absolute_path('../AtomicBoy/AtomicBoy.xcworkspace'),
287
301
  scheme: 'AtomicBoy',
288
302
  try_count: 3,
289
- only_testing: ['AtomicBoyTests']
303
+ only_testing: ['AtomicBoyTests'],
304
+ fail_build: false
305
+ )
306
+ ",
307
+ "
308
+ UI.important(
309
+ 'example: ' \\
310
+ 'multi_scan also works with json.'
311
+ )
312
+ multi_scan(
313
+ workspace: File.absolute_path('../AtomicBoy/AtomicBoy.xcworkspace'),
314
+ scheme: 'AtomicBoy',
315
+ try_count: 3,
316
+ output_types: 'json',
317
+ output_files: 'report.json',
318
+ fail_build: false
290
319
  )
291
320
  "
292
321
  ]
@@ -2,7 +2,7 @@ module TestCenter
2
2
  module Helper
3
3
  require 'fastlane_core/ui/ui.rb'
4
4
  require 'plist'
5
-
5
+ require 'json'
6
6
  class CorrectingScanHelper
7
7
  attr_reader :retry_total_count
8
8
 
@@ -26,6 +26,8 @@ module TestCenter
26
26
  custom_report_file_name
27
27
  fail_build
28
28
  testrun_completed_block
29
+ output_types
30
+ output_files
29
31
  ].include?(option)
30
32
  end
31
33
  @scan_options[:clean] = false
@@ -92,6 +94,59 @@ module TestCenter
92
94
  end
93
95
 
94
96
  def collate_reports(output_directory, reportnamer)
97
+ collate_junit_reports(output_directory, reportnamer)
98
+
99
+ if reportnamer.includes_html?
100
+ collate_html_reports(output_directory, reportnamer)
101
+ end
102
+
103
+ if reportnamer.includes_json?
104
+ collate_json_reports(output_directory, reportnamer)
105
+ end
106
+ end
107
+
108
+ def passed_test_count_from_summary(summary)
109
+ /.*Executed (?<test_count>\d+) test, with (?<test_failures>\d+) failure/ =~ summary
110
+ test_count.to_i - test_failures.to_i
111
+ end
112
+
113
+ def collate_json_reports(output_directory, reportnamer)
114
+ report_filepaths = Dir.glob("#{output_directory}/#{reportnamer.json_fileglob}").map do |relative_filepath|
115
+ File.absolute_path(relative_filepath)
116
+ end
117
+ if report_filepaths.size > 1
118
+ config = FastlaneCore::Configuration.create(
119
+ Fastlane::Actions::CollateJsonReportsAction.available_options,
120
+ {
121
+ reports: report_filepaths.sort { |f1, f2| File.mtime(f1) <=> File.mtime(f2) },
122
+ collated_report: File.absolute_path(File.join(output_directory, reportnamer.json_reportname))
123
+ }
124
+ )
125
+ Fastlane::Actions::CollateJsonReportsAction.run(config)
126
+ end
127
+ retried_json_reportfiles = Dir.glob("#{output_directory}/#{reportnamer.json_numbered_fileglob}")
128
+ FileUtils.rm_f(retried_json_reportfiles)
129
+ end
130
+
131
+ def collate_html_reports(output_directory, reportnamer)
132
+ report_files = Dir.glob("#{output_directory}/#{reportnamer.html_fileglob}").map do |relative_filepath|
133
+ File.absolute_path(relative_filepath)
134
+ end
135
+ if report_files.size > 1
136
+ config = FastlaneCore::Configuration.create(
137
+ Fastlane::Actions::CollateHtmlReportsAction.available_options,
138
+ {
139
+ reports: report_files.sort { |f1, f2| File.mtime(f1) <=> File.mtime(f2) },
140
+ collated_report: File.absolute_path(File.join(output_directory, reportnamer.html_reportname))
141
+ }
142
+ )
143
+ Fastlane::Actions::CollateHtmlReportsAction.run(config)
144
+ end
145
+ retried_html_reportfiles = Dir.glob("#{output_directory}/#{reportnamer.html_numbered_fileglob}")
146
+ FileUtils.rm_f(retried_html_reportfiles)
147
+ end
148
+
149
+ def collate_junit_reports(output_directory, reportnamer)
95
150
  report_files = Dir.glob("#{output_directory}/#{reportnamer.junit_fileglob}").map do |relative_filepath|
96
151
  File.absolute_path(relative_filepath)
97
152
  end
@@ -107,30 +162,13 @@ module TestCenter
107
162
  end
108
163
  retried_junit_reportfiles = Dir.glob("#{output_directory}/#{reportnamer.junit_numbered_fileglob}")
109
164
  FileUtils.rm_f(retried_junit_reportfiles)
110
-
111
- if reportnamer.includes_html?
112
- report_files = Dir.glob("#{output_directory}/#{reportnamer.html_fileglob}").map do |relative_filepath|
113
- File.absolute_path(relative_filepath)
114
- end
115
- if report_files.size > 1
116
- config = FastlaneCore::Configuration.create(
117
- Fastlane::Actions::CollateHtmlReportsAction.available_options,
118
- {
119
- reports: report_files.sort { |f1, f2| File.mtime(f1) <=> File.mtime(f2) },
120
- collated_report: File.absolute_path(File.join(output_directory, reportnamer.html_reportname))
121
- }
122
- )
123
- Fastlane::Actions::CollateHtmlReportsAction.run(config)
124
- end
125
- retried_html_reportfiles = Dir.glob("#{output_directory}/#{reportnamer.html_numbered_fileglob}")
126
- FileUtils.rm_f(retried_html_reportfiles)
127
- end
128
165
  end
129
166
 
130
167
  def correcting_scan(scan_run_options, batch, reportnamer)
131
168
  scan_options = @scan_options.merge(scan_run_options)
132
169
  try_count = 0
133
170
  tests_passed = true
171
+ xcpretty_json_file_output = ENV['XCPRETTY_JSON_FILE_OUTPUT']
134
172
  begin
135
173
  try_count += 1
136
174
  config = FastlaneCore::Configuration.create(
@@ -138,6 +176,12 @@ module TestCenter
138
176
  scan_options.merge(reportnamer.scan_options)
139
177
  )
140
178
  quit_simulators
179
+ if reportnamer.includes_json?
180
+ ENV['XCPRETTY_JSON_FILE_OUTPUT'] = File.join(
181
+ scan_options[:output_directory],
182
+ reportnamer.json_last_reportname
183
+ )
184
+ end
141
185
  Fastlane::Actions::ScanAction.run(config)
142
186
  @testrun_completed_block && @testrun_completed_block.call(
143
187
  testrun_info(batch, try_count, reportnamer, scan_options[:output_directory])
@@ -164,6 +208,8 @@ module TestCenter
164
208
  retry
165
209
  end
166
210
  tests_passed = false
211
+ ensure
212
+ ENV['XCPRETTY_JSON_FILE_OUTPUT'] = xcpretty_json_file_output
167
213
  end
168
214
  tests_passed
169
215
  end
@@ -189,6 +235,10 @@ module TestCenter
189
235
  html_report_filepath = File.join(output_directory, reportnamer.html_last_reportname)
190
236
  info[:html_report_filepath] = html_report_filepath
191
237
  end
238
+ if reportnamer.includes_json?
239
+ json_report_filepath = File.join(output_directory, reportnamer.json_last_reportname)
240
+ info[:json_report_filepath] = json_report_filepath
241
+ end
192
242
  info
193
243
  end
194
244
 
@@ -39,15 +39,24 @@ module TestCenter
39
39
  end
40
40
 
41
41
  def scan_options
42
+ options = {}
43
+
44
+ types = @output_types.split(',').each(&:chomp)
42
45
  files = @output_files.split(',').each(&:chomp)
46
+ if (json_index = types.find_index('json'))
47
+ options[:formatter] = 'xcpretty-json-formatter'
48
+ files.delete_at(json_index)
49
+ types.delete_at(json_index)
50
+ end
43
51
  files.map! do |filename|
44
52
  filename.chomp
45
53
  numbered_filename(filename)
46
54
  end
47
- {
48
- output_types: @output_types,
55
+
56
+ options.merge(
57
+ output_types: types.join(','),
49
58
  output_files: files.join(',')
50
- }
59
+ )
51
60
  end
52
61
 
53
62
  def junit_last_reportname
@@ -98,6 +107,32 @@ module TestCenter
98
107
  "#{File.basename(html_reportname, '.*')}-[1-9]*#{html_filextension}"
99
108
  end
100
109
 
110
+ def includes_json?
111
+ @output_types.split(',').find_index('json') != nil
112
+ end
113
+
114
+ def json_last_reportname
115
+ json_index = @output_types.split(',').find_index('json')
116
+ numbered_filename(@output_files.to_s.split(',')[json_index])
117
+ end
118
+
119
+ def json_reportname
120
+ json_index = @output_types.split(',').find_index('json')
121
+ @output_files.to_s.split(',')[json_index]
122
+ end
123
+
124
+ def json_filextension
125
+ File.extname(json_reportname)
126
+ end
127
+
128
+ def json_fileglob
129
+ "#{File.basename(json_reportname, '.*')}*#{json_filextension}"
130
+ end
131
+
132
+ def json_numbered_fileglob
133
+ "#{File.basename(json_reportname, '.*')}-[1-9]*#{json_filextension}"
134
+ end
135
+
101
136
  def increment
102
137
  @report_count += 1
103
138
  end
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
2
  module TestCenter
3
- VERSION = "3.3.0"
3
+ VERSION = "3.4.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane-plugin-test_center
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.0
4
+ version: 3.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lyndsey Ferguson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-06-07 00:00:00.000000000 Z
11
+ date: 2018-06-24 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: json
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: plist
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -178,6 +192,20 @@ dependencies:
178
192
  - - ">="
179
193
  - !ruby/object:Gem::Version
180
194
  version: '0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: xcpretty-json-formatter
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
181
209
  description: |2
182
210
  This fastlane plugin includes the following actions:
183
211
  1) multi_scan: uses scan to run Xcode tests, optionally in batches, a given number of times: only re-testing failing tests.
@@ -196,6 +224,7 @@ files:
196
224
  - README.md
197
225
  - lib/fastlane/plugin/test_center.rb
198
226
  - lib/fastlane/plugin/test_center/actions/collate_html_reports.rb
227
+ - lib/fastlane/plugin/test_center/actions/collate_json_reports.rb
199
228
  - lib/fastlane/plugin/test_center/actions/collate_junit_reports.rb
200
229
  - lib/fastlane/plugin/test_center/actions/multi_scan.rb
201
230
  - lib/fastlane/plugin/test_center/actions/suppress_tests.rb