spaceship 0.13.1 → 0.14.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/spaceship/base.rb +1 -1
- data/lib/spaceship/portal/certificate.rb +1 -1
- data/lib/spaceship/portal/portal_client.rb +2 -2
- data/lib/spaceship/portal/ui/select_team.rb +3 -3
- data/lib/spaceship/tunes/app_version.rb +1 -1
- data/lib/spaceship/tunes/build.rb +1 -0
- data/lib/spaceship/tunes/build_train.rb +17 -1
- data/lib/spaceship/tunes/tunes_client.rb +34 -32
- data/lib/spaceship/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 370ec337b82d693b4f075578ab84890ab2902e5f
|
4
|
+
data.tar.gz: 5e2606ea51d5c94ef8ec6f4f965f30c33a791ef8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: df4dcbb65bea1cf44d5d67e2f07131970efef005f3467ea4d0311a1800496be35ba21478e10fb9fd6166670369ead31a2395163fef4db86f8f6523addb5fdd9f
|
7
|
+
data.tar.gz: ebb2ecb1788a9c54a0613faf5d313c6ee12616c5373b66641c8deb7cabce6fa72690f3bdc3cf4be2cf3b271c50191da9e1306500617b1b83c814b5eaef18e069
|
data/README.md
CHANGED
@@ -154,7 +154,7 @@ I won't go into too much technical details about the various API endpoints, but
|
|
154
154
|
- Managing apps
|
155
155
|
- Managing beta testers
|
156
156
|
- Submitting updates to review
|
157
|
-
-
|
157
|
+
- Managing app metadata
|
158
158
|
- `https://du-itc.itunesconnect.apple.com`:
|
159
159
|
- Upload icons, screenshots, trailers ...
|
160
160
|
|
data/lib/spaceship/base.rb
CHANGED
@@ -197,7 +197,7 @@ module Spaceship
|
|
197
197
|
# If this is called from a subclass of Certificate, this will
|
198
198
|
# only include certificates matching the current type.
|
199
199
|
def all
|
200
|
-
if
|
200
|
+
if self == Certificate # are we the base-class?
|
201
201
|
types = CERTIFICATE_TYPE_IDS.keys
|
202
202
|
else
|
203
203
|
types = [CERTIFICATE_TYPE_IDS.key(self)]
|
@@ -225,14 +225,14 @@ module Spaceship
|
|
225
225
|
end
|
226
226
|
end
|
227
227
|
|
228
|
-
def devices_by_class(
|
228
|
+
def devices_by_class(device_class)
|
229
229
|
paging do |page_number|
|
230
230
|
r = request(:post, 'account/ios/device/listDevices.action', {
|
231
231
|
teamId: team_id,
|
232
232
|
pageNumber: page_number,
|
233
233
|
pageSize: page_size,
|
234
234
|
sort: 'name=asc',
|
235
|
-
deviceClasses:
|
235
|
+
deviceClasses: device_class
|
236
236
|
})
|
237
237
|
parse_response(r, 'devices')
|
238
238
|
end
|
@@ -43,8 +43,8 @@ module Spaceship
|
|
43
43
|
# User provided a value, let's see if it's valid
|
44
44
|
teams.each_with_index do |team, i|
|
45
45
|
# There are 2 different values - one from the login page one from the Dev Team Page
|
46
|
-
return team['teamId'] if
|
47
|
-
return team['teamId'] if
|
46
|
+
return team['teamId'] if team['teamId'].strip == team_id
|
47
|
+
return team['teamId'] if team['currentTeamMember']['teamMemberId'].to_s.strip == team_id
|
48
48
|
end
|
49
49
|
puts "Couldn't find team with ID '#{team_id}'"
|
50
50
|
end
|
@@ -52,7 +52,7 @@ module Spaceship
|
|
52
52
|
if team_name.length > 0
|
53
53
|
# User provided a value, let's see if it's valid
|
54
54
|
teams.each_with_index do |team, i|
|
55
|
-
return team['teamId'] if
|
55
|
+
return team['teamId'] if team['name'].strip == team_name
|
56
56
|
end
|
57
57
|
puts "Couldn't find team with Name '#{team_name}'"
|
58
58
|
end
|
@@ -566,7 +566,7 @@ module Spaceship
|
|
566
566
|
expected_resolution = TunesClient.video_preview_resolution_for(device, is_portrait)
|
567
567
|
actual_resolution = Utilities.resolution(preview_screenshot_path)
|
568
568
|
orientation = is_portrait ? "portrait" : "landscape"
|
569
|
-
raise "Invalid #{orientation} screenshot resolution for device #{device}. Should be #{expected_resolution}" unless
|
569
|
+
raise "Invalid #{orientation} screenshot resolution for device #{device}. Should be #{expected_resolution}" unless actual_resolution == expected_resolution
|
570
570
|
end
|
571
571
|
|
572
572
|
def raw_data_details
|
@@ -72,13 +72,29 @@ module Spaceship
|
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
75
|
+
# @return (Spaceship::Tunes::Build) The latest build for this train, sorted by upload time.
|
76
|
+
def latest_build
|
77
|
+
@builds.max_by(&:upload_date)
|
78
|
+
end
|
79
|
+
|
75
80
|
# @param (testing_type) internal or external
|
76
|
-
def update_testing_status!(new_value, testing_type)
|
81
|
+
def update_testing_status!(new_value, testing_type, build = nil)
|
77
82
|
data = client.build_trains(self.application.apple_id, testing_type)
|
78
83
|
|
84
|
+
build ||= latest_build if testing_type == 'external'
|
85
|
+
|
79
86
|
data['trains'].each do |train|
|
80
87
|
train["#{testing_type}Testing"]['value'] = false
|
81
88
|
train["#{testing_type}Testing"]['value'] = new_value if train['versionString'] == version_string
|
89
|
+
|
90
|
+
# also update the builds
|
91
|
+
train['builds'].each do |b|
|
92
|
+
next if b["#{testing_type}Testing"].nil?
|
93
|
+
next if build.nil?
|
94
|
+
next if b["buildVersion"] != build.build_version
|
95
|
+
b["#{testing_type}Testing"]['value'] = false
|
96
|
+
b["#{testing_type}Testing"]['value'] = new_value if b['trainVersion'] == version_string
|
97
|
+
end
|
82
98
|
end
|
83
99
|
|
84
100
|
result = client.update_build_trains!(application.apple_id, testing_type, data)
|
@@ -38,33 +38,39 @@ module Spaceship
|
|
38
38
|
"https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa/"
|
39
39
|
end
|
40
40
|
|
41
|
-
#
|
42
|
-
def
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
41
|
+
# returns wosinst, wosid and itctx
|
42
|
+
def login_overhead_cookies(myacinfo)
|
43
|
+
return @login_overhead_cookies if @login_overhead_cookies
|
44
|
+
|
45
|
+
response = request(:get, "https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa/wa/route?noext") # for woinst and wosid
|
46
|
+
cookies = {
|
47
|
+
woinst: response['Set-Cookie'].match(/woinst=([^;]*)/)[1],
|
48
|
+
wosid: response['Set-Cookie'].match(/wosid=([^;]*)/)[1],
|
49
|
+
myacinfo: myacinfo
|
50
|
+
}
|
49
51
|
|
50
|
-
|
51
|
-
|
52
|
-
url
|
53
|
-
|
54
|
-
|
55
|
-
File.write(cache_path, url)
|
56
|
-
return url
|
57
|
-
rescue => ex
|
58
|
-
puts ex
|
59
|
-
raise "Could not fetch the login URL from iTunes Connect, the server might be down"
|
52
|
+
# The second request has to be after getting the woinst and wois
|
53
|
+
woa = request(:get) do |req|
|
54
|
+
req.url "https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa"
|
55
|
+
req.headers["Cookie"] = cookies.collect { |k, v| "#{k}=#{v}; " }.join("")
|
60
56
|
end
|
57
|
+
cookies[:itctx] = woa['Set-Cookie'].match(/itctx=([^;]*)/)[1]
|
58
|
+
|
59
|
+
return @login_overhead_cookies ||= cookies
|
61
60
|
end
|
62
61
|
|
63
62
|
def send_login_request(user, password)
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
63
|
+
data = {
|
64
|
+
accountName: user,
|
65
|
+
password: password,
|
66
|
+
rememberMe: true
|
67
|
+
}
|
68
|
+
|
69
|
+
response = request(:post) do |req|
|
70
|
+
req.url "https://idmsa.apple.com/appleauth/auth/signin"
|
71
|
+
req.body = data.to_json
|
72
|
+
req.headers['Content-Type'] = 'application/json'
|
73
|
+
end
|
68
74
|
|
69
75
|
if response['Set-Cookie'] =~ /myacinfo=(\w+);/
|
70
76
|
# To use the session properly we'll need the following cookies:
|
@@ -74,15 +80,10 @@ module Spaceship
|
|
74
80
|
# - itctx
|
75
81
|
begin
|
76
82
|
re = response['Set-Cookie']
|
83
|
+
myacinfo = re.match(/myacinfo=([^;]*)/)[1]
|
84
|
+
cookies = login_overhead_cookies(myacinfo)
|
77
85
|
|
78
|
-
|
79
|
-
"myacinfo=" + re.match(/myacinfo=([^;]*)/)[1],
|
80
|
-
"woinst=" + re.match(/woinst=([^;]*)/)[1],
|
81
|
-
"itctx=" + re.match(/itctx=([^;]*)/)[1],
|
82
|
-
"wosid=" + re.match(/wosid=([^;]*)/)[1]
|
83
|
-
]
|
84
|
-
|
85
|
-
@cookie = to_use.join(';')
|
86
|
+
@cookie = cookies.collect { |k, v| "#{k}=#{v}; " }.join("")
|
86
87
|
rescue
|
87
88
|
raise ITunesConnectError.new, [response.body, response['Set-Cookie']].join("\n")
|
88
89
|
end
|
@@ -499,7 +500,6 @@ module Spaceship
|
|
499
500
|
handle_itc_response(r.body)
|
500
501
|
end
|
501
502
|
|
502
|
-
# rubocop:disable Metrics/AbcSize
|
503
503
|
def submit_testflight_build_for_review!( # Required:
|
504
504
|
app_id: nil,
|
505
505
|
train: nil,
|
@@ -514,6 +514,7 @@ module Spaceship
|
|
514
514
|
last_name: nil,
|
515
515
|
review_email: nil,
|
516
516
|
phone_number: nil,
|
517
|
+
significant_change: false,
|
517
518
|
|
518
519
|
# Optional Metadata:
|
519
520
|
privacy_policy_url: nil,
|
@@ -540,6 +541,7 @@ module Spaceship
|
|
540
541
|
current['privacyPolicyUrl']['value'] = privacy_policy_url
|
541
542
|
current['pageLanguageValue'] = current['language'] # There is no valid reason why we need this, only iTC being iTC
|
542
543
|
end
|
544
|
+
build_info['significantChange']['value'] = significant_change
|
543
545
|
build_info['testInfo']['reviewFirstName']['value'] = first_name
|
544
546
|
build_info['testInfo']['reviewLastName']['value'] = last_name
|
545
547
|
build_info['testInfo']['reviewPhone']['value'] = phone_number
|
@@ -559,6 +561,7 @@ module Spaceship
|
|
559
561
|
# only sometimes this is required
|
560
562
|
|
561
563
|
encryption_info['usesEncryption']['value'] = encryption
|
564
|
+
encryption_info['encryptionUpdated']['value'] = encryption
|
562
565
|
|
563
566
|
r = request(:post) do |req|
|
564
567
|
req.url "ra/apps/#{app_id}/trains/#{train}/builds/#{build_number}/submit/complete"
|
@@ -569,7 +572,6 @@ module Spaceship
|
|
569
572
|
handle_itc_response(r.body)
|
570
573
|
end
|
571
574
|
end
|
572
|
-
# rubocop:enable Metrics/AbcSize
|
573
575
|
|
574
576
|
#####################################################
|
575
577
|
# @!group Submit for Review
|
data/lib/spaceship/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spaceship
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.14.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Felix Krause
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-11-
|
12
|
+
date: 2015-11-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: credentials_manager
|
@@ -314,7 +314,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
314
314
|
version: '0'
|
315
315
|
requirements: []
|
316
316
|
rubyforge_project:
|
317
|
-
rubygems_version: 2.
|
317
|
+
rubygems_version: 2.4.0
|
318
318
|
signing_key:
|
319
319
|
specification_version: 4
|
320
320
|
summary: Because you would rather spend your time building stuff than fighting provisioning
|