fastlane 1.59.0 → 1.60.0

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
  SHA1:
3
- metadata.gz: 7acb651b99d94230e6795a8cc1464c058d76723f
4
- data.tar.gz: a84369d44f2ad07524e83e67b333886603c81cba
3
+ metadata.gz: a1338c5055a5be98c13f9ac2339fc8af01cc4618
4
+ data.tar.gz: 27953fcef98fff5cb1f1f8cf2eee2661869a5668
5
5
  SHA512:
6
- metadata.gz: bda64f711bed402357ff4077adb348d9ef7fb66a864578fbc76730151841a351cf6cda1906d116eae11ae10bb338187a6dbe47b9be3b5a26872f25b35f8fe28c
7
- data.tar.gz: 3dde5ef54740b221f7498cb1e55d8590560df96b2a86a25daff0ee17e6b2ca91a131a7cfb047838248124b65e414a645c954236b0bef93681cac69dbdd11e57b
6
+ metadata.gz: 325bf47a78344790a47d9bb191c771f0d4d01682f9383529862cf4272878bca0f77a81679619a04e96f4be0deaa7ca322cbc2f2b52b963e46b9c82972b5608b0
7
+ data.tar.gz: 94d735495e67d72454fef23fb03a09a01146f19927673531075c1d8513cf37ccf8e0d1a8de18735f8e1f5daef059564ac35cfce2dd0b9829cce92bb89172dc64
@@ -0,0 +1,65 @@
1
+ module Fastlane
2
+ module Actions
3
+ module SharedValues
4
+ end
5
+
6
+ class AdbAction < Action
7
+ def self.run(params)
8
+ adb = Helper::AdbHelper.new(adb_path: params[:adb_path])
9
+ result = adb.trigger(command: params[:command], serial: params[:serial])
10
+ return result
11
+ end
12
+
13
+ #####################################################
14
+ # @!group Documentation
15
+ #####################################################
16
+
17
+ def self.description
18
+ "Run ADB Actions"
19
+ end
20
+
21
+ def self.details
22
+ [
23
+ "see adb --help for more details"
24
+ ].join("\n")
25
+ end
26
+
27
+ def self.available_options
28
+ [
29
+ FastlaneCore::ConfigItem.new(key: :serial,
30
+ env_name: "FL_ANDROID_SERIAL",
31
+ description: "Android serial, which device should be used for this command",
32
+ is_string: true,
33
+ default_value: ""),
34
+ FastlaneCore::ConfigItem.new(key: :command,
35
+ env_name: "FL_ADB_COMMAND",
36
+ description: "All commands you want to pass to the adb command, e.g. `kill-server`",
37
+ optional: true,
38
+ is_string: true),
39
+ FastlaneCore::ConfigItem.new(key: :adb_path,
40
+ env_name: "FL_ADB_PATH",
41
+ optional: true,
42
+ description: "The path to your `adb` binary",
43
+ is_string: true,
44
+ default_value: "adb"
45
+ )
46
+ ]
47
+ end
48
+
49
+ def self.output
50
+ end
51
+
52
+ def self.return_value
53
+ "The output of the adb command"
54
+ end
55
+
56
+ def self.authors
57
+ ["hjanuschka"]
58
+ end
59
+
60
+ def self.is_supported?(platform)
61
+ platform == :android
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,55 @@
1
+ module Fastlane
2
+ module Actions
3
+ module SharedValues
4
+ end
5
+
6
+ class AdbDevicesAction < Action
7
+ def self.run(params)
8
+ adb = Helper::AdbHelper.new(adb_path: params[:adb_path])
9
+ result = adb.load_all_devices
10
+ return result
11
+ end
12
+
13
+ #####################################################
14
+ # @!group Documentation
15
+ #####################################################
16
+
17
+ def self.description
18
+ "Get an Array of Connected android device serials"
19
+ end
20
+
21
+ def self.details
22
+ [
23
+ "fetches device list via adb"
24
+ ].join("\n")
25
+ end
26
+
27
+ def self.available_options
28
+ [
29
+ FastlaneCore::ConfigItem.new(key: :adb_path,
30
+ env_name: "FL_ADB_PATH",
31
+ description: "The path to your `adb` binary",
32
+ is_string: true,
33
+ optional: true,
34
+ default_value: "adb"
35
+ )
36
+ ]
37
+ end
38
+
39
+ def self.output
40
+ end
41
+
42
+ def self.return_value
43
+ "Array of devices"
44
+ end
45
+
46
+ def self.authors
47
+ ["hjanuschka"]
48
+ end
49
+
50
+ def self.is_supported?(platform)
51
+ platform == :android
52
+ end
53
+ end
54
+ end
55
+ end
@@ -9,7 +9,9 @@ module Fastlane
9
9
  custom: params[:custom],
10
10
  no_badge: params[:no_badge],
11
11
  shield: params[:shield],
12
- alpha: params[:alpha]
12
+ alpha: params[:alpha],
13
+ shield_io_timeout: params[:shield_io_timeout],
14
+ glob: params[:glob]
13
15
  }
14
16
  Badge::Runner.new.run(params[:path], options)
15
17
  end
@@ -76,7 +78,20 @@ module Fastlane
76
78
  default_value: '.',
77
79
  verify_block: proc do |value|
78
80
  raise "path needs to be a valid directory".red if Dir[value].empty?
79
- end)
81
+ end),
82
+ FastlaneCore::ConfigItem.new(key: :shield_io_timeout,
83
+ env_name: "FL_BADGE_SHIELD_IO_TIMEOUT",
84
+ description: "Set custom duration for the timeout of the shield.io request in seconds",
85
+ optional: true,
86
+ is_string: false,
87
+ verify_block: proc do |value|
88
+ raise "shield_io_timeout needs to be an integer > 0".red if value.to_i < 1
89
+ end),
90
+ FastlaneCore::ConfigItem.new(key: :glob,
91
+ env_name: "FL_BADGE_GLOB",
92
+ description: "Glob pattern for finding image files",
93
+ optional: true,
94
+ is_string: true)
80
95
  ]
81
96
  end
82
97
 
@@ -85,7 +100,7 @@ module Fastlane
85
100
  end
86
101
 
87
102
  def self.is_supported?(platform)
88
- platform == :ios
103
+ [:ios, :mac, :android].include?(platform)
89
104
  end
90
105
  end
91
106
  end
@@ -34,16 +34,15 @@ module Fastlane
34
34
  FastlaneCore::ConfigItem.new(key: :destination,
35
35
  short_option: "-D",
36
36
  env_name: "FL_ERB_DST",
37
- description: "destination file",
37
+ description: "Destination file",
38
38
  optional: true,
39
39
  is_string: true
40
40
  ),
41
41
  FastlaneCore::ConfigItem.new(key: :placeholders,
42
42
  short_option: "-p",
43
- env_name: "FL_ERB_LOG",
44
- description: "Log Commands",
45
- optional: true,
46
- default_value: true,
43
+ env_name: "FL_ERB_PLACEHOLDERS",
44
+ description: "Placeholders given as a hash",
45
+ default_value: {},
47
46
  is_string: false,
48
47
  type: Hash
49
48
  )
@@ -11,7 +11,7 @@ module Fastlane
11
11
 
12
12
  gradle = Helper::GradleHelper.new(gradle_path: params[:gradle_path])
13
13
 
14
- result = gradle.trigger(task: task, flags: params[:flags])
14
+ result = gradle.trigger(task: task, flags: params[:flags], serial: params[:serial])
15
15
 
16
16
  return result unless task.start_with?("assemble")
17
17
 
@@ -51,6 +51,11 @@ module Fastlane
51
51
 
52
52
  def self.available_options
53
53
  [
54
+ FastlaneCore::ConfigItem.new(key: :serial,
55
+ env_name: "FL_ANDROID_SERIAL",
56
+ description: "Android serial, wich device should be used for this command",
57
+ is_string: true,
58
+ default_value: ""),
54
59
  FastlaneCore::ConfigItem.new(key: :task,
55
60
  env_name: "FL_GRADLE_TASK",
56
61
  description: "The gradle task you want to execute",
@@ -10,11 +10,11 @@ module Fastlane
10
10
  command += upload_options(params)
11
11
  command << upload_url(params)
12
12
 
13
- Fastlane::Actions.sh(command.join(' '), log: false)
13
+ Fastlane::Actions.sh(command.join(' '), log: params[:verbose])
14
14
  end
15
15
 
16
16
  def self.upload_url(params)
17
- "#{params[:endpoint].shellescape}/nexus/service/local/artifact/maven/content"
17
+ "#{params[:endpoint]}#{params[:mount_path]}/service/local/artifact/maven/content".shellescape
18
18
  end
19
19
 
20
20
  def self.verbose(params)
@@ -96,6 +96,11 @@ module Fastlane
96
96
  env_name: "FL_NEXUS_ENDPOINT",
97
97
  description: "Nexus endpoint e.g. http://nexus:8081",
98
98
  optional: false),
99
+ FastlaneCore::ConfigItem.new(key: :mount_path,
100
+ env_name: "FL_NEXUS_MOUNT_PATH",
101
+ description: "Nexus mount path. Defaults to /nexus",
102
+ default_value: "/nexus",
103
+ optional: true),
99
104
  FastlaneCore::ConfigItem.new(key: :username,
100
105
  env_name: "FL_NEXUS_USERNAME",
101
106
  description: "Nexus username",
@@ -74,6 +74,7 @@ module Fastlane
74
74
  FastlaneCore::ConfigItem.new(key: :team_id,
75
75
  env_name: "FASTLANE_TEAM_ID",
76
76
  description: "optional: Your team ID",
77
+ default_value: CredentialsManager::AppfileConfig.try_fetch_value(:team_id),
77
78
  optional: true),
78
79
  FastlaneCore::ConfigItem.new(key: :username,
79
80
  env_name: "DELIVER_USER",
@@ -0,0 +1,172 @@
1
+ module Fastlane
2
+ module Actions
3
+ class SetupJenkinsAction < Action
4
+ USED_ENV_NAMES = [
5
+ "BACKUP_XCARCHIVE_DESTINATION",
6
+ "DERIVED_DATA_PATH",
7
+ "GYM_BUILD_PATH",
8
+ "GYM_CODE_SIGNING_IDENTITY",
9
+ "GYM_DERIVED_DATA_PATH",
10
+ "GYM_OUTPUT_DIRECTORY",
11
+ "GYM_RESULT_BUNDLE",
12
+ "SCAN_DERIVED_DATA_PATH",
13
+ "SCAN_OUTPUT_DIRECTORY",
14
+ "SCAN_RESULT_BUNDLE",
15
+ "XCODE_DERIVED_DATA_PATH"
16
+ ].freeze
17
+
18
+ def self.run(params)
19
+ # Stop if not executed by CI
20
+ if !Helper.is_ci? && !params[:force]
21
+ UI.important "Not executed by Continuous Integration system."
22
+ return
23
+ end
24
+
25
+ # Print table
26
+ FastlaneCore::PrintTable.print_values(
27
+ config: params,
28
+ title: "Summary for Setup Jenkins Action"
29
+ )
30
+
31
+ # Keychain
32
+ if params[:unlock_keychain] && params[:keychain_path]
33
+ keychain_path = File.expand_path(params[:keychain_path])
34
+ UI.message "Unlocking keychain: \"#{keychain_path}\"."
35
+ Actions::UnlockKeychainAction.run(
36
+ path: keychain_path,
37
+ password: params[:keychain_password],
38
+ add_to_search_list: params[:add_keychain_to_search_list],
39
+ set_default: params[:set_default_keychain]
40
+ )
41
+ end
42
+
43
+ # Code signing identity
44
+ if params[:set_code_signing_identity] && params[:code_signing_identity]
45
+ code_signing_identity = params[:code_signing_identity]
46
+ UI.message "Set code signing identity: \"#{code_signing_identity}\"."
47
+ ENV['GYM_CODE_SIGNING_IDENTITY'] = code_signing_identity
48
+ end
49
+
50
+ # Set output directory
51
+ if params[:output_directory]
52
+ output_directory_path = File.expand_path(params[:output_directory])
53
+ UI.message "Set output directory path to: \"#{output_directory_path}\"."
54
+ ENV['GYM_BUILD_PATH'] = output_directory_path
55
+ ENV['GYM_OUTPUT_DIRECTORY'] = output_directory_path
56
+ ENV['SCAN_OUTPUT_DIRECTORY'] = output_directory_path
57
+ ENV['BACKUP_XCARCHIVE_DESTINATION'] = output_directory_path
58
+ end
59
+
60
+ # Set derived data
61
+ if params[:derived_data_path]
62
+ derived_data_path = File.expand_path(params[:derived_data_path])
63
+ UI.message "Set derived data path to: \"#{derived_data_path}\"."
64
+ ENV['DERIVED_DATA_PATH'] = derived_data_path # Used by clear_derived_data.
65
+ ENV['XCODE_DERIVED_DATA_PATH'] = derived_data_path
66
+ ENV['GYM_DERIVED_DATA_PATH'] = derived_data_path
67
+ ENV['SCAN_DERIVED_DATA_PATH'] = derived_data_path
68
+ end
69
+
70
+ # Set result bundle
71
+ if params[:result_bundle]
72
+ UI.message "Set result bundle."
73
+ ENV['GYM_RESULT_BUNDLE'] = "YES"
74
+ ENV['SCAN_RESULT_BUNDLE'] = "YES"
75
+ end
76
+ end
77
+
78
+ #####################################################
79
+ # @!group Documentation
80
+ #####################################################
81
+
82
+ def self.description
83
+ "Setup xcodebuild, gym and scan for easier Jenkins integration"
84
+ end
85
+
86
+ def self.details
87
+ [
88
+ "- Adds and unlocks keychains from Jenkins 'Keychains and Provisioning Profiles Plugin'",
89
+ "- Sets code signing identity from Jenkins 'Keychains and Provisioning Profiles Plugin'",
90
+ "- Sets output directory to './output' (gym, scan and backup_xcarchive).",
91
+ "- Sets derived data path to './derivedData' (xcodebuild, gym, scan and clear_derived_data).",
92
+ "- Produce result bundle (gym and scan)."
93
+ ].join("\n")
94
+ end
95
+
96
+ def self.available_options
97
+ [
98
+ # General
99
+ FastlaneCore::ConfigItem.new(key: :force,
100
+ env_name: "FL_SETUP_JENKINS_FORCE",
101
+ description: "Force setup, even if not executed by Jenkins",
102
+ is_string: false,
103
+ default_value: false),
104
+
105
+ # Keychain
106
+ FastlaneCore::ConfigItem.new(key: :unlock_keychain,
107
+ env_name: "FL_SETUP_JENKINS_UNLOCK_KEYCHAIN",
108
+ description: "Unlocks keychain",
109
+ is_string: false,
110
+ default_value: true),
111
+ FastlaneCore::ConfigItem.new(key: :add_keychain_to_search_list,
112
+ env_name: "FL_SETUP_JENKINS_ADD_KEYCHAIN_TO_SEARCH_LIST",
113
+ description: "Add to keychain search list",
114
+ is_string: false,
115
+ default_value: :replace),
116
+ FastlaneCore::ConfigItem.new(key: :set_default_keychain,
117
+ env_name: "FL_SETUP_JENKINS_SET_DEFAULT_KEYCHAIN",
118
+ description: "Set keychain as default",
119
+ is_string: false,
120
+ default_value: true),
121
+ FastlaneCore::ConfigItem.new(key: :keychain_path,
122
+ env_name: "KEYCHAIN_PATH",
123
+ description: "Path to keychain",
124
+ is_string: true,
125
+ optional: true),
126
+ FastlaneCore::ConfigItem.new(key: :keychain_password,
127
+ env_name: "KEYCHAIN_PASSWORD",
128
+ description: "Keychain password",
129
+ is_string: true,
130
+ default_value: ""),
131
+
132
+ # Code signing identity
133
+ FastlaneCore::ConfigItem.new(key: :set_code_signing_identity,
134
+ env_name: "FL_SETUP_JENKINS_SET_CODE_SIGNING_IDENTITY",
135
+ description: "Set code signing identity from CODE_SIGNING_IDENTITY environment",
136
+ is_string: false,
137
+ default_value: true),
138
+ FastlaneCore::ConfigItem.new(key: :code_signing_identity,
139
+ env_name: "CODE_SIGNING_IDENTITY",
140
+ description: "Code signing identity",
141
+ is_string: true,
142
+ optional: true),
143
+
144
+ # Xcode parameters
145
+ FastlaneCore::ConfigItem.new(key: :output_directory,
146
+ env_name: "FL_SETUP_JENKINS_OUTPUT_DIRECTORY",
147
+ description: "The directory in which the ipa file should be stored in",
148
+ is_string: true,
149
+ default_value: "./output"),
150
+ FastlaneCore::ConfigItem.new(key: :derived_data_path,
151
+ env_name: "FL_SETUP_JENKINS_DERIVED_DATA_PATH",
152
+ description: "The directory where build products and other derived data will go",
153
+ is_string: true,
154
+ default_value: "./derivedData"),
155
+ FastlaneCore::ConfigItem.new(key: :result_bundle,
156
+ env_name: "FL_SETUP_JENKINS_RESULT_BUNDLE",
157
+ description: "Produce the result bundle describing what occurred will be placed",
158
+ is_string: false,
159
+ default_value: true)
160
+ ]
161
+ end
162
+
163
+ def self.authors
164
+ ["bartoszj"]
165
+ end
166
+
167
+ def self.is_supported?(platform)
168
+ [:ios, :mac].include?(platform)
169
+ end
170
+ end
171
+ end
172
+ end
@@ -23,7 +23,9 @@ module Fastlane
23
23
  "spaceship",
24
24
  "pilot",
25
25
  "supply",
26
- "scan"
26
+ "scan",
27
+ "screengrab",
28
+ "match"
27
29
  ]
28
30
 
29
31
  def self.run(options)
@@ -70,6 +70,9 @@ module Fastlane
70
70
  project = ENV["XCODE_PROJECT"]
71
71
  buildlog_path = ENV["XCODE_BUILDLOG_PATH"]
72
72
 
73
+ # Set derived data path.
74
+ params[:derivedDataPath] ||= ENV["XCODE_DERIVED_DATA_PATH"]
75
+
73
76
  # Append slash to build path, if needed
74
77
  if build_path && !build_path.end_with?("/")
75
78
  build_path += "/"
@@ -0,0 +1,48 @@
1
+ module Fastlane
2
+ module Helper
3
+ class AdbDevice
4
+ attr_accessor :serial
5
+
6
+ def initialize(serial: nil)
7
+ self.serial = serial
8
+ end
9
+ end
10
+
11
+ class AdbHelper
12
+ # Path to the adb binary
13
+ attr_accessor :adb_path
14
+
15
+ # All available devices
16
+ attr_accessor :devices
17
+
18
+ def initialize(adb_path: nil)
19
+ self.adb_path = adb_path
20
+ end
21
+
22
+ # Run a certain action
23
+ def trigger(command: nil, serial: nil)
24
+ android_serial = serial != "" ? "ANDROID_SERIAL=#{serial}" : nil
25
+ command = [android_serial, adb_path, command].join(" ")
26
+ Action.sh(command)
27
+ end
28
+
29
+ def device_avalaible?(serial)
30
+ load_all_devices
31
+ return devices.map(&:serial).include?(serial)
32
+ end
33
+
34
+ def load_all_devices
35
+ self.devices = []
36
+
37
+ command = [adb_path, "devices"].join(" ")
38
+ output = Actions.sh(command, log: false)
39
+ output.split("\n").each do |line|
40
+ if (result = line.match(/(.*)\tdevice$/))
41
+ self.devices << AdbDevice.new(serial: result[1])
42
+ end
43
+ end
44
+ self.devices
45
+ end
46
+ end
47
+ end
48
+ end
@@ -23,10 +23,10 @@ module Fastlane
23
23
  end
24
24
 
25
25
  # Run a certain action
26
- def trigger(task: nil, flags: nil)
26
+ def trigger(task: nil, flags: nil, serial:nil)
27
27
  # raise "Could not find gradle task '#{task}' in the list of available tasks".red unless task_available?(task)
28
-
29
- command = [gradle_path, task, flags].join(" ")
28
+ android_serial = serial != "" ? "ANDROID_SERIAL=#{serial}" : nil
29
+ command = [android_serial, gradle_path, task, flags].join(" ")
30
30
  Action.sh(command)
31
31
  end
32
32
 
@@ -1,3 +1,3 @@
1
1
  module Fastlane
2
- VERSION = '1.59.0'
2
+ VERSION = '1.60.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.59.0
4
+ version: 1.60.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Felix Krause
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-11 00:00:00.000000000 Z
11
+ date: 2016-02-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: krausefx-shenzhen
@@ -134,7 +134,7 @@ dependencies:
134
134
  requirements:
135
135
  - - ">="
136
136
  - !ruby/object:Gem::Version
137
- version: 0.36.2
137
+ version: 0.36.5
138
138
  - - "<"
139
139
  - !ruby/object:Gem::Version
140
140
  version: 1.0.0
@@ -144,7 +144,7 @@ dependencies:
144
144
  requirements:
145
145
  - - ">="
146
146
  - !ruby/object:Gem::Version
147
- version: 0.36.2
147
+ version: 0.36.5
148
148
  - - "<"
149
149
  - !ruby/object:Gem::Version
150
150
  version: 1.0.0
@@ -194,7 +194,7 @@ dependencies:
194
194
  requirements:
195
195
  - - ">="
196
196
  - !ruby/object:Gem::Version
197
- version: 1.10.0
197
+ version: 1.10.1
198
198
  - - "<"
199
199
  - !ruby/object:Gem::Version
200
200
  version: 2.0.0
@@ -204,7 +204,7 @@ dependencies:
204
204
  requirements:
205
205
  - - ">="
206
206
  - !ruby/object:Gem::Version
207
- version: 1.10.0
207
+ version: 1.10.1
208
208
  - - "<"
209
209
  - !ruby/object:Gem::Version
210
210
  version: 2.0.0
@@ -334,7 +334,7 @@ dependencies:
334
334
  requirements:
335
335
  - - ">="
336
336
  - !ruby/object:Gem::Version
337
- version: 1.6.0
337
+ version: 1.6.1
338
338
  - - "<"
339
339
  - !ruby/object:Gem::Version
340
340
  version: 2.0.0
@@ -344,7 +344,7 @@ dependencies:
344
344
  requirements:
345
345
  - - ">="
346
346
  - !ruby/object:Gem::Version
347
- version: 1.6.0
347
+ version: 1.6.1
348
348
  - - "<"
349
349
  - !ruby/object:Gem::Version
350
350
  version: 2.0.0
@@ -614,6 +614,8 @@ files:
614
614
  - lib/fastlane/action_collector.rb
615
615
  - lib/fastlane/actions/README.md
616
616
  - lib/fastlane/actions/actions_helper.rb
617
+ - lib/fastlane/actions/adb.rb
618
+ - lib/fastlane/actions/adb_devices.rb
617
619
  - lib/fastlane/actions/add_git_tag.rb
618
620
  - lib/fastlane/actions/appaloosa.rb
619
621
  - lib/fastlane/actions/appetize.rb
@@ -724,6 +726,7 @@ files:
724
726
  - lib/fastlane/actions/set_changelog.rb
725
727
  - lib/fastlane/actions/set_github_release.rb
726
728
  - lib/fastlane/actions/set_info_plist_value.rb
729
+ - lib/fastlane/actions/setup_jenkins.rb
727
730
  - lib/fastlane/actions/sigh.rb
728
731
  - lib/fastlane/actions/skip_docs.rb
729
732
  - lib/fastlane/actions/slack.rb
@@ -770,6 +773,7 @@ files:
770
773
  - lib/fastlane/fast_file.rb
771
774
  - lib/fastlane/fastlane_folder.rb
772
775
  - lib/fastlane/helper/README.md
776
+ - lib/fastlane/helper/adb_helper.rb
773
777
  - lib/fastlane/helper/crashlytics_helper.rb
774
778
  - lib/fastlane/helper/gem_helper.rb
775
779
  - lib/fastlane/helper/git_helper.rb
@@ -808,7 +812,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
808
812
  version: '0'
809
813
  requirements: []
810
814
  rubyforge_project:
811
- rubygems_version: 2.4.5.1
815
+ rubygems_version: 2.2.2
812
816
  signing_key:
813
817
  specification_version: 4
814
818
  summary: Connect all iOS deployment tools into one streamlined workflow