fastlane-plugin-apperian 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1be9ef0603b008d48bbcf707f7efce8ec8302b5d
4
+ data.tar.gz: 705fdc53a30f314b4e7606df45ce5a6e018c46d5
5
+ SHA512:
6
+ metadata.gz: 6dae633c76aac30a70829e09788158037ed05fce50284f2d6bef2f03aa2b1704d435f8c39319b5a4ad594706cfb5b8d1205603a1850778ead0d7af01540b1921
7
+ data.tar.gz: 27e9e28ab6af951c7f8775c348a3830764bd428bb0b30a65309ca9364cfab32c397f45f0869060b07fca67208d967fb22198867d308e291c7494de3e2b53f451
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2016 tomiblank
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,52 @@
1
+ # apperian plugin
2
+
3
+ [![fastlane Plugin Badge](https://rawcdn.githack.com/fastlane/fastlane/master/fastlane/assets/plugin-badge.svg)](https://rubygems.org/gems/fastlane-plugin-apperian)
4
+
5
+ ## Getting Started
6
+
7
+ This project is a [fastlane](https://github.com/fastlane/fastlane) plugin. To get started with `fastlane-plugin-apperian`, add it to your project by running:
8
+
9
+ ```bash
10
+ fastlane add_plugin apperian
11
+ ```
12
+
13
+ ## About apperian
14
+
15
+ Allows to upload your app file to Apperian
16
+
17
+ **Note to author:** Add a more detailed description about this plugin here. If your plugin contains multiple actions, make sure to mention them here.
18
+
19
+ ## Example
20
+
21
+ Check out the [example `Fastfile`](fastlane/Fastfile) to see how to use this plugin. Try it by cloning the repo, running `fastlane install_plugins` and `bundle exec fastlane test`.
22
+
23
+ **Note to author:** Please set up a sample project to make it easy for users to explore what your plugin does. Provide everything that is necessary to try out the plugin in this project (including a sample Xcode/Android project if necessary)
24
+
25
+ ## Run tests for this plugin
26
+
27
+ To run both the tests, and code style validation, run
28
+
29
+ ```
30
+ rake
31
+ ```
32
+
33
+ To automatically fix many of the styling issues, use
34
+ ```
35
+ rubocop -a
36
+ ```
37
+
38
+ ## Issues and Feedback
39
+
40
+ For any other issues and feedback about this plugin, please submit it to this repository.
41
+
42
+ ## Troubleshooting
43
+
44
+ If you have trouble using plugins, check out the [Plugins Troubleshooting](https://github.com/fastlane/fastlane/blob/master/fastlane/docs/PluginsTroubleshooting.md) doc in the main `fastlane` repo.
45
+
46
+ ## Using `fastlane` Plugins
47
+
48
+ For more information about how the `fastlane` plugin system works, check out the [Plugins documentation](https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Plugins.md).
49
+
50
+ ## About `fastlane`
51
+
52
+ `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).
@@ -0,0 +1,16 @@
1
+ require 'fastlane/plugin/apperian/version'
2
+
3
+ module Fastlane
4
+ module Apperian
5
+ # Return all .rb files inside the "actions" and "helper" directory
6
+ def self.all_classes
7
+ Dir[File.expand_path('**/{actions,helper}/*.rb', File.dirname(__FILE__))]
8
+ end
9
+ end
10
+ end
11
+
12
+ # By default we want to import all available actions and helpers
13
+ # A plugin can contain any number of actions and plugins
14
+ Fastlane::Apperian.all_classes.each do |current|
15
+ require current
16
+ end
@@ -0,0 +1,408 @@
1
+ module Fastlane
2
+ module Actions
3
+ class ApperianAction < Action
4
+ $is_debug = false
5
+
6
+ def self.run(params)
7
+ # check if debug is enabled
8
+ $is_debug = params[:debug]
9
+
10
+ if debug
11
+ UI.message("---------------------------------")
12
+ UI.message("Apperian plugin debug information")
13
+ UI.message("---------------------------------")
14
+ UI.message(" api_url: #{params[:api_url]}")
15
+ UI.message(" email: #{params[:email]}")
16
+ UI.message(" password: #{params[:password]}")
17
+ UI.message(" app_identifier: #{params[:app_identifier]}")
18
+ UI.message(" ipa: #{params[:ipa]}")
19
+ UI.message(" app_name: #{params[:app_name]}")
20
+ UI.message(" author: #{params[:author]}")
21
+ UI.message(" short_description: #{params[:short_description]}")
22
+ UI.message(" long_description: #{params[:long_description]}")
23
+ UI.message(" version: #{params[:version]}")
24
+ UI.message(" version_notes: #{params[:version_notes]}")
25
+ UI.message("---------------------------------")
26
+ end
27
+
28
+ api_url = params[:api_url]
29
+ email = params[:email]
30
+ password = params[:password]
31
+ app_identifier = params[:app_identifier]
32
+ ipa = params[:ipa]
33
+ app_name = params[:app_name]
34
+ author = params[:author]
35
+ short_description = params[:short_description]
36
+ long_description = params[:long_description]
37
+ version = params[:version]
38
+ version_notes = params[:version_notes]
39
+
40
+ # step 1: authenticate
41
+ UI.message("1. Authenticate")
42
+ token = authenticate(api_url, email, password)
43
+
44
+ # step 2: find app
45
+ UI.message("2. Find app")
46
+ appID = find_app(api_url, app_identifier, token)
47
+ if debug
48
+ UI.message("Found app:")
49
+ UI.message(appID)
50
+ end
51
+
52
+ # step 3: create or update app
53
+ transactionID = ""
54
+ fileUploadURL = ""
55
+
56
+ if appID == "" then
57
+ # step 3a: create app
58
+ UI.message("3a. Create app")
59
+ result = create_app(api_url, token) # return array [0] = transactionID, [1] = fileUploadURL
60
+ transactionID = result[0]
61
+ fileUploadURL = result[1]
62
+ else
63
+ # step 3b: update app
64
+ UI.message("3b. Update app")
65
+ result = update_app(api_url, appID, token) # return array [0] = transactionID, [1] = fileUploadURL
66
+ transactionID = result[0]
67
+ fileUploadURL = result[1]
68
+ end
69
+
70
+ # step 4: upload file
71
+ UI.message("4. Upload file")
72
+ fileID = upload_file(fileUploadURL, ipa)
73
+
74
+ # step 5: publish app
75
+ UI.message("5. Publish app")
76
+ result = publish_app(api_url, fileID, token, transactionID, app_name, author, short_description, long_description, version, version_notes)
77
+
78
+ end
79
+
80
+
81
+ def self.authenticate(api_url, email, password)
82
+ require 'rest-client'
83
+ require 'json'
84
+
85
+ body = {
86
+ "id" => 1,
87
+ "apiVersion" => "1.0",
88
+ "jsonrpc" => "2.0",
89
+ "method" => "com.apperian.eas.user.authenticateuser",
90
+ "params" => {
91
+ "email" => email,
92
+ "password" => password
93
+ }
94
+ }
95
+
96
+ response = RestClient.post(api_url, body.to_json, {content_type: :json, accept: :json})
97
+
98
+ if debug
99
+ UI.message(response.code)
100
+ UI.message(response.body)
101
+ end
102
+
103
+ json = JSON.parse(response.body)
104
+ token = json["result"]["token"]
105
+ return token
106
+ end
107
+
108
+ def self.find_app(api_url, app_identifier, token)
109
+ # get the list of apps
110
+ data = list_apps(api_url, token)
111
+ result = ""
112
+
113
+ data['result']['applications'].each do |app|
114
+ if app['bundleId'] == app_identifier
115
+ result = app['ID']
116
+ break
117
+ end
118
+ end
119
+
120
+ return result
121
+ end
122
+
123
+ def self.list_apps(api_url, token)
124
+ require 'rest-client'
125
+ require 'json'
126
+
127
+ body = {
128
+ "id" => 1,
129
+ "apiVersion" => "1.0",
130
+ "jsonrpc" => "2.0",
131
+ "method" => "com.apperian.eas.apps.getlist",
132
+ "params" => {
133
+ "token" => token
134
+ }
135
+ }
136
+
137
+ response = RestClient.post(api_url, body.to_json, {content_type: :json, accept: :json})
138
+
139
+ if debug
140
+ UI.message(response.code)
141
+ UI.message(response.body)
142
+ end
143
+
144
+ json = JSON.parse(response.body)
145
+ return json
146
+ end
147
+
148
+ def self.create_app(api_url, token)
149
+ require 'rest-client'
150
+ require 'json'
151
+
152
+ body = {
153
+ "id" => 1,
154
+ "apiVersion" => "1.0",
155
+ "jsonrpc" => "2.0",
156
+ "method" => "com.apperian.eas.apps.create",
157
+ "params" => {
158
+ "token" => token
159
+ }
160
+ }
161
+
162
+ response = RestClient.post(api_url, body.to_json, {content_type: :json, accept: :json})
163
+
164
+ if debug
165
+ UI.message(response.code)
166
+ UI.message(response.body)
167
+ end
168
+
169
+ json = JSON.parse(response.body)
170
+ transactionID = json["result"]["transactionID"]
171
+ fileUploadURL = json["result"]["fileUploadURL"]
172
+ return transactionID, fileUploadURL
173
+ end
174
+
175
+ def self.update_app(api_url, appID, token)
176
+ require 'rest-client'
177
+ require 'json'
178
+
179
+ body = {
180
+ "id" => 1,
181
+ "apiVersion" => "1.0",
182
+ "jsonrpc" => "2.0",
183
+ "method" => "com.apperian.eas.apps.update",
184
+ "params" => {
185
+ "appID" => appID,
186
+ "token" => token
187
+ }
188
+ }
189
+
190
+ response = RestClient.post(api_url, body.to_json, {content_type: :json, accept: :json})
191
+
192
+ if debug
193
+ UI.message(response.code)
194
+ UI.message(response.body)
195
+ end
196
+
197
+ json = JSON.parse(response.body)
198
+ transactionID = json["result"]["transactionID"]
199
+ fileUploadURL = json["result"]["fileUploadURL"]
200
+ return transactionID, fileUploadURL
201
+ end
202
+
203
+ def self.publish_app(api_url, fileID, token, transactionID, app_name, author, short_description, long_description, version, version_notes)
204
+ require 'rest-client'
205
+ require 'json'
206
+
207
+ body = {
208
+ "id" => 1,
209
+ "apiVersion" => "1.0",
210
+ "jsonrpc" => "2.0",
211
+ "method" => "com.apperian.eas.apps.publish",
212
+ "params" => {
213
+ "EASEmetadata" => {
214
+ "author" => author,
215
+ "name" => app_name,
216
+ "shortdescription" => short_description,
217
+ "longdescription" => long_description,
218
+ "version" => version,
219
+ "versionNotes" => version_notes
220
+ },
221
+ "files" => {
222
+ "application" => fileID
223
+ },
224
+ "token" => token,
225
+ "transactionID" => transactionID
226
+ }
227
+ }
228
+
229
+ response = RestClient.post(api_url, body.to_json, {content_type: :json, accept: :json})
230
+
231
+ if debug
232
+ UI.message(response.code)
233
+ UI.message(response.body)
234
+ end
235
+
236
+ json = JSON.parse(response.body)
237
+ status = json["result"]["status"]
238
+ appID = json["result"]["appID"]
239
+ return status, appID
240
+ end
241
+
242
+ def self.upload_file(upload_url, file_path)
243
+ require 'rest-client'
244
+ require 'json'
245
+
246
+ response = RestClient.post upload_url, :LUuploadFile => File.new(file_path, 'rb')
247
+
248
+ if debug
249
+ UI.message(response.code)
250
+ UI.message(response.body)
251
+ end
252
+
253
+ json = JSON.parse(response.body)
254
+ fileID = json["fileID"]
255
+ return fileID
256
+
257
+ end
258
+
259
+ def self.description
260
+ "Allows to upload your app file to Apperian"
261
+ end
262
+
263
+ def self.authors
264
+ ["Thomas Blank"]
265
+ end
266
+
267
+ def self.return_value
268
+ # If your method provides a return value, you can describe here what it does
269
+ end
270
+
271
+ def self.details
272
+ # Optional:
273
+ "Detailled description will follow soon"
274
+ end
275
+
276
+ def self.available_options
277
+ [
278
+ FastlaneCore::ConfigItem.new(key: :api_url,
279
+ env_name: "APPERIAN_API_URL",
280
+ description: "The API URL to the Apperian API host",
281
+ optional: false,
282
+ type: String,
283
+ verify_block: proc do |value|
284
+ UI.user_error!("No Apperian API URl given, check https://help.apperian.com/display/pub/Using+the+Publishing+API for options and pass using `api_url: 'https://easesvc.apperian.com/ease.interface.php'`") unless value and !value.empty?
285
+ end),
286
+
287
+ FastlaneCore::ConfigItem.new(key: :email,
288
+ env_name: "APPERIAN_EMAIL",
289
+ description: "Your email address to authenticate yourself with the Apperian API host",
290
+ optional: false,
291
+ type: String,
292
+ verify_block: proc do |value|
293
+ UI.user_error!("No email for Apperian authentication given, pass using `email: 'me@example.com'`") unless value and !value.empty?
294
+ end),
295
+
296
+ FastlaneCore::ConfigItem.new(key: :password,
297
+ env_name: "APPERIAN_PASSWORD",
298
+ description: "Your password to authenticate yourself with the Apperian API host",
299
+ optional: false,
300
+ type: String,
301
+ verify_block: proc do |value|
302
+ UI.user_error!("No password for Apperian authentication given, pass using `password: 'secret'`") unless value and !value.empty?
303
+ end),
304
+
305
+ FastlaneCore::ConfigItem.new(key: :app_identifier,
306
+ env_name: "APPERIAN_APP_IDENTIFIER",
307
+ description: "The identifier of your app",
308
+ optional: false,
309
+ type: String,
310
+ verify_block: proc do |value|
311
+ UI.user_error!("No app identifier given, pass using `app_identifier: 'com.example.app'`") unless value and !value.empty?
312
+ end),
313
+
314
+ FastlaneCore::ConfigItem.new(key: :ipa,
315
+ env_name: "APPERIAN_IPA",
316
+ description: "The path to your IPA file",
317
+ optional: false,
318
+ type: String,
319
+ verify_block: proc do |value|
320
+ UI.user_error!("Could not find IPA file, pass using `ipa: '/path/to/file.ipa'`") unless File.exist?(value)
321
+ end),
322
+
323
+ FastlaneCore::ConfigItem.new(key: :app_name,
324
+ env_name: "APPERIAN_APP_NAME",
325
+ description: "The name of your app",
326
+ optional: false,
327
+ type: String,
328
+ verify_block: proc do |value|
329
+ UI.user_error!("No app name given, pass using `app_name: 'My sample app'`") unless value and !value.empty?
330
+ UI.user_error!("app_name: maximum characters allowed: 30") unless value.length <= 30
331
+ end),
332
+
333
+ FastlaneCore::ConfigItem.new(key: :author,
334
+ env_name: "APPERIAN_AUTHOR",
335
+ description: "Author of the app",
336
+ optional: false,
337
+ type: String,
338
+ verify_block: proc do |value|
339
+ UI.user_error!("No author given, pass using `author: 'Bob'`") unless value and !value.empty?
340
+ UI.user_error!("author: maximum characters allowed: 150") unless value.length <= 150
341
+ end),
342
+
343
+ FastlaneCore::ConfigItem.new(key: :short_description,
344
+ env_name: "APPERIAN_SHORT_DESCRIPTION",
345
+ description: "Short description",
346
+ optional: false,
347
+ type: String,
348
+ verify_block: proc do |value|
349
+ UI.user_error!("No short description given, pass using `short_description: 'This is what my app does'`") unless value and !value.empty?
350
+ UI.user_error!("short_description: maximum characters allowed: 100") unless value.length <= 100
351
+ end),
352
+
353
+ FastlaneCore::ConfigItem.new(key: :long_description,
354
+ env_name: "APPERIAN_LONG_DESCRIPTION",
355
+ description: "Long description",
356
+ optional: false,
357
+ type: String,
358
+ verify_block: proc do |value|
359
+ UI.user_error!("No long description given, pass using `long_description: 'Detailled description of my app'`") unless value and !value.empty?
360
+ UI.user_error!("long_description: maximum characters allowed: 10'000'") unless value.length <= 10000
361
+ end),
362
+
363
+ FastlaneCore::ConfigItem.new(key: :version,
364
+ env_name: "APPERIAN_VERSION",
365
+ description: "Version number",
366
+ optional: false,
367
+ type: String,
368
+ verify_block: proc do |value|
369
+ UI.user_error!("No version given, pass using `version: '1.0.2'`") unless value and !value.empty?
370
+ UI.user_error!("version: maximum characters allowed: 21") unless value.length <= 21
371
+ end),
372
+
373
+ FastlaneCore::ConfigItem.new(key: :version_notes,
374
+ env_name: "APPERIAN_VERSION_NOTES",
375
+ description: "Version notes",
376
+ optional: false,
377
+ type: String,
378
+ verify_block: proc do |value|
379
+ UI.user_error!("No version notes given, pass using `version_notes: 'New version available'`") unless value and !value.empty?
380
+ UI.user_error!("version_notes: maximum characters allowed: 1500") unless value.length <= 1500
381
+ end),
382
+
383
+ FastlaneCore::ConfigItem.new(key: :debug,
384
+ env_name: "APPERIAN_DEBUG",
385
+ description: "Debug flag, set to true to show extended output. default: false",
386
+ optional: true,
387
+ is_string: false,
388
+ default_value: false)
389
+
390
+ ]
391
+ end
392
+
393
+ def self.is_supported?(platform)
394
+ # Adjust this if your plugin only works for a particular platform (iOS vs. Android, for example)
395
+ # See: https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Platforms.md
396
+
397
+ [:ios].include?(platform)
398
+ end
399
+
400
+ # helpers
401
+
402
+ def self.debug
403
+ $is_debug
404
+ end
405
+
406
+ end
407
+ end
408
+ end
@@ -0,0 +1,12 @@
1
+ module Fastlane
2
+ module Helper
3
+ class ApperianHelper
4
+ # class methods that you define here become available in your action
5
+ # as `Helper::ApperianHelper.your_method`
6
+ #
7
+ def self.show_message
8
+ UI.message("Hello from the apperian plugin helper!")
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,5 @@
1
+ module Fastlane
2
+ module Apperian
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
metadata ADDED
@@ -0,0 +1,147 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fastlane-plugin-apperian
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Tomi Blank
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-11-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rest-client
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: pry
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
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
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
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: rubocop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: fastlane
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: 1.106.2
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: 1.106.2
111
+ description:
112
+ email: tomiblank@gmail.com
113
+ executables: []
114
+ extensions: []
115
+ extra_rdoc_files: []
116
+ files:
117
+ - LICENSE
118
+ - README.md
119
+ - lib/fastlane/plugin/apperian.rb
120
+ - lib/fastlane/plugin/apperian/actions/apperian_action.rb
121
+ - lib/fastlane/plugin/apperian/helper/apperian_helper.rb
122
+ - lib/fastlane/plugin/apperian/version.rb
123
+ homepage: https://github.com/tomiblank/fastlane-plugin-apperian
124
+ licenses:
125
+ - MIT
126
+ metadata: {}
127
+ post_install_message:
128
+ rdoc_options: []
129
+ require_paths:
130
+ - lib
131
+ required_ruby_version: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - ">="
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ required_rubygems_version: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - ">="
139
+ - !ruby/object:Gem::Version
140
+ version: '0'
141
+ requirements: []
142
+ rubyforge_project:
143
+ rubygems_version: 2.5.1
144
+ signing_key:
145
+ specification_version: 4
146
+ summary: Allows to upload your IPA file to Apperian
147
+ test_files: []