fastlane-plugin-try_scan 0.3.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c6c7d43c04eefe86a77bf821325cfe4a435487df5162edc121784d5a7b22eb97
4
- data.tar.gz: ec7438c57260293d37e743ec83bc9303c8893259a6d0d9f088e4675e0ea74a94
3
+ metadata.gz: e8b1ddd52d18056454daac6439174007793d35118f4288fb081351b3afb4b9bd
4
+ data.tar.gz: ef591e6c38f9bccb374acd281c3b3b35b3cbc9e312b8f1148ed742f1a53819eb
5
5
  SHA512:
6
- metadata.gz: 57050baf27ba80ade9c67594d7d9d2f0280352fc14e758d6783043cdc1929b23abe7bf92b5d0f8f0d36a2fbe8d70b14e19de04ea7d99ce48c151b8d1072ec0f4
7
- data.tar.gz: cfc8abc27d18cce7067ce95316214d9f4f477bfb6d4375b7dc5ce41e0f1ac070295513086f21c64610eff0ecee28b21c507bddd9554c1a4bf2f85ed92062db6e
6
+ metadata.gz: 464e74a6bc906a21eaba25240239e39c16892060e381375ee1312105e4e65ff639b198001f2cc96a420bb3afa50b655404314e08cefb863a99550778e6c31c12
7
+ data.tar.gz: c756f55f28a47ed440578aeb24aae388257a83b0a4ee773d0522c2a34b63a27a638d1ae5c6d81e21da550425cdd1e51e0f30011c9f1f25ee55f5d6c40861f67e
data/README.md CHANGED
@@ -2,36 +2,39 @@
2
2
 
3
3
  [![fastlane Plugin Badge](https://rawcdn.githack.com/fastlane/fastlane/master/fastlane/assets/plugin-badge.svg)](https://rubygems.org/gems/fastlane-plugin-try_scan)
4
4
 
5
+ ## About try_scan
6
+
7
+ The easiest way to rerun tests of your iOS and Mac app 🚀
8
+
9
+ Under the hood `try_scan` uses official [`fastlane scan action`](https://docs.fastlane.tools/actions/scan/), it means that you are able to provide any `scan` options and use `Scanfile` as before — everything will work like a charm, `try_scan` just brings couple of new amazing options:
10
+
11
+ | Option | Description | Default |
12
+ | ------- |------------ | ------- |
13
+ | try_count | Number of times to try to get your tests green | 1 |
14
+ | try_parallel | Should first run be executed in parallel? Equivalent to `-parallel-testing-enabled` | true |
15
+ | retry_parallel | Should subsequent runs be executed in parallel? Required `try_parallel: true` | true |
16
+ | 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` | |
17
+ | retry_build | Should building be retried after failure? | false |
18
+ | retry_strategy | What would you like to retry after failure: test, class or suite? | test |
19
+
20
+ ## Requirements
21
+
22
+ * Xcode 11.x or greater. Download it at the [Apple Developer - Downloads](https://developer.apple.com/downloads) or the [Mac App Store](https://apps.apple.com/us/app/xcode/id497799835?mt=12).
23
+
5
24
  ## Getting Started
6
25
 
7
- This project is a [_fastlane_](https://github.com/fastlane/fastlane) plugin. To get started with `try_scan`, add it to your project by running:
26
+ To get started with `try_scan`, add it to your project by running:
8
27
 
9
28
  ```bash
10
- fastlane add_plugin try_scan
29
+ $ fastlane add_plugin try_scan
11
30
  ```
12
31
 
13
- ## About try_scan
14
-
15
- Simple way to retry your scan action 🚀
16
-
17
32
  ## Usage
18
33
 
19
34
  ```ruby
20
35
  try_scan(
21
36
  workspace: "Example.xcworkspace",
22
- devices: ["iPhone 6s", "iPad Air"],
37
+ devices: ["iPhone 7", "iPad Air"],
23
38
  try_count: 3
24
39
  )
25
40
  ```
26
-
27
- ## Issues and Feedback
28
-
29
- For any other issues and feedback about this plugin, please submit it to this repository.
30
-
31
- ## Troubleshooting
32
-
33
- If you have trouble using plugins, check out the [Plugins Troubleshooting](https://docs.fastlane.tools/plugins/plugins-troubleshooting/) guide.
34
-
35
- ## About _fastlane_
36
-
37
- _fastlane_ is the easiest way to automate beta deployments and releases for your iOS and Android apps. To learn more, check out [fastlane.tools](https://fastlane.tools).
@@ -1,8 +1,6 @@
1
1
  module Fastlane
2
2
  module Actions
3
-
4
3
  require 'json'
5
- require 'nokogiri'
6
4
  require 'fastlane/actions/scan'
7
5
  require_relative '../helper/scan_helper'
8
6
  require_relative '../helper/try_scan_runner'
@@ -11,61 +9,16 @@ module Fastlane
11
9
 
12
10
  class TryScanAction < Action
13
11
  def self.run(params)
14
- prepare_for_testing(params)
15
- success = TryScanManager::Runner.new(params.values).run
16
-
17
- raise FastlaneCore::UI.test_failure!('Tests have failed') if params[:fail_build] && !success
18
- end
19
-
20
- def self.prepare_for_testing(params)
21
- warn_of_xcode11_result_bundle_incompatability(params)
22
- use_scanfile_to_override_settings(params.values)
23
- turn_off_concurrent_workers(params.values)
24
- prepare_scan_config(params.values)
25
- coerce_destination_to_array(params)
26
- end
27
-
28
- def self.warn_of_xcode11_result_bundle_incompatability(params)
29
- if FastlaneCore::Helper.xcode_at_least?('11.0.0')
30
- if params[:result_bundle]
31
- FastlaneCore::UI.important('As of Xcode 11, test_result bundles created in the output directory are actually symbolic links to an xcresult bundle')
32
- end
33
- elsif params[:output_types]&.include?('xcresult')
34
- FastlaneCore::UI.important("The 'xcresult' :output_type is only supported for Xcode 11 and greater. You are using #{FastlaneCore::Helper.xcode_version}.")
35
- end
36
- end
37
-
38
- def self.coerce_destination_to_array(params)
39
- destination = params[:destination] || Scan.config[:destination] || []
40
- unless destination.kind_of?(Array)
41
- params[:destination] = Scan.config[:destination] = [destination]
42
- end
43
- end
44
-
45
- def self.turn_off_concurrent_workers(scan_options)
46
- if Gem::Version.new(Fastlane::VERSION) >= Gem::Version.new('2.142.0')
47
- scan_options.delete(:concurrent_workers) if scan_options[:concurrent_workers].to_i > 0
48
- end
49
- end
50
-
51
- def self.use_scanfile_to_override_settings(scan_options)
52
- overridden_options = FastlaneScanHelper.options_from_configuration_file(
53
- FastlaneScanHelper.scan_options_from_try_scan_options(scan_options)
54
- )
12
+ if Helper.xcode_at_least?('11.0.0')
13
+ params[:destination] = [params[:destination]] if params[:destination] && !params[:destination].kind_of?(Array)
14
+ success = TryScanManager::Runner.new(params.values).run
55
15
 
56
- unless overridden_options.empty?
57
- FastlaneCore::UI.important("Scanfile found: overriding try_scan options with it's values.")
58
- overridden_options.each { |key, val| scan_options[key] = val }
16
+ raise FastlaneCore::UI.test_failure!('Tests have failed') if params[:fail_build] && !success
17
+ else
18
+ raise FastlaneCore::UI.user_error!("Minimum supported Xcode: `v11.0.0` (used: `v#{Helper.xcode_version}`)")
59
19
  end
60
20
  end
61
21
 
62
- def self.prepare_scan_config(scan_options)
63
- Scan.config ||= FastlaneCore::Configuration.create(
64
- Fastlane::Actions::ScanAction.available_options,
65
- FastlaneScanHelper.scan_options_from_try_scan_options(scan_options)
66
- )
67
- end
68
-
69
22
  #####################################################
70
23
  # Documentation #
71
24
  #####################################################
@@ -78,20 +31,60 @@ module Fastlane
78
31
  ["Alexey Alter-Pesotskiy"]
79
32
  end
80
33
 
81
- def self.scan_options
82
- ScanAction.available_options.reject { |config| %i[output_types].include?(config.key) }
83
- end
84
-
85
34
  def self.available_options
86
- scan_options = ScanAction.available_options.reject { |config| %i[output_types].include?(config.key) }
87
- scan_options + [
35
+ ScanAction.available_options + [
88
36
  FastlaneCore::ConfigItem.new(
89
37
  key: :try_count,
90
38
  env_name: "FL_TRY_SCAN_TRY_COUNT",
91
- description: "The number of times to retry running tests via scan",
39
+ description: "Number of times to try to get your tests green",
92
40
  type: Integer,
93
41
  is_string: false,
42
+ optional: true,
94
43
  default_value: 1
44
+ ),
45
+ FastlaneCore::ConfigItem.new(
46
+ key: :try_parallel,
47
+ env_name: "FL_TRY_SCAN_TRY_PARALLEL",
48
+ description: "Should first run be executed in parallel? Equivalent to -parallel-testing-enabled",
49
+ is_string: false,
50
+ optional: true,
51
+ default_value: true
52
+ ),
53
+ FastlaneCore::ConfigItem.new(
54
+ key: :retry_parallel,
55
+ env_name: "FL_TRY_SCAN_RETRY_PARALLEL",
56
+ description: "Should subsequent runs be executed in parallel? Required :try_parallel: true",
57
+ is_string: false,
58
+ optional: true,
59
+ default_value: true
60
+ ),
61
+ FastlaneCore::ConfigItem.new(
62
+ key: :parallel_workers,
63
+ env_name: "FL_TRY_SCAN_PARALLEL_WORKERS",
64
+ description: "Specify the exact number of test runners that will be spawned during parallel testing. Equivalent to -parallel-testing-worker-count and :concurrent_workers",
65
+ type: Integer,
66
+ is_string: false,
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
95
88
  )
96
89
  ]
97
90
  end
@@ -101,7 +94,7 @@ module Fastlane
101
94
  end
102
95
 
103
96
  def self.is_supported?(platform)
104
- [:ios].include?(platform)
97
+ [:ios, :mac].include?(platform)
105
98
  end
106
99
  end
107
100
  end
@@ -19,31 +19,9 @@ module TryScanManager
19
19
  end
20
20
 
21
21
  def self.scan_options_from_try_scan_options(params)
22
- valid_scan_keys = Fastlane::Actions::ScanAction.available_options.map(&:key)
23
22
  params.select { |key, _| valid_scan_keys.include?(key) }
24
23
  end
25
24
 
26
- def self.options_from_configuration_file(params)
27
- config = FastlaneCore::Configuration.create(
28
- Fastlane::Actions::ScanAction.available_options,
29
- params
30
- )
31
- config_file = config.load_configuration_file(Scan.scanfile_name, nil, true)
32
- overridden_options = config_file ? config_file.options : {}
33
-
34
- FastlaneCore::Project.detect_projects(config)
35
- project = FastlaneCore::Project.new(config)
36
-
37
- imported_path = File.expand_path(Scan.scanfile_name)
38
- Dir.chdir(File.expand_path("..", project.path)) do
39
- if File.expand_path(Scan.scanfile_name) != imported_path
40
- config_file = config.load_configuration_file(Scan.scanfile_name, nil, true)
41
- end
42
- overridden_options.merge!(config_file.options) if config_file
43
- end
44
- overridden_options
45
- end
46
-
47
25
  def self.remove_preexisting_simulator_logs(params)
48
26
  return unless params[:include_simulator_logs]
49
27
 
@@ -90,4 +68,4 @@ module TryScanManager
90
68
  end
91
69
  end
92
70
  end
93
- end
71
+ end
@@ -1,46 +1,42 @@
1
1
  module TryScanManager
2
2
  class Runner
3
-
4
3
  FastlaneScanHelper = TryScanManager::Helper::FastlaneScanHelper
5
4
 
6
5
  def initialize(options = {})
7
6
  @options = options
7
+ @options[:try_count] = 1 if @options[:try_count] < 1
8
+ @options[:result_bundle] = true
8
9
  end
9
10
 
10
11
  def run
11
- update_scan_config
12
+ configure_xcargs
13
+ prepare_scan_config(@options)
12
14
  print_summary
13
15
  @attempt = 1
14
16
  begin
15
17
  warn_of_performing_attempts
16
18
  clear_preexisting_data
17
19
  Scan::Runner.new.run
18
- print_parallel_scan_result
20
+ print_try_scan_result
19
21
  return true
20
22
  rescue FastlaneCore::Interface::FastlaneTestFailure => _
21
- failed_tests = extract_failed_tests
22
- print_parallel_scan_result(failed_tests_count: failed_tests.size)
23
- update_scan_junit_report
24
- return false if @attempt >= @options[:try_count]
23
+ failed_tests = failed_tests_from_xcresult_report
24
+ print_try_scan_result(failed_tests_count: failed_tests.size)
25
+ return false if finish?
25
26
 
26
27
  @attempt += 1
27
28
  update_scan_options(failed_tests)
28
29
  retry
29
30
  rescue FastlaneCore::Interface::FastlaneBuildFailure => _
30
- return false if @attempt >= @options[:try_count]
31
+ return false if finish? || !@options[:retry_build]
31
32
 
32
33
  @attempt += 1
33
34
  retry
34
35
  end
35
36
  end
36
37
 
37
- def update_scan_config
38
- if !Scan.config[:output_types].include?('junit') && !parallel_running?
39
- output_types = Scan.config[:output_types].split(',')
40
- output_types << 'junit'
41
- Scan.config[:output_types] = output_types.join(',')
42
- end
43
- @options[:try_count] = 1 if @options[:try_count] < 1
38
+ def finish?
39
+ @attempt >= @options[:try_count]
44
40
  end
45
41
 
46
42
  def print_summary
@@ -70,12 +66,10 @@ module TryScanManager
70
66
  FastlaneScanHelper.remove_report_files
71
67
  end
72
68
 
73
- def print_parallel_scan_result(failed_tests_count: 0)
74
- return unless parallel_running?
75
-
69
+ def print_try_scan_result(failed_tests_count: 0)
76
70
  FastlaneCore::UI.important("TryScan: result after #{ordinalized_attempt} shot 👇")
77
71
  FastlaneCore::PrintTable.print_values(
78
- config: {"Number of tests" => tests_count_from_xcresult_report, "Number of failures" => failed_tests_count},
72
+ config: { "Number of tests" => tests_count_from_xcresult_report, "Number of failures" => failed_tests_count },
79
73
  title: "Test Results"
80
74
  )
81
75
  end
@@ -93,98 +87,73 @@ module TryScanManager
93
87
  end
94
88
  end
95
89
 
96
- def update_scan_options(failed_tests)
97
- scan_options = @options.select { |key, _|
98
- FastlaneScanHelper.valid_scan_keys.include?(key)
99
- }.merge(plugin_scan_options)
100
- scan_options[:only_testing] = failed_tests
101
- scan_options[:skip_build] = true
102
- scan_options[:test_without_building] = true
103
- scan_options[:build_for_testing] = false
104
- scan_options.delete(:skip_testing)
105
- Scan.cache.clear
106
- scan_options.each do |key, val|
107
- next if val.nil?
90
+ def prepare_scan_config(scan_options)
91
+ Scan.config = FastlaneCore::Configuration.create(
92
+ Fastlane::Actions::ScanAction.available_options,
93
+ FastlaneScanHelper.scan_options_from_try_scan_options(scan_options)
94
+ )
95
+ end
108
96
 
109
- Scan.config.set(key, val) unless val.nil?
110
- FastlaneCore::UI.verbose("\tSetting #{key.to_s} to #{val}")
97
+ def configure_xcargs
98
+ if @options[:xcargs]&.include?('-parallel-testing-enabled')
99
+ FastlaneCore::UI.important("TryScan overwrites `-parallel-testing-enabled` in :xcargs, use :try_parallel option instead")
100
+ @options[:xcargs].gsub!(/-parallel-testing-enabled(=|\s+)(YES|NO)/, '')
111
101
  end
112
- end
113
102
 
114
- def plugin_scan_options
115
- xcargs = @options[:xcargs] || ''
116
- if xcargs&.include?('build-for-testing')
117
- FastlaneCore::UI.important(":xcargs, #{xcargs}, contained 'build-for-testing', removing it")
118
- xcargs.slice!('build-for-testing')
103
+ if @options[:xcargs]&.include?('-parallel-testing-worker-count')
104
+ FastlaneCore::UI.important("TryScan overwrites `-parallel-testing-worker-count` in :xcargs, use :concurrent_workers option instead")
105
+ @options[:xcargs].gsub!(/-parallel-testing-worker-count(=|\s+)(\d+)/, '')
119
106
  end
120
- if xcargs.include?('-quiet')
121
- FastlaneCore::UI.important('Disabling -quiet as failing tests cannot be found with it enabled.')
122
- xcargs.gsub!('-quiet', '')
107
+
108
+ if @options[:xcargs]&.include?('build-for-testing') || @options[:build_for_testing]
109
+ FastlaneCore::UI.important("TryScan rejects `build-for-testing` request, use it in a separate scan lane")
110
+ @options[:xcargs].slice!('build-for-testing')
111
+ @options[:build_for_testing] = nil
123
112
  end
124
- @options.select { |key, _| FastlaneScanHelper.valid_scan_keys.include?(key) }.merge({ xcargs: xcargs })
125
- end
126
113
 
127
- def extract_failed_tests
128
- if parallel_running?
129
- failed_tests_from_xcresult_report
114
+ xcargs = []
115
+ if @options[:try_parallel]
116
+ xcargs << '-parallel-testing-enabled YES'
117
+ if @options[:parallel_workers] || @options[:concurrent_workers]
118
+ workers_count = [@options[:parallel_workers].to_i, @options[:concurrent_workers].to_i].max
119
+ xcargs << "-parallel-testing-worker-count #{workers_count}"
120
+ @options[:concurrent_workers] = nil
121
+ end
130
122
  else
131
- failed_tests_from_junit_report
123
+ xcargs << '-parallel-testing-enabled NO'
132
124
  end
125
+ @options[:xcargs] = "#{@options[:xcargs]} #{xcargs.join(' ')}"
133
126
  end
134
127
 
135
- def parallel_running?
136
- return @options[:concurrent_workers].to_i > 0 ||
137
- (@options[:devices] && @options[:devices].size > 1) ||
138
- (@options[:xcargs] && (@options[:xcargs] =~ /-parallel-testing-enabled(=|\s+)YES/ || @options[:xcargs].split('-destination').size > 2))
139
- end
128
+ def update_scan_options(failed_tests)
129
+ scan_options = FastlaneScanHelper.scan_options_from_try_scan_options(@options)
130
+ scan_options[:only_testing] = failed_tests
131
+ scan_options[:skip_build] = true
132
+ scan_options.delete(:skip_testing)
133
+ if @options[:try_parallel] && !@options[:retry_parallel]
134
+ scan_options[:xcargs].gsub!(/-parallel-testing-enabled(=|\s+)(YES|NO)/, '-parallel-testing-enabled NO')
135
+ scan_options[:xcargs].gsub!(/-parallel-testing-worker-count(=|\s+)(\d+)/, '')
136
+ end
140
137
 
141
- def failed_tests_from_junit_report
142
- report = junit_report
143
- suite_name = report.xpath('testsuites/@name').to_s.split('.')[0]
144
- test_cases = report.xpath('//testcase')
145
- only_testing = []
146
- test_cases.each do |test_case|
147
- next if test_case.xpath('failure').empty?
138
+ Scan.cache.clear
139
+ scan_options.each do |key, val|
140
+ next if val.nil?
148
141
 
149
- test_class = test_case.xpath('@classname').to_s.split('.')[1]
150
- test_name = test_case.xpath('@name')
151
- only_testing << "#{suite_name}/#{test_class}/#{test_name}"
142
+ Scan.config.set(key, val)
143
+ FastlaneCore::UI.verbose("\tSetting #{key} to #{val}")
152
144
  end
153
- only_testing
154
145
  end
155
146
 
156
- def junit_report(cached: false)
157
- unless cached
158
- report_options = FastlaneScanHelper.report_options
159
- output_files = report_options.instance_variable_get(:@output_files)
160
- output_directory = report_options.instance_variable_get(:@output_directory)
161
- file_name = output_files.select { |name| name.include?('.xml') }.first
162
- @junit_report_path = "#{output_directory}/#{file_name}"
163
- @cached_junit_report = File.open(@junit_report_path) { |f| Nokogiri::XML(f) }
164
- end
165
- @cached_junit_report
147
+ def retry_failed_test?
148
+ @options[:retry_strategy] == 'test'
166
149
  end
167
150
 
168
- def update_scan_junit_report
169
- return if @attempt == 1 || parallel_running?
170
-
171
- old_junit_report = junit_report(cached: true)
172
- new_junit_report = junit_report(cached: false)
173
-
174
- new_junit_report.css("testsuites").zip(old_junit_report.css("testsuites")).each do |new_suites, old_suites|
175
- old_suites.attributes["failures"].value = new_suites.attributes["failures"].value
176
- new_suites.css("testsuite").zip(old_suites.css("testsuite")).each do |new_suite, old_suite|
177
- old_suite.attributes["failures"].value = new_suite.attributes["failures"].value
178
- end
179
- end
180
-
181
- new_junit_report.css('testcase').each do |node1|
182
- old_junit_report.css('testcase').each do |node2|
183
- node2.children = node1.children if node1['name'] == node2['name']
184
- end
185
- end
151
+ def retry_failed_class?
152
+ @options[:retry_strategy] == 'class'
153
+ end
186
154
 
187
- File.open(@junit_report_path, "w+") { |f| f.write(old_junit_report.to_xml) }
155
+ def retry_failed_suite?
156
+ @options[:retry_strategy] == 'suite'
188
157
  end
189
158
 
190
159
  def parse_xcresult_report
@@ -205,13 +174,20 @@ module TryScanManager
205
174
  begin
206
175
  test_class = test_path.split('.').first
207
176
  test_name = test_path.split('.')[1].split('(').first
208
- rescue NoMethodError => _
177
+ rescue
209
178
  test_class = test_path.split('[')[1].split(' ').first
210
179
  test_name = test_path.split(' ')[1].split(']').first
211
180
  end
212
- only_testing << "#{suite_name}/#{test_class}/#{test_name}"
181
+ only_testing <<
182
+ if retry_failed_test?
183
+ "#{suite_name}/#{test_class}/#{test_name}"
184
+ elsif retry_failed_class?
185
+ "#{suite_name}/#{test_class}"
186
+ elsif retry_failed_suite?
187
+ suite_name
188
+ end
213
189
  end
214
- only_testing
190
+ only_testing.uniq
215
191
  end
216
192
 
217
193
  def tests_count_from_xcresult_report
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
2
  module TryScan
3
- VERSION = "0.3.0"
3
+ VERSION = "1.0.1"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,43 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane-plugin-try_scan
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexey Alter-Pesotskiy
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-16 00:00:00.000000000 Z
11
+ date: 2020-07-16 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: nokogiri
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'
27
- - !ruby/object:Gem::Dependency
28
- name: json
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
13
  - !ruby/object:Gem::Dependency
42
14
  name: pry
43
15
  requirement: !ruby/object:Gem::Requirement
@@ -67,21 +39,7 @@ dependencies:
67
39
  - !ruby/object:Gem::Version
68
40
  version: '0'
69
41
  - !ruby/object:Gem::Dependency
70
- name: rspec
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: rspec_junit_formatter
42
+ name: rake
85
43
  requirement: !ruby/object:Gem::Requirement
86
44
  requirements:
87
45
  - - ">="
@@ -95,19 +53,19 @@ dependencies:
95
53
  - !ruby/object:Gem::Version
96
54
  version: '0'
97
55
  - !ruby/object:Gem::Dependency
98
- name: rake
56
+ name: fasterer
99
57
  requirement: !ruby/object:Gem::Requirement
100
58
  requirements:
101
- - - ">="
59
+ - - '='
102
60
  - !ruby/object:Gem::Version
103
- version: '0'
61
+ version: 0.8.3
104
62
  type: :development
105
63
  prerelease: false
106
64
  version_requirements: !ruby/object:Gem::Requirement
107
65
  requirements:
108
- - - ">="
66
+ - - '='
109
67
  - !ruby/object:Gem::Version
110
- version: '0'
68
+ version: 0.8.3
111
69
  - !ruby/object:Gem::Dependency
112
70
  name: rubocop
113
71
  requirement: !ruby/object:Gem::Requirement
@@ -165,7 +123,7 @@ dependencies:
165
123
  - !ruby/object:Gem::Version
166
124
  version: 2.144.0
167
125
  description:
168
- email: 33gri@bk.ru
126
+ email: a.alterpesotskiy@mail.ru
169
127
  executables: []
170
128
  extensions: []
171
129
  extra_rdoc_files: []
@@ -200,5 +158,5 @@ requirements: []
200
158
  rubygems_version: 3.0.3
201
159
  signing_key:
202
160
  specification_version: 4
203
- summary: Simple way to retry your scan action
161
+ summary: The easiest way to retry your fastlane scan action
204
162
  test_files: []