fastlane 2.126.0.beta.20190606200048 → 2.126.0.beta.20190607200028
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/fastlane/lib/fastlane/actions/app_store_build_number.rb +1 -1
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/fastlane_core/lib/fastlane_core/build_watcher.rb +3 -4
- data/pilot/lib/pilot/build_manager.rb +7 -7
- data/pilot/lib/pilot/manager.rb +2 -2
- data/pilot/lib/pilot/tester_exporter.rb +3 -3
- data/pilot/lib/pilot/tester_manager.rb +2 -2
- data/spaceship/lib/spaceship/connect_api.rb +2 -17
- data/spaceship/lib/spaceship/connect_api/{models/model.rb → model.rb} +5 -4
- data/spaceship/lib/spaceship/connect_api/response.rb +4 -7
- data/spaceship/lib/spaceship/connect_api/testflight/base.rb +41 -0
- data/spaceship/lib/spaceship/connect_api/testflight/client.rb +553 -0
- data/spaceship/lib/spaceship/connect_api/testflight/models/app.rb +99 -0
- data/spaceship/lib/spaceship/connect_api/testflight/models/beta_app_localization.rb +30 -0
- data/spaceship/lib/spaceship/connect_api/testflight/models/beta_app_review_detail.rb +34 -0
- data/spaceship/lib/spaceship/connect_api/testflight/models/beta_app_review_submission.rb +28 -0
- data/spaceship/lib/spaceship/connect_api/testflight/models/beta_build_localization.rb +22 -0
- data/spaceship/lib/spaceship/connect_api/testflight/models/beta_build_metric.rb +26 -0
- data/spaceship/lib/spaceship/connect_api/testflight/models/beta_group.rb +43 -0
- data/spaceship/lib/spaceship/connect_api/testflight/models/beta_tester.rb +58 -0
- data/spaceship/lib/spaceship/connect_api/testflight/models/beta_tester_metric.rb +45 -0
- data/spaceship/lib/spaceship/connect_api/testflight/models/build.rb +146 -0
- data/spaceship/lib/spaceship/connect_api/testflight/models/build_beta_detail.rb +58 -0
- data/spaceship/lib/spaceship/connect_api/testflight/models/build_delivery.rb +38 -0
- data/spaceship/lib/spaceship/connect_api/testflight/models/pre_release_version.rb +22 -0
- data/spaceship/lib/spaceship/connect_api/testflight/models/user.rb +52 -0
- data/spaceship/lib/spaceship/connect_api/testflight/testflight.rb +27 -0
- data/spaceship/lib/spaceship/test_flight/build.rb +3 -3
- data/spaceship/lib/spaceship/test_flight/build_trains.rb +1 -1
- metadata +34 -33
- data/spaceship/lib/spaceship/connect_api/base.rb +0 -39
- data/spaceship/lib/spaceship/connect_api/client.rb +0 -551
- data/spaceship/lib/spaceship/connect_api/models/app.rb +0 -97
- data/spaceship/lib/spaceship/connect_api/models/beta_app_localization.rb +0 -28
- data/spaceship/lib/spaceship/connect_api/models/beta_app_review_detail.rb +0 -32
- data/spaceship/lib/spaceship/connect_api/models/beta_app_review_submission.rb +0 -26
- data/spaceship/lib/spaceship/connect_api/models/beta_build_localization.rb +0 -20
- data/spaceship/lib/spaceship/connect_api/models/beta_build_metric.rb +0 -24
- data/spaceship/lib/spaceship/connect_api/models/beta_group.rb +0 -41
- data/spaceship/lib/spaceship/connect_api/models/beta_tester.rb +0 -56
- data/spaceship/lib/spaceship/connect_api/models/beta_tester_metric.rb +0 -43
- data/spaceship/lib/spaceship/connect_api/models/build.rb +0 -144
- data/spaceship/lib/spaceship/connect_api/models/build_beta_detail.rb +0 -56
- data/spaceship/lib/spaceship/connect_api/models/build_delivery.rb +0 -36
- data/spaceship/lib/spaceship/connect_api/models/pre_release_version.rb +0 -20
- data/spaceship/lib/spaceship/connect_api/models/user.rb +0 -50
@@ -0,0 +1,58 @@
|
|
1
|
+
require_relative '../../model'
|
2
|
+
module Spaceship
|
3
|
+
module ConnectAPI
|
4
|
+
module TestFlight
|
5
|
+
class BuildBetaDetail
|
6
|
+
include Spaceship::ConnectAPI::Model
|
7
|
+
|
8
|
+
attr_accessor :auto_notify_enabled
|
9
|
+
attr_accessor :did_notify
|
10
|
+
attr_accessor :internal_build_state
|
11
|
+
attr_accessor :external_build_state
|
12
|
+
|
13
|
+
module InternalState
|
14
|
+
PROCESSING_EXCEPTION = "PROCESSING_EXCEPTION"
|
15
|
+
MISSING_EXPORT_COMPLIANCE = "MISSING_EXPORT_COMPLIANCE"
|
16
|
+
READY_FOR_BETA_TESTING = "READY_FOR_BETA_TESTING"
|
17
|
+
IN_BETA_TESTING = "IN_BETA_TESTING"
|
18
|
+
EXPIRED = "EXPIRED"
|
19
|
+
IN_EXPORT_COMPLIANCE_REVIEW = "IN_EXPORT_COMPLIANCE_REVIEW"
|
20
|
+
end
|
21
|
+
|
22
|
+
module ExternalState
|
23
|
+
PROCESSING = "PROCESSING"
|
24
|
+
PROCESSING_EXCEPTION = "PROCESSING_EXCEPTION"
|
25
|
+
MISSING_EXPORT_COMPLIANCE = "MISSING_EXPORT_COMPLIANCE"
|
26
|
+
READY_FOR_BETA_TESTING = "READY_FOR_BETA_TESTING"
|
27
|
+
IN_BETA_TESTING = "IN_BETA_TESTING"
|
28
|
+
EXPIRED = "EXPIRED"
|
29
|
+
READY_FOR_BETA_SUBMISSION = "READY_FOR_BETA_SUBMISSION"
|
30
|
+
IN_EXPORT_COMPLIANCE_REVIEW = "IN_EXPORT_COMPLIANCE_REVIEW"
|
31
|
+
WAITING_FOR_BETA_REVIEW = "WAITING_FOR_BETA_REVIEW"
|
32
|
+
IN_BETA_REVIEW = "IN_BETA_REVIEW"
|
33
|
+
BETA_REJECTED = "BETA_REJECTED"
|
34
|
+
BETA_APPROVED = "BETA_APPROVED"
|
35
|
+
end
|
36
|
+
|
37
|
+
attr_mapping({
|
38
|
+
"autoNotifyEnabled" => "auto_notify_enabled",
|
39
|
+
"didNotify" => "did_notify",
|
40
|
+
"internalBuildState" => "internal_build_state",
|
41
|
+
"externalBuildState" => "external_build_state"
|
42
|
+
})
|
43
|
+
|
44
|
+
def self.type
|
45
|
+
return "buildBetaDetails"
|
46
|
+
end
|
47
|
+
|
48
|
+
#
|
49
|
+
# Helpers
|
50
|
+
#
|
51
|
+
|
52
|
+
def ready_for_beta_submission?
|
53
|
+
return external_build_state == ExternalState::READY_FOR_BETA_SUBMISSION
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require_relative '../../model'
|
2
|
+
module Spaceship
|
3
|
+
module ConnectAPI
|
4
|
+
module TestFlight
|
5
|
+
class BuildDelivery
|
6
|
+
include Spaceship::ConnectAPI::Model
|
7
|
+
|
8
|
+
attr_accessor :cf_build_version
|
9
|
+
attr_accessor :cf_build_short_version_string
|
10
|
+
attr_accessor :platform
|
11
|
+
attr_accessor :uploaded_date
|
12
|
+
|
13
|
+
attr_mapping({
|
14
|
+
"cfBundleVersion" => "cf_build_version",
|
15
|
+
"cfBundleShortVersionString" => "cf_build_short_version_string",
|
16
|
+
"platform" => "platform",
|
17
|
+
"uploadedDate" => "uploaded_date"
|
18
|
+
})
|
19
|
+
|
20
|
+
def self.type
|
21
|
+
return "buildDeliveries"
|
22
|
+
end
|
23
|
+
|
24
|
+
#
|
25
|
+
# API
|
26
|
+
#
|
27
|
+
|
28
|
+
def self.all(app_id: nil, version: nil, build_number: nil)
|
29
|
+
resps = testflight_client.get_build_deliveries(
|
30
|
+
filter: { app: app_id, cfBundleShortVersionString: version, cfBundleVersion: build_number },
|
31
|
+
limit: 1
|
32
|
+
).all_pages
|
33
|
+
return resps.map(&:to_models).flatten
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require_relative '../../model'
|
2
|
+
module Spaceship
|
3
|
+
module ConnectAPI
|
4
|
+
module TestFlight
|
5
|
+
class PreReleaseVersion
|
6
|
+
include Spaceship::ConnectAPI::Model
|
7
|
+
|
8
|
+
attr_accessor :version
|
9
|
+
attr_accessor :platform
|
10
|
+
|
11
|
+
attr_mapping({
|
12
|
+
"version" => "version",
|
13
|
+
"platform" => "platform"
|
14
|
+
})
|
15
|
+
|
16
|
+
def self.type
|
17
|
+
return "preReleaseVersions"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require_relative '../../model'
|
2
|
+
module Spaceship
|
3
|
+
module ConnectAPI
|
4
|
+
module TestFlight
|
5
|
+
class User
|
6
|
+
include Spaceship::ConnectAPI::Model
|
7
|
+
|
8
|
+
attr_accessor :username
|
9
|
+
attr_accessor :first_name
|
10
|
+
attr_accessor :last_name
|
11
|
+
attr_accessor :email
|
12
|
+
attr_accessor :preferred_currency_territory
|
13
|
+
attr_accessor :agreed_to_terms
|
14
|
+
attr_accessor :roles
|
15
|
+
attr_accessor :all_apps_visible
|
16
|
+
attr_accessor :provisioning_allowed
|
17
|
+
attr_accessor :email_vetting_required
|
18
|
+
attr_accessor :notifications
|
19
|
+
|
20
|
+
attr_mapping({
|
21
|
+
"username" => "username",
|
22
|
+
"firstName" => "first_name",
|
23
|
+
"lastName" => "last_name",
|
24
|
+
"email" => "email",
|
25
|
+
"preferredCurrencyTerritory" => "preferred_currency_territory",
|
26
|
+
"agreedToTerms" => "agreed_to_terms",
|
27
|
+
"roles" => "roles",
|
28
|
+
"allAppsVisible" => "all_apps_visible",
|
29
|
+
"provisioningAllowed" => "provisioning_allowed",
|
30
|
+
"emailVettingRequired" => "email_vetting_required",
|
31
|
+
"notifications" => "notifications"
|
32
|
+
})
|
33
|
+
|
34
|
+
def self.type
|
35
|
+
return "users"
|
36
|
+
end
|
37
|
+
|
38
|
+
#
|
39
|
+
# API
|
40
|
+
#
|
41
|
+
|
42
|
+
def self.all(filter: {}, includes: nil, limit: nil, sort: nil)
|
43
|
+
return client.get_users(filter: filter, includes: includes)
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.find(email: nil, includes: nil)
|
47
|
+
return all(filter: { email: email }, includes: includes)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spaceship/connect_api/testflight/client'
|
2
|
+
require 'spaceship/connect_api/testflight/base'
|
3
|
+
|
4
|
+
require 'spaceship/connect_api/testflight/models/app'
|
5
|
+
require 'spaceship/connect_api/testflight/models/beta_app_localization'
|
6
|
+
require 'spaceship/connect_api/testflight/models/beta_build_localization'
|
7
|
+
require 'spaceship/connect_api/testflight/models/beta_build_metric'
|
8
|
+
require 'spaceship/connect_api/testflight/models/beta_app_review_detail'
|
9
|
+
require 'spaceship/connect_api/testflight/models/beta_app_review_submission'
|
10
|
+
require 'spaceship/connect_api/testflight/models/beta_group'
|
11
|
+
require 'spaceship/connect_api/testflight/models/beta_tester'
|
12
|
+
require 'spaceship/connect_api/testflight/models/beta_tester_metric'
|
13
|
+
require 'spaceship/connect_api/testflight/models/build'
|
14
|
+
require 'spaceship/connect_api/testflight/models/build_delivery'
|
15
|
+
require 'spaceship/connect_api/testflight/models/build_beta_detail'
|
16
|
+
require 'spaceship/connect_api/testflight/models/pre_release_version'
|
17
|
+
require 'spaceship/connect_api/testflight/models/user'
|
18
|
+
|
19
|
+
module Spaceship
|
20
|
+
module ConnectAPI
|
21
|
+
module TestFlight
|
22
|
+
def self.client
|
23
|
+
return Spaceship::ConnectAPI::TestFlight::Base.client
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -6,7 +6,7 @@ require_relative 'export_compliance'
|
|
6
6
|
require_relative 'beta_review_info'
|
7
7
|
require_relative 'build_trains'
|
8
8
|
|
9
|
-
require_relative '../connect_api
|
9
|
+
require_relative '../connect_api'
|
10
10
|
|
11
11
|
module Spaceship
|
12
12
|
module TestFlight
|
@@ -218,7 +218,7 @@ module Spaceship
|
|
218
218
|
return if approved?
|
219
219
|
|
220
220
|
build = find_app_store_connect_build
|
221
|
-
Spaceship::ConnectAPI::
|
221
|
+
Spaceship::ConnectAPI::TestFlight.client.post_beta_app_review_submissions(build_id: build["id"])
|
222
222
|
end
|
223
223
|
|
224
224
|
def expire!
|
@@ -231,7 +231,7 @@ module Spaceship
|
|
231
231
|
|
232
232
|
# Bridges the TestFlight::Build to the App Store Connect API build
|
233
233
|
def find_app_store_connect_build
|
234
|
-
resp = Spaceship::ConnectAPI::
|
234
|
+
resp = Spaceship::ConnectAPI::TestFlight.client.get_builds(filter: { expired: false, processingState: "PROCESSING,VALID", version: self.build_version, "preReleaseVersion.version" => self.train_version, app: app_id })
|
235
235
|
resp.first
|
236
236
|
end
|
237
237
|
end
|
@@ -13,7 +13,7 @@ module Spaceship::TestFlight
|
|
13
13
|
# See `Spaceship::TestFlight::Build#reload`
|
14
14
|
|
15
15
|
def self.all(app_id: nil, platform: nil, retry_count: 3)
|
16
|
-
client = Spaceship::ConnectAPI::
|
16
|
+
client = Spaceship::ConnectAPI::TestFlight.client
|
17
17
|
|
18
18
|
builds = []
|
19
19
|
included = []
|
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.126.0.beta.
|
4
|
+
version: 2.126.0.beta.20190607200028
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joshua Liebowitz
|
@@ -27,7 +27,7 @@ authors:
|
|
27
27
|
autorequire:
|
28
28
|
bindir: bin
|
29
29
|
cert_chain: []
|
30
|
-
date: 2019-06-
|
30
|
+
date: 2019-06-07 00:00:00.000000000 Z
|
31
31
|
dependencies:
|
32
32
|
- !ruby/object:Gem::Dependency
|
33
33
|
name: slack-notifier
|
@@ -1587,24 +1587,25 @@ files:
|
|
1587
1587
|
- spaceship/lib/spaceship/client.rb
|
1588
1588
|
- spaceship/lib/spaceship/commands_generator.rb
|
1589
1589
|
- spaceship/lib/spaceship/connect_api.rb
|
1590
|
-
- spaceship/lib/spaceship/connect_api/
|
1591
|
-
- spaceship/lib/spaceship/connect_api/client.rb
|
1592
|
-
- spaceship/lib/spaceship/connect_api/models/app.rb
|
1593
|
-
- spaceship/lib/spaceship/connect_api/models/beta_app_localization.rb
|
1594
|
-
- spaceship/lib/spaceship/connect_api/models/beta_app_review_detail.rb
|
1595
|
-
- spaceship/lib/spaceship/connect_api/models/beta_app_review_submission.rb
|
1596
|
-
- spaceship/lib/spaceship/connect_api/models/beta_build_localization.rb
|
1597
|
-
- spaceship/lib/spaceship/connect_api/models/beta_build_metric.rb
|
1598
|
-
- spaceship/lib/spaceship/connect_api/models/beta_group.rb
|
1599
|
-
- spaceship/lib/spaceship/connect_api/models/beta_tester.rb
|
1600
|
-
- spaceship/lib/spaceship/connect_api/models/beta_tester_metric.rb
|
1601
|
-
- spaceship/lib/spaceship/connect_api/models/build.rb
|
1602
|
-
- spaceship/lib/spaceship/connect_api/models/build_beta_detail.rb
|
1603
|
-
- spaceship/lib/spaceship/connect_api/models/build_delivery.rb
|
1604
|
-
- spaceship/lib/spaceship/connect_api/models/model.rb
|
1605
|
-
- spaceship/lib/spaceship/connect_api/models/pre_release_version.rb
|
1606
|
-
- spaceship/lib/spaceship/connect_api/models/user.rb
|
1590
|
+
- spaceship/lib/spaceship/connect_api/model.rb
|
1607
1591
|
- spaceship/lib/spaceship/connect_api/response.rb
|
1592
|
+
- spaceship/lib/spaceship/connect_api/testflight/base.rb
|
1593
|
+
- spaceship/lib/spaceship/connect_api/testflight/client.rb
|
1594
|
+
- spaceship/lib/spaceship/connect_api/testflight/models/app.rb
|
1595
|
+
- spaceship/lib/spaceship/connect_api/testflight/models/beta_app_localization.rb
|
1596
|
+
- spaceship/lib/spaceship/connect_api/testflight/models/beta_app_review_detail.rb
|
1597
|
+
- spaceship/lib/spaceship/connect_api/testflight/models/beta_app_review_submission.rb
|
1598
|
+
- spaceship/lib/spaceship/connect_api/testflight/models/beta_build_localization.rb
|
1599
|
+
- spaceship/lib/spaceship/connect_api/testflight/models/beta_build_metric.rb
|
1600
|
+
- spaceship/lib/spaceship/connect_api/testflight/models/beta_group.rb
|
1601
|
+
- spaceship/lib/spaceship/connect_api/testflight/models/beta_tester.rb
|
1602
|
+
- spaceship/lib/spaceship/connect_api/testflight/models/beta_tester_metric.rb
|
1603
|
+
- spaceship/lib/spaceship/connect_api/testflight/models/build.rb
|
1604
|
+
- spaceship/lib/spaceship/connect_api/testflight/models/build_beta_detail.rb
|
1605
|
+
- spaceship/lib/spaceship/connect_api/testflight/models/build_delivery.rb
|
1606
|
+
- spaceship/lib/spaceship/connect_api/testflight/models/pre_release_version.rb
|
1607
|
+
- spaceship/lib/spaceship/connect_api/testflight/models/user.rb
|
1608
|
+
- spaceship/lib/spaceship/connect_api/testflight/testflight.rb
|
1608
1609
|
- spaceship/lib/spaceship/connect_api/token.rb
|
1609
1610
|
- spaceship/lib/spaceship/du/du_client.rb
|
1610
1611
|
- spaceship/lib/spaceship/du/upload_file.rb
|
@@ -1724,24 +1725,24 @@ metadata:
|
|
1724
1725
|
post_install_message:
|
1725
1726
|
rdoc_options: []
|
1726
1727
|
require_paths:
|
1727
|
-
- frameit/lib
|
1728
|
-
- gym/lib
|
1729
|
-
- sigh/lib
|
1730
|
-
- credentials_manager/lib
|
1731
|
-
- match/lib
|
1732
|
-
- precheck/lib
|
1733
|
-
- fastlane/lib
|
1734
|
-
- produce/lib
|
1735
1728
|
- supply/lib
|
1736
|
-
- scan/lib
|
1737
|
-
- pilot/lib
|
1738
|
-
- fastlane_core/lib
|
1739
1729
|
- cert/lib
|
1740
|
-
-
|
1730
|
+
- fastlane/lib
|
1741
1731
|
- spaceship/lib
|
1742
|
-
- pem/lib
|
1743
|
-
- deliver/lib
|
1744
1732
|
- snapshot/lib
|
1733
|
+
- scan/lib
|
1734
|
+
- fastlane_core/lib
|
1735
|
+
- pilot/lib
|
1736
|
+
- deliver/lib
|
1737
|
+
- pem/lib
|
1738
|
+
- precheck/lib
|
1739
|
+
- sigh/lib
|
1740
|
+
- gym/lib
|
1741
|
+
- screengrab/lib
|
1742
|
+
- credentials_manager/lib
|
1743
|
+
- produce/lib
|
1744
|
+
- frameit/lib
|
1745
|
+
- match/lib
|
1745
1746
|
required_ruby_version: !ruby/object:Gem::Requirement
|
1746
1747
|
requirements:
|
1747
1748
|
- - ">="
|
@@ -1,39 +0,0 @@
|
|
1
|
-
require_relative '../base'
|
2
|
-
require_relative '../tunes/tunes_client'
|
3
|
-
|
4
|
-
module Spaceship
|
5
|
-
module ConnectAPI
|
6
|
-
class Base < Spaceship::Base
|
7
|
-
def self.client
|
8
|
-
# Verify there is a client that can be used
|
9
|
-
if Spaceship::Tunes.client
|
10
|
-
# Initialize new client if new or if team changed
|
11
|
-
if @client.nil? || @client.team_id != Spaceship::Tunes.client.team_id
|
12
|
-
@client = Client.client_with_authorization_from(Spaceship::Tunes.client)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
# Need to handle not having a client but this shouldn't ever happen
|
17
|
-
raise "Please login using `Spaceship::Tunes.login('user', 'password')`" unless @client
|
18
|
-
|
19
|
-
@client
|
20
|
-
end
|
21
|
-
|
22
|
-
##
|
23
|
-
# Have subclasses inherit the client from their superclass
|
24
|
-
#
|
25
|
-
# Essentially, we are making a class-inheritable-accessor as described here:
|
26
|
-
# https://apidock.com/rails/v4.2.7/Class/class_attribute
|
27
|
-
def self.inherited(subclass)
|
28
|
-
this_class = self
|
29
|
-
subclass.define_singleton_method(:client) do
|
30
|
-
this_class.client
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def to_json
|
35
|
-
raw_data.to_json
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
@@ -1,551 +0,0 @@
|
|
1
|
-
require_relative '../client'
|
2
|
-
require_relative './response'
|
3
|
-
|
4
|
-
module Spaceship
|
5
|
-
# rubocop:disable Metrics/ClassLength
|
6
|
-
module ConnectAPI
|
7
|
-
class Client < Spaceship::Client
|
8
|
-
##
|
9
|
-
# Spaceship HTTP client for the App Store Connect API.
|
10
|
-
#
|
11
|
-
# This client is solely responsible for the making HTTP requests and
|
12
|
-
# parsing their responses. Parameters should be either named parameters, or
|
13
|
-
# for large request data bodies, pass in anything that can resond to
|
14
|
-
# `to_json`.
|
15
|
-
#
|
16
|
-
# Each request method should validate the required parameters. A required parameter is one that would result in 400-range response if it is not supplied.
|
17
|
-
# Each request method should make only one request. For more high-level logic, put code in the data models.
|
18
|
-
|
19
|
-
def self.hostname
|
20
|
-
'https://appstoreconnect.apple.com/iris/v1/'
|
21
|
-
end
|
22
|
-
|
23
|
-
#
|
24
|
-
# Helpers
|
25
|
-
#
|
26
|
-
|
27
|
-
def build_params(filter: nil, includes: nil, limit: nil, sort: nil, cursor: nil)
|
28
|
-
params = {}
|
29
|
-
|
30
|
-
filter = filter.delete_if { |k, v| v.nil? } if filter
|
31
|
-
|
32
|
-
params[:filter] = filter if filter && !filter.empty?
|
33
|
-
params[:include] = includes if includes
|
34
|
-
params[:limit] = limit if limit
|
35
|
-
params[:sort] = sort if sort
|
36
|
-
params[:cursor] = cursor if cursor
|
37
|
-
|
38
|
-
return params
|
39
|
-
end
|
40
|
-
|
41
|
-
def get(url_or_path, params = nil)
|
42
|
-
response = request(:get) do |req|
|
43
|
-
req.url(url_or_path)
|
44
|
-
req.options.params_encoder = Faraday::NestedParamsEncoder
|
45
|
-
req.params = params if params
|
46
|
-
end
|
47
|
-
handle_response(response)
|
48
|
-
end
|
49
|
-
|
50
|
-
def post(url_or_path, body)
|
51
|
-
response = request(:post) do |req|
|
52
|
-
req.url(url_or_path)
|
53
|
-
req.body = body.to_json
|
54
|
-
req.headers['Content-Type'] = 'application/json'
|
55
|
-
end
|
56
|
-
handle_response(response)
|
57
|
-
end
|
58
|
-
|
59
|
-
def patch(url_or_path, body)
|
60
|
-
response = request(:patch) do |req|
|
61
|
-
req.url(url_or_path)
|
62
|
-
req.body = body.to_json
|
63
|
-
req.headers['Content-Type'] = 'application/json'
|
64
|
-
end
|
65
|
-
handle_response(response)
|
66
|
-
end
|
67
|
-
|
68
|
-
def delete(url_or_path, params = nil, body = nil)
|
69
|
-
response = request(:delete) do |req|
|
70
|
-
req.url(url_or_path)
|
71
|
-
req.options.params_encoder = Faraday::NestedParamsEncoder if params
|
72
|
-
req.params = params if params
|
73
|
-
req.body = body.to_json if body
|
74
|
-
req.headers['Content-Type'] = 'application/json' if body
|
75
|
-
end
|
76
|
-
handle_response(response)
|
77
|
-
end
|
78
|
-
|
79
|
-
#
|
80
|
-
# apps
|
81
|
-
#
|
82
|
-
|
83
|
-
def get_apps(filter: {}, includes: nil, limit: nil, sort: nil)
|
84
|
-
# GET
|
85
|
-
# https://appstoreconnect.apple.com/iris/v1/apps
|
86
|
-
params = build_params(filter: filter, includes: includes, limit: limit, sort: sort)
|
87
|
-
get("apps", params)
|
88
|
-
end
|
89
|
-
|
90
|
-
def get_app(app_id: nil, includes: nil)
|
91
|
-
# GET
|
92
|
-
# https://appstoreconnect.apple.com/iris/v1/apps/<app_id>
|
93
|
-
params = build_params(filter: nil, includes: includes, limit: nil, sort: nil)
|
94
|
-
get("apps/#{app_id}", params)
|
95
|
-
end
|
96
|
-
|
97
|
-
#
|
98
|
-
# betaAppLocalizations
|
99
|
-
#
|
100
|
-
|
101
|
-
def get_beta_app_localizations(filter: {}, includes: nil, limit: nil, sort: nil)
|
102
|
-
# GET
|
103
|
-
# https://appstoreconnect.apple.com/iris/v1/betaAppLocalizations?filter[app]=<app_id>
|
104
|
-
params = build_params(filter: filter, includes: includes, limit: limit, sort: sort)
|
105
|
-
get("betaAppLocalizations", params)
|
106
|
-
end
|
107
|
-
|
108
|
-
def post_beta_app_localizations(app_id: nil, attributes: {})
|
109
|
-
# POST
|
110
|
-
# https://appstoreconnect.apple.com/iris/v1/betaAppLocalizations
|
111
|
-
path = "betaAppLocalizations"
|
112
|
-
|
113
|
-
body = {
|
114
|
-
data: {
|
115
|
-
attributes: attributes,
|
116
|
-
type: "betaAppLocalizations",
|
117
|
-
relationships: {
|
118
|
-
app: {
|
119
|
-
data: {
|
120
|
-
type: "apps",
|
121
|
-
id: app_id
|
122
|
-
}
|
123
|
-
}
|
124
|
-
}
|
125
|
-
}
|
126
|
-
}
|
127
|
-
|
128
|
-
post(path, body)
|
129
|
-
end
|
130
|
-
|
131
|
-
def patch_beta_app_localizations(localization_id: nil, attributes: {})
|
132
|
-
# PATCH
|
133
|
-
# https://appstoreconnect.apple.com/iris/v1/apps/<app_id>/betaAppLocalizations/<localization_id>
|
134
|
-
path = "betaAppLocalizations/#{localization_id}"
|
135
|
-
|
136
|
-
body = {
|
137
|
-
data: {
|
138
|
-
attributes: attributes,
|
139
|
-
id: localization_id,
|
140
|
-
type: "betaAppLocalizations"
|
141
|
-
}
|
142
|
-
}
|
143
|
-
|
144
|
-
patch(path, body)
|
145
|
-
end
|
146
|
-
|
147
|
-
#
|
148
|
-
# betaAppReviewDetails
|
149
|
-
#
|
150
|
-
|
151
|
-
def get_beta_app_review_detail(filter: {}, includes: nil, limit: nil, sort: nil)
|
152
|
-
# GET
|
153
|
-
# https://appstoreconnect.apple.com/iris/v1/betaAppReviewDetails?filter[app]=<app_id>
|
154
|
-
params = build_params(filter: filter, includes: includes, limit: limit, sort: sort)
|
155
|
-
get("betaAppReviewDetails", params)
|
156
|
-
end
|
157
|
-
|
158
|
-
def patch_beta_app_review_detail(app_id: nil, attributes: {})
|
159
|
-
# PATCH
|
160
|
-
# https://appstoreconnect.apple.com/iris/v1/apps/<app_id>/betaAppReviewDetails
|
161
|
-
path = "betaAppReviewDetails/#{app_id}"
|
162
|
-
|
163
|
-
body = {
|
164
|
-
data: {
|
165
|
-
attributes: attributes,
|
166
|
-
id: app_id,
|
167
|
-
type: "betaAppReviewDetails"
|
168
|
-
}
|
169
|
-
}
|
170
|
-
|
171
|
-
patch(path, body)
|
172
|
-
end
|
173
|
-
|
174
|
-
#
|
175
|
-
# betaAppReviewSubmissions
|
176
|
-
#
|
177
|
-
|
178
|
-
def get_beta_app_review_submissions(filter: {}, includes: nil, limit: nil, sort: nil, cursor: nil)
|
179
|
-
# GET
|
180
|
-
# https://appstoreconnect.apple.com/iris/v1/betaAppReviewSubmissions
|
181
|
-
params = build_params(filter: filter, includes: includes, limit: limit, sort: sort, cursor: cursor)
|
182
|
-
get("betaAppReviewSubmissions", params)
|
183
|
-
end
|
184
|
-
|
185
|
-
def post_beta_app_review_submissions(build_id: nil)
|
186
|
-
# POST
|
187
|
-
# https://appstoreconnect.apple.com/iris/v1/betaAppReviewSubmissions
|
188
|
-
path = "betaAppReviewSubmissions"
|
189
|
-
body = {
|
190
|
-
data: {
|
191
|
-
type: "betaAppReviewSubmissions",
|
192
|
-
relationships: {
|
193
|
-
build: {
|
194
|
-
data: {
|
195
|
-
type: "builds",
|
196
|
-
id: build_id
|
197
|
-
}
|
198
|
-
}
|
199
|
-
}
|
200
|
-
}
|
201
|
-
}
|
202
|
-
|
203
|
-
post(path, body)
|
204
|
-
end
|
205
|
-
|
206
|
-
def delete_beta_app_review_submission(beta_app_review_submission_id: nil)
|
207
|
-
# DELETE
|
208
|
-
# https://appstoreconnect.apple.com/iris/v1/betaAppReviewSubmissions/<beta_app_review_submission_id>
|
209
|
-
params = build_params(filter: nil, includes: nil, limit: nil, sort: nil, cursor: nil)
|
210
|
-
delete("betaAppReviewSubmissions/#{beta_app_review_submission_id}", params)
|
211
|
-
end
|
212
|
-
|
213
|
-
#
|
214
|
-
# betaBuildLocalizations
|
215
|
-
#
|
216
|
-
|
217
|
-
def get_beta_build_localizations(filter: {}, includes: nil, limit: nil, sort: nil)
|
218
|
-
# GET
|
219
|
-
# https://appstoreconnect.apple.com/iris/v1/betaBuildLocalizations
|
220
|
-
path = "betaBuildLocalizations"
|
221
|
-
params = build_params(filter: filter, includes: includes, limit: limit, sort: sort)
|
222
|
-
get(path, params)
|
223
|
-
end
|
224
|
-
|
225
|
-
def post_beta_build_localizations(build_id: nil, attributes: {})
|
226
|
-
# POST
|
227
|
-
# https://appstoreconnect.apple.com/iris/v1/betaBuildLocalizations
|
228
|
-
path = "betaBuildLocalizations"
|
229
|
-
|
230
|
-
body = {
|
231
|
-
data: {
|
232
|
-
attributes: attributes,
|
233
|
-
type: "betaBuildLocalizations",
|
234
|
-
relationships: {
|
235
|
-
build: {
|
236
|
-
data: {
|
237
|
-
type: "builds",
|
238
|
-
id: build_id
|
239
|
-
}
|
240
|
-
}
|
241
|
-
}
|
242
|
-
}
|
243
|
-
}
|
244
|
-
|
245
|
-
post(path, body)
|
246
|
-
end
|
247
|
-
|
248
|
-
def patch_beta_build_localizations(localization_id: nil, feedbackEmail: nil, attributes: {})
|
249
|
-
# PATCH
|
250
|
-
# https://appstoreconnect.apple.com/iris/v1/apps/<app_id>/betaBuildLocalizations
|
251
|
-
path = "betaBuildLocalizations/#{localization_id}"
|
252
|
-
|
253
|
-
body = {
|
254
|
-
data: {
|
255
|
-
attributes: attributes,
|
256
|
-
id: localization_id,
|
257
|
-
type: "betaBuildLocalizations"
|
258
|
-
}
|
259
|
-
}
|
260
|
-
|
261
|
-
patch(path, body)
|
262
|
-
end
|
263
|
-
|
264
|
-
#
|
265
|
-
# betaBuildMetrics
|
266
|
-
#
|
267
|
-
|
268
|
-
def get_beta_build_metrics(filter: {}, includes: nil, limit: nil, sort: nil)
|
269
|
-
# GET
|
270
|
-
# https://appstoreconnect.apple.com/iris/v1/betaBuildMetrics
|
271
|
-
params = build_params(filter: filter, includes: includes, limit: limit, sort: sort)
|
272
|
-
get("betaBuildMetrics", params)
|
273
|
-
end
|
274
|
-
|
275
|
-
#
|
276
|
-
# betaGroups
|
277
|
-
#
|
278
|
-
|
279
|
-
def get_beta_groups(filter: {}, includes: nil, limit: nil, sort: nil)
|
280
|
-
# GET
|
281
|
-
# https://appstoreconnect.apple.com/iris/v1/betaGroups
|
282
|
-
params = build_params(filter: filter, includes: includes, limit: limit, sort: sort)
|
283
|
-
get("betaGroups", params)
|
284
|
-
end
|
285
|
-
|
286
|
-
def add_beta_groups_to_build(build_id: nil, beta_group_ids: [])
|
287
|
-
# POST
|
288
|
-
# https://appstoreconnect.apple.com/iris/v1/builds/<build_id>/relationships/betaGroups
|
289
|
-
path = "builds/#{build_id}/relationships/betaGroups"
|
290
|
-
body = {
|
291
|
-
data: beta_group_ids.map do |id|
|
292
|
-
{
|
293
|
-
type: "betaGroups",
|
294
|
-
id: id
|
295
|
-
}
|
296
|
-
end
|
297
|
-
}
|
298
|
-
|
299
|
-
post(path, body)
|
300
|
-
end
|
301
|
-
|
302
|
-
#
|
303
|
-
# betaTesters
|
304
|
-
#
|
305
|
-
|
306
|
-
def get_beta_testers(filter: {}, includes: nil, limit: nil, sort: nil)
|
307
|
-
# GET
|
308
|
-
# https://appstoreconnect.apple.com/iris/v1/betaTesters
|
309
|
-
params = build_params(filter: filter, includes: includes, limit: limit, sort: sort)
|
310
|
-
get("betaTesters", params)
|
311
|
-
end
|
312
|
-
|
313
|
-
# beta_testers - [{email: "", firstName: "", lastName: ""}]
|
314
|
-
def post_bulk_beta_tester_assignments(beta_group_id: nil, beta_testers: nil)
|
315
|
-
# POST
|
316
|
-
# https://appstoreconnect.apple.com/iris/v1/bulkBetaTesterAssignments
|
317
|
-
beta_testers || []
|
318
|
-
|
319
|
-
beta_testers.map do |tester|
|
320
|
-
tester[:errors] = []
|
321
|
-
end
|
322
|
-
|
323
|
-
body = {
|
324
|
-
data: {
|
325
|
-
attributes: {
|
326
|
-
betaTesters: beta_testers
|
327
|
-
},
|
328
|
-
relationships: {
|
329
|
-
betaGroup: {
|
330
|
-
data: {
|
331
|
-
type: "betaGroups",
|
332
|
-
id: beta_group_id
|
333
|
-
}
|
334
|
-
}
|
335
|
-
},
|
336
|
-
type: "bulkBetaTesterAssignments"
|
337
|
-
}
|
338
|
-
}
|
339
|
-
|
340
|
-
post("bulkBetaTesterAssignments", body)
|
341
|
-
end
|
342
|
-
|
343
|
-
def delete_beta_tester_from_apps(beta_tester_id: nil, app_ids: [])
|
344
|
-
# DELETE
|
345
|
-
# https://appstoreconnect.apple.com/iris/v1/betaTesters/<beta_tester_id>/relationships/apps
|
346
|
-
path = "betaTesters/#{beta_tester_id}/relationships/apps"
|
347
|
-
body = {
|
348
|
-
data: app_ids.map do |id|
|
349
|
-
{
|
350
|
-
type: "apps",
|
351
|
-
id: id
|
352
|
-
}
|
353
|
-
end
|
354
|
-
}
|
355
|
-
|
356
|
-
delete(path, nil, body)
|
357
|
-
end
|
358
|
-
|
359
|
-
def delete_beta_tester_from_beta_groups(beta_tester_id: nil, beta_group_ids: [])
|
360
|
-
# DELETE
|
361
|
-
# https://appstoreconnect.apple.com/iris/v1/betaTesters/<beta_tester_id>/relationships/betaGroups
|
362
|
-
path = "betaTesters/#{beta_tester_id}/relationships/betaGroups"
|
363
|
-
body = {
|
364
|
-
data: beta_group_ids.map do |id|
|
365
|
-
{
|
366
|
-
type: "betaGroups",
|
367
|
-
id: id
|
368
|
-
}
|
369
|
-
end
|
370
|
-
}
|
371
|
-
|
372
|
-
delete(path, nil, body)
|
373
|
-
end
|
374
|
-
|
375
|
-
#
|
376
|
-
# betaTesterMetrics
|
377
|
-
#
|
378
|
-
|
379
|
-
def get_beta_tester_metrics(filter: {}, includes: nil, limit: nil, sort: nil)
|
380
|
-
# GET
|
381
|
-
# https://appstoreconnect.apple.com/iris/v1/betaTesterMetrics
|
382
|
-
params = build_params(filter: filter, includes: includes, limit: limit, sort: sort)
|
383
|
-
get("betaTesterMetrics", params)
|
384
|
-
end
|
385
|
-
|
386
|
-
#
|
387
|
-
# builds
|
388
|
-
#
|
389
|
-
|
390
|
-
def get_builds(filter: {}, includes: "buildBetaDetail,betaBuildMetrics", limit: 10, sort: "uploadedDate", cursor: nil)
|
391
|
-
# GET
|
392
|
-
# https://appstoreconnect.apple.com/iris/v1/builds
|
393
|
-
params = build_params(filter: filter, includes: includes, limit: limit, sort: sort, cursor: cursor)
|
394
|
-
get("builds", params)
|
395
|
-
end
|
396
|
-
|
397
|
-
def get_build(build_id: nil, includes: nil)
|
398
|
-
# GET
|
399
|
-
# https://appstoreconnect.apple.com/iris/v1/builds/<build_id>?
|
400
|
-
params = build_params(filter: nil, includes: includes, limit: nil, sort: nil, cursor: nil)
|
401
|
-
get("builds/#{build_id}", params)
|
402
|
-
end
|
403
|
-
|
404
|
-
def patch_builds(build_id: nil, attributes: {})
|
405
|
-
# PATCH
|
406
|
-
# https://appstoreconnect.apple.com/iris/v1/builds/<build_id>
|
407
|
-
path = "builds/#{build_id}"
|
408
|
-
|
409
|
-
body = {
|
410
|
-
data: {
|
411
|
-
attributes: attributes,
|
412
|
-
id: build_id,
|
413
|
-
type: "builds"
|
414
|
-
}
|
415
|
-
}
|
416
|
-
|
417
|
-
patch(path, body)
|
418
|
-
end
|
419
|
-
|
420
|
-
#
|
421
|
-
# buildBetaDetails
|
422
|
-
#
|
423
|
-
|
424
|
-
def get_build_beta_details(filter: {}, includes: nil, limit: nil, sort: nil)
|
425
|
-
# GET
|
426
|
-
# https://appstoreconnect.apple.com/iris/v1/buildBetaDetails
|
427
|
-
params = build_params(filter: filter, includes: includes, limit: limit, sort: sort)
|
428
|
-
get("buildBetaDetails", params)
|
429
|
-
end
|
430
|
-
|
431
|
-
def patch_build_beta_details(build_beta_details_id: nil, attributes: {})
|
432
|
-
# PATCH
|
433
|
-
# https://appstoreconnect.apple.com/iris/v1/buildBetaDetails/<build_beta_details_id>
|
434
|
-
path = "buildBetaDetails/#{build_beta_details_id}"
|
435
|
-
|
436
|
-
body = {
|
437
|
-
data: {
|
438
|
-
attributes: attributes,
|
439
|
-
id: build_beta_details_id,
|
440
|
-
type: "buildBetaDetails"
|
441
|
-
}
|
442
|
-
}
|
443
|
-
|
444
|
-
patch(path, body)
|
445
|
-
end
|
446
|
-
|
447
|
-
#
|
448
|
-
# buildDeliveries
|
449
|
-
#
|
450
|
-
|
451
|
-
def get_build_deliveries(filter: {}, includes: nil, limit: nil, sort: nil)
|
452
|
-
# GET
|
453
|
-
# https://appstoreconnect.apple.com/iris/v1/buildDeliveries
|
454
|
-
params = build_params(filter: filter, includes: includes, limit: limit, sort: sort)
|
455
|
-
get("buildDeliveries", params)
|
456
|
-
end
|
457
|
-
|
458
|
-
#
|
459
|
-
# preReleaseVersions
|
460
|
-
#
|
461
|
-
|
462
|
-
def get_pre_release_versions(filter: {}, includes: nil, limit: nil, sort: nil)
|
463
|
-
# GET
|
464
|
-
# https://appstoreconnect.apple.com/iris/v1/preReleaseVersions
|
465
|
-
params = build_params(filter: filter, includes: includes, limit: limit, sort: sort)
|
466
|
-
get("preReleaseVersions", params)
|
467
|
-
end
|
468
|
-
|
469
|
-
#
|
470
|
-
# users
|
471
|
-
#
|
472
|
-
|
473
|
-
def get_users(filter: {}, includes: nil, limit: nil, sort: nil)
|
474
|
-
# GET
|
475
|
-
# https://appstoreconnect.apple.com/iris/v1/users
|
476
|
-
params = build_params(filter: filter, includes: includes, limit: limit, sort: sort)
|
477
|
-
get("users", params)
|
478
|
-
end
|
479
|
-
|
480
|
-
protected
|
481
|
-
|
482
|
-
def handle_response(response)
|
483
|
-
if (200...300).cover?(response.status) && (response.body.nil? || response.body.empty?)
|
484
|
-
return
|
485
|
-
end
|
486
|
-
|
487
|
-
raise InternalServerError, "Server error got #{response.status}" if (500...600).cover?(response.status)
|
488
|
-
|
489
|
-
unless response.body.kind_of?(Hash)
|
490
|
-
raise UnexpectedResponse, response.body
|
491
|
-
end
|
492
|
-
|
493
|
-
raise UnexpectedResponse, response.body['error'] if response.body['error']
|
494
|
-
|
495
|
-
raise UnexpectedResponse, handle_errors(response) if response.body['errors']
|
496
|
-
|
497
|
-
raise UnexpectedResponse, "Temporary App Store Connect error: #{response.body}" if response.body['statusCode'] == 'ERROR'
|
498
|
-
|
499
|
-
return Spaceship::ConnectAPI::Response.new(body: response.body, status: response.status)
|
500
|
-
end
|
501
|
-
|
502
|
-
def handle_errors(response)
|
503
|
-
# Example error format
|
504
|
-
# {
|
505
|
-
# "errors" : [ {
|
506
|
-
# "id" : "ce8c391e-f858-411b-a14b-5aa26e0915f2",
|
507
|
-
# "status" : "400",
|
508
|
-
# "code" : "PARAMETER_ERROR.INVALID",
|
509
|
-
# "title" : "A parameter has an invalid value",
|
510
|
-
# "detail" : "'uploadedDate3' is not a valid field name",
|
511
|
-
# "source" : {
|
512
|
-
# "parameter" : "sort"
|
513
|
-
# }
|
514
|
-
# } ]
|
515
|
-
# }
|
516
|
-
|
517
|
-
return response.body['errors'].map do |error|
|
518
|
-
"#{error['title']} - #{error['detail']}"
|
519
|
-
end.join(" ")
|
520
|
-
end
|
521
|
-
|
522
|
-
private
|
523
|
-
|
524
|
-
# used to assert all of the named parameters are supplied values
|
525
|
-
#
|
526
|
-
# @raises NameError if the values are nil
|
527
|
-
def assert_required_params(method_name, binding)
|
528
|
-
parameter_names = method(method_name).parameters.map { |_, v| v }
|
529
|
-
parameter_names.each do |name|
|
530
|
-
if local_variable_get(binding, name).nil?
|
531
|
-
raise NameError, "`#{name}' is a required parameter"
|
532
|
-
end
|
533
|
-
end
|
534
|
-
end
|
535
|
-
|
536
|
-
def local_variable_get(binding, name)
|
537
|
-
if binding.respond_to?(:local_variable_get)
|
538
|
-
binding.local_variable_get(name)
|
539
|
-
else
|
540
|
-
binding.eval(name.to_s)
|
541
|
-
end
|
542
|
-
end
|
543
|
-
|
544
|
-
def provider_id
|
545
|
-
return team_id if self.provider.nil?
|
546
|
-
self.provider.provider_id
|
547
|
-
end
|
548
|
-
end
|
549
|
-
end
|
550
|
-
# rubocop:enable Metrics/ClassLength
|
551
|
-
end
|