fastlane 2.52.0.beta.20170809010003 → 2.52.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: 84dfac521c24a7dc35841c4d194e9a31ae8db07a
4
- data.tar.gz: 1e6dc149c74e78056604e463a8c7868308e2857d
3
+ metadata.gz: c7f3c794df6dc0a5cd82ae0ed33a3cd555c58e02
4
+ data.tar.gz: bfc83e409c4b6daa53a5be411be8b9f645353c49
5
5
  SHA512:
6
- metadata.gz: 235a44f8ba3596df28e20a411e11f700c068d9b2f99cc63b4e75d5a5c096ff4484029198959ecdffcaabd976fc195e16a57178a9648c2857b32217f9915e1130
7
- data.tar.gz: 72e318606acf692f108481298541fb07c0d2a756b307a2994c686cfa3c99ab82f84c7ac86defca2088d5159787bbe5665eef22b6a17a6285c6a1c759ba73e9c8
6
+ metadata.gz: 5aa6e50c5bf45bb129d1e0978d46ffad40feef098efb8d01e1d986b19563ddff192e19544f91948ab83e841719b4323ae3eb97ae3d39fc17165677df27a89e58
7
+ data.tar.gz: 0bd5fe9a8a057d0bf66678614c74066f42a4e355a2c8361dace35878ae7dcac8760c70f810cfac31c21e71ee6680b095405d6cd43dbc304d632c886b8aee606d
Binary file
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
- VERSION = '2.52.0.beta.20170809010003'.freeze
2
+ VERSION = '2.52.0'.freeze
3
3
  DESCRIPTION = "The easiest way to automate beta deployments and releases for your iOS and Android apps".freeze
4
4
  MINIMUM_XCODE_RELEASE = "7.0".freeze
5
5
  end
data/produce/README.md CHANGED
@@ -61,6 +61,8 @@ Get in contact with the developers on Twitter: [@FastlaneTools](https://twitter.
61
61
  - **Modify** Application Services on the Apple Developer Portal
62
62
  - **Create** App Groups on the Apple Developer Portal
63
63
  - **Associate** apps with App Groups on the Apple Developer Portal
64
+ - **Create** Merchant Identifiers on the Apple Developer Portal
65
+ - **Associate** apps with Merchant Identifiers on the Apple Developer Portal
64
66
  - Support for **multiple Apple accounts**, storing your credentials securely in the Keychain
65
67
 
66
68
  ##### [Do you like fastlane? Be the first to know about updates and new fastlane tools](https://tinyletter.com/fastlane-tools)
@@ -78,15 +80,17 @@ Get in contact with the developers on Twitter: [@FastlaneTools](https://twitter.
78
80
  To get a list of all available parameters:
79
81
 
80
82
  fastlane produce --help
81
-
83
+
82
84
  ```
83
85
  Commands: (* default)
84
- associate_group Associate with a group, which is created if needed or simply located otherwise
85
- create * Creates a new app on iTunes Connect and the Apple Developer Portal
86
- disable_services Disable specific Application Services for a specific app on the Apple Developer Portal
87
- enable_services Enable specific Application Services for a specific app on the Apple Developer Portal
88
- group Ensure that a specific App Group exists
89
- help Display global or [command] help documentation
86
+ associate_group Associate with a group, which is created if needed or simply located otherwise
87
+ associate_merchant Associate with a merchant for use with Apple Pay. Apple Pay will be enabled for this app
88
+ create * Creates a new app on iTunes Connect and the Apple Developer Portal
89
+ disable_services Disable specific Application Services for a specific app on the Apple Developer Portal
90
+ enable_services Enable specific Application Services for a specific app on the Apple Developer Portal
91
+ group Ensure that a specific App Group exists
92
+ help Display global or [command] help documentation
93
+ merchant Ensure that a specific Merchant exists
90
94
 
91
95
  Global Options:
92
96
  --verbose
@@ -173,6 +177,37 @@ Get a list of all available options using
173
177
  --vpn-conf Disable VPN Configuration
174
178
  ```
175
179
 
180
+ ## Creating Apple Pay merchants and associating them with an App ID
181
+
182
+ If you want to create a new Apple Pay Merchant Identifier:
183
+
184
+ ```
185
+ fastlane produce merchant -o merchant.com.example.production -r "Example Merchant Production"
186
+ ```
187
+
188
+ Use `--help` for more information about all available parameters
189
+ ```
190
+ fastlane produce merchant --help
191
+ ```
192
+
193
+ If you want to associate an app with a Merchant Identifier:
194
+
195
+ ```
196
+ fastlane produce associate_merchant -a com.krausefx.app merchant.com.example.production
197
+ ```
198
+
199
+ If you want to associate an app with multiple Merchant Identifiers:
200
+
201
+ ```
202
+ fastlane produce associate_merchant -a com.krausefx.app merchant.com.example.production merchant.com.example.sandbox
203
+ ```
204
+
205
+ Use --help for more information about all available parameters
206
+
207
+ ```
208
+ fastlane produce associate_merchant --help
209
+ ```
210
+
176
211
  ## Environment Variables
177
212
 
178
213
  All available values can also be passed using environment variables, run `fastlane produce --help` to get a list of all available parameters.
@@ -135,6 +135,43 @@ module Produce
135
135
  end
136
136
  end
137
137
 
138
+ command :merchant do |c|
139
+ c.syntax = 'fastlane produce merchant'
140
+ c.description = 'Ensure that a specific Merchant exists'
141
+ c.example 'Create merchant', 'fastlane produce merchant -o merchant.com.example.production -r "Example Merchant Production"'
142
+
143
+ c.option '-r', '--merchant_name STRING', String, 'Name for the merchant that is created (PRODUCE_MERCHANT_NAME)'
144
+ c.option '-o', '--merchant_identifier STRING', String, 'Merchant identifier for the merchant (PRODUCE_MERCHANT_IDENTIFIER)'
145
+
146
+ FastlaneCore::CommanderGenerator.new.generate(Produce::Options.available_options, command: c)
147
+
148
+ c.action do |args, options|
149
+ extra_options = [FastlaneCore::ConfigItem.new(key: :merchant_name, optional: true), FastlaneCore::ConfigItem.new(key: :merchant_identifier)]
150
+ all_options = Produce::Options.available_options + extra_options
151
+ allowed_keys = all_options.collect(&:key)
152
+
153
+ Produce.config = FastlaneCore::Configuration.create(all_options, options.__hash__.select { |key, value| allowed_keys.include? key })
154
+
155
+ require 'produce/merchant'
156
+ Produce::Merchant.new.create(options, args)
157
+ end
158
+ end
159
+
160
+ command :associate_merchant do |c|
161
+ c.syntax = 'fastlane produce associate_merchant -a APP_IDENTIFIER MERCHANT_IDENTIFIER1, MERCHANT_IDENTIFIER2, ...'
162
+ c.description = 'Associate with a merchant for use with Apple Pay. Apple Pay will be enabled for this app.'
163
+ c.example 'Associate with merchant', 'fastlane produce associate_merchant -a com.example.app merchant.com.example.production'
164
+
165
+ FastlaneCore::CommanderGenerator.new.generate(Produce::Options.available_options, command: c)
166
+
167
+ c.action do |args, options|
168
+ Produce.config = FastlaneCore::Configuration.create(Produce::Options.available_options, options.__hash__)
169
+
170
+ require 'produce/merchant'
171
+ Produce::Merchant.new.associate(options, args)
172
+ end
173
+ end
174
+
138
175
  default_command :create
139
176
 
140
177
  run!
@@ -0,0 +1,120 @@
1
+ require 'spaceship'
2
+
3
+ module Produce
4
+ class Merchant
5
+ def create(_options, _args)
6
+ login
7
+
8
+ merchant_identifier = detect_merchant_identifier
9
+ merchant = find_merchant(merchant_identifier)
10
+
11
+ if merchant
12
+ UI.success("[DevCenter] Merchant '#{merchant.bundle_id})' already exists, nothing to do on the Dev Center")
13
+ else
14
+ merchant_name = Produce.config[:merchant_name] || merchant_name_from_identifier(merchant_identifier)
15
+ UI.success("Creating new merchant '#{merchant_name}' with identifier '#{merchant_identifier}' on the Apple Dev Center")
16
+ merchant = Spaceship.merchant.create!(bundle_id: merchant_identifier, name: merchant_name, mac: self.class.mac?)
17
+
18
+ if merchant.name != merchant_name
19
+ UI.important("Your merchant name might include non-ASCII characters, which are not supported by the Apple Developer Portal.")
20
+ UI.important("To fix this a unique (internal) name '#{merchant.name}' has been created for you.")
21
+ end
22
+
23
+ UI.message("Created merchant #{merchant.merchant_id}")
24
+ UI.success("Finished creating new merchant '#{merchant_name}' on the Dev Center")
25
+ end
26
+ end
27
+
28
+ def associate(_options, args)
29
+ login
30
+
31
+ app = Spaceship.app.find(app_identifier)
32
+
33
+ if app
34
+ app.update_service(Spaceship.app_service.apple_pay.on)
35
+
36
+ UI.message("Validating merchants before association")
37
+
38
+ # associate requires identifiers to exist. This splits the provided identifiers into existing/non-existing. See: https://ruby-doc.org/core/Enumerable.html#method-i-partition
39
+ valid_identifiers, errored_identifiers = args.partition { |identifier| merchant_exists?(identifier) }
40
+ new_merchants = valid_identifiers.map { |identifier| find_merchant(identifier) }
41
+
42
+ errored_identifiers.each do |merchant_identifier|
43
+ UI.message("[DevCenter] Merchant '#{merchant_identifier}' does not exist, please create it first, skipping for now")
44
+ end
45
+
46
+ UI.message("Finalising association with #{new_merchants.count} #{pluralize('merchant', new_merchants)}")
47
+ app.associate_merchants(new_merchants)
48
+ UI.success("Done!")
49
+ else
50
+ UI.message("[DevCenter] App '#{Produce.config[:app_identifier]}' does not exist, nothing to associate with the merchants")
51
+ end
52
+ end
53
+
54
+ def login
55
+ UI.message("Starting login with user '#{Produce.config[:username]}'")
56
+ Spaceship.login(Produce.config[:username], nil)
57
+ Spaceship.select_team
58
+ UI.message("Successfully logged in")
59
+ end
60
+
61
+ def app_identifier
62
+ Produce.config[:app_identifier]
63
+ end
64
+
65
+ def pluralize(singular, arr)
66
+ return singular if arr.count == 1
67
+
68
+ "#{singular}s"
69
+ end
70
+
71
+ def merchant_exists?(identifier)
72
+ find_merchant(identifier)
73
+ end
74
+
75
+ def detect_merchant_identifier
76
+ self.class.detect_merchant_identifier
77
+ end
78
+
79
+ def self.detect_merchant_identifier(config = Produce.config)
80
+ identifier = config[:merchant_identifier] || input("Merchant identifier (reverse-domain name style string starting with 'merchant'): ", ":merchant_identifier option is required")
81
+ prepare_identifier(identifier)
82
+ end
83
+
84
+ def self.input(message, error_message)
85
+ if UI.interactive?
86
+ UI.input(message)
87
+ else
88
+ UI.user_error!(error_message)
89
+ end
90
+ end
91
+
92
+ def self.prepare_identifier(identifier)
93
+ return identifier if identifier.start_with?("merchant.")
94
+
95
+ "merchant.#{identifier}"
96
+ end
97
+
98
+ def find_merchant(identifier)
99
+ self.class.find_merchant(identifier)
100
+ end
101
+
102
+ def self.find_merchant(identifier, merchant: Spaceship.merchant)
103
+ @cache ||= {}
104
+ @cache[identifier] ||= merchant.find(identifier, mac: mac?)
105
+ end
106
+
107
+ def self.mac?(config = Produce.config)
108
+ config[:platform].to_s == "mac"
109
+ end
110
+
111
+ def merchant_name_from_identifier(identifier)
112
+ self.class.merchant_name_from_identifier(identifier)
113
+ end
114
+
115
+ def self.merchant_name_from_identifier(identifier)
116
+ capitalized_words = identifier.split(".").map(&:capitalize)
117
+ capitalized_words.reverse.join(' ')
118
+ end
119
+ end
120
+ end
@@ -25,6 +25,7 @@ module Spaceship
25
25
  Passbook = Spaceship::Portal::Passbook
26
26
  WebsitePush = Spaceship::Portal::WebsitePush
27
27
  AppService = Spaceship::Portal::AppService
28
+ Merchant = Spaceship::Portal::Merchant
28
29
 
29
30
  # iTunes Connect
30
31
  AppVersion = Spaceship::Tunes::AppVersion
@@ -144,6 +144,13 @@ module Spaceship
144
144
  self.class.factory(app)
145
145
  end
146
146
 
147
+ # Associate specific merchants with this app
148
+ # @return (App) The updated detailed app. This is nil if the app couldn't be found
149
+ def associate_merchants(merchants)
150
+ app = client.associate_merchants_with_app(self, merchants, mac?)
151
+ self.class.factory(app)
152
+ end
153
+
147
154
  # Update a service for the app with given AppService object
148
155
  # @return (App) The updated detailed app. This is nil if the app couldn't be found
149
156
  def update_service(service)
@@ -0,0 +1,84 @@
1
+ module Spaceship
2
+ module Portal
3
+ # Represents a Merchant ID from the Developer Portal
4
+ class Merchant < PortalBase
5
+ # @return (String) The identifier of this merchant, provided by the Dev Portal
6
+ # @example
7
+ # "LM1UX73BAC"
8
+ attr_accessor :merchant_id
9
+
10
+ # @return (String) The name you provided for this merchant
11
+ # @example
12
+ # "Spaceship Production"
13
+ attr_accessor :name
14
+
15
+ # @return (String) the supported platform of this merchant
16
+ # @example
17
+ # "ios"
18
+ attr_accessor :platform
19
+
20
+ # Prefix provided by the Dev Portal
21
+ # @example
22
+ # "5A9972XTK2"
23
+ attr_accessor :prefix
24
+
25
+ # @return (String) The bundle_id (merchant identifier) of merchant id
26
+ # @example
27
+ # "merchant.com.krausefx.app.production"
28
+ attr_accessor :bundle_id
29
+
30
+ # @return (String) Status of the merchant
31
+ # @example
32
+ # "current"
33
+ attr_accessor :status
34
+
35
+ attr_mapping(
36
+ 'omcId' => :merchant_id,
37
+ 'name' => :name,
38
+ 'prefix' => :prefix,
39
+ 'identifier' => :bundle_id,
40
+ 'status' => :status
41
+ )
42
+
43
+ class << self
44
+ # @param mac [Bool] Fetches Mac merchant if true
45
+ # @return (Array) Returns all merchants available for this account
46
+ def all(mac: false)
47
+ client.merchants(mac: mac).map { |merchant| new(merchant) }
48
+ end
49
+
50
+ # Creates a new Merchant on the Apple Dev Portal
51
+ #
52
+ # @param bundle_id [String] the bundle id (merchant_identifier) of the merchant
53
+ # @param name [String] the name of the Merchant
54
+ # @param mac [Bool] is this a Mac Merchant?
55
+ # @return (Merchant) The Merchant you just created
56
+ def create!(bundle_id: nil, name: nil, mac: false)
57
+ new_merchant = client.create_merchant!(name, bundle_id, mac: mac)
58
+ new(new_merchant)
59
+ end
60
+
61
+ # Find a specific Merchant ID based on the bundle_id
62
+ # @param mac [Bool] Searches Mac merchants if true
63
+ # @return (Merchant) The Merchant you're looking for. This is nil if the merchant can't be found.
64
+ def find(bundle_id, mac: false)
65
+ all(mac: mac).find do |merchant|
66
+ merchant.bundle_id == bundle_id
67
+ end
68
+ end
69
+ end
70
+
71
+ # Delete this Merchant
72
+ # @return (Merchant) The merchant you just deleted
73
+ def delete!
74
+ client.delete_merchant!(merchant_id, mac: mac?)
75
+ self
76
+ end
77
+
78
+ # @return (Bool) Is this a Mac merchant?
79
+ def mac?
80
+ platform == 'mac'
81
+ end
82
+ end
83
+ end
84
+ end
@@ -10,5 +10,6 @@ require 'spaceship/portal/portal_client'
10
10
  require 'spaceship/portal/persons'
11
11
  require 'spaceship/portal/person'
12
12
  require 'spaceship/portal/key'
13
+ require 'spaceship/portal/merchant'
13
14
  require 'spaceship/portal/passbook'
14
15
  require 'spaceship/portal/invite'
@@ -132,6 +132,18 @@ module Spaceship
132
132
  details_for_app(app)
133
133
  end
134
134
 
135
+ def associate_merchants_with_app(app, merchants, mac)
136
+ ensure_csrf(Spaceship::Merchant)
137
+
138
+ request(:post, "account/#{platform_slug(mac)}/identifiers/assignOMCToAppId.action", {
139
+ teamId: team_id,
140
+ appIdId: app.app_id,
141
+ omcIds: merchants.map(&:merchant_id)
142
+ })
143
+
144
+ details_for_app(app)
145
+ end
146
+
135
147
  def valid_name_for(input)
136
148
  latinized = input.to_slug.transliterate
137
149
  latinized = latinized.gsub(/[^0-9A-Za-z\d\s]/, '') # remove non-valid characters
@@ -273,6 +285,43 @@ module Spaceship
273
285
  parse_response(r)
274
286
  end
275
287
 
288
+ #####################################################
289
+ # @!group Merchant
290
+ #####################################################
291
+
292
+ def merchants(mac: false)
293
+ paging do |page_number|
294
+ r = request(:post, "account/#{platform_slug(mac)}/identifiers/listOMCs.action", {
295
+ teamId: team_id,
296
+ pageNumber: page_number,
297
+ pageSize: page_size,
298
+ sort: 'name=asc'
299
+ })
300
+ parse_response(r, 'identifierList')
301
+ end
302
+ end
303
+
304
+ def create_merchant!(name, bundle_id, mac: false)
305
+ ensure_csrf(Spaceship::Merchant)
306
+
307
+ r = request(:post, "account/#{platform_slug(mac)}/identifiers/addOMC.action", {
308
+ name: name,
309
+ identifier: bundle_id,
310
+ teamId: team_id
311
+ })
312
+ parse_response(r, 'omcId')
313
+ end
314
+
315
+ def delete_merchant!(merchant_id, mac: false)
316
+ ensure_csrf(Spaceship::Merchant)
317
+
318
+ r = request(:post, "account/#{platform_slug(mac)}/identifiers/deleteOMC.action", {
319
+ teamId: team_id,
320
+ omcId: merchant_id
321
+ })
322
+ parse_response(r)
323
+ end
324
+
276
325
  #####################################################
277
326
  # @!group App Groups
278
327
  #####################################################
@@ -78,6 +78,11 @@ module Spaceship
78
78
  def provisioning_profile
79
79
  Spaceship::ProvisioningProfile.set_client(@client)
80
80
  end
81
+
82
+ # @return (Class) Access the merchants for the spaceship
83
+ def merchant
84
+ Spaceship::Merchant.set_client(@client)
85
+ end
81
86
  end
82
87
  end
83
88
 
@@ -126,5 +131,9 @@ module Spaceship
126
131
  def client
127
132
  Spaceship::Portal.client
128
133
  end
134
+
135
+ def merchant
136
+ Spaceship::Portal.merchant
137
+ end
129
138
  end
130
139
  end
@@ -24,7 +24,7 @@ module Supply
24
24
  FastlaneCore::ConfigItem.new(key: :rollout,
25
25
  short_option: "-r",
26
26
  description: "The percentage of the user fraction when uploading to the rollout track",
27
- default_value: '0.1',
27
+ optional: true,
28
28
  verify_block: proc do |value|
29
29
  min = 0.0
30
30
  max = 1.0
@@ -43,7 +43,7 @@ module Supply
43
43
  # the actual value passed for the rollout argument does not matter because it will be ignored by the Google Play API
44
44
  # but it has to be between 0.0 and 1.0 to pass the validity check. So we are passing the default value 0.1
45
45
  client.update_track(Supply.config[:track], 0.1, nil)
46
- client.update_track(Supply.config[:track_promote_to], Supply.config[:rollout], version_codes)
46
+ client.update_track(Supply.config[:track_promote_to], Supply.config[:rollout] || 0.1, version_codes)
47
47
  end
48
48
 
49
49
  def upload_changelogs(language)
@@ -157,8 +157,8 @@ module Supply
157
157
  UI.message("Updating track '#{Supply.config[:track]}'...")
158
158
  check_superseded_tracks(apk_version_codes) if Supply.config[:check_superseded_tracks]
159
159
 
160
- if Supply.config[:track].eql? "rollout"
161
- client.update_track(Supply.config[:track], Supply.config[:rollout], apk_version_codes)
160
+ if Supply.config[:track].eql?("rollout")
161
+ client.update_track(Supply.config[:track], Supply.config[:rollout] || 0.1, apk_version_codes)
162
162
  else
163
163
  client.update_track(Supply.config[:track], 1.0, apk_version_codes)
164
164
  end
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.52.0.beta.20170809010003
4
+ version: 2.52.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Felix Krause
@@ -830,6 +830,7 @@ files:
830
830
  - fastlane/lib/assets/s3_plist_template.erb
831
831
  - fastlane/lib/assets/s3_version_template.erb
832
832
  - fastlane/lib/fastlane.rb
833
+ - fastlane/lib/fastlane/.DS_Store
833
834
  - fastlane/lib/fastlane/action.rb
834
835
  - fastlane/lib/fastlane/action_collector.rb
835
836
  - fastlane/lib/fastlane/actions/README.md
@@ -1233,6 +1234,7 @@ files:
1233
1234
  - produce/lib/produce/group.rb
1234
1235
  - produce/lib/produce/itunes_connect.rb
1235
1236
  - produce/lib/produce/manager.rb
1237
+ - produce/lib/produce/merchant.rb
1236
1238
  - produce/lib/produce/options.rb
1237
1239
  - produce/lib/produce/service.rb
1238
1240
  - scan/README.md
@@ -1317,6 +1319,7 @@ files:
1317
1319
  - spaceship/lib/spaceship/portal/device.rb
1318
1320
  - spaceship/lib/spaceship/portal/invite.rb
1319
1321
  - spaceship/lib/spaceship/portal/key.rb
1322
+ - spaceship/lib/spaceship/portal/merchant.rb
1320
1323
  - spaceship/lib/spaceship/portal/passbook.rb
1321
1324
  - spaceship/lib/spaceship/portal/person.rb
1322
1325
  - spaceship/lib/spaceship/portal/persons.rb
@@ -1403,24 +1406,24 @@ metadata:
1403
1406
  post_install_message:
1404
1407
  rdoc_options: []
1405
1408
  require_paths:
1406
- - spaceship/lib
1407
- - scan/lib
1408
- - sigh/lib
1409
- - snapshot/lib
1410
- - screengrab/lib
1411
- - fastlane/lib
1412
1409
  - cert/lib
1413
- - pem/lib
1414
- - gym/lib
1415
- - produce/lib
1410
+ - credentials_manager/lib
1416
1411
  - deliver/lib
1417
- - supply/lib
1418
- - match/lib
1412
+ - fastlane/lib
1413
+ - fastlane_core/lib
1419
1414
  - frameit/lib
1420
- - credentials_manager/lib
1415
+ - gym/lib
1416
+ - match/lib
1417
+ - pem/lib
1421
1418
  - pilot/lib
1422
1419
  - precheck/lib
1423
- - fastlane_core/lib
1420
+ - produce/lib
1421
+ - scan/lib
1422
+ - screengrab/lib
1423
+ - sigh/lib
1424
+ - snapshot/lib
1425
+ - spaceship/lib
1426
+ - supply/lib
1424
1427
  required_ruby_version: !ruby/object:Gem::Requirement
1425
1428
  requirements:
1426
1429
  - - ">="
@@ -1428,14 +1431,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
1428
1431
  version: 2.0.0
1429
1432
  required_rubygems_version: !ruby/object:Gem::Requirement
1430
1433
  requirements:
1431
- - - ">"
1434
+ - - ">="
1432
1435
  - !ruby/object:Gem::Version
1433
- version: 1.3.1
1436
+ version: '0'
1434
1437
  requirements: []
1435
1438
  rubyforge_project:
1436
- rubygems_version: 2.4.5.1
1439
+ rubygems_version: 2.6.8
1437
1440
  signing_key:
1438
1441
  specification_version: 4
1439
1442
  summary: The easiest way to automate beta deployments and releases for your iOS and
1440
1443
  Android apps
1441
1444
  test_files: []
1445
+ has_rdoc: