fastlane-plugin-try_scan 0.5.0 → 1.0.2

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
- SHA256:
3
- metadata.gz: 6423da17416a0d0718726d80c011463f8c11763bea4305c77db114fdca0bac98
4
- data.tar.gz: a6650bda5beb09a03105ee929904c8c2b25b9df3faf69e4dbe3db9cccba97f90
2
+ SHA1:
3
+ metadata.gz: 8dbabd07feebaef1f230a9c2afd3dd991a3a3de7
4
+ data.tar.gz: ed9495eec01b730ab3476c7c76ddd935fe573e6b
5
5
  SHA512:
6
- metadata.gz: e9e2661f541ba9b72aa57317e3d9b5cea705086b0360827cbd56722361bf1f56a480b23fdbcaad520070b2bdade410680af2ac6de2d3791cb3e77057d604f2a8
7
- data.tar.gz: 22ced8f5d7bc59bfa915557f1febb8b9fdf46556feb555063210f15d6658f423f73d8fe79d9a2afc8b1182a0dafc4fcb0fb8efac6dfac0fabedca4edf58fa5f8
6
+ metadata.gz: 8741546e7347f4f8f7e92c80c7543a9453b72e2a597f0a400168490e6e78709a31ebf99a196037021053bcae05cee765a0326a7d4847c06aed225cb0701b42c2
7
+ data.tar.gz: 331ac99fbcda25606b17ef06c19bb8f32227213ba146511f719b5dc94abcf6b5183c834fc1803e61ed95d662170b720ac27e9335f9d0b1870d6cf14453c42e69
data/README.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## Important Announcement ⚠️
2
+
3
+ **Xcode 13** provides test repetitions out of the box. For more details check out [WWDC21](https://developer.apple.com/videos/play/wwdc2021/10296).
4
+
5
+ ---
6
+
1
7
  # try_scan plugin
2
8
 
3
9
  [![fastlane Plugin Badge](https://rawcdn.githack.com/fastlane/fastlane/master/fastlane/assets/plugin-badge.svg)](https://rubygems.org/gems/fastlane-plugin-try_scan)
@@ -14,6 +20,9 @@ Under the hood `try_scan` uses official [`fastlane scan action`](https://docs.fa
14
20
  | try_parallel | Should first run be executed in parallel? Equivalent to `-parallel-testing-enabled` | true |
15
21
  | retry_parallel | Should subsequent runs be executed in parallel? Required `try_parallel: true` | true |
16
22
  | parallel_workers | Specify the exact number of test runners that will be spawned during parallel testing. Equivalent to `-parallel-testing-worker-count` and `concurrent_workers` | |
23
+ | retry_build | Should building be retried after failure? | false |
24
+ | retry_strategy | What would you like to retry after failure: test, class or suite? | test |
25
+ | backup | Back up an output of each execution to a separate folder | false |
17
26
 
18
27
  ## Requirements
19
28
 
@@ -32,7 +41,10 @@ $ fastlane add_plugin try_scan
32
41
  ```ruby
33
42
  try_scan(
34
43
  workspace: "Example.xcworkspace",
35
- devices: ["iPhone 7", "iPad Air"],
36
- try_count: 3
44
+ device: "iPhone 11 Pro Max",
45
+ try_count: 3,
46
+ parallel_workers: 2,
47
+ try_parallel: true,
48
+ retry_parallel: false
37
49
  )
38
50
  ```
@@ -1,6 +1,5 @@
1
1
  module Fastlane
2
2
  module Actions
3
-
4
3
  require 'json'
5
4
  require 'fastlane/actions/scan'
6
5
  require_relative '../helper/scan_helper'
@@ -66,6 +65,34 @@ module Fastlane
66
65
  type: Integer,
67
66
  is_string: false,
68
67
  optional: true
68
+ ),
69
+ FastlaneCore::ConfigItem.new(
70
+ key: :retry_build,
71
+ env_name: "FL_TRY_SCAN_RETRY_BUILD",
72
+ description: "Should building be retried after failure?",
73
+ is_string: false,
74
+ optional: true,
75
+ default_value: false
76
+ ),
77
+ FastlaneCore::ConfigItem.new(
78
+ key: :retry_strategy,
79
+ env_name: "FL_TRY_SCAN_RETRY_STRATEGY",
80
+ description: "What would you like to retry after failure: test, class or suite?",
81
+ is_string: true,
82
+ optional: true,
83
+ default_value: 'test',
84
+ verify_block: proc do |strategy|
85
+ possible_strategies = ['test', 'class', 'suite']
86
+ UI.user_error!("Error: :retry_strategy must equal to one of the following values: #{possible_strategies}") unless possible_strategies.include?(strategy)
87
+ end
88
+ ),
89
+ FastlaneCore::ConfigItem.new(
90
+ key: :backup,
91
+ env_name: "FL_TRY_SCAN_BACKUP",
92
+ description: "Back up an output of each execution to a separate folder",
93
+ is_string: false,
94
+ optional: true,
95
+ default_value: false
69
96
  )
70
97
  ]
71
98
  end
@@ -66,6 +66,27 @@ module TryScanManager
66
66
  end
67
67
  end
68
68
  end
69
+
70
+ def self.backup_output_folder(attempt)
71
+ output_files = report_options.instance_variable_get(:@output_files)
72
+ output_directory = report_options.instance_variable_get(:@output_directory)
73
+
74
+ unless output_files.empty?
75
+ FastlaneCore::UI.verbose("Back up an output folder")
76
+ backup = "#{output_directory}_#{attempt}"
77
+ FileUtils.mkdir_p(backup)
78
+ FileUtils.copy_entry(output_directory, backup)
79
+ end
80
+ end
81
+
82
+ def self.clean_up_backup
83
+ output_directory = report_options.instance_variable_get(:@output_directory)
84
+
85
+ Dir["#{output_directory}_*"].each do |backup|
86
+ FastlaneCore::UI.verbose("Removing backup: #{backup}")
87
+ FileUtils.rm_rf(backup)
88
+ end
89
+ end
69
90
  end
70
91
  end
71
92
  end
@@ -1,6 +1,5 @@
1
1
  module TryScanManager
2
2
  class Runner
3
-
4
3
  FastlaneScanHelper = TryScanManager::Helper::FastlaneScanHelper
5
4
 
6
5
  def initialize(options = {})
@@ -12,6 +11,7 @@ module TryScanManager
12
11
  def run
13
12
  configure_xcargs
14
13
  prepare_scan_config(@options)
14
+ FastlaneScanHelper.clean_up_backup
15
15
  print_summary
16
16
  @attempt = 1
17
17
  begin
@@ -23,13 +23,14 @@ module TryScanManager
23
23
  rescue FastlaneCore::Interface::FastlaneTestFailure => _
24
24
  failed_tests = failed_tests_from_xcresult_report
25
25
  print_try_scan_result(failed_tests_count: failed_tests.size)
26
+ backup_output_folder if @options[:backup]
26
27
  return false if finish?
27
28
 
28
29
  @attempt += 1
29
30
  update_scan_options(failed_tests)
30
31
  retry
31
32
  rescue FastlaneCore::Interface::FastlaneBuildFailure => _
32
- return false if finish?
33
+ return false if finish? || !@options[:retry_build]
33
34
 
34
35
  @attempt += 1
35
36
  retry
@@ -70,7 +71,7 @@ module TryScanManager
70
71
  def print_try_scan_result(failed_tests_count: 0)
71
72
  FastlaneCore::UI.important("TryScan: result after #{ordinalized_attempt} shot 👇")
72
73
  FastlaneCore::PrintTable.print_values(
73
- config: {"Number of tests" => tests_count_from_xcresult_report, "Number of failures" => failed_tests_count},
74
+ config: { "Number of tests" => tests_count_from_xcresult_report, "Number of failures" => failed_tests_count },
74
75
  title: "Test Results"
75
76
  )
76
77
  end
@@ -112,14 +113,18 @@ module TryScanManager
112
113
  @options[:build_for_testing] = nil
113
114
  end
114
115
 
115
- if @options[:try_parallel] && !@options[:disable_concurrent_testing]
116
- xcargs = ['-parallel-testing-enabled YES']
116
+ xcargs = []
117
+ if @options[:try_parallel]
118
+ xcargs << '-parallel-testing-enabled YES'
117
119
  if @options[:parallel_workers] || @options[:concurrent_workers]
118
120
  workers_count = [@options[:parallel_workers].to_i, @options[:concurrent_workers].to_i].max
119
121
  xcargs << "-parallel-testing-worker-count #{workers_count}"
122
+ @options[:concurrent_workers] = nil
120
123
  end
121
- @options[:xcargs] = "#{@options[:xcargs].to_s} #{xcargs.join(' ')}"
124
+ else
125
+ xcargs << '-parallel-testing-enabled NO'
122
126
  end
127
+ @options[:xcargs] = "#{@options[:xcargs]} #{xcargs.join(' ')}"
123
128
  end
124
129
 
125
130
  def update_scan_options(failed_tests)
@@ -137,10 +142,22 @@ module TryScanManager
137
142
  next if val.nil?
138
143
 
139
144
  Scan.config.set(key, val)
140
- FastlaneCore::UI.verbose("\tSetting #{key.to_s} to #{val}")
145
+ FastlaneCore::UI.verbose("\tSetting #{key} to #{val}")
141
146
  end
142
147
  end
143
148
 
149
+ def retry_failed_test?
150
+ @options[:retry_strategy] == 'test'
151
+ end
152
+
153
+ def retry_failed_class?
154
+ @options[:retry_strategy] == 'class'
155
+ end
156
+
157
+ def retry_failed_suite?
158
+ @options[:retry_strategy] == 'suite'
159
+ end
160
+
144
161
  def parse_xcresult_report
145
162
  report_options = FastlaneScanHelper.report_options
146
163
  output_directory = report_options.instance_variable_get(:@output_directory)
@@ -159,17 +176,28 @@ module TryScanManager
159
176
  begin
160
177
  test_class = test_path.split('.').first
161
178
  test_name = test_path.split('.')[1].split('(').first
162
- rescue NoMethodError => _
179
+ rescue
163
180
  test_class = test_path.split('[')[1].split(' ').first
164
181
  test_name = test_path.split(' ')[1].split(']').first
165
182
  end
166
- only_testing << "#{suite_name}/#{test_class}/#{test_name}"
183
+ only_testing <<
184
+ if retry_failed_test?
185
+ "#{suite_name}/#{test_class}/#{test_name}"
186
+ elsif retry_failed_class?
187
+ "#{suite_name}/#{test_class}"
188
+ elsif retry_failed_suite?
189
+ suite_name
190
+ end
167
191
  end
168
- only_testing
192
+ only_testing.uniq
169
193
  end
170
194
 
171
195
  def tests_count_from_xcresult_report
172
196
  parse_xcresult_report['metrics']['testsCount']['_value']
173
197
  end
198
+
199
+ def backup_output_folder
200
+ FastlaneScanHelper.backup_output_folder(@attempt)
201
+ end
174
202
  end
175
203
  end
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
2
  module TryScan
3
- VERSION = "0.5.0"
3
+ VERSION = "1.0.2"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane-plugin-try_scan
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexey Alter-Pesotskiy
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-25 00:00:00.000000000 Z
11
+ date: 2021-07-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pry
@@ -39,21 +39,7 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: rspec
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: rspec_junit_formatter
42
+ name: rake
57
43
  requirement: !ruby/object:Gem::Requirement
58
44
  requirements:
59
45
  - - ">="
@@ -67,19 +53,19 @@ dependencies:
67
53
  - !ruby/object:Gem::Version
68
54
  version: '0'
69
55
  - !ruby/object:Gem::Dependency
70
- name: rake
56
+ name: fasterer
71
57
  requirement: !ruby/object:Gem::Requirement
72
58
  requirements:
73
- - - ">="
59
+ - - '='
74
60
  - !ruby/object:Gem::Version
75
- version: '0'
61
+ version: 0.8.3
76
62
  type: :development
77
63
  prerelease: false
78
64
  version_requirements: !ruby/object:Gem::Requirement
79
65
  requirements:
80
- - - ">="
66
+ - - '='
81
67
  - !ruby/object:Gem::Version
82
- version: '0'
68
+ version: 0.8.3
83
69
  - !ruby/object:Gem::Dependency
84
70
  name: rubocop
85
71
  requirement: !ruby/object:Gem::Requirement
@@ -136,8 +122,8 @@ dependencies:
136
122
  - - ">="
137
123
  - !ruby/object:Gem::Version
138
124
  version: 2.144.0
139
- description:
140
- email: 33gri@bk.ru
125
+ description:
126
+ email: a.alterpesotskiy@mail.ru
141
127
  executables: []
142
128
  extensions: []
143
129
  extra_rdoc_files: []
@@ -154,7 +140,7 @@ licenses:
154
140
  - MIT
155
141
  metadata:
156
142
  allowed_push_host: https://rubygems.org
157
- post_install_message:
143
+ post_install_message:
158
144
  rdoc_options: []
159
145
  require_paths:
160
146
  - lib
@@ -169,8 +155,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
169
155
  - !ruby/object:Gem::Version
170
156
  version: '0'
171
157
  requirements: []
172
- rubygems_version: 3.0.3
173
- signing_key:
158
+ rubyforge_project:
159
+ rubygems_version: 2.6.8
160
+ signing_key:
174
161
  specification_version: 4
175
- summary: Simple way to retry your scan action
162
+ summary: The easiest way to retry your fastlane scan action
176
163
  test_files: []