fastlane 2.210.0 → 2.211.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +100 -100
  3. data/deliver/lib/deliver/app_screenshot.rb +17 -0
  4. data/deliver/lib/deliver/runner.rb +5 -2
  5. data/fastlane/lib/fastlane/actions/docs/build_app.md +5 -5
  6. data/fastlane/lib/fastlane/actions/docs/run_tests.md +1 -1
  7. data/fastlane/lib/fastlane/actions/update_code_signing_settings.rb +14 -4
  8. data/fastlane/lib/fastlane/actions/xcode_install.rb +5 -1
  9. data/fastlane/lib/fastlane/actions/xcode_select.rb +1 -1
  10. data/fastlane/lib/fastlane/actions/xcodes.rb +137 -0
  11. data/fastlane/lib/fastlane/actions/xcversion.rb +10 -15
  12. data/fastlane/lib/fastlane/helper/xcodes_helper.rb +28 -0
  13. data/fastlane/lib/fastlane/helper/xcversion_helper.rb +0 -9
  14. data/fastlane/lib/fastlane/version.rb +1 -1
  15. data/fastlane/swift/Deliverfile.swift +1 -1
  16. data/fastlane/swift/DeliverfileProtocol.swift +1 -1
  17. data/fastlane/swift/Fastlane.swift +66 -3
  18. data/fastlane/swift/Gymfile.swift +1 -1
  19. data/fastlane/swift/GymfileProtocol.swift +1 -1
  20. data/fastlane/swift/Matchfile.swift +1 -1
  21. data/fastlane/swift/MatchfileProtocol.swift +5 -1
  22. data/fastlane/swift/Precheckfile.swift +1 -1
  23. data/fastlane/swift/PrecheckfileProtocol.swift +1 -1
  24. data/fastlane/swift/Scanfile.swift +1 -1
  25. data/fastlane/swift/ScanfileProtocol.swift +1 -1
  26. data/fastlane/swift/Screengrabfile.swift +1 -1
  27. data/fastlane/swift/ScreengrabfileProtocol.swift +1 -1
  28. data/fastlane/swift/Snapshotfile.swift +1 -1
  29. data/fastlane/swift/SnapshotfileProtocol.swift +1 -1
  30. data/fastlane/swift/formatting/Brewfile.lock.json +20 -15
  31. data/fastlane_core/lib/fastlane_core/cert_checker.rb +2 -2
  32. data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +2 -3
  33. data/frameit/lib/frameit/device.rb +1 -1
  34. data/match/lib/match/change_password.rb +2 -0
  35. data/match/lib/match/commands_generator.rb +2 -1
  36. data/match/lib/match/generator.rb +1 -0
  37. data/match/lib/match/importer.rb +2 -0
  38. data/match/lib/match/migrate.rb +4 -3
  39. data/match/lib/match/nuke.rb +2 -0
  40. data/match/lib/match/options.rb +5 -0
  41. data/match/lib/match/runner.rb +5 -2
  42. data/pilot/lib/pilot/build_manager.rb +5 -2
  43. data/sigh/lib/sigh/options.rb +5 -0
  44. data/sigh/lib/sigh/runner.rb +3 -1
  45. data/snapshot/lib/assets/SnapshotHelper.swift +2 -2
  46. data/spaceship/lib/spaceship/connect_api/models/actor.rb +26 -0
  47. data/spaceship/lib/spaceship/connect_api/models/app_screenshot_set.rb +5 -0
  48. data/spaceship/lib/spaceship/connect_api/models/app_store_version.rb +1 -1
  49. data/spaceship/lib/spaceship/connect_api/models/app_store_version_localization.rb +10 -10
  50. data/spaceship/lib/spaceship/connect_api/models/device.rb +3 -0
  51. data/spaceship/lib/spaceship/connect_api/models/resolution_center_message.rb +29 -0
  52. data/spaceship/lib/spaceship/connect_api/models/resolution_center_thread.rb +67 -0
  53. data/spaceship/lib/spaceship/connect_api/models/review_rejection.rb +19 -0
  54. data/spaceship/lib/spaceship/connect_api/models/review_submission.rb +12 -0
  55. data/spaceship/lib/spaceship/connect_api/token.rb +2 -5
  56. data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +23 -0
  57. data/spaceship/lib/spaceship/connect_api.rb +5 -0
  58. metadata +25 -19
@@ -2,40 +2,45 @@
2
2
  "entries": {
3
3
  "brew": {
4
4
  "swiftformat": {
5
- "version": "0.49.18",
5
+ "version": "0.50.3",
6
6
  "bottle": {
7
7
  "rebuild": 0,
8
8
  "root_url": "https://ghcr.io/v2/homebrew/core",
9
9
  "files": {
10
+ "arm64_ventura": {
11
+ "cellar": ":any_skip_relocation",
12
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:fca75bfe7fda2151c2972e7e9262e9ca6ce2f50e3fc562e0688dd817550813c2",
13
+ "sha256": "fca75bfe7fda2151c2972e7e9262e9ca6ce2f50e3fc562e0688dd817550813c2"
14
+ },
10
15
  "arm64_monterey": {
11
16
  "cellar": ":any_skip_relocation",
12
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:6362f6087bc3821f4271c3d17b3a4f180b1e1326646ddfb60f6d27bfb5a2a357",
13
- "sha256": "6362f6087bc3821f4271c3d17b3a4f180b1e1326646ddfb60f6d27bfb5a2a357"
17
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:f03398746b42c97a4057eb74c740a842b96b7fbb49b003057daf114d72db74b4",
18
+ "sha256": "f03398746b42c97a4057eb74c740a842b96b7fbb49b003057daf114d72db74b4"
14
19
  },
15
20
  "arm64_big_sur": {
16
21
  "cellar": ":any_skip_relocation",
17
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:e94cf1b66df0d712bbfbf509b98efaf31d39a61b82999314e1f3c0e45195c51a",
18
- "sha256": "e94cf1b66df0d712bbfbf509b98efaf31d39a61b82999314e1f3c0e45195c51a"
22
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:ff1b0f20ebaaa03a580817e8f4c670e54227c86c3c53d813899c276d03415461",
23
+ "sha256": "ff1b0f20ebaaa03a580817e8f4c670e54227c86c3c53d813899c276d03415461"
19
24
  },
20
25
  "monterey": {
21
26
  "cellar": ":any_skip_relocation",
22
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:456e0c95a565adbb45a29747abfadf41c838a7f09fae052a874e59429a94ef14",
23
- "sha256": "456e0c95a565adbb45a29747abfadf41c838a7f09fae052a874e59429a94ef14"
27
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:5dddca5459af2ad28f1a9ef1e664da40ed664ae907c0351dc92b3cd0af52c29e",
28
+ "sha256": "5dddca5459af2ad28f1a9ef1e664da40ed664ae907c0351dc92b3cd0af52c29e"
24
29
  },
25
30
  "big_sur": {
26
31
  "cellar": ":any_skip_relocation",
27
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:d00204be714789fa8b35d4c6f6eea5813604aa09f3911635059973aa827d2e8c",
28
- "sha256": "d00204be714789fa8b35d4c6f6eea5813604aa09f3911635059973aa827d2e8c"
32
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:7427e072a246141371df90135c5cea00c832bf2c511b62ef1cf49c1148b5bf23",
33
+ "sha256": "7427e072a246141371df90135c5cea00c832bf2c511b62ef1cf49c1148b5bf23"
29
34
  },
30
35
  "catalina": {
31
36
  "cellar": ":any_skip_relocation",
32
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:b07f7221f3c5225ad0037293cecb95bde4f0dba4fa19797d84a3376dd1ad02ea",
33
- "sha256": "b07f7221f3c5225ad0037293cecb95bde4f0dba4fa19797d84a3376dd1ad02ea"
37
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:a3de195f76316795eb6a56e240265a8fd41c042c7d515ae1df254aa3f577b540",
38
+ "sha256": "a3de195f76316795eb6a56e240265a8fd41c042c7d515ae1df254aa3f577b540"
34
39
  },
35
40
  "x86_64_linux": {
36
41
  "cellar": "/home/linuxbrew/.linuxbrew/Cellar",
37
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:c4a4ebd2f3f54b8f399551efaf47b3e419db2c729ffaf18a09e64bbf62d82f38",
38
- "sha256": "c4a4ebd2f3f54b8f399551efaf47b3e419db2c729ffaf18a09e64bbf62d82f38"
42
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:8557726207a8ce0871b950bf44ae9f2b8e95973ba026a77cf728d31cefc3ac00",
43
+ "sha256": "8557726207a8ce0871b950bf44ae9f2b8e95973ba026a77cf728d31cefc3ac00"
39
44
  }
40
45
  }
41
46
  }
@@ -61,9 +66,9 @@
61
66
  "macOS": "11.0.1"
62
67
  },
63
68
  "monterey": {
64
- "HOMEBREW_VERSION": "3.6.1-50-g6eaa510",
69
+ "HOMEBREW_VERSION": "3.6.10-11-gb683beb",
65
70
  "HOMEBREW_PREFIX": "/opt/homebrew",
66
- "Homebrew/homebrew-core": "4d6529affa1851ffb992a33fe5641b0cd739c895",
71
+ "Homebrew/homebrew-core": "0bc04af3657134103a6f2b48b31e278e2537e85f",
67
72
  "CLT": "13.4.0.0.1.1651278267",
68
73
  "Xcode": "13.4.1",
69
74
  "macOS": "12.5"
@@ -160,13 +160,13 @@ module FastlaneCore
160
160
  import_command = "curl -f -o #{filename} #{url} && security import #{filename} #{keychain}"
161
161
  UI.verbose("Installing WWDR Cert: #{import_command}")
162
162
 
163
- stdout, stderr, _status = Open3.capture3(import_command)
163
+ stdout, stderr, status = Open3.capture3(import_command)
164
164
  if FastlaneCore::Globals.verbose?
165
165
  UI.command_output(stdout)
166
166
  UI.command_output(stderr)
167
167
  end
168
168
 
169
- unless $?.success?
169
+ unless status.success?
170
170
  UI.verbose("Failed to install WWDR Certificate, checking output to see why")
171
171
  # Check the command output, WWDR might already exist
172
172
  unless /The specified item already exists in the keychain./ =~ stderr
@@ -873,12 +873,11 @@ module FastlaneCore
873
873
 
874
874
  # Create .p8 file from api_key and provide api key info which contains .p8 file path
875
875
  def api_key_with_p8_file_path(original_api_key)
876
- api_key = original_api_key.clone
876
+ api_key = original_api_key.dup
877
877
  api_key[:key_dir] = Dir.mktmpdir("deliver-")
878
878
  # Specified p8 needs to be generated to call altool
879
879
  File.open(File.join(api_key[:key_dir], "AuthKey_#{api_key[:key_id]}.p8"), "wb") do |p8|
880
- key_content = api_key[:is_key_content_base64] ? Base64.decode64(api_key[:key]) : api_key[:key]
881
- p8.write(key_content)
880
+ p8.write(api_key[:key])
882
881
  end
883
882
  api_key
884
883
  end
@@ -51,7 +51,7 @@ module Frameit
51
51
  found_device = nil
52
52
  filename_device = nil
53
53
  filename = Pathname.new(path).basename.to_s
54
- Devices.constants.each do |c|
54
+ Devices.constants.sort_by(&:length).reverse_each do |c|
55
55
  device = Devices.const_get(c)
56
56
  next unless device.resolutions.include?(size)
57
57
  # assign to filename_device if the filename contains the formatted name / id and its priority is higher than the current filename_device
@@ -42,6 +42,8 @@ module Match
42
42
  message = "[fastlane] Changed passphrase"
43
43
  files_to_commit = encryption.encrypt_files(password: new_password)
44
44
  storage.save_changes!(files_to_commit: files_to_commit, custom_message: message)
45
+ ensure
46
+ storage.clear_changes if storage
45
47
  end
46
48
 
47
49
  def self.ensure_ui_interactive
@@ -155,7 +155,8 @@ module Match
155
155
  FastlaneCore::CommanderGenerator.new.generate(Match::Options.available_options, command: c)
156
156
 
157
157
  c.action do |args, options|
158
- Match::Migrate.new.migrate(args, options)
158
+ params = FastlaneCore::Configuration.create(Match::Options.available_options, options.__hash__)
159
+ Match::Migrate.new.migrate(params)
159
160
  end
160
161
  end
161
162
 
@@ -90,6 +90,7 @@ module Match
90
90
  template_name: params[:template_name],
91
91
  fail_on_name_taken: params[:fail_on_name_taken],
92
92
  include_all_certificates: params[:include_all_certificates],
93
+ include_mac_in_profiles: params[:include_mac_in_profiles],
93
94
  }
94
95
 
95
96
  values[:platform] = params[:platform]
@@ -144,6 +144,8 @@ module Match
144
144
  # Encrypt and commit
145
145
  encryption.encrypt_files if encryption
146
146
  storage.save_changes!(files_to_commit: files_to_commit)
147
+ ensure
148
+ storage.clear_changes if storage
147
149
  end
148
150
 
149
151
  def ensure_valid_file_path(file_path, file_description, file_extension, optional: false)
@@ -1,4 +1,3 @@
1
- require_relative 'options'
2
1
  require_relative 'spaceship_ensure'
3
2
  require_relative 'encryption'
4
3
  require_relative 'storage'
@@ -7,8 +6,7 @@ require 'fileutils'
7
6
 
8
7
  module Match
9
8
  class Migrate
10
- def migrate(args, options)
11
- params = FastlaneCore::Configuration.create(Match::Options.available_options, options.__hash__)
9
+ def migrate(params)
12
10
  loaded_matchfile = params.load_configuration_file("Matchfile")
13
11
 
14
12
  ensure_parameters_are_valid(params)
@@ -88,6 +86,9 @@ module Match
88
86
  UI.success("You can also remove the `git_url`, as well as any other git related configurations from your Fastfile and Matchfile")
89
87
  UI.message("")
90
88
  UI.input("Please make sure to read the above and confirm with enter")
89
+ ensure
90
+ google_cloud_storage.clear_changes if google_cloud_storage
91
+ git_storage.clear_changes if git_storage
91
92
  end
92
93
 
93
94
  def api_token(params)
@@ -103,6 +103,8 @@ module Match
103
103
  else
104
104
  UI.success("No relevant certificates or provisioning profiles found, nothing to nuke here :)")
105
105
  end
106
+ ensure
107
+ self.storage.clear_changes if self.storage
106
108
  end
107
109
 
108
110
  # Be smart about optional values here
@@ -253,6 +253,11 @@ module Match
253
253
  description: "Renew the provisioning profiles if the device count on the developer portal has changed. Ignored for profile types 'appstore' and 'developer_id'",
254
254
  type: Boolean,
255
255
  default_value: false),
256
+ FastlaneCore::ConfigItem.new(key: :include_mac_in_profiles,
257
+ env_name: "MATCH_INCLUDE_MAC_IN_PROFILES",
258
+ description: "Include Apple Silicon Mac devices in provisioning profiles for iOS/iPadOS apps",
259
+ type: Boolean,
260
+ default_value: false),
256
261
  FastlaneCore::ConfigItem.new(key: :include_all_certificates,
257
262
  env_name: "MATCH_INCLUDE_ALL_CERTIFICATES",
258
263
  description: "Include all matching certificates in the provisioning profile. Works only for the 'development' provisioning profile type",
@@ -336,7 +336,7 @@ module Match
336
336
 
337
337
  prov_types_without_devices = [:appstore, :developer_id]
338
338
  if !prov_types_without_devices.include?(prov_type) && !params[:force]
339
- force = device_count_different?(profile: profile, keychain_path: keychain_path, platform: params[:platform].to_sym)
339
+ force = device_count_different?(profile: profile, keychain_path: keychain_path, platform: params[:platform].to_sym, include_mac_in_profiles: params[:include_mac_in_profiles])
340
340
  else
341
341
  # App Store provisioning profiles don't contain device identifiers and
342
342
  # thus shouldn't be renewed if the device count has changed.
@@ -347,7 +347,7 @@ module Match
347
347
  return force
348
348
  end
349
349
 
350
- def device_count_different?(profile: nil, keychain_path: nil, platform: nil)
350
+ def device_count_different?(profile: nil, keychain_path: nil, platform: nil, include_mac_in_profiles: false)
351
351
  return false unless profile
352
352
 
353
353
  parsed = FastlaneCore::ProvisioningProfile.parse(profile, keychain_path)
@@ -379,6 +379,9 @@ module Match
379
379
  else
380
380
  []
381
381
  end
382
+ if platform == :ios && include_mac_in_profiles
383
+ device_classes += [Spaceship::ConnectAPI::Device::DeviceClass::APPLE_SILICON_MAC]
384
+ end
382
385
 
383
386
  devices = Spaceship::ConnectAPI::Device.all
384
387
  unless device_classes.empty?
@@ -391,9 +391,12 @@ module Pilot
391
391
  api_token = Spaceship::ConnectAPI.token
392
392
  api_key = if options[:api_key].nil? && !api_token.nil?
393
393
  # Load api key info if user set api_key_path, not api_key
394
- { key_id: api_token.key_id, issuer_id: api_token.issuer_id, key: api_token.key_raw, is_key_content_base64: api_token.is_key_content_base64 }
394
+ { key_id: api_token.key_id, issuer_id: api_token.issuer_id, key: api_token.key_raw }
395
395
  elsif !options[:api_key].nil?
396
- options[:api_key].transform_keys(&:to_sym)
396
+ api_key = options[:api_key].transform_keys(&:to_sym).dup
397
+ # key is still base 64 style if api_key is loaded from option
398
+ api_key[:key] = Base64.decode64(api_key[:key]) if api_key[:is_key_content_base64]
399
+ api_key
397
400
  end
398
401
 
399
402
  unless api_token.nil?
@@ -47,6 +47,11 @@ module Sigh
47
47
  is_string: false,
48
48
  short_option: "-f",
49
49
  default_value: false),
50
+ FastlaneCore::ConfigItem.new(key: :include_mac_in_profiles,
51
+ env_name: "SIGH_INCLUDE_MAC_IN_PROFILES",
52
+ description: "Include Apple Silicon Mac devices in provisioning profiles for iOS/iPadOS apps",
53
+ is_string: false,
54
+ default_value: false),
50
55
  FastlaneCore::ConfigItem.new(key: :app_identifier,
51
56
  short_option: "-a",
52
57
  env_name: "SIGH_APP_IDENTIFIER",
@@ -289,7 +289,9 @@ module Sigh
289
289
  when 'macos', 'catalyst'
290
290
  [Spaceship::ConnectAPI::Device::DeviceClass::MAC]
291
291
  end
292
-
292
+ if Sigh.config[:platform].to_s == 'ios' && Sigh.config[:include_mac_in_profiles]
293
+ device_classes += [Spaceship::ConnectAPI::Device::DeviceClass::APPLE_SILICON_MAC]
294
+ end
293
295
  if Spaceship::ConnectAPI.token
294
296
  return Spaceship::ConnectAPI::Device.all.select do |device|
295
297
  device_classes.include?(device.device_class)
@@ -181,7 +181,7 @@ open class Snapshot: NSObject {
181
181
 
182
182
  let path = screenshotsDir.appendingPathComponent("\(simulator)-\(name).png")
183
183
  #if swift(<5.0)
184
- UIImagePNGRepresentation(image)?.write(to: path, options: .atomic)
184
+ try UIImagePNGRepresentation(image)?.write(to: path, options: .atomic)
185
185
  #else
186
186
  try image.pngData()?.write(to: path, options: .atomic)
187
187
  #endif
@@ -306,4 +306,4 @@ private extension CGFloat {
306
306
 
307
307
  // Please don't remove the lines below
308
308
  // They are used to detect outdated configuration files
309
- // SnapshotHelperVersion [1.28]
309
+ // SnapshotHelperVersion [1.29]
@@ -0,0 +1,26 @@
1
+ require_relative '../model'
2
+ module Spaceship
3
+ class ConnectAPI
4
+ class Actor
5
+ include Spaceship::ConnectAPI::Model
6
+
7
+ attr_accessor :actor_type
8
+ attr_accessor :user_first_name
9
+ attr_accessor :user_last_name
10
+ attr_accessor :user_email
11
+ attr_accessor :api_key_id
12
+
13
+ attr_mapping({
14
+ actorType: 'actor_type',
15
+ userFirstName: 'user_first_name',
16
+ userLastName: 'user_last_name',
17
+ userEmail: 'user_email',
18
+ apiKeyId: 'api_key_id'
19
+ })
20
+
21
+ def self.type
22
+ return 'actors'
23
+ end
24
+ end
25
+ end
26
+ end
@@ -17,6 +17,7 @@ module Spaceship
17
17
  APP_IPHONE_55 = "APP_IPHONE_55"
18
18
  APP_IPHONE_58 = "APP_IPHONE_58"
19
19
  APP_IPHONE_65 = "APP_IPHONE_65"
20
+ APP_IPHONE_67 = "APP_IPHONE_67"
20
21
 
21
22
  APP_IPAD_97 = "APP_IPAD_97"
22
23
  APP_IPAD_105 = "APP_IPAD_105"
@@ -29,6 +30,7 @@ module Spaceship
29
30
  IMESSAGE_APP_IPHONE_55 = "IMESSAGE_APP_IPHONE_55"
30
31
  IMESSAGE_APP_IPHONE_58 = "IMESSAGE_APP_IPHONE_58"
31
32
  IMESSAGE_APP_IPHONE_65 = "IMESSAGE_APP_IPHONE_65"
33
+ IMESSAGE_APP_IPHONE_67 = "IMESSAGE_APP_IPHONE_67"
32
34
 
33
35
  IMESSAGE_APP_IPAD_97 = "IMESSAGE_APP_IPAD_97"
34
36
  IMESSAGE_APP_IPAD_105 = "IMESSAGE_APP_IPAD_105"
@@ -50,6 +52,7 @@ module Spaceship
50
52
  IMESSAGE_APP_IPHONE_55,
51
53
  IMESSAGE_APP_IPHONE_58,
52
54
  IMESSAGE_APP_IPHONE_65,
55
+ IMESSAGE_APP_IPHONE_67,
53
56
 
54
57
  IMESSAGE_APP_IPAD_97,
55
58
  IMESSAGE_APP_IPAD_105,
@@ -65,6 +68,7 @@ module Spaceship
65
68
  APP_IPHONE_55,
66
69
  APP_IPHONE_58,
67
70
  APP_IPHONE_65,
71
+ APP_IPHONE_67,
68
72
 
69
73
  APP_IPAD_97,
70
74
  APP_IPAD_105,
@@ -77,6 +81,7 @@ module Spaceship
77
81
  IMESSAGE_APP_IPHONE_55,
78
82
  IMESSAGE_APP_IPHONE_58,
79
83
  IMESSAGE_APP_IPHONE_65,
84
+ IMESSAGE_APP_IPHONE_67,
80
85
 
81
86
  IMESSAGE_APP_IPAD_97,
82
87
  IMESSAGE_APP_IPAD_105,
@@ -112,7 +112,7 @@ module Spaceship
112
112
 
113
113
  # @deprecated
114
114
  def fetch_age_rating_declaration(client: nil)
115
- raise 'AppStoreVersion no longer as AgeRatingDeclaration as of App Store Connect API 1.3 - Use AppInfo instead'
115
+ raise 'AppStoreVersion no longer has AgeRatingDeclaration as of App Store Connect API 1.3 - Use AppInfo instead'
116
116
  end
117
117
 
118
118
  #
@@ -19,16 +19,16 @@ module Spaceship
19
19
  attr_accessor :app_preview_sets
20
20
 
21
21
  attr_mapping({
22
- "description" => "description",
23
- "locale" => "locale",
24
- "keywords" => "keywords",
25
- "marketingUrl" => "marketing_url",
26
- "promotionalText" => "promotional_text",
27
- "supportUrl" => "support_url",
28
- "whatsNew" => "whats_new",
29
-
30
- "appScreenshotSets" => "app_screenshot_sets",
31
- "appPreviewSets" => "app_preview_sets"
22
+ "description" => "description",
23
+ "locale" => "locale",
24
+ "keywords" => "keywords",
25
+ "marketingUrl" => "marketing_url",
26
+ "promotionalText" => "promotional_text",
27
+ "supportUrl" => "support_url",
28
+ "whatsNew" => "whats_new",
29
+
30
+ "appScreenshotSets" => "app_screenshot_sets",
31
+ "appPreviewSets" => "app_preview_sets"
32
32
  })
33
33
 
34
34
  def self.type
@@ -29,6 +29,9 @@ module Spaceship
29
29
  IPOD = "IPOD"
30
30
  APPLE_TV = "APPLE_TV"
31
31
  MAC = "MAC"
32
+
33
+ # As of 2022-11-12, this is not officially supported by App Store Connect API
34
+ APPLE_SILICON_MAC = "APPLE_SILICON_MAC"
32
35
  end
33
36
 
34
37
  module Status
@@ -0,0 +1,29 @@
1
+ require_relative '../model'
2
+ require_relative './actor'
3
+ require_relative './review_rejection'
4
+
5
+ module Spaceship
6
+ class ConnectAPI
7
+ class ResolutionCenterMessage
8
+ include Spaceship::ConnectAPI::Model
9
+
10
+ attr_accessor :message_body
11
+ attr_accessor :created_date
12
+ attr_accessor :rejections
13
+ attr_accessor :from_actor
14
+
15
+ attr_mapping({
16
+ messageBody: 'message_body',
17
+ createdDate: 'created_date',
18
+
19
+ # includes
20
+ rejections: 'rejections',
21
+ fromActor: 'from_actor'
22
+ })
23
+
24
+ def self.type
25
+ return 'resolutionCenterMessages'
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,67 @@
1
+ require_relative '../model'
2
+
3
+ module Spaceship
4
+ class ConnectAPI
5
+ class ResolutionCenterThread
6
+ include Spaceship::ConnectAPI::Model
7
+
8
+ attr_accessor :state
9
+ attr_accessor :can_developer_add_node
10
+ attr_accessor :objectionable_content
11
+ attr_accessor :thread_type
12
+ attr_accessor :created_date
13
+ attr_accessor :last_message_response_date
14
+
15
+ attr_accessor :resolution_center_messages
16
+ attr_accessor :app_store_version
17
+
18
+ module ThreadType
19
+ REJECTION_BINARY = 'REJECTION_BINARY'
20
+ REJECTION_METADATA = 'REJECTION_METADATA'
21
+ REJECTION_REVIEW_SUBMISSION = 'REJECTION_REVIEW_SUBMISSION'
22
+ APP_MESSAGE_ARC = 'APP_MESSAGE_ARC'
23
+ APP_MESSAGE_ARB = 'APP_MESSAGE_ARB'
24
+ APP_MESSAGE_COMM = 'APP_MESSAGE_COMM'
25
+ end
26
+
27
+ attr_mapping({
28
+ state: 'state',
29
+ canDeveloperAddNote: 'can_developer_add_node',
30
+ objectionableContent: 'objectionable_content',
31
+ threadType: 'thread_type',
32
+ createdDate: 'created_date',
33
+ lastMessageResponseDate: 'last_message_response_date',
34
+
35
+ # includes
36
+ resolutionCenterMessages: 'resolution_center_messages',
37
+ appStoreVersion: 'app_store_version'
38
+ })
39
+
40
+ def self.type
41
+ return "resolutionCenterThreads"
42
+ end
43
+
44
+ #
45
+ # API
46
+ #
47
+
48
+ def self.all(client: nil, filter:, includes: nil)
49
+ client ||= Spaceship::ConnectAPI
50
+ resps = client.get_resolution_center_threads(filter: filter, includes: includes).all_pages
51
+ return resps.flat_map(&:to_models)
52
+ end
53
+
54
+ def fetch_messages(client: nil, filter: {}, includes: nil)
55
+ client ||= Spaceship::ConnectAPI
56
+ resps = client.get_resolution_center_messages(thread_id: id, filter: filter, includes: includes).all_pages
57
+ return resps.flat_map(&:to_models)
58
+ end
59
+
60
+ def fetch_rejection_reasons(client: nil, includes: nil)
61
+ client ||= Spaceship::ConnectAPI
62
+ resp = client.get_review_rejection(filter: { 'resolutionCenterMessage.resolutionCenterThread': id }, includes: includes)
63
+ return resp.to_models
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,19 @@
1
+ require_relative '../model'
2
+
3
+ module Spaceship
4
+ class ConnectAPI
5
+ class ReviewRejection
6
+ include Spaceship::ConnectAPI::Model
7
+
8
+ attr_accessor :reasons
9
+
10
+ attr_mapping({
11
+ reasons: 'reasons'
12
+ })
13
+
14
+ def self.type
15
+ return 'reviewRejections'
16
+ end
17
+ end
18
+ end
19
+ end
@@ -69,6 +69,18 @@ module Spaceship
69
69
  resp = client.post_review_submission_item(review_submission_id: id, app_store_version_id: app_store_version_id)
70
70
  return resp.to_models.first
71
71
  end
72
+
73
+ def fetch_resolution_center_threads(client: nil)
74
+ client ||= Spaceship::ConnectAPI
75
+ resp = client.get_resolution_center_threads(filter: { reviewSubmission: id }, includes: 'reviewSubmission')
76
+ return resp.to_models
77
+ end
78
+
79
+ def latest_resolution_center_messages(client: nil)
80
+ client ||= Spaceship::ConnectAPI
81
+ threads = fetch_resolution_center_threads(client: client)
82
+ threads.first.fetch_messages(client: client)
83
+ end
72
84
  end
73
85
  end
74
86
  end
@@ -22,7 +22,6 @@ module Spaceship
22
22
  attr_reader :expiration
23
23
 
24
24
  attr_reader :key_raw
25
- attr_reader :is_key_content_base64
26
25
 
27
26
  # Temporary attribute not needed to create the JWT text
28
27
  # There is no way to determine if the team associated with this
@@ -72,19 +71,17 @@ module Spaceship
72
71
  key: OpenSSL::PKey::EC.new(key),
73
72
  key_raw: key,
74
73
  duration: duration,
75
- in_house: in_house,
76
- is_key_content_base64: is_key_content_base64
74
+ in_house: in_house
77
75
  )
78
76
  end
79
77
 
80
- def initialize(key_id: nil, issuer_id: nil, key: nil, key_raw: nil, duration: nil, in_house: nil, is_key_content_base64: nil)
78
+ def initialize(key_id: nil, issuer_id: nil, key: nil, key_raw: nil, duration: nil, in_house: nil)
81
79
  @key_id = key_id
82
80
  @key = key
83
81
  @key_raw = key_raw
84
82
  @issuer_id = issuer_id
85
83
  @duration = duration
86
84
  @in_house = in_house
87
- @is_key_content_base64 = is_key_content_base64
88
85
 
89
86
  @duration ||= DEFAULT_TOKEN_DURATION
90
87
  @duration = @duration.to_i if @duration
@@ -1252,6 +1252,29 @@ module Spaceship
1252
1252
  params = tunes_request_client.build_params(filter: nil, includes: nil, limit: nil, sort: nil)
1253
1253
  tunes_request_client.get("territories", params)
1254
1254
  end
1255
+
1256
+ #
1257
+ # resolutionCenter
1258
+ #
1259
+ # As of 2022-11-11:
1260
+ # This is not official available throught the App Store Connect API using an API Key.
1261
+ # This is only works with Apple ID auth.
1262
+ #
1263
+
1264
+ def get_resolution_center_threads(filter: {}, includes: nil)
1265
+ params = tunes_request_client.build_params(filter: filter, includes: includes)
1266
+ tunes_request_client.get('resolutionCenterThreads', params)
1267
+ end
1268
+
1269
+ def get_resolution_center_messages(thread_id:, filter: {}, includes: nil)
1270
+ params = tunes_request_client.build_params(filter: filter, includes: includes)
1271
+ tunes_request_client.get("resolutionCenterThreads/#{thread_id}/resolutionCenterMessages", params)
1272
+ end
1273
+
1274
+ def get_review_rejection(filter: {}, includes: nil)
1275
+ params = tunes_request_client.build_params(filter: filter, includes: includes)
1276
+ tunes_request_client.get("reviewRejections", params)
1277
+ end
1255
1278
  end
1256
1279
  end
1257
1280
  end
@@ -68,6 +68,11 @@ require 'spaceship/connect_api/models/reset_ratings_request'
68
68
  require 'spaceship/connect_api/models/sandbox_tester'
69
69
  require 'spaceship/connect_api/models/territory'
70
70
 
71
+ require 'spaceship/connect_api/models/resolution_center_message'
72
+ require 'spaceship/connect_api/models/resolution_center_thread'
73
+ require 'spaceship/connect_api/models/review_rejection'
74
+ require 'spaceship/connect_api/models/actor'
75
+
71
76
  module Spaceship
72
77
  class ConnectAPI
73
78
  # Defined in the App Store Connect API docs: