fastlane 2.150.0.rc3 → 2.150.0.rc4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9d404f18ab2b675e5d8d87a50231b245945e7190325f1b73baf33b940364fb5e
4
- data.tar.gz: 268835faf3d58aa4d0707b31ae7606bd1b986ded00b2b22f51bfbb538fa334df
3
+ metadata.gz: f736bd9272a03db4f9c52dcb3f3cbe1cc21b3f78221a8a27849a0801ad791177
4
+ data.tar.gz: 61ea559625a0a4fd290774205aecfec2754b7f7a6f4264a3775b51145fd6169e
5
5
  SHA512:
6
- metadata.gz: 803a021579a5478e8a136b72d3ea7623df1fc29b838c5f4a50be7a86dbf790bfc462f2724258fd96939ac9235a3a3ec8f30636ed04b4b42eec9f34395992cc97
7
- data.tar.gz: 377de10f8a84594b91a35c1e1749235aa7d61cd159d197a95955d9b297f687d28164ec26536824ff9aaef44d2c4d0436674262a008bf44e9af917e04e08c5ccd
6
+ metadata.gz: 769baf252715d93327440d48a152c53bd5f532741f5d9118e04cc09433b1fcd654d0d68973d8c0376e979fda909f0264e6f9e61e9dd66d4d9dacc5027f4ba87b
7
+ data.tar.gz: 3ee6471846ffcdd74dc4e953822aed04fd05caf5ad03ee1f242d486a3197c66168fda158b9b417831b3221e8782b039bda4d59016653be9416c977691d24effb
@@ -1,4 +1,5 @@
1
1
  require 'spaceship/tunes/tunes'
2
+ require 'digest/md5'
2
3
 
3
4
  require_relative 'app_screenshot'
4
5
  require_relative 'module'
@@ -91,6 +92,10 @@ module Deliver
91
92
  localizations = version.get_app_store_version_localizations
92
93
  end
93
94
 
95
+ upload_screenshots(screenshots_per_language, localizations)
96
+ end
97
+
98
+ def upload_screenshots(screenshots_per_language, localizations)
94
99
  # Upload screenshots
95
100
  indized = {} # per language and device type
96
101
 
@@ -114,7 +119,13 @@ module Deliver
114
119
  app_screenshot_sets_map[app_screenshot_set.screenshot_display_type] = app_screenshot_set
115
120
 
116
121
  # Set initial screnshot count
117
- indized[localization.locale][app_screenshot_set.screenshot_display_type] ||= app_screenshot_set.app_screenshots.size
122
+ indized[localization.locale][app_screenshot_set.screenshot_display_type] ||= {
123
+ count: app_screenshot_set.app_screenshots.size,
124
+ checksums: []
125
+ }
126
+
127
+ checksums = app_screenshot_set.app_screenshots.map(&:source_file_checksum).uniq
128
+ indized[localization.locale][app_screenshot_set.screenshot_display_type][:checksums] = checksums
118
129
  end
119
130
 
120
131
  UI.message("Uploading #{screenshots_for_language.length} screenshots for language #{language}")
@@ -133,21 +144,30 @@ module Deliver
133
144
  })
134
145
  app_screenshot_sets_map[display_type] = set
135
146
 
136
- indized[localization.locale][set.screenshot_display_type] = 0
147
+ indized[localization.locale][set.screenshot_display_type] = {
148
+ count: 0,
149
+ checksums: []
150
+ }
137
151
  end
138
152
 
139
- index = indized[localization.locale][set.screenshot_display_type]
153
+ index = indized[localization.locale][set.screenshot_display_type][:count]
140
154
 
141
155
  if index >= 10
142
- UI.error("Too many screenshots found for device '#{screenshot.formatted_name}' in '#{screenshot.language}', skipping this one (#{screenshot.path})")
156
+ UI.error("Too many screenshots found for device '#{screenshot.device_type}' in '#{screenshot.language}', skipping this one (#{screenshot.path})")
143
157
  next
144
158
  end
145
159
 
146
- indized[localization.locale][set.screenshot_display_type] += 1
160
+ bytes = File.binread(screenshot.path)
161
+ checksum = Digest::MD5.hexdigest(bytes)
162
+ duplicate = indized[localization.locale][set.screenshot_display_type][:checksums].include?(checksum)
147
163
 
148
- # Also.. what is the messages type even for?
149
- UI.message("Uploading '#{screenshot.path}'...")
150
- set.upload_screenshot(path: screenshot.path)
164
+ if duplicate
165
+ UI.message("Previous uploaded. Skipping '#{screenshot.path}'...")
166
+ else
167
+ indized[localization.locale][set.screenshot_display_type][:count] += 1
168
+ UI.message("Uploading '#{screenshot.path}'...")
169
+ set.upload_screenshot(path: screenshot.path)
170
+ end
151
171
  end
152
172
  end
153
173
  UI.success("Successfully uploaded screenshots to App Store Connect")
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
- VERSION = '2.150.0.rc3'.freeze
2
+ VERSION = '2.150.0.rc4'.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
  RUBOCOP_REQUIREMENT = '0.49.1'.freeze
@@ -239,64 +239,101 @@ module FastlaneCore
239
239
  # escaping problems in its accompanying shell script.
240
240
  class JavaTransporterExecutor < TransporterExecutor
241
241
  def build_upload_command(username, password, source = "/tmp", provider_short_name = "")
242
- [
243
- Helper.transporter_java_executable_path.shellescape,
244
- "-Djava.ext.dirs=#{Helper.transporter_java_ext_dir.shellescape}",
245
- '-XX:NewSize=2m',
246
- '-Xms32m',
247
- '-Xmx1024m',
248
- '-Xms1024m',
249
- '-Djava.awt.headless=true',
250
- '-Dsun.net.http.retryPost=false',
251
- java_code_option,
252
- '-m upload',
253
- "-u #{username.shellescape}",
254
- "-p #{password.shellescape}",
255
- "-f #{source.shellescape}",
256
- additional_upload_parameters, # that's here, because the user might overwrite the -t option
257
- '-k 100000',
258
- ("-itc_provider #{provider_short_name}" unless provider_short_name.to_s.empty?),
259
- '2>&1' # cause stderr to be written to stdout
260
- ].compact.join(' ') # compact gets rid of the possibly nil ENV value
242
+ if Helper.mac? && Helper.xcode_at_least?(11)
243
+ [
244
+ 'xcrun iTMSTransporter',
245
+ '-m upload',
246
+ "-u #{username.shellescape}",
247
+ "-p #{password.shellescape}",
248
+ "-f #{source.shellescape}",
249
+ additional_upload_parameters, # that's here, because the user might overwrite the -t option
250
+ '-k 100000',
251
+ ("-itc_provider #{provider_short_name}" unless provider_short_name.to_s.empty?),
252
+ '2>&1' # cause stderr to be written to stdout
253
+ ].compact.join(' ') # compact gets rid of the possibly nil ENV value
254
+ else
255
+ [
256
+ Helper.transporter_java_executable_path.shellescape,
257
+ "-Djava.ext.dirs=#{Helper.transporter_java_ext_dir.shellescape}",
258
+ '-XX:NewSize=2m',
259
+ '-Xms32m',
260
+ '-Xmx1024m',
261
+ '-Xms1024m',
262
+ '-Djava.awt.headless=true',
263
+ '-Dsun.net.http.retryPost=false',
264
+ java_code_option,
265
+ '-m upload',
266
+ "-u #{username.shellescape}",
267
+ "-p #{password.shellescape}",
268
+ "-f #{source.shellescape}",
269
+ additional_upload_parameters, # that's here, because the user might overwrite the -t option
270
+ '-k 100000',
271
+ ("-itc_provider #{provider_short_name}" unless provider_short_name.to_s.empty?),
272
+ '2>&1' # cause stderr to be written to stdout
273
+ ].compact.join(' ') # compact gets rid of the possibly nil ENV value
274
+ end
261
275
  end
262
276
 
263
277
  def build_download_command(username, password, apple_id, destination = "/tmp", provider_short_name = "")
264
- [
265
- Helper.transporter_java_executable_path.shellescape,
266
- "-Djava.ext.dirs=#{Helper.transporter_java_ext_dir.shellescape}",
267
- '-XX:NewSize=2m',
268
- '-Xms32m',
269
- '-Xmx1024m',
270
- '-Xms1024m',
271
- '-Djava.awt.headless=true',
272
- '-Dsun.net.http.retryPost=false',
273
- java_code_option,
274
- '-m lookupMetadata',
275
- "-u #{username.shellescape}",
276
- "-p #{password.shellescape}",
277
- "-apple_id #{apple_id.shellescape}",
278
- "-destination #{destination.shellescape}",
279
- ("-itc_provider #{provider_short_name}" unless provider_short_name.to_s.empty?),
280
- '2>&1' # cause stderr to be written to stdout
281
- ].compact.join(' ')
278
+ if Helper.mac? && Helper.xcode_at_least?(11)
279
+ [
280
+ 'xcrun iTMSTransporter',
281
+ '-m lookupMetadata',
282
+ "-u #{username.shellescape}",
283
+ "-p #{password.shellescape}",
284
+ "-apple_id #{apple_id.shellescape}",
285
+ "-destination #{destination.shellescape}",
286
+ ("-itc_provider #{provider_short_name}" unless provider_short_name.to_s.empty?),
287
+ '2>&1' # cause stderr to be written to stdout
288
+ ].compact.join(' ')
289
+ else
290
+ [
291
+ Helper.transporter_java_executable_path.shellescape,
292
+ "-Djava.ext.dirs=#{Helper.transporter_java_ext_dir.shellescape}",
293
+ '-XX:NewSize=2m',
294
+ '-Xms32m',
295
+ '-Xmx1024m',
296
+ '-Xms1024m',
297
+ '-Djava.awt.headless=true',
298
+ '-Dsun.net.http.retryPost=false',
299
+ java_code_option,
300
+ '-m lookupMetadata',
301
+ "-u #{username.shellescape}",
302
+ "-p #{password.shellescape}",
303
+ "-apple_id #{apple_id.shellescape}",
304
+ "-destination #{destination.shellescape}",
305
+ ("-itc_provider #{provider_short_name}" unless provider_short_name.to_s.empty?),
306
+ '2>&1' # cause stderr to be written to stdout
307
+ ].compact.join(' ')
308
+ end
282
309
  end
283
310
 
284
311
  def build_provider_ids_command(username, password)
285
- [
286
- Helper.transporter_java_executable_path.shellescape,
287
- "-Djava.ext.dirs=#{Helper.transporter_java_ext_dir.shellescape}",
288
- '-XX:NewSize=2m',
289
- '-Xms32m',
290
- '-Xmx1024m',
291
- '-Xms1024m',
292
- '-Djava.awt.headless=true',
293
- '-Dsun.net.http.retryPost=false',
294
- java_code_option,
295
- '-m provider',
296
- "-u #{username.shellescape}",
297
- "-p #{password.shellescape}",
298
- '2>&1' # cause stderr to be written to stdout
299
- ].compact.join(' ')
312
+ if Helper.mac? && Helper.xcode_at_least?(11)
313
+ [
314
+ 'xcrun iTMSTransporter',
315
+ '-m provider',
316
+ "-u #{username.shellescape}",
317
+ "-p #{password.shellescape}",
318
+ '2>&1' # cause stderr to be written to stdout
319
+ ].compact.join(' ')
320
+ else
321
+ [
322
+ Helper.transporter_java_executable_path.shellescape,
323
+ "-Djava.ext.dirs=#{Helper.transporter_java_ext_dir.shellescape}",
324
+ '-XX:NewSize=2m',
325
+ '-Xms32m',
326
+ '-Xmx1024m',
327
+ '-Xms1024m',
328
+ '-Djava.awt.headless=true',
329
+ '-Dsun.net.http.retryPost=false',
330
+ java_code_option,
331
+ '-m provider',
332
+ "-u #{username.shellescape}",
333
+ "-p #{password.shellescape}",
334
+ '2>&1' # cause stderr to be written to stdout
335
+ ].compact.join(' ')
336
+ end
300
337
  end
301
338
 
302
339
  def java_code_option
@@ -2,10 +2,12 @@ require 'faraday' # HTTP Client
2
2
  require 'faraday-cookie_jar'
3
3
  require 'faraday_middleware'
4
4
 
5
+ require 'spaceship/globals'
6
+
5
7
  module Spaceship
6
8
  class ConnectAPI
7
9
  module FileUploader
8
- def self.upload(upload_operation, payload)
10
+ def self.upload(upload_operations, bytes)
9
11
  # {
10
12
  # "method": "PUT",
11
13
  # "url": "https://some-url-apple-gives-us",
@@ -19,17 +21,47 @@ module Spaceship
19
21
  # ]
20
22
  # }
21
23
 
22
- headers = {}
23
- upload_operation["requestHeaders"].each do |hash|
24
- headers[hash["name"]] = hash["value"]
24
+ upload_operations.each_with_index do |upload_operation, index|
25
+ headers = {}
26
+ upload_operation["requestHeaders"].each do |hash|
27
+ headers[hash["name"]] = hash["value"]
28
+ end
29
+
30
+ offset = upload_operation["offset"]
31
+ length = upload_operation["length"]
32
+
33
+ puts("Uploading file (part #{index + 1})...") if Spaceship::Globals.verbose?
34
+ with_retry do
35
+ client.send(
36
+ upload_operation["method"].downcase,
37
+ upload_operation["url"],
38
+ bytes[offset, length],
39
+ headers
40
+ )
41
+ end
25
42
  end
43
+ puts("Uploading complete!") if Spaceship::Globals.verbose?
44
+ end
26
45
 
27
- client.send(
28
- upload_operation["method"].downcase,
29
- upload_operation["url"],
30
- payload,
31
- headers
32
- )
46
+ def self.with_retry(tries = 5, &_block)
47
+ tries = 1 if Object.const_defined?("SpecHelper")
48
+ response = yield
49
+
50
+ tries -= 1
51
+
52
+ unless (200...300).cover?(response.status)
53
+ msg = "Received status of #{response.status}! Retrying after 3 seconds (remaining: #{tries})..."
54
+ raise msg
55
+ end
56
+
57
+ return response
58
+ rescue => error
59
+ puts(error) if Spaceship::Globals.verbose?
60
+ if tries.zero?
61
+ raise "Failed to upload file after retries... Received #{response.status}"
62
+ else
63
+ retry
64
+ end
33
65
  end
34
66
 
35
67
  def self.client
@@ -95,7 +95,7 @@ module Spaceship
95
95
  return value if new_value.nil?
96
96
  return new_value
97
97
  else
98
- return LEGACY_RATING_VALUE_ITC_MAP[value]
98
+ return LEGACY_RATING_VALUE_ITC_MAP[value] || value
99
99
  end
100
100
 
101
101
  return value
@@ -82,10 +82,13 @@ module Spaceship
82
82
  Spaceship::ConnectAPI::AppInfo::AppStoreState::PREPARE_FOR_SUBMISSION,
83
83
  Spaceship::ConnectAPI::AppInfo::AppStoreState::DEVELOPER_REJECTED,
84
84
  Spaceship::ConnectAPI::AppInfo::AppStoreState::REJECTED,
85
- Spaceship::ConnectAPI::AppInfo::AppStoreState::METADATA_REJECTED
85
+ Spaceship::ConnectAPI::AppInfo::AppStoreState::METADATA_REJECTED,
86
+ Spaceship::ConnectAPI::AppInfo::AppStoreState::WAITING_FOR_REVIEW,
87
+ Spaceship::ConnectAPI::AppInfo::AppStoreState::INVALID_BINARY
86
88
  ]
87
89
 
88
- resp = Spaceship::ConnectAPI.get_app_infos(app_id: id)
90
+ filter = { app: id }
91
+ resp = Spaceship::ConnectAPI.get_app_infos(filter: filter)
89
92
  return resp.to_models.select do |model|
90
93
  states.include?(model.app_store_state)
91
94
  end.first
@@ -144,7 +147,9 @@ module Spaceship
144
147
  Spaceship::ConnectAPI::AppStoreVersion::AppStoreState::PREPARE_FOR_SUBMISSION,
145
148
  Spaceship::ConnectAPI::AppStoreVersion::AppStoreState::DEVELOPER_REJECTED,
146
149
  Spaceship::ConnectAPI::AppStoreVersion::AppStoreState::REJECTED,
147
- Spaceship::ConnectAPI::AppStoreVersion::AppStoreState::METADATA_REJECTED
150
+ Spaceship::ConnectAPI::AppStoreVersion::AppStoreState::METADATA_REJECTED,
151
+ Spaceship::ConnectAPI::AppStoreVersion::AppStoreState::WAITING_FOR_REVIEW,
152
+ Spaceship::ConnectAPI::AppStoreVersion::AppStoreState::INVALID_BINARY
148
153
  ].join(","),
149
154
  platform: platform
150
155
  }
@@ -16,6 +16,7 @@ module Spaceship
16
16
  REJECTED = "REJECTED"
17
17
  PREPARE_FOR_SUBMISSION = "PREPARE_FOR_SUBMISSION"
18
18
  METADATA_REJECTED = "METADATA_REJECTED"
19
+ INVALID_BINARY = "INVALID_BINARY"
19
20
  end
20
21
 
21
22
  module AppStoreAgeRating
@@ -1,5 +1,8 @@
1
1
  require_relative '../model'
2
2
  require_relative '../file_uploader'
3
+ require 'spaceship/globals'
4
+
5
+ require 'digest/md5'
3
6
 
4
7
  module Spaceship
5
8
  class ConnectAPI
@@ -34,39 +37,88 @@ module Spaceship
34
37
  return "appPreviews"
35
38
  end
36
39
 
40
+ def complete?
41
+ (asset_delivery_state || {})["state"] == "COMPLETE"
42
+ end
43
+
37
44
  #
38
45
  # API
39
46
  #
40
47
 
41
- def self.create(app_preview_set_id: nil, path: nil)
48
+ def self.get(app_preview_id: nil)
49
+ Spaceship::ConnectAPI.get_app_preview(app_preview_id: app_preview_id).first
50
+ end
51
+
52
+ # Creates an AppPreview in an AppPreviewSet
53
+ # Setting the optional frame_time_code will force polling until video is done processing
54
+ # @param app_preview_set_id The AppPreviewSet id
55
+ # @param path The path of the file
56
+ # @param frame_time_code The time code for the preview still frame (ex: "00:00:07:01")
57
+ def self.create(app_preview_set_id: nil, path: nil, frame_time_code: nil)
42
58
  require 'faraday'
43
59
 
44
60
  filename = File.basename(path)
45
61
  filesize = File.size(path)
46
- payload = File.binread(path)
62
+ bytes = File.binread(path)
47
63
 
48
64
  post_attributes = {
49
65
  fileSize: filesize,
50
66
  fileName: filename
51
67
  }
52
68
 
53
- post_resp = Spaceship::ConnectAPI.post_app_preview(
69
+ # Create placeholder
70
+ preview = Spaceship::ConnectAPI.post_app_preview(
54
71
  app_preview_set_id: app_preview_set_id,
55
72
  attributes: post_attributes
56
73
  ).to_models.first
57
74
 
58
- upload_operation = post_resp.upload_operations.first
59
- Spaceship::ConnectAPI::FileUploader.upload(upload_operation, payload)
75
+ # Upload the file
76
+ upload_operations = preview.upload_operations
77
+ Spaceship::ConnectAPI::FileUploader.upload(upload_operations, bytes)
60
78
 
79
+ # Update file uploading complete
61
80
  patch_attributes = {
62
81
  uploaded: true,
63
- sourceFileChecksum: "checksum-holder"
82
+ sourceFileChecksum: Digest::MD5.hexdigest(bytes)
64
83
  }
65
84
 
66
- Spaceship::ConnectAPI.patch_app_preview(
67
- app_preview_id: post_resp.id,
68
- attributes: patch_attributes
69
- ).to_models.first
85
+ begin
86
+ preview = Spaceship::ConnectAPI.patch_app_preview(
87
+ app_preview_id: preview.id,
88
+ attributes: patch_attributes
89
+ ).to_models.first
90
+ rescue => error
91
+ puts("Failed to patch app preview. Update may have gone through so verifying") if Spaceship::Globals.verbose?
92
+
93
+ preview = Spaceship::ConnectAPI::AppPreview.get(app_preview_id: preview.id)
94
+ raise error unless preview.complete?
95
+ end
96
+
97
+ # Poll for video processing completion to set still frame time
98
+ unless frame_time_code.nil?
99
+ loop do
100
+ unless preview.video_url.nil?
101
+ puts("Preview processing complete!") if Spaceship::Globals.verbose?
102
+ preview = preview.update(attributes: {
103
+ previewFrameTimeCode: frame_time_code
104
+ })
105
+ puts("Updated preview frame time code!") if Spaceship::Globals.verbose?
106
+ break
107
+ end
108
+
109
+ sleep_time = 30
110
+ puts("Waiting #{sleep_time} seconds before checking status of processing...") if Spaceship::Globals.verbose?
111
+ sleep(sleep_time)
112
+
113
+ preview = Spaceship::ConnectAPI::AppPreview.get(app_preview_id: preview.id)
114
+ end
115
+ end
116
+
117
+ preview
118
+ end
119
+
120
+ def update(attributes: nil)
121
+ Spaceship::ConnectAPI.patch_app_preview(app_preview_id: id, attributes: attributes)
70
122
  end
71
123
 
72
124
  def delete!(filter: {}, includes: nil, limit: nil, sort: nil)
@@ -63,8 +63,8 @@ module Spaceship
63
63
  return resp.to_models
64
64
  end
65
65
 
66
- def upload_preview(path: nil)
67
- return Spaceship::ConnectAPI::AppPreview.create(app_preview_set_id: id, path: path)
66
+ def upload_preview(path: nil, frame_time_code: nil)
67
+ return Spaceship::ConnectAPI::AppPreview.create(app_preview_set_id: id, path: path, frame_time_code: frame_time_code)
68
68
  end
69
69
  end
70
70
  end
@@ -1,4 +1,7 @@
1
1
  require_relative '../model'
2
+ require_relative '../file_uploader'
3
+ require 'digest/md5'
4
+
2
5
  module Spaceship
3
6
  class ConnectAPI
4
7
  class AppReviewAttachment
@@ -31,46 +34,33 @@ module Spaceship
31
34
 
32
35
  filename = File.basename(path)
33
36
  filesize = File.size(path)
34
- payload = File.binread(path)
37
+ bytes = File.binread(path)
35
38
 
36
39
  post_attributes = {
37
40
  fileSize: filesize,
38
41
  fileName: filename
39
42
  }
40
43
 
41
- post_resp = Spaceship::ConnectAPI.post_app_review_attachment(app_store_review_detail_id: app_store_review_detail_id, attributes: post_attributes).to_models.first
42
-
43
- # {
44
- # "method": "PUT",
45
- # "url": "https://some-url-apple-gives-us",
46
- # "length": 57365,
47
- # "offset": 0,
48
- # "requestHeaders": [
49
- # {
50
- # "name": "Content-Type",
51
- # "value": "image/png"
52
- # }
53
- # ]
54
- # }
55
- upload_operation = post_resp.upload_operations.first
56
-
57
- headers = {}
58
- upload_operation["requestHeaders"].each do |hash|
59
- headers[hash["name"]] = hash["value"]
60
- end
44
+ # Create placeholder
45
+ attachment = Spaceship::ConnectAPI.post_app_review_attachment(
46
+ app_store_review_detail_id: app_store_review_detail_id,
47
+ attributes: post_attributes
48
+ ).to_models.first
61
49
 
62
- Faraday.put(
63
- upload_operation["url"],
64
- payload,
65
- headers
66
- )
50
+ # Upload the file
51
+ upload_operations = attachment.upload_operations
52
+ Spaceship::ConnectAPI::FileUploader.upload(upload_operations, bytes)
67
53
 
54
+ # Update file uploading complete
68
55
  patch_attributes = {
69
56
  uploaded: true,
70
- sourceFileChecksum: "checksum-holder"
57
+ sourceFileChecksum: Digest::MD5.hexdigest(bytes)
71
58
  }
72
59
 
73
- Spaceship::ConnectAPI.patch_app_review_attachment(app_review_attachment_id: post_resp.id, attributes: patch_attributes).to_models.first
60
+ Spaceship::ConnectAPI.patch_app_review_attachment(
61
+ app_review_attachment_id: attachment.id,
62
+ attributes: patch_attributes
63
+ ).to_models.first
74
64
  end
75
65
 
76
66
  def delete!(filter: {}, includes: nil, limit: nil, sort: nil)
@@ -1,5 +1,8 @@
1
1
  require_relative '../model'
2
2
  require_relative '../file_uploader'
3
+ require 'spaceship/globals'
4
+
5
+ require 'digest/md5'
3
6
 
4
7
  module Spaceship
5
8
  class ConnectAPI
@@ -15,36 +18,6 @@ module Spaceship
15
18
  attr_accessor :asset_delivery_state
16
19
  attr_accessor :uploaded
17
20
 
18
- # "fileSize": 92542,
19
- # "fileName": "ftl_3241d62418767c0aa9b889b020c4f8db_45455763d4aaf7b18ee0045bc787f3de.png",
20
- # "sourceFileChecksum": "c237fd7852ed8f9285d16d9a28d2ec25",
21
- # "imageAsset": {
22
- # "templateUrl": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/61/18/68/61186886-b234-5bd0-1f4a-563124f18511/pr_source.png/{w}x{h}bb.{f}",
23
- # "width": 2048,
24
- # "height": 2732
25
- # },
26
- # "assetToken": "Purple113/v4/61/18/68/61186886-b234-5bd0-1f4a-563124f18511/pr_source.png",
27
- # "assetType": "SortedJ99ScreenShot",
28
- # "uploadOperations": null,
29
- # "assetDeliveryState": {
30
- # "errors": [],
31
- # "warnings": null,
32
- # "state": "COMPLETE"
33
- # },
34
- # "uploaded": null
35
-
36
- # "assetDeliveryState": {
37
- # "errors": [],
38
- # "warnings": null,
39
- # "state": "AWAITING_UPLOAD"
40
- # },
41
-
42
- # "assetDeliveryState": {
43
- # "errors": [],
44
- # "warnings": null,
45
- # "state": "UPLOAD_COMPLETE"
46
- # },
47
-
48
21
  attr_mapping({
49
22
  "fileName" => "file_name",
50
23
  "sourceFileChecksum" => "source_file_checksum",
@@ -60,33 +33,56 @@ module Spaceship
60
33
  return "appScreenshots"
61
34
  end
62
35
 
36
+ def complete?
37
+ (asset_delivery_state || {})["state"] == "COMPLETE"
38
+ end
39
+
63
40
  #
64
41
  # API
65
42
  #
43
+ #
66
44
 
67
45
  def self.create(app_screenshot_set_id: nil, path: nil)
68
46
  require 'faraday'
69
47
 
70
48
  filename = File.basename(path)
71
49
  filesize = File.size(path)
72
- payload = File.binread(path)
50
+ bytes = File.binread(path)
73
51
 
74
52
  post_attributes = {
75
53
  fileSize: filesize,
76
54
  fileName: filename
77
55
  }
78
56
 
79
- post_resp = Spaceship::ConnectAPI.post_app_screenshot(app_screenshot_set_id: app_screenshot_set_id, attributes: post_attributes).to_models.first
57
+ # Create placeholder
58
+ screenshot = Spaceship::ConnectAPI.post_app_screenshot(
59
+ app_screenshot_set_id: app_screenshot_set_id,
60
+ attributes: post_attributes
61
+ ).first
80
62
 
81
- upload_operation = post_resp.upload_operations.first
82
- Spaceship::ConnectAPI::FileUploader.upload(upload_operation, payload)
63
+ # Upload the file
64
+ upload_operations = screenshot.upload_operations
65
+ Spaceship::ConnectAPI::FileUploader.upload(upload_operations, bytes)
83
66
 
67
+ # Update file uploading complete
84
68
  patch_attributes = {
85
69
  uploaded: true,
86
- sourceFileChecksum: "checksum-holder"
70
+ sourceFileChecksum: Digest::MD5.hexdigest(bytes)
87
71
  }
88
72
 
89
- Spaceship::ConnectAPI.patch_app_screenshot(app_screenshot_id: post_resp.id, attributes: patch_attributes).to_models.first
73
+ begin
74
+ screenshot = Spaceship::ConnectAPI.patch_app_screenshot(
75
+ app_screenshot_id: screenshot.id,
76
+ attributes: patch_attributes
77
+ ).first
78
+ rescue => error
79
+ puts("Failed to patch app screenshot. Update may have gone through so verifying") if Spaceship::Globals.verbose?
80
+
81
+ screenshot = Spaceship::ConnectAPI.get_app_screenshot(app_screenshot_id: screenshot.id).first
82
+ raise error unless screenshot.complete?
83
+ end
84
+
85
+ return screenshot
90
86
  end
91
87
 
92
88
  def delete!(filter: {}, includes: nil, limit: nil, sort: nil)
@@ -26,6 +26,7 @@ module Spaceship
26
26
  REJECTED = "REJECTED"
27
27
  PREPARE_FOR_SUBMISSION = "PREPARE_FOR_SUBMISSION"
28
28
  METADATA_REJECTED = "METADATA_REJECTED"
29
+ INVALID_BINARY = "INVALID_BINARY"
29
30
  end
30
31
 
31
32
  module ReleaseType
@@ -188,6 +188,11 @@ module Spaceship
188
188
  # appPreview
189
189
  #
190
190
 
191
+ def get_app_preview(app_preview_id: nil)
192
+ params = Client.instance.build_params(filter: nil, includes: nil, limit: nil, sort: nil)
193
+ Client.instance.get("appPreviews/#{app_preview_id}", params)
194
+ end
195
+
191
196
  def post_app_preview(app_preview_set_id: nil, attributes: {})
192
197
  body = {
193
198
  data: {
@@ -338,6 +343,11 @@ module Spaceship
338
343
  # appScreenshots
339
344
  #
340
345
 
346
+ def get_app_screenshot(app_screenshot_id: nil)
347
+ params = Client.instance.build_params(filter: nil, includes: nil, limit: nil, sort: nil)
348
+ Client.instance.get("appScreenshots/#{app_screenshot_id}", params)
349
+ end
350
+
341
351
  def post_app_screenshot(app_screenshot_set_id: nil, attributes: {})
342
352
  body = {
343
353
  data: {
@@ -378,9 +388,9 @@ module Spaceship
378
388
  # appInfos
379
389
  #
380
390
 
381
- def get_app_infos(app_id: nil, filter: {}, includes: nil, limit: nil, sort: nil)
391
+ def get_app_infos(filter: {}, includes: nil, limit: nil, sort: nil)
382
392
  params = Client.instance.build_params(filter: filter, includes: includes, limit: limit, sort: sort)
383
- Client.instance.get("apps/#{app_id}/appInfos", params)
393
+ Client.instance.get("appInfos", params)
384
394
  end
385
395
 
386
396
  def patch_app_info(app_info_id: nil, attributes: {})
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.150.0.rc3
4
+ version: 2.150.0.rc4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Manu Wallner
@@ -29,7 +29,7 @@ authors:
29
29
  autorequire:
30
30
  bindir: bin
31
31
  cert_chain: []
32
- date: 2020-06-25 00:00:00.000000000 Z
32
+ date: 2020-06-28 00:00:00.000000000 Z
33
33
  dependencies:
34
34
  - !ruby/object:Gem::Dependency
35
35
  name: slack-notifier