fastlane 2.229.0 → 2.230.0

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.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +100 -94
  3. data/deliver/lib/assets/summary.html.erb +3 -3
  4. data/deliver/lib/deliver/app_screenshot.rb +215 -347
  5. data/deliver/lib/deliver/app_screenshot_iterator.rb +4 -1
  6. data/deliver/lib/deliver/app_screenshot_validator.rb +5 -21
  7. data/deliver/lib/deliver/loader.rb +2 -9
  8. data/deliver/lib/deliver/upload_metadata.rb +5 -0
  9. data/deliver/lib/deliver/upload_screenshots.rb +4 -2
  10. data/fastlane/lib/fastlane/actions/docs/create_app_online.md +2 -1
  11. data/fastlane/lib/fastlane/actions/docs/sync_code_signing.md +3 -1
  12. data/fastlane/lib/fastlane/actions/docs/upload_to_app_store.md.erb +34 -6
  13. data/fastlane/lib/fastlane/actions/docs/upload_to_testflight.md +2 -0
  14. data/fastlane/lib/fastlane/actions/install_xcode_plugin.rb +3 -2
  15. data/fastlane/lib/fastlane/actions/modify_services.rb +1 -0
  16. data/fastlane/lib/fastlane/actions/notarize.rb +1 -1
  17. data/fastlane/lib/fastlane/actions/xcov.rb +1 -7
  18. data/fastlane/lib/fastlane/documentation/markdown_docs_generator.rb +4 -4
  19. data/fastlane/lib/fastlane/plugins/template/.github/workflows/test.yml +20 -20
  20. data/fastlane/lib/fastlane/version.rb +1 -1
  21. data/fastlane/swift/Deliverfile.swift +1 -1
  22. data/fastlane/swift/DeliverfileProtocol.swift +1 -1
  23. data/fastlane/swift/Fastlane.swift +85 -13
  24. data/fastlane/swift/Gymfile.swift +1 -1
  25. data/fastlane/swift/GymfileProtocol.swift +9 -1
  26. data/fastlane/swift/Matchfile.swift +1 -1
  27. data/fastlane/swift/MatchfileProtocol.swift +1 -1
  28. data/fastlane/swift/Precheckfile.swift +1 -1
  29. data/fastlane/swift/PrecheckfileProtocol.swift +1 -1
  30. data/fastlane/swift/Scanfile.swift +1 -1
  31. data/fastlane/swift/ScanfileProtocol.swift +5 -1
  32. data/fastlane/swift/Screengrabfile.swift +1 -1
  33. data/fastlane/swift/ScreengrabfileProtocol.swift +1 -1
  34. data/fastlane/swift/Snapshotfile.swift +1 -1
  35. data/fastlane/swift/SnapshotfileProtocol.swift +5 -1
  36. data/fastlane_core/lib/fastlane_core/fastlane_pty.rb +5 -1
  37. data/fastlane_core/lib/fastlane_core/ipa_upload_package_builder.rb +14 -0
  38. data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +38 -8
  39. data/fastlane_core/lib/fastlane_core/project.rb +4 -0
  40. data/fastlane_core/lib/fastlane_core/provisioning_profile.rb +7 -1
  41. data/frameit/lib/frameit/device.rb +2 -2
  42. data/frameit/lib/frameit/device_types.rb +108 -70
  43. data/frameit/lib/frameit/template_finder.rb +1 -1
  44. data/gym/lib/gym/module.rb +9 -4
  45. data/gym/lib/gym/options.rb +14 -1
  46. data/gym/lib/gym/runner.rb +38 -3
  47. data/produce/lib/produce/developer_center.rb +1 -0
  48. data/produce/lib/produce/service.rb +6 -1
  49. data/scan/lib/scan/options.rb +5 -0
  50. data/scan/lib/scan/test_command_generator.rb +8 -0
  51. data/sigh/lib/sigh/local_manage.rb +6 -4
  52. data/sigh/lib/sigh/runner.rb +18 -1
  53. data/snapshot/lib/snapshot/options.rb +5 -0
  54. data/spaceship/lib/spaceship/connect_api/models/age_rating_declaration.rb +62 -8
  55. data/spaceship/lib/spaceship/connect_api/models/app_info_localization.rb +4 -4
  56. data/spaceship/lib/spaceship/connect_api/models/app_screenshot_set.rb +7 -1
  57. data/spaceship/lib/spaceship/connect_api/models/app_store_version_localization.rb +16 -16
  58. data/spaceship/lib/spaceship/connect_api/models/bundle_id_capability.rb +2 -0
  59. data/spaceship/lib/spaceship/connect_api/provisioning/provisioning.rb +0 -6
  60. data/spaceship/lib/spaceship/errors.rb +8 -6
  61. data/supply/lib/supply/client.rb +18 -1
  62. metadata +75 -29
  63. data/fastlane/lib/fastlane/core_ext/bundler_monkey_patch.rb +0 -14
  64. data/fastlane/lib/fastlane/plugins/template/.circleci/config.yml +0 -43
  65. data/fastlane/lib/fastlane/plugins/template/.travis.yml +0 -4
@@ -57,7 +57,7 @@ module Produce
57
57
 
58
58
  def valid_services_for(options)
59
59
  allowed_keys = [:access_wifi, :app_attest, :app_group, :apple_pay, :associated_domains, :auto_fill_credential, :car_play_audio_app, :car_play_messaging_app,
60
- :car_play_navigation_app, :car_play_voip_calling_app, :class_kit, :icloud, :critical_alerts, :custom_network_protocol, :data_protection,
60
+ :car_play_navigation_app, :car_play_voip_calling_app, :class_kit, :declared_age_range, :icloud, :critical_alerts, :custom_network_protocol, :data_protection,
61
61
  :extended_virtual_address_space, :file_provider_testing_mode, :family_controls, :fonts, :game_center, :health_kit, :hls_interstitial_preview, :home_kit, :hotspot,
62
62
  :hotspot_helper, :in_app_purchase, :inter_app_audio, :low_latency_hls, :managed_associated_domains, :maps, :multipath, :network_extension,
63
63
  :nfc_tag_reading, :passbook, :personal_vpn, :push_notification, :sign_in_with_apple, :siri_kit, :system_extension, :user_management, :vpn_configuration, :wallet,
@@ -174,6 +174,11 @@ module Produce
174
174
  bundle_id.update_capability(DATA_PROTECTION, enabled: on, settings: settings)
175
175
  end
176
176
 
177
+ if options.declared_age_range
178
+ UI.message("\tDeclared Age Range")
179
+ bundle_id.update_capability(DECLARED_AGE_RANGE, enabled: on)
180
+ end
181
+
177
182
  if options.extended_virtual_address_space
178
183
  UI.message("\tExtended Virtual Address Space")
179
184
  bundle_id.update_capability(EXTENDED_VIRTUAL_ADDRESSING, enabled: on)
@@ -512,6 +512,11 @@ module Scan
512
512
  description: "Sets a custom path for Swift Package Manager dependencies",
513
513
  type: String,
514
514
  optional: true),
515
+ FastlaneCore::ConfigItem.new(key: :package_cache_path,
516
+ env_name: "SCAN_PACKAGE_CACHE_PATH",
517
+ description: "Sets a custom package cache path for Swift Package Manager dependencies",
518
+ type: String,
519
+ optional: true),
515
520
  FastlaneCore::ConfigItem.new(key: :skip_package_dependencies_resolution,
516
521
  env_name: "SCAN_SKIP_PACKAGE_DEPENDENCIES_RESOLUTION",
517
522
  description: "Skips resolution of Swift Package Manager dependencies",
@@ -69,6 +69,14 @@ module Scan
69
69
  options << "-enableAddressSanitizer #{config[:address_sanitizer] ? 'YES' : 'NO'}" unless config[:address_sanitizer].nil?
70
70
  options << "-enableThreadSanitizer #{config[:thread_sanitizer] ? 'YES' : 'NO'}" unless config[:thread_sanitizer].nil?
71
71
  if FastlaneCore::Helper.xcode_at_least?(11)
72
+ if config[:cloned_source_packages_path] && !options.include?("-clonedSourcePackagesDirPath #{config[:cloned_source_packages_path].shellescape}")
73
+ options << "-clonedSourcePackagesDirPath #{config[:cloned_source_packages_path].shellescape}"
74
+ end
75
+
76
+ if config[:package_cache_path] && !options.include?("-packageCachePath #{config[:package_cache_path].shellescape}")
77
+ options << "-packageCachePath #{config[:package_cache_path].shellescape}"
78
+ end
79
+
72
80
  options << "-testPlan '#{config[:testplan]}'" if config[:testplan]
73
81
 
74
82
  # detect_values will ensure that these values are present as Arrays if
@@ -1,5 +1,6 @@
1
1
  require 'plist'
2
2
  require 'fastlane_core/globals'
3
+ require 'fastlane_core/provisioning_profile'
3
4
 
4
5
  require_relative 'module'
5
6
 
@@ -19,10 +20,10 @@ module Sigh
19
20
 
20
21
  def self.install_profile(profile)
21
22
  UI.message("Installing provisioning profile...")
22
- profile_path = File.expand_path("~") + "/Library/MobileDevice/Provisioning Profiles/"
23
+ profile_path = FastlaneCore::ProvisioningProfile.profiles_path
23
24
  uuid = ENV["SIGH_UUID"] || ENV["SIGH_UDID"]
24
25
  profile_filename = uuid + ".mobileprovision"
25
- destination = profile_path + profile_filename
26
+ destination = File.join(profile_path, profile_filename)
26
27
 
27
28
  # If the directory doesn't exist, make it first
28
29
  unless File.directory?(profile_path)
@@ -126,8 +127,9 @@ module Sigh
126
127
  end
127
128
 
128
129
  def self.load_profiles
129
- UI.message("Loading Provisioning profiles from ~/Library/MobileDevice/Provisioning Profiles/")
130
- profiles_path = File.expand_path("~") + "/Library/MobileDevice/Provisioning Profiles/*.mobileprovision"
130
+ profiles_path = FastlaneCore::ProvisioningProfile.profiles_path
131
+ UI.message("Loading Provisioning profiles from #{profiles_path}")
132
+ profiles_path = File.join(profiles_path, "*.mobileprovision")
131
133
  profile_paths = Dir[profiles_path]
132
134
 
133
135
  profiles = []
@@ -84,7 +84,7 @@ module Sigh
84
84
 
85
85
  includes = 'bundleId'
86
86
 
87
- unless Sigh.config[:skip_certificate_verification] || Sigh.config[:include_all_certificates]
87
+ unless (Sigh.config[:skip_certificate_verification] || Sigh.config[:include_all_certificates]) && Sigh.config[:cert_id].to_s.length == 0
88
88
  includes += ',certificates'
89
89
  end
90
90
 
@@ -105,6 +105,8 @@ module Sigh
105
105
 
106
106
  # Take the provisioning profile name into account
107
107
  results = filter_profiles_by_name(results) if Sigh.config[:provisioning_name].to_s.length > 0
108
+ # Take the cert_id into account
109
+ results = filter_profiles_by_cert_id(results) if Sigh.config[:cert_id].to_s.length > 0
108
110
  return results if Sigh.config[:skip_certificate_verification] || Sigh.config[:include_all_certificates]
109
111
 
110
112
  UI.message("Verifying certificates...")
@@ -199,6 +201,21 @@ module Sigh
199
201
  profiles
200
202
  end
201
203
 
204
+ def filter_profiles_by_cert_id(profiles)
205
+ filtered = profiles.find_all do |current_profile|
206
+ valid_cert_id = false
207
+ current_profile.certificates.each do |cert|
208
+ if cert.id == Sigh.config[:cert_id].to_s
209
+ valid_cert_id = true
210
+ else
211
+ UI.message("Provisioning Profile cert_id : '#{cert.id}' does not match given cert_id : '#{Sigh.config[:cert_id]}', skipping this one...")
212
+ end
213
+ end
214
+ valid_cert_id
215
+ end
216
+ filtered
217
+ end
218
+
202
219
  def fetch_certificates(certificate_types)
203
220
  filter = {
204
221
  certificateType: certificate_types.join(',')
@@ -257,6 +257,11 @@ module Snapshot
257
257
  description: "Sets a custom path for Swift Package Manager dependencies",
258
258
  type: String,
259
259
  optional: true),
260
+ FastlaneCore::ConfigItem.new(key: :package_cache_path,
261
+ env_name: "SNAPSHOT_PACKAGE_CACHE_PATH",
262
+ description: "Sets a custom package cache path for Swift Package Manager dependencies",
263
+ type: String,
264
+ optional: true),
260
265
  FastlaneCore::ConfigItem.new(key: :skip_package_dependencies_resolution,
261
266
  env_name: "SNAPSHOT_SKIP_PACKAGE_DEPENDENCIES_RESOLUTION",
262
267
  description: "Skips resolution of Swift Package Manager dependencies",
@@ -8,34 +8,66 @@ module Spaceship
8
8
  attr_accessor :alcohol_tobacco_or_drug_use_or_references
9
9
  attr_accessor :contests
10
10
  attr_accessor :gambling_simulated
11
- attr_accessor :korea_age_rating_override
11
+ attr_accessor :guns_or_other_weapons
12
+ attr_accessor :horror_or_fear_themes
13
+ attr_accessor :mature_or_suggestive_themes
12
14
  attr_accessor :medical_or_treatment_information
13
15
  attr_accessor :profanity_or_crude_humor
14
16
  attr_accessor :sexual_content_graphic_and_nudity
15
17
  attr_accessor :sexual_content_or_nudity
16
- attr_accessor :horror_or_fear_themes
17
- attr_accessor :mature_or_suggestive_themes
18
18
  attr_accessor :violence_cartoon_or_fantasy
19
19
  attr_accessor :violence_realistic_prolonged_graphic_or_sadistic
20
20
  attr_accessor :violence_realistic
21
21
 
22
22
  # Boolean
23
+ attr_accessor :advertising
24
+ attr_accessor :age_assurance
23
25
  attr_accessor :gambling
26
+ attr_accessor :health_or_wellness_topics
24
27
  attr_accessor :loot_box
28
+ attr_accessor :messaging_and_chat
29
+ attr_accessor :parental_controls
25
30
  attr_accessor :unrestricted_web_access
31
+ attr_accessor :user_generated_content
32
+
33
+ # AgeRating
34
+ attr_accessor :age_rating_override_v2
35
+
36
+ # KoreaAgeRating
37
+ attr_accessor :korea_age_rating_override
26
38
 
27
39
  # KidsAge
28
40
  attr_accessor :kids_age_band
29
41
 
42
+ # URL
43
+ attr_accessor :developer_age_rating_info_url
44
+
30
45
  # Deprecated as of App Store Connect API 1.3
31
46
  attr_accessor :gambling_and_contests
32
47
 
33
48
  module Rating
34
49
  NONE = "NONE"
50
+ INFREQUENT = "INFREQUENT"
35
51
  INFREQUENT_OR_MILD = "INFREQUENT_OR_MILD"
52
+ FREQUENT = "FREQUENT"
36
53
  FREQUENT_OR_INTENSE = "FREQUENT_OR_INTENSE"
37
54
  end
38
55
 
56
+ module AgeRating
57
+ NONE = "NONE"
58
+ NINE_PLUS = "NINE_PLUS"
59
+ THIRTEEN_PLUS = "THIRTEEN_PLUS"
60
+ SIXTEEN_PLUS = "SIXTEEN_PLUS"
61
+ EIGHTEEN_PLUS = "EIGHTEEN_PLUS"
62
+ UNRATED = "UNRATED"
63
+ end
64
+
65
+ module KoreaAgeRating
66
+ NONE = "NONE"
67
+ FIFTEEN_PLUS = "FIFTEEN_PLUS"
68
+ NINETEEN_PLUS = "NINETEEN_PLUS"
69
+ end
70
+
39
71
  module KidsAge
40
72
  FIVE_AND_UNDER = "FIVE_AND_UNDER"
41
73
  SIX_TO_EIGHT = "SIX_TO_EIGHT"
@@ -43,25 +75,34 @@ module Spaceship
43
75
  end
44
76
 
45
77
  attr_mapping({
78
+ "advertising" => "advertising",
79
+ "ageAssurance" => "age_assurance",
80
+ "ageRatingOverrideV2" => "age_rating_override_v2",
46
81
  "alcoholTobaccoOrDrugUseOrReferences" => "alcohol_tobacco_or_drug_use_or_references",
47
82
  "contests" => "contests",
83
+ "developerAgeRatingInfoUrl" => "developer_age_rating_info_url",
48
84
  "gambling" => "gambling",
49
85
  "gamblingSimulated" => "gambling_simulated",
86
+ "gunsOrOtherWeapons" => "guns_or_other_weapons",
87
+ "healthOrWellnessTopics" => "health_or_wellness_topics",
88
+ "horrorOrFearThemes" => "horror_or_fear_themes",
89
+ "kidsAgeBand" => "kids_age_band",
50
90
  "koreaAgeRatingOverride" => "korea_age_rating_override",
51
91
  "lootBox" => "loot_box",
92
+ "matureOrSuggestiveThemes" => "mature_or_suggestive_themes",
52
93
  "medicalOrTreatmentInformation" => "medical_or_treatment_information",
94
+ "messagingAndChat" => "messaging_and_chat",
95
+ "parentalControls" => "parental_controls",
53
96
  "profanityOrCrudeHumor" => "profanity_or_crude_humor",
54
97
  "sexualContentGraphicAndNudity" => "sexual_content_graphic_and_nudity",
55
98
  "sexualContentOrNudity" => "sexual_content_or_nudity",
56
- "horrorOrFearThemes" => "horror_or_fear_themes",
57
- "matureOrSuggestiveThemes" => "mature_or_suggestive_themes",
58
99
  "unrestrictedWebAccess" => "unrestricted_web_access",
100
+ "userGeneratedContent" => "user_generated_content",
59
101
  "violenceCartoonOrFantasy" => "violence_cartoon_or_fantasy",
60
102
  "violenceRealisticProlongedGraphicOrSadistic" => "violence_realistic_prolonged_graphic_or_sadistic",
61
103
  "violenceRealistic" => "violence_realistic",
62
- "kidsAgeBand" => "kids_age_band",
63
104
 
64
- # Deprecated as of App Store Connect API 1.3
105
+ # Deprecated as of App Store Connect API 1.3 - No longer accepted by API
65
106
  "gamblingAndContests" => "gambling_and_contests",
66
107
  })
67
108
 
@@ -124,7 +165,20 @@ module Spaceship
124
165
  end
125
166
 
126
167
  def self.map_value_from_itc(key, value)
127
- if ["gamblingAndContests", "unrestrictedWebAccess"].include?(key)
168
+ boolean_keys = [
169
+ "advertising",
170
+ "ageAssurance",
171
+ "gambling",
172
+ "gamblingAndContests",
173
+ "healthOrWellnessTopics",
174
+ "lootBox",
175
+ "messagingAndChat",
176
+ "parentalControls",
177
+ "unrestrictedWebAccess",
178
+ "userGeneratedContent"
179
+ ]
180
+
181
+ if boolean_keys.include?(key)
128
182
  new_value = LEGACY_BOOLEAN_VALUE_ITC_MAP[value]
129
183
  return value if new_value.nil?
130
184
  return new_value
@@ -33,15 +33,15 @@ module Spaceship
33
33
  client ||= Spaceship::ConnectAPI
34
34
  attributes = reverse_attr_mapping(attributes)
35
35
  client.patch_app_info_localization(app_info_localization_id: id, attributes: attributes)
36
- rescue
37
- raise Spaceship::AppStoreLocalizationError, @locale
36
+ rescue => error
37
+ raise Spaceship::AppStoreLocalizationError.new(@locale, error)
38
38
  end
39
39
 
40
40
  def delete!(client: nil, filter: {}, includes: nil, limit: nil, sort: nil)
41
41
  client ||= Spaceship::ConnectAPI
42
42
  client.delete_app_info_localization(app_info_localization_id: id)
43
- rescue
44
- raise Spaceship::AppStoreLocalizationError, @locale
43
+ rescue => error
44
+ raise Spaceship::AppStoreLocalizationError.new(@locale, error)
45
45
  end
46
46
  end
47
47
  end
@@ -43,12 +43,15 @@ module Spaceship
43
43
  APP_WATCH_SERIES_3 = "APP_WATCH_SERIES_3"
44
44
  APP_WATCH_SERIES_4 = "APP_WATCH_SERIES_4"
45
45
  APP_WATCH_SERIES_7 = "APP_WATCH_SERIES_7"
46
+ APP_WATCH_SERIES_10 = "APP_WATCH_SERIES_10"
46
47
  APP_WATCH_ULTRA = "APP_WATCH_ULTRA"
47
48
 
48
49
  APP_APPLE_TV = "APP_APPLE_TV"
49
50
 
50
51
  APP_DESKTOP = "APP_DESKTOP"
51
52
 
53
+ APP_APPLE_VISION_PRO = "APP_APPLE_VISION_PRO"
54
+
52
55
  ALL_IMESSAGE = [
53
56
  IMESSAGE_APP_IPHONE_40,
54
57
  IMESSAGE_APP_IPHONE_47,
@@ -98,9 +101,12 @@ module Spaceship
98
101
  APP_WATCH_SERIES_3,
99
102
  APP_WATCH_SERIES_4,
100
103
  APP_WATCH_SERIES_7,
104
+ APP_WATCH_SERIES_10,
101
105
  APP_WATCH_ULTRA,
102
106
 
103
- APP_DESKTOP
107
+ APP_DESKTOP,
108
+
109
+ APP_APPLE_VISION_PRO
104
110
  ]
105
111
  end
106
112
 
@@ -44,31 +44,31 @@ module Spaceship
44
44
  client ||= Spaceship::ConnectAPI
45
45
  resp = client.get_app_store_version_localization(app_store_version_localization_id: app_store_version_localization_id, filter: filter, includes: includes, limit: limit, sort: sort)
46
46
  return resp.to_models
47
- rescue
48
- raise Spaceship::AppStoreLocalizationError, @locale
47
+ rescue => error
48
+ raise Spaceship::AppStoreLocalizationError.new(@locale, error)
49
49
  end
50
50
 
51
51
  def self.all(client: nil, app_store_version_id: nil, filter: {}, includes: nil, limit: nil, sort: nil)
52
52
  client ||= Spaceship::ConnectAPI
53
53
  resp = client.get_app_store_version_localizations(app_store_version_id: app_store_version_id, filter: filter, includes: includes, limit: limit, sort: sort)
54
54
  return resp.to_models
55
- rescue
56
- raise Spaceship::AppStoreLocalizationError, @locale
55
+ rescue => error
56
+ raise Spaceship::AppStoreLocalizationError.new(@locale, error)
57
57
  end
58
58
 
59
59
  def update(client: nil, attributes: nil)
60
60
  client ||= Spaceship::ConnectAPI
61
61
  attributes = reverse_attr_mapping(attributes)
62
62
  client.patch_app_store_version_localization(app_store_version_localization_id: id, attributes: attributes)
63
- rescue
64
- raise Spaceship::AppStoreLocalizationError, @locale
63
+ rescue => error
64
+ raise Spaceship::AppStoreLocalizationError.new(@locale, error)
65
65
  end
66
66
 
67
67
  def delete!(client: nil, filter: {}, includes: nil, limit: nil, sort: nil)
68
68
  client ||= Spaceship::ConnectAPI
69
69
  client.delete_app_store_version_localization(app_store_version_localization_id: id)
70
- rescue
71
- raise Spaceship::AppStoreLocalizationError, @locale
70
+ rescue => error
71
+ raise Spaceship::AppStoreLocalizationError.new(@locale, error)
72
72
  end
73
73
 
74
74
  #
@@ -80,16 +80,16 @@ module Spaceship
80
80
  filter ||= {}
81
81
  filter["appStoreVersionLocalization"] = id
82
82
  return Spaceship::ConnectAPI::AppPreviewSet.all(client: client, filter: filter, includes: includes, limit: limit, sort: sort)
83
- rescue
84
- raise Spaceship::AppStoreAppPreviewError, @locale
83
+ rescue => error
84
+ raise Spaceship::AppStoreAppPreviewError.new(@locale, error)
85
85
  end
86
86
 
87
87
  def create_app_preview_set(client: nil, attributes: nil)
88
88
  client ||= Spaceship::ConnectAPI
89
89
  resp = client.post_app_preview_set(app_store_version_localization_id: id, attributes: attributes)
90
90
  return resp.to_models.first
91
- rescue
92
- raise Spaceship::AppStoreAppPreviewError, @locale
91
+ rescue => error
92
+ raise Spaceship::AppStoreAppPreviewError.new(@locale, error)
93
93
  end
94
94
 
95
95
  #
@@ -99,16 +99,16 @@ module Spaceship
99
99
  def get_app_screenshot_sets(client: nil, filter: {}, includes: "appScreenshots", limit: nil, sort: nil)
100
100
  client ||= Spaceship::ConnectAPI
101
101
  return Spaceship::ConnectAPI::AppScreenshotSet.all(client: client, app_store_version_localization_id: id, filter: filter, includes: includes, limit: limit, sort: sort)
102
- rescue
103
- raise Spaceship::AppStoreScreenshotError, @locale
102
+ rescue => error
103
+ raise Spaceship::AppStoreScreenshotError.new(@locale, error)
104
104
  end
105
105
 
106
106
  def create_app_screenshot_set(client: nil, attributes: nil)
107
107
  client ||= Spaceship::ConnectAPI
108
108
  resp = client.post_app_screenshot_set(app_store_version_localization_id: id, attributes: attributes)
109
109
  return resp.to_models.first
110
- rescue
111
- raise Spaceship::AppStoreScreenshotError, @locale
110
+ rescue => error
111
+ raise Spaceship::AppStoreScreenshotError.new(@locale, error)
112
112
  end
113
113
  end
114
114
  end
@@ -77,6 +77,8 @@ module Spaceship
77
77
 
78
78
  # Undocumented as of 2020-06-09
79
79
  MARZIPAN = "MARZIPAN" # Catalyst
80
+ # Undocumented as of 2025-10-15
81
+ DECLARED_AGE_RANGE = "DECLARED_AGE_RANGE"
80
82
  end
81
83
 
82
84
  module Settings
@@ -77,12 +77,6 @@ module Spaceship
77
77
  type: "bundleIds",
78
78
  id: bundle_id_id
79
79
  }
80
- },
81
- capability: {
82
- data: {
83
- type: "capabilities",
84
- id: capability_type
85
- }
86
80
  }
87
81
  }
88
82
  }
@@ -116,9 +116,11 @@ module Spaceship
116
116
 
117
117
  # Base class for errors coming from App Store Connect locale changes
118
118
  class AppStoreLocaleError < BasicPreferredInfoError
119
- def initialize(msg)
120
- @message = (msg ? "An exception occurred for locale: #{msg}." : nil)
121
- super
119
+ def initialize(locale, error)
120
+ error_message = error.respond_to?(:message) ? error.message : error.to_s
121
+ locale_str = locale || "unknown"
122
+ @message = "An exception has occurred for locale: #{locale_str}.\nError: #{error_message}"
123
+ super(@message)
122
124
  end
123
125
 
124
126
  # no need to search github issues since the error is specific
@@ -130,21 +132,21 @@ module Spaceship
130
132
  # Raised for localized text errors from App Store Connect
131
133
  class AppStoreLocalizationError < AppStoreLocaleError
132
134
  def preferred_error_info
133
- "#{@message} Check the localization requirements here: https://help.apple.com/app-store-connect/en.lproj/static.html#dev354659071"
135
+ "#{@message}\nCheck the localization requirements here: https://developer.apple.com/help/app-store-connect/manage-app-information/localize-app-information"
134
136
  end
135
137
  end
136
138
 
137
139
  # Raised for localized screenshots errors from App Store Connect
138
140
  class AppStoreScreenshotError < AppStoreLocaleError
139
141
  def preferred_error_info
140
- "#{@message} Check the screenshot requirements here: https://help.apple.com/app-store-connect/en.lproj/static.html#devd274dd925"
142
+ "#{@message}\nCheck the screenshot requirements here: https://developer.apple.com/help/app-store-connect/reference/screenshot-specifications"
141
143
  end
142
144
  end
143
145
 
144
146
  # Raised for localized app preview errors from App Store Connect
145
147
  class AppStoreAppPreviewError < AppStoreLocaleError
146
148
  def preferred_error_info
147
- "#{@message} Check the app preview requirements here: https://help.apple.com/app-store-connect/en.lproj/static.html#dev4e413fcb8"
149
+ "#{@message}\nCheck the app preview requirements here: https://developer.apple.com/help/app-store-connect/reference/app-preview-specifications"
148
150
  end
149
151
  end
150
152
  end
@@ -46,7 +46,24 @@ module Supply
46
46
  # Initializes the service and its auth_client using the specified information
47
47
  # @param service_account_json: The raw service account Json data
48
48
  def initialize(service_account_json: nil, params: nil)
49
- auth_client = Google::Auth::ServiceAccountCredentials.make_creds(json_key_io: service_account_json, scope: self.class::SCOPE)
49
+ # decode the json and check its type
50
+ begin
51
+ json_content = service_account_json.read
52
+ google_credentials = JSON.parse(json_content)
53
+ service_account_json.rewind
54
+ rescue JSON::ParserError
55
+ UI.user_error!("Invalid Google Credentials file provided - unable to parse json.")
56
+ end
57
+
58
+ # use correct credential class based on type
59
+ case google_credentials['type']
60
+ when "external_account"
61
+ auth_client = Google::Auth::ExternalAccount::Credentials.make_creds(json_key_io: service_account_json, scope: self.class::SCOPE)
62
+ when "service_account"
63
+ auth_client = Google::Auth::ServiceAccountCredentials.make_creds(json_key_io: service_account_json, scope: self.class::SCOPE)
64
+ else
65
+ UI.user_error!("Invalid Google Credentials file provided - no credential type found.")
66
+ end
50
67
 
51
68
  UI.verbose("Fetching a new access token from Google...")
52
69
 
metadata CHANGED
@@ -1,39 +1,40 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.229.0
4
+ version: 2.230.0
5
5
  platform: ruby
6
6
  authors:
7
+ - Aaron Brager
7
8
  - Felix Krause
8
- - Helmut Januschka
9
- - Andrew McBurney
10
- - Daniel Jankowski
11
- - Iulian Onofrei
9
+ - Satoshi Namai
10
+ - Stefan Natchev
11
+ - Łukasz Grabowski
12
+ - Luka Mirosevic
13
+ - Connor Tumbleson
12
14
  - Danielle Tomlinson
13
- - Jérôme Lacoste
14
- - Aaron Brager
15
- - Maksym Grebenets
16
15
  - Max Ott
17
- - Jorge Revuelta H
18
- - Łukasz Grabowski
19
- - Jimmy Dee
20
- - Manu Wallner
21
- - Kohki Miki
22
- - Josh Holtz
23
- - Satoshi Namai
16
+ - Fumiya Nakamura
24
17
  - Olivier Halligon
25
- - Luka Mirosevic
26
18
  - Matthew Ellis
27
- - Stefan Natchev
19
+ - Jorge Revuelta H
20
+ - Jérôme Lacoste
21
+ - Jimmy Dee
22
+ - Daniel Jankowski
28
23
  - Joshua Liebowitz
29
- - Manish Rathi
24
+ - Manu Wallner
30
25
  - Jan Piotrowski
31
- - Fumiya Nakamura
32
26
  - Roger Oba
27
+ - Helmut Januschka
28
+ - Andrew McBurney
29
+ - Iulian Onofrei
30
+ - Josh Holtz
31
+ - Manish Rathi
32
+ - Kohki Miki
33
+ - Maksym Grebenets
33
34
  autorequire:
34
35
  bindir: bin
35
36
  cert_chain: []
36
- date: 2025-11-21 00:00:00.000000000 Z
37
+ date: 2025-12-18 00:00:00.000000000 Z
37
38
  dependencies:
38
39
  - !ruby/object:Gem::Dependency
39
40
  name: addressable
@@ -736,19 +737,33 @@ dependencies:
736
737
  - !ruby/object:Gem::Version
737
738
  version: 0.4.1
738
739
  - !ruby/object:Gem::Dependency
739
- name: mutex_m
740
+ name: abbrev
740
741
  requirement: !ruby/object:Gem::Requirement
741
742
  requirements:
742
743
  - - "~>"
743
744
  - !ruby/object:Gem::Version
744
- version: 0.3.0
745
+ version: 0.1.2
745
746
  type: :runtime
746
747
  prerelease: false
747
748
  version_requirements: !ruby/object:Gem::Requirement
748
749
  requirements:
749
750
  - - "~>"
750
751
  - !ruby/object:Gem::Version
751
- version: 0.3.0
752
+ version: 0.1.2
753
+ - !ruby/object:Gem::Dependency
754
+ name: base64
755
+ requirement: !ruby/object:Gem::Requirement
756
+ requirements:
757
+ - - "~>"
758
+ - !ruby/object:Gem::Version
759
+ version: 0.2.0
760
+ type: :runtime
761
+ prerelease: false
762
+ version_requirements: !ruby/object:Gem::Requirement
763
+ requirements:
764
+ - - "~>"
765
+ - !ruby/object:Gem::Version
766
+ version: 0.2.0
752
767
  - !ruby/object:Gem::Dependency
753
768
  name: csv
754
769
  requirement: !ruby/object:Gem::Requirement
@@ -764,19 +779,53 @@ dependencies:
764
779
  - !ruby/object:Gem::Version
765
780
  version: '3.3'
766
781
  - !ruby/object:Gem::Dependency
767
- name: abbrev
782
+ name: mutex_m
768
783
  requirement: !ruby/object:Gem::Requirement
769
784
  requirements:
770
785
  - - "~>"
771
786
  - !ruby/object:Gem::Version
772
- version: 0.1.2
787
+ version: 0.3.0
773
788
  type: :runtime
774
789
  prerelease: false
775
790
  version_requirements: !ruby/object:Gem::Requirement
776
791
  requirements:
777
792
  - - "~>"
778
793
  - !ruby/object:Gem::Version
779
- version: 0.1.2
794
+ version: 0.3.0
795
+ - !ruby/object:Gem::Dependency
796
+ name: nkf
797
+ requirement: !ruby/object:Gem::Requirement
798
+ requirements:
799
+ - - "~>"
800
+ - !ruby/object:Gem::Version
801
+ version: 0.2.0
802
+ type: :runtime
803
+ prerelease: false
804
+ version_requirements: !ruby/object:Gem::Requirement
805
+ requirements:
806
+ - - "~>"
807
+ - !ruby/object:Gem::Version
808
+ version: 0.2.0
809
+ - !ruby/object:Gem::Dependency
810
+ name: logger
811
+ requirement: !ruby/object:Gem::Requirement
812
+ requirements:
813
+ - - ">="
814
+ - !ruby/object:Gem::Version
815
+ version: '1.6'
816
+ - - "<"
817
+ - !ruby/object:Gem::Version
818
+ version: '2.0'
819
+ type: :runtime
820
+ prerelease: false
821
+ version_requirements: !ruby/object:Gem::Requirement
822
+ requirements:
823
+ - - ">="
824
+ - !ruby/object:Gem::Version
825
+ version: '1.6'
826
+ - - "<"
827
+ - !ruby/object:Gem::Version
828
+ version: '2.0'
780
829
  description: The easiest way to automate beta deployments and releases for your iOS
781
830
  and Android apps
782
831
  email:
@@ -1110,7 +1159,6 @@ files:
1110
1159
  - fastlane/lib/fastlane/commands_generator.rb
1111
1160
  - fastlane/lib/fastlane/configuration_helper.rb
1112
1161
  - fastlane/lib/fastlane/console.rb
1113
- - fastlane/lib/fastlane/core_ext/bundler_monkey_patch.rb
1114
1162
  - fastlane/lib/fastlane/documentation/actions_list.rb
1115
1163
  - fastlane/lib/fastlane/documentation/docs_generator.rb
1116
1164
  - fastlane/lib/fastlane/documentation/markdown_docs_generator.rb
@@ -1153,12 +1201,10 @@ files:
1153
1201
  - fastlane/lib/fastlane/plugins/plugin_update_manager.rb
1154
1202
  - fastlane/lib/fastlane/plugins/plugins.rb
1155
1203
  - fastlane/lib/fastlane/plugins/template/%gem_name%.gemspec.erb
1156
- - fastlane/lib/fastlane/plugins/template/.circleci/config.yml
1157
1204
  - fastlane/lib/fastlane/plugins/template/.github/workflows/test.yml
1158
1205
  - fastlane/lib/fastlane/plugins/template/.gitignore
1159
1206
  - fastlane/lib/fastlane/plugins/template/.rspec
1160
1207
  - fastlane/lib/fastlane/plugins/template/.rubocop.yml
1161
- - fastlane/lib/fastlane/plugins/template/.travis.yml
1162
1208
  - fastlane/lib/fastlane/plugins/template/Gemfile.erb
1163
1209
  - fastlane/lib/fastlane/plugins/template/LICENSE.erb
1164
1210
  - fastlane/lib/fastlane/plugins/template/README.md.erb