fastlane 2.54.0.beta.20170822010003 → 2.54.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/deliver/lib/deliver/loader.rb +29 -3
  4. data/deliver/lib/deliver/upload_metadata.rb +18 -0
  5. data/fastlane/lib/fastlane/actions/opt_out_crash_reporting.rb +1 -1
  6. data/fastlane/lib/fastlane/version.rb +1 -1
  7. data/fastlane_core/lib/fastlane_core.rb +1 -0
  8. data/fastlane_core/lib/fastlane_core/crash_reporter/crash_reporter.rb +1 -1
  9. data/fastlane_core/lib/fastlane_core/device_manager.rb +12 -12
  10. data/fastlane_core/lib/fastlane_core/test_parser.rb +145 -0
  11. data/fastlane_core/lib/fastlane_core/ui/fastlane_runner.rb +1 -1
  12. data/pilot/lib/pilot/tester_manager.rb +8 -1
  13. data/sigh/lib/sigh/runner.rb +27 -18
  14. data/snapshot/README.md +3 -1
  15. data/snapshot/lib/assets/SnapshotHelper.swift +57 -35
  16. data/snapshot/lib/assets/SnapshotHelperXcode8.swift +173 -0
  17. data/snapshot/lib/snapshot.rb +6 -0
  18. data/snapshot/lib/snapshot/collector.rb +37 -11
  19. data/snapshot/lib/snapshot/detect_values.rb +4 -1
  20. data/snapshot/lib/snapshot/fixes/simulator_zoom_fix.rb +1 -1
  21. data/snapshot/lib/snapshot/options.rb +5 -0
  22. data/snapshot/lib/snapshot/reports_generator.rb +34 -3
  23. data/snapshot/lib/snapshot/runner.rb +30 -215
  24. data/snapshot/lib/snapshot/setup.rb +9 -3
  25. data/snapshot/lib/snapshot/simulator_launchers/launcher_configuration.rb +53 -0
  26. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher.rb +203 -0
  27. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +129 -0
  28. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_xcode_8.rb +110 -0
  29. data/snapshot/lib/snapshot/test_command_generator.rb +39 -107
  30. data/snapshot/lib/snapshot/test_command_generator_base.rb +94 -0
  31. data/snapshot/lib/snapshot/test_command_generator_xcode_8.rb +65 -0
  32. data/snapshot/lib/snapshot/update.rb +4 -2
  33. data/spaceship/lib/spaceship/portal/provisioning_profile.rb +5 -2
  34. data/spaceship/lib/spaceship/test_flight/client.rb +8 -0
  35. data/spaceship/lib/spaceship/test_flight/tester.rb +20 -4
  36. metadata +26 -17
@@ -1,133 +1,65 @@
1
+ require 'snapshot/test_command_generator_base'
2
+
1
3
  module Snapshot
2
4
  # Responsible for building the fully working xcodebuild command
3
- class TestCommandGenerator
5
+ # Xcode 9 introduced the ability to run tests in parallel on multiple simulators
6
+ # This TestCommandGenerator constructs the appropriate `xcodebuild` command
7
+ # to be used for executing simultaneous tests
8
+ class TestCommandGenerator < TestCommandGeneratorBase
4
9
  class << self
5
- def generate(device_type: nil, language: nil, locale: nil)
10
+ def generate(devices: nil, language: nil, locale: nil, log_path: nil)
6
11
  parts = prefix
7
12
  parts << "xcodebuild"
8
13
  parts += options
9
- parts += destination(device_type)
14
+ parts += destination(devices)
10
15
  parts += build_settings
11
16
  parts += actions
12
17
  parts += suffix
13
- parts += pipe(device_type, language, locale)
14
-
15
- parts
16
- end
17
-
18
- def prefix
19
- ["set -o pipefail &&"]
20
- end
21
-
22
- # Path to the project or workspace as parameter
23
- # This will also include the scheme (if given)
24
- # @return [Array] The array with all the components to join
25
- def project_path_array
26
- proj = Snapshot.project.xcodebuild_parameters
27
- return proj if proj.count > 0
28
- UI.user_error!("No project/workspace found")
29
- end
30
-
31
- def options
32
- config = Snapshot.config
33
-
34
- options = []
35
- options += project_path_array
36
- options << "-sdk '#{config[:sdk]}'" if config[:sdk]
37
- options << "-derivedDataPath '#{derived_data_path}'"
38
- options << config[:xcargs] if config[:xcargs]
39
- options
40
- end
41
-
42
- def build_settings
43
- config = Snapshot.config
44
-
45
- build_settings = []
46
- build_settings << "FASTLANE_SNAPSHOT=YES"
47
- build_settings << "TEST_TARGET_NAME=#{config[:test_target_name].shellescape}" if config[:test_target_name]
48
-
49
- build_settings
50
- end
51
-
52
- def actions
53
- actions = []
54
- actions << :clean if Snapshot.config[:clean]
55
- actions << :build # https://github.com/fastlane/snapshot/issues/246
56
- actions << :test
18
+ parts += pipe(language: language, locale: locale, log_path: log_path)
57
19
 
58
- actions
20
+ return parts
59
21
  end
60
22
 
61
- def suffix
62
- []
23
+ def pipe(language: nil, locale: nil, log_path: nil)
24
+ tee_command = ['tee']
25
+ tee_command << '-a' if log_path && File.exist?(log_path)
26
+ tee_command << log_path.shellescape if log_path
27
+ return ["| #{tee_command.join(' ')} | xcpretty #{Snapshot.config[:xcpretty_args]}"]
63
28
  end
64
29
 
65
- def pipe(device_type, language, locale)
66
- log_path = xcodebuild_log_path(device_type: device_type, language: language, locale: locale)
67
- ["| tee #{log_path.shellescape} | xcpretty #{Snapshot.config[:xcpretty_args]}"]
68
- end
69
-
70
- def find_device(device_name, os_version = Snapshot.config[:ios_version])
71
- # We might get this error message
72
- # > The requested device could not be found because multiple devices matched the request.
73
- #
74
- # This happens when you have multiple simulators for a given device type / iOS combination
75
- # { platform:iOS Simulator, id:1685B071-AFB2-4DC1-BE29-8370BA4A6EBD, OS:9.0, name:iPhone 5 }
76
- # { platform:iOS Simulator, id:A141F23B-96B3-491A-8949-813B376C28A7, OS:9.0, name:iPhone 5 }
77
- #
78
- simulators = FastlaneCore::DeviceManager.simulators
79
- # Sort devices with matching names by OS version, largest first, so that we can
80
- # pick the device with the newest OS in case an exact OS match is not available
81
- name_matches = simulators.find_all { |sim| sim.name.strip == device_name.strip }
82
- .sort_by { |sim| Gem::Version.new(sim.os_version) }
83
- .reverse
84
- name_matches.find { |sim| sim.os_version == os_version } || name_matches.first
85
- end
86
-
87
- def device_udid(device_name, os_version = Snapshot.config[:ios_version])
88
- device = find_device(device_name, os_version)
89
-
90
- device ? device.udid : nil
91
- end
92
-
93
- def destination(device_name)
30
+ def destination(devices)
31
+ unless verify_devices_share_os(devices)
32
+ UI.user_error!('All devices provided to snapshot should run the same operating system')
33
+ end
94
34
  # on Mac we will always run on host machine, so should specify only platform
95
- return ["-destination 'platform=macOS'"] if device_name =~ /^Mac/
35
+ return ["-destination 'platform=macOS'"] if devices.first.to_s =~ /^Mac/
36
+
37
+ os = devices.first.to_s =~ /^Apple TV/ ? "tvOS" : "iOS"
96
38
 
97
- os = device_name =~ /^Apple TV/ ? "tvOS" : "iOS"
98
39
  os_version = Snapshot.config[:ios_version] || Snapshot::LatestOsVersion.version(os)
99
40
 
100
- device = find_device(device_name, os_version)
101
- if device.nil?
102
- UI.user_error!("No device found named '#{device_name}' for version '#{os_version}'")
103
- return
104
- elsif device.os_version != os_version
105
- UI.important("Using device named '#{device_name}' with version '#{device.os_version}' because no match was found for version '#{os_version}'")
41
+ destinations = devices.map do |d|
42
+ device = find_device(d, os_version)
43
+ UI.user_error!("No device found named '#{d}' for version '#{os_version}'") if device.nil?
44
+ "-destination 'platform=#{os} Simulator,name=#{device.name},OS=#{os_version}'"
106
45
  end
107
- value = "platform=#{os} Simulator,id=#{device.udid},OS=#{os_version}"
108
46
 
109
- return ["-destination '#{value}'"]
47
+ return [destinations.join(' ')]
110
48
  end
111
49
 
112
- def xcodebuild_log_path(device_type: nil, language: nil, locale: nil)
113
- name_components = [Snapshot.project.app_name, Snapshot.config[:scheme]]
114
-
115
- if Snapshot.config[:namespace_log_files]
116
- name_components << device_type if device_type
117
- name_components << language if language
118
- name_components << locale if locale
50
+ def verify_devices_share_os(devices)
51
+ # Check each device to see if it is an iOS device
52
+ all_ios = devices.map do |device|
53
+ device = device.downcase
54
+ device.start_with?('iphone', 'ipad')
119
55
  end
120
-
121
- file_name = "#{name_components.join('-')}.log"
122
-
123
- containing = File.expand_path(Snapshot.config[:buildlog_path])
124
- FileUtils.mkdir_p(containing)
125
-
126
- return File.join(containing, file_name)
127
- end
128
-
129
- def derived_data_path
130
- Snapshot.cache[:derived_data_path] ||= (Snapshot.config[:derived_data_path] || Dir.mktmpdir("snapshot_derived"))
56
+ # Return true if all devices are iOS devices
57
+ return true unless all_ios.include?(false)
58
+ # There should only be more than 1 device type if
59
+ # it is iOS, therefore, if there is more than 1
60
+ # device in the array, and they are not all iOS
61
+ # as checked above, that would imply that this is a mixed bag
62
+ return devices.count == 1
131
63
  end
132
64
  end
133
65
  end
@@ -0,0 +1,94 @@
1
+ module Snapshot
2
+ class TestCommandGeneratorBase
3
+ class << self
4
+ def prefix
5
+ ["set -o pipefail &&"]
6
+ end
7
+
8
+ # Path to the project or workspace as parameter
9
+ # This will also include the scheme (if given)
10
+ # @return [Array] The array with all the components to join
11
+ def project_path_array
12
+ proj = Snapshot.project.xcodebuild_parameters
13
+ return proj if proj.count > 0
14
+ UI.user_error!("No project/workspace found")
15
+ end
16
+
17
+ def options
18
+ config = Snapshot.config
19
+ options = []
20
+ options += project_path_array
21
+ options << "-sdk '#{config[:sdk]}'" if config[:sdk]
22
+ options << "-derivedDataPath '#{derived_data_path}'"
23
+ options << config[:xcargs] if config[:xcargs]
24
+ return options
25
+ end
26
+
27
+ def build_settings
28
+ config = Snapshot.config
29
+
30
+ build_settings = []
31
+ build_settings << "FASTLANE_SNAPSHOT=YES"
32
+ build_settings << "TEST_TARGET_NAME=#{config[:test_target_name].shellescape}" if config[:test_target_name]
33
+
34
+ return build_settings
35
+ end
36
+
37
+ def actions
38
+ actions = []
39
+ actions << :clean if Snapshot.config[:clean]
40
+ actions << :build # https://github.com/fastlane/snapshot/issues/246
41
+ actions << :test
42
+
43
+ return actions
44
+ end
45
+
46
+ def suffix
47
+ return []
48
+ end
49
+
50
+ def find_device(device_name, os_version = Snapshot.config[:ios_version])
51
+ # We might get this error message
52
+ # > The requested device could not be found because multiple devices matched the request.
53
+ #
54
+ # This happens when you have multiple simulators for a given device type / iOS combination
55
+ # { platform:iOS Simulator, id:1685B071-AFB2-4DC1-BE29-8370BA4A6EBD, OS:9.0, name:iPhone 5 }
56
+ # { platform:iOS Simulator, id:A141F23B-96B3-491A-8949-813B376C28A7, OS:9.0, name:iPhone 5 }
57
+ #
58
+ simulators = FastlaneCore::DeviceManager.simulators
59
+ # Sort devices with matching names by OS version, largest first, so that we can
60
+ # pick the device with the newest OS in case an exact OS match is not available
61
+ name_matches = simulators.find_all { |sim| sim.name.strip == device_name.strip }
62
+ .sort_by { |sim| Gem::Version.new(sim.os_version) }
63
+ .reverse
64
+ return name_matches.find { |sim| sim.os_version == os_version } || name_matches.first
65
+ end
66
+
67
+ def device_udid(device_name, os_version = Snapshot.config[:ios_version])
68
+ device = find_device(device_name, os_version)
69
+
70
+ return device ? device.udid : nil
71
+ end
72
+
73
+ def derived_data_path
74
+ Snapshot.cache[:derived_data_path] ||= (Snapshot.config[:derived_data_path] || Dir.mktmpdir("snapshot_derived"))
75
+ end
76
+
77
+ def initialize
78
+ not_implemented(__method__)
79
+ end
80
+
81
+ def pipe(device_type, language, locale)
82
+ not_implemented(__method__)
83
+ end
84
+
85
+ def destination(device_name)
86
+ not_implemented(__method__)
87
+ end
88
+
89
+ def xcodebuild_log_path(device_type: nil, language: nil, locale: nil)
90
+ not_implemented(__method__)
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,65 @@
1
+ require 'snapshot/test_command_generator_base'
2
+
3
+ module Snapshot
4
+ # Responsible for building the fully working xcodebuild command
5
+ # This TestCommandGenerator supports Xcode 8's `xcodebuild` requirements
6
+ # It is its own object, as the logic differs for how we want to handle
7
+ # creating `xcodebuild` commands for Xcode 9 (see test_command_generator.rb)
8
+ class TestCommandGeneratorXcode8 < TestCommandGeneratorBase
9
+ class << self
10
+ def generate(device_type: nil, language: nil, locale: nil)
11
+ parts = prefix
12
+ parts << "xcodebuild"
13
+ parts += options
14
+ parts += destination(device_type)
15
+ parts += build_settings
16
+ parts += actions
17
+ parts += suffix
18
+ parts += pipe(device_type, language, locale)
19
+
20
+ return parts
21
+ end
22
+
23
+ def pipe(device_type, language, locale)
24
+ log_path = xcodebuild_log_path(device_type: device_type, language: language, locale: locale)
25
+ return ["| tee #{log_path.shellescape} | xcpretty #{Snapshot.config[:xcpretty_args]}"]
26
+ end
27
+
28
+ def destination(device_name)
29
+ # on Mac we will always run on host machine, so should specify only platform
30
+ return ["-destination 'platform=macOS'"] if device_name =~ /^Mac/
31
+
32
+ # if device_name is nil, use the config and get all devices
33
+ os = device_name =~ /^Apple TV/ ? "tvOS" : "iOS"
34
+ os_version = Snapshot.config[:ios_version] || Snapshot::LatestOsVersion.version(os)
35
+
36
+ device = find_device(device_name, os_version)
37
+ if device.nil?
38
+ UI.user_error!("No device found named '#{device_name}' for version '#{os_version}'")
39
+ elsif device.os_version != os_version
40
+ UI.important("Using device named '#{device_name}' with version '#{device.os_version}' because no match was found for version '#{os_version}'")
41
+ end
42
+ value = "platform=#{os} Simulator,id=#{device.udid},OS=#{os_version}"
43
+
44
+ return ["-destination '#{value}'"]
45
+ end
46
+
47
+ def xcodebuild_log_path(device_type: nil, language: nil, locale: nil)
48
+ name_components = [Snapshot.project.app_name, Snapshot.config[:scheme]]
49
+
50
+ if Snapshot.config[:namespace_log_files]
51
+ name_components << device_type if device_type
52
+ name_components << language if language
53
+ name_components << locale if locale
54
+ end
55
+
56
+ file_name = "#{name_components.join('-')}.log"
57
+
58
+ containing = File.expand_path(Snapshot.config[:buildlog_path])
59
+ FileUtils.mkdir_p(containing)
60
+
61
+ return File.join(containing, file_name)
62
+ end
63
+ end
64
+ end
65
+ end
@@ -3,11 +3,12 @@ module Snapshot
3
3
  class Update
4
4
  # @return [Array] A list of helper files (usually just one)
5
5
  def self.find_helper
6
- Dir["./**/SnapshotHelper.swift"]
6
+ Dir["./**/SnapshotHelper.swift"] + Dir["./**/SnapshotHelperXcode8.swift"]
7
7
  end
8
8
 
9
9
  def update
10
10
  paths = self.class.find_helper
11
+ UI.user_error!("Couldn't find any SnapshotHelper files in current directory") if paths.count == 0
11
12
 
12
13
  UI.message "Found the following SnapshotHelper:"
13
14
  paths.each { |p| UI.message "\t#{p}" }
@@ -20,7 +21,8 @@ module Snapshot
20
21
 
21
22
  paths.each do |path|
22
23
  UI.message "Updating '#{path}'..."
23
- File.write(path, File.read("#{Snapshot::ROOT}/lib/assets/SnapshotHelper.swift"))
24
+ input_path = Snapshot::Runner.path_to_helper_file_from_gem
25
+ File.write(path, File.read(input_path))
24
26
  end
25
27
 
26
28
  UI.success "Successfully updated helper files"
@@ -316,9 +316,12 @@ module Spaceship
316
316
  # profiles matching the bundle identifier
317
317
  # Returns [] if no profiles were found
318
318
  # This may also contain invalid or expired profiles
319
- def find_by_bundle_id(bundle_id, mac: false)
319
+ def find_by_bundle_id(bundle_id: nil, mac: false, sub_platform: nil)
320
+ raise "Missing required parameter 'bundle_id'" if bundle_id.to_s.empty?
321
+ raise "Invalid sub_platform #{sub_platform}, valid values are tvOS" if !sub_platform.nil? and sub_platform != 'tvOS'
322
+ find_tvos_profiles = sub_platform == 'tvOS'
320
323
  all(mac: mac).find_all do |profile|
321
- profile.app.bundle_id == bundle_id
324
+ profile.app.bundle_id == bundle_id && profile.tvos? == find_tvos_profiles
322
325
  end
323
326
  end
324
327
  end
@@ -112,6 +112,14 @@ module Spaceship::TestFlight
112
112
  handle_response(response)
113
113
  end
114
114
 
115
+ def search_for_tester_in_app(app_id: nil, text: nil)
116
+ assert_required_params(__method__, binding)
117
+ text = CGI.escape(text)
118
+ url = "providers/#{team_id}/apps/#{app_id}/testers?order=asc&search=#{text}&sort=status"
119
+ response = request(:get, url)
120
+ handle_response(response)
121
+ end
122
+
115
123
  def resend_invite_to_external_tester(app_id: nil, tester_id: nil)
116
124
  assert_required_params(__method__, binding)
117
125
  url = "/testflight/v1/invites/#{app_id}/resend?testerId=#{tester_id}"
@@ -20,11 +20,27 @@ module Spaceship::TestFlight
20
20
  client.testers_for_app(app_id: app_id).map { |data| self.new(data) }
21
21
  end
22
22
 
23
- # @return (Spaceship::TestFlight::Tester) Returns the tester matching the parameter
24
- # as either the Tester id or email
25
- # @param email (String) (required): Value used to filter the tester, case insensitive
23
+ # *DEPRECATED: Use `Spaceship::TestFlight::Tester.search` method instead*
26
24
  def self.find(app_id: nil, email: nil)
27
- self.all(app_id: app_id).find { |tester| tester.email == email }
25
+ testers = self.search(app_id: app_id, text: email, is_email_exact_match: true)
26
+ return testers.first
27
+ end
28
+
29
+ # @return (Spaceship::TestFlight::Tester) Returns the testers matching the parameter.
30
+ # ITC searchs all fields, and is full text. The search results are the union of all words in the search text
31
+ # @param text (String) (required): Value used to filter the tester, case insensitive
32
+ def self.search(app_id: nil, text: nil, is_email_exact_match: false)
33
+ text = text.strip
34
+ testers_matching_text = client.search_for_tester_in_app(app_id: app_id, text: text).map { |data| self.new(data) }
35
+ testers_matching_text ||= []
36
+ if is_email_exact_match
37
+ text = text.downcase
38
+ testers_matching_text = testers_matching_text.select do |tester|
39
+ tester.email.downcase == text
40
+ end
41
+ end
42
+
43
+ return testers_matching_text
28
44
  end
29
45
 
30
46
  def self.create_app_level_tester(app_id: nil, first_name: nil, last_name: nil, email: nil)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.54.0.beta.20170822010003
4
+ version: 2.54.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Felix Krause
@@ -1125,6 +1125,7 @@ files:
1125
1125
  - fastlane_core/lib/fastlane_core/provisioning_profile.rb
1126
1126
  - fastlane_core/lib/fastlane_core/string_filters.rb
1127
1127
  - fastlane_core/lib/fastlane_core/swag.rb
1128
+ - fastlane_core/lib/fastlane_core/test_parser.rb
1128
1129
  - fastlane_core/lib/fastlane_core/tool_collector.rb
1129
1130
  - fastlane_core/lib/fastlane_core/ui/disable_colors.rb
1130
1131
  - fastlane_core/lib/fastlane_core/ui/errors/fastlane_common_error.rb
@@ -1277,6 +1278,7 @@ files:
1277
1278
  - snapshot/README.md
1278
1279
  - snapshot/lib/assets/SnapfileTemplate
1279
1280
  - snapshot/lib/assets/SnapshotHelper.swift
1281
+ - snapshot/lib/assets/SnapshotHelperXcode8.swift
1280
1282
  - snapshot/lib/snapshot.rb
1281
1283
  - snapshot/lib/snapshot/collector.rb
1282
1284
  - snapshot/lib/snapshot/commands_generator.rb
@@ -1295,7 +1297,13 @@ files:
1295
1297
  - snapshot/lib/snapshot/screenshot_flatten.rb
1296
1298
  - snapshot/lib/snapshot/screenshot_rotate.rb
1297
1299
  - snapshot/lib/snapshot/setup.rb
1300
+ - snapshot/lib/snapshot/simulator_launchers/launcher_configuration.rb
1301
+ - snapshot/lib/snapshot/simulator_launchers/simulator_launcher.rb
1302
+ - snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb
1303
+ - snapshot/lib/snapshot/simulator_launchers/simulator_launcher_xcode_8.rb
1298
1304
  - snapshot/lib/snapshot/test_command_generator.rb
1305
+ - snapshot/lib/snapshot/test_command_generator_base.rb
1306
+ - snapshot/lib/snapshot/test_command_generator_xcode_8.rb
1299
1307
  - snapshot/lib/snapshot/update.rb
1300
1308
  - spaceship/README.md
1301
1309
  - spaceship/lib/assets/languageMapping.json
@@ -1407,24 +1415,24 @@ metadata:
1407
1415
  post_install_message:
1408
1416
  rdoc_options: []
1409
1417
  require_paths:
1410
- - spaceship/lib
1411
- - scan/lib
1412
- - sigh/lib
1413
- - snapshot/lib
1414
- - screengrab/lib
1415
- - fastlane/lib
1416
1418
  - cert/lib
1417
- - pem/lib
1418
- - gym/lib
1419
- - produce/lib
1419
+ - credentials_manager/lib
1420
1420
  - deliver/lib
1421
- - supply/lib
1422
- - match/lib
1421
+ - fastlane/lib
1422
+ - fastlane_core/lib
1423
1423
  - frameit/lib
1424
- - credentials_manager/lib
1424
+ - gym/lib
1425
+ - match/lib
1426
+ - pem/lib
1425
1427
  - pilot/lib
1426
1428
  - precheck/lib
1427
- - fastlane_core/lib
1429
+ - produce/lib
1430
+ - scan/lib
1431
+ - screengrab/lib
1432
+ - sigh/lib
1433
+ - snapshot/lib
1434
+ - spaceship/lib
1435
+ - supply/lib
1428
1436
  required_ruby_version: !ruby/object:Gem::Requirement
1429
1437
  requirements:
1430
1438
  - - ">="
@@ -1432,14 +1440,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
1432
1440
  version: 2.0.0
1433
1441
  required_rubygems_version: !ruby/object:Gem::Requirement
1434
1442
  requirements:
1435
- - - ">"
1443
+ - - ">="
1436
1444
  - !ruby/object:Gem::Version
1437
- version: 1.3.1
1445
+ version: '0'
1438
1446
  requirements: []
1439
1447
  rubyforge_project:
1440
- rubygems_version: 2.4.5.1
1448
+ rubygems_version: 2.5.2
1441
1449
  signing_key:
1442
1450
  specification_version: 4
1443
1451
  summary: The easiest way to automate beta deployments and releases for your iOS and
1444
1452
  Android apps
1445
1453
  test_files: []
1454
+ has_rdoc: