fastlane 2.150.0.rc1 → 2.150.0.rc6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/deliver/lib/deliver/download_screenshots.rb +48 -26
  3. data/deliver/lib/deliver/runner.rb +0 -17
  4. data/deliver/lib/deliver/submit_for_review.rb +79 -32
  5. data/deliver/lib/deliver/upload_metadata.rb +92 -21
  6. data/deliver/lib/deliver/upload_price_tier.rb +9 -2
  7. data/deliver/lib/deliver/upload_screenshots.rb +61 -9
  8. data/fastlane/lib/fastlane/actions/.hockey.rb.swp +0 -0
  9. data/fastlane/lib/fastlane/actions/.slack.rb.swp +0 -0
  10. data/fastlane/lib/fastlane/actions/.update_project_provisioning.rb.swp +0 -0
  11. data/fastlane/lib/fastlane/actions/docs/upload_to_app_store.md.erb +78 -85
  12. data/fastlane/lib/fastlane/actions/set_changelog.rb +23 -20
  13. data/fastlane/lib/fastlane/version.rb +1 -1
  14. data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/xcuserdata/josh.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  15. data/fastlane_core/lib/fastlane_core/build_watcher.rb +4 -4
  16. data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +89 -52
  17. data/pilot/lib/pilot/.manager.rb.swp +0 -0
  18. data/produce/lib/produce/itunes_connect.rb +43 -5
  19. data/spaceship/lib/spaceship/client.rb +4 -3
  20. data/spaceship/lib/spaceship/connect_api.rb +5 -1
  21. data/spaceship/lib/spaceship/{.DS_Store → connect_api/.DS_Store} +0 -0
  22. data/spaceship/lib/spaceship/connect_api/client.rb +50 -20
  23. data/spaceship/lib/spaceship/connect_api/file_uploader.rb +98 -0
  24. data/spaceship/lib/spaceship/connect_api/models/age_rating_declaration.rb +6 -2
  25. data/spaceship/lib/spaceship/connect_api/models/app.rb +35 -13
  26. data/spaceship/lib/spaceship/connect_api/models/app_info.rb +4 -11
  27. data/spaceship/lib/spaceship/connect_api/models/app_preview.rb +129 -0
  28. data/spaceship/lib/spaceship/connect_api/models/app_preview_set.rb +71 -0
  29. data/spaceship/lib/spaceship/connect_api/models/app_review_attachment.rb +18 -28
  30. data/spaceship/lib/spaceship/connect_api/models/app_screenshot.rb +88 -59
  31. data/spaceship/lib/spaceship/connect_api/models/app_screenshot_set.rb +26 -2
  32. data/spaceship/lib/spaceship/connect_api/models/app_store_version.rb +1 -0
  33. data/spaceship/lib/spaceship/connect_api/models/app_store_version_localization.rb +16 -0
  34. data/spaceship/lib/spaceship/connect_api/models/territory.rb +27 -0
  35. data/spaceship/lib/spaceship/connect_api/models/user.rb +2 -1
  36. data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +215 -74
  37. data/spaceship/lib/spaceship/connect_api/users/users.rb +13 -0
  38. metadata +16 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8a0da99338a957f184c8f61225f84bbea77cf2e295f9a7fc21918095ec2967e3
4
- data.tar.gz: '0998f1c0adaa75fcabb51584113223c552268c9f86c844771bdc27b1f74f10d1'
3
+ metadata.gz: 87c0c26f1a8fc4baab70230ea4478de1303401d512bce5564c7963f7d52aeee9
4
+ data.tar.gz: 7093929e2f5d402e0623b5e2873a8178a8fcc74a711595ed9d038ca1e9f39e0d
5
5
  SHA512:
6
- metadata.gz: 49d0496a16e951b91d512f972d8e5a5f4af1bae7bc68f8a71f32d328b3e1868e0d3b5dfa948723e7c82414f3c2672a6ec73a99884822ccec740aabd2ef1632a7
7
- data.tar.gz: 508186460c3e7e4c13bef4f3ad019a5f81374ddaffd32844aa079e02c2165dbb2c454aa2441e150c865aa3c42f526af7dbf494d53911ebfe99cbc02ae2cf5d3d
6
+ metadata.gz: f836a09c447b7b4ae447f6a78163a978620e104e06bf5f9b46fcbcbcad49baa089e153ab60aec1312d366a55e11369cc149de680d72f8e51582612c471b6f167
7
+ data.tar.gz: cf0dd78f7208ce467c1be9fa1bd5bb5b9be1ffa8587ad0d9191c0370d41cc3aa8f1e8e92001fbcf7d7ee2e450d074c31111e6fde2eb23a500ced56cff87f34fc
@@ -1,4 +1,5 @@
1
1
  require_relative 'module'
2
+ require 'spaceship'
2
3
  require 'open-uri'
3
4
 
4
5
  module Deliver
@@ -13,35 +14,56 @@ module Deliver
13
14
  end
14
15
 
15
16
  def self.download(options, folder_path)
16
- v = options[:use_live_version] ? options[:app].live_version(platform: options[:platform]) : options[:app].latest_version(platform: options[:platform])
17
-
18
- v.screenshots.each do |language, screenshots|
19
- screenshots.each do |screenshot|
20
- file_name = [screenshot.sort_order, screenshot.device_type, screenshot.sort_order].join("_")
21
- original_file_extension = File.basename(screenshot.original_file_name)
22
- file_name += "." + original_file_extension
23
-
24
- UI.message("Downloading existing screenshot '#{file_name}' for language '#{language}'")
25
-
26
- # If the screen shot is for an appleTV we need to store it in a way that we'll know it's an appleTV
27
- # screen shot later as the screen size is the same as an iPhone 6 Plus in landscape.
28
- if screenshot.device_type == "appleTV"
29
- containing_folder = File.join(folder_path, "appleTV", screenshot.language)
30
- else
31
- containing_folder = File.join(folder_path, screenshot.language)
32
- end
17
+ legacy_app = options[:app]
18
+ app_id = legacy_app.apple_id
19
+ app = Spaceship::ConnectAPI::App.get(app_id: app_id)
33
20
 
34
- if screenshot.is_imessage
35
- containing_folder = File.join(folder_path, "iMessage", screenshot.language)
36
- end
21
+ platform = Spaceship::ConnectAPI::Platform.map(options[:platform])
22
+ if options[:use_live_version]
23
+ version = app.get_live_app_store_version(platform: platform)
24
+ UI.user_error!("Could not find a live version on App Store Connect. Try using '--use_live_version false'") if version.nil?
25
+ else
26
+ version = app.get_edit_app_store_version(platform: platform)
27
+ UI.user_error!("Could not find an edit version on App Store Connect. Try using '--use_live_version true'") if version.nil?
28
+ end
29
+
30
+ localizations = version.get_app_store_version_localizations
31
+ localizations.each do |localization|
32
+ screenshot_sets = localization.get_app_screenshot_sets
33
+ screenshot_sets.each do |screenshot_set|
34
+ screenshot_set.app_screenshots.each_with_index do |screenshot, index|
35
+ url = screenshot.image_asset_url
36
+ next if url.nil?
37
+
38
+ file_name = [index, screenshot_set.screenshot_display_type, index].join("_")
39
+ original_file_extension = File.basename(screenshot.file_name)
40
+ file_name += "." + original_file_extension
41
+
42
+ language = localization.locale
43
+
44
+ UI.message("Downloading existing screenshot '#{file_name}' for language '#{language}'")
45
+
46
+ # If the screen shot is for an appleTV we need to store it in a way that we'll know it's an appleTV
47
+ # screen shot later as the screen size is the same as an iPhone 6 Plus in landscape.
48
+ if screenshot_set.apple_tv?
49
+ containing_folder = File.join(folder_path, "appleTV", language)
50
+ else
51
+ containing_folder = File.join(folder_path, language)
52
+ end
53
+
54
+ if screenshot_set.imessage?
55
+ containing_folder = File.join(folder_path, "iMessage", language)
56
+ end
57
+
58
+ begin
59
+ FileUtils.mkdir_p(containing_folder)
60
+ rescue
61
+ # if it's already there
62
+ end
37
63
 
38
- begin
39
- FileUtils.mkdir_p(containing_folder)
40
- rescue
41
- # if it's already there
64
+ path = File.join(containing_folder, file_name)
65
+ File.binwrite(path, open(url).read)
42
66
  end
43
- path = File.join(containing_folder, file_name)
44
- File.binwrite(path, open(screenshot.url).read)
45
67
  end
46
68
  end
47
69
  end
@@ -114,9 +114,6 @@ module Deliver
114
114
  # Assign "default" values to all languages
115
115
  upload_metadata.assign_defaults(options)
116
116
 
117
- # Handle app icon / watch icon
118
- prepare_app_icons(options)
119
-
120
117
  # Validate
121
118
  validate_html(screenshots)
122
119
 
@@ -126,20 +123,6 @@ module Deliver
126
123
  UploadPriceTier.new.upload(options)
127
124
  end
128
125
 
129
- # If options[:app_icon]/options[:apple_watch_app_icon]
130
- # is supplied value/path will be used.
131
- # If it is unset files (app_icon/watch_icon) exists in
132
- # the fastlane/metadata/ folder, those will be used
133
- def prepare_app_icons(options = {})
134
- return unless options[:metadata_path]
135
-
136
- default_app_icon_path = Dir[File.join(options[:metadata_path], "app_icon.{png,jpg}")].first
137
- options[:app_icon] ||= default_app_icon_path if default_app_icon_path && File.exist?(default_app_icon_path)
138
-
139
- default_watch_icon_path = Dir[File.join(options[:metadata_path], "watch_icon.{png,jpg}")].first
140
- options[:apple_watch_app_icon] ||= default_watch_icon_path if default_watch_icon_path && File.exist?(default_watch_icon_path)
141
- end
142
-
143
126
  # Upload the binary to App Store Connect
144
127
  def upload_binary
145
128
  UI.message("Uploading binary to App Store Connect")
@@ -59,57 +59,93 @@ module Deliver
59
59
 
60
60
  def update_export_compliance(options, app, build)
61
61
  submission_information = options[:submission_information] || {}
62
+ submission_information = submission_information.collect { |k, v| [k.to_sym, v] }.to_h
63
+
62
64
  uses_encryption = submission_information[:export_compliance_uses_encryption]
63
65
 
64
- UI.verbose("Updating build for export compliance status of '#{uses_encryption}'")
65
66
  if build.uses_non_exempt_encryption.nil?
67
+ UI.verbose("Updating build for export compliance status of '#{uses_encryption}'")
68
+
69
+ if uses_encryption.to_s.empty?
70
+ message = [
71
+ "Export compliance is required to submit",
72
+ "Add information to the :submission_information option...",
73
+ " Docs: http://docs.fastlane.tools/actions/deliver/#compliance-and-idfa-settings",
74
+ " Example: submission_information: { export_compliance_uses_encryption: false }",
75
+ " Example CLI:",
76
+ " --submission_information \"{\\\"export_compliance_uses_encryption\\\": false}\"",
77
+ "This can also be set in your Info.plist with key 'ITSAppUsesNonExemptEncryption'"
78
+ ].join("\n")
79
+ UI.user_error!(message)
80
+ end
81
+
66
82
  build = build.update(attributes: {
67
83
  usesNonExemptEncryption: uses_encryption
68
84
  })
85
+
86
+ UI.verbose("Successfully updated build for export compliance status of '#{build.uses_non_exempt_encryption}' on App Store Connect")
69
87
  end
70
- UI.verbose("Updated build for export compliance status of '#{build.uses_non_exempt_encryption}'")
71
88
  end
72
89
 
73
90
  def update_idfa(options, app, version)
74
91
  submission_information = options[:submission_information] || {}
75
- return unless submission_information.include?(:add_id_info_uses_idfa)
92
+ submission_information = submission_information.collect { |k, v| [k.to_sym, v] }.to_h
76
93
 
77
94
  uses_idfa = submission_information[:add_id_info_uses_idfa]
95
+
78
96
  idfa_declaration = begin
79
97
  version.fetch_idfa_declaration
80
98
  rescue
81
99
  nil
82
100
  end
83
101
 
84
- UI.verbose("Updating app store version for IDFA status of '#{uses_idfa}'")
85
- version = version.update(attributes: {
86
- usesIdfa: uses_idfa
87
- })
88
- UI.verbose("Updated app store version for IDFA status of '#{version.uses_idfa}'")
102
+ updated_idfa = false
103
+
104
+ # Set IDFA on version
105
+ unless uses_idfa.nil?
106
+ UI.verbose("Updating app store version for IDFA status of '#{uses_idfa}'")
107
+ version = version.update(attributes: {
108
+ usesIdfa: uses_idfa
109
+ })
110
+ UI.verbose("Updated app store version for IDFA status of '#{version.uses_idfa}'")
111
+ updated_idfa = true
112
+ end
113
+
114
+ # Error if uses_idfa not set
115
+ if version.uses_idfa.nil?
116
+ message = [
117
+ "Use of Advertising Identifier (IDFA) is required to submit",
118
+ "Add information to the :submission_information option...",
119
+ " Docs: http://docs.fastlane.tools/actions/deliver/#compliance-and-idfa-settings",
120
+ " Example: submission_information: { add_id_info_uses_idfa: false }",
121
+ " Example: submission_information: {",
122
+ " add_id_info_uses_idfa: true,",
123
+ " add_id_info_limits_tracking: false,",
124
+ " add_id_info_serves_ads: false,",
125
+ " add_id_info_uses_idfa: false,",
126
+ " add_id_info_tracks_install: false",
127
+ " }",
128
+ " Example CLI:",
129
+ " --submission_information \"{\\\"add_id_info_uses_idfa\\\": false}\""
130
+ ].join("\n")
131
+ UI.user_error!(message)
132
+ end
89
133
 
134
+ # Create, update, or delete IDFA declaration
90
135
  if uses_idfa == false
91
136
  if idfa_declaration
92
137
  UI.verbose("Deleting IDFA delcaration")
93
138
  idfa_declaration.delete!
139
+ updated_idfa = true
94
140
  UI.verbose("Deleted IDFA delcaration")
95
141
  end
96
- else
97
- attributes = {}
98
- if submission_information.include?(:add_id_info_limits_tracking)
99
- attributes[:honorsLimitedAdTracking] = submission_information[:add_id_info_limits_tracking]
100
- end
101
-
102
- if submission_information.include?(:add_id_info_serves_ads)
103
- attributes[:servesAds] = submission_information[:add_id_info_serves_ads]
104
- end
105
-
106
- if submission_information.include?(:add_id_info_tracks_install)
107
- attributes[:attributesAppInstallationToPreviousAd] = submission_information[:add_id_info_tracks_install]
108
- end
109
-
110
- if submission_information.include?(:add_id_info_tracks_action)
111
- attributes[:attributesActionWithPreviousAd] = submission_information[:add_id_info_tracks_action]
112
- end
142
+ elsif uses_idfa == true
143
+ attributes = {
144
+ honorsLimitedAdTracking: !!submission_information[:add_id_info_limits_tracking],
145
+ servesAds: !!submission_information[:add_id_info_serves_ads],
146
+ attributesAppInstallationToPreviousAd: !!submission_information[:add_id_info_tracks_install],
147
+ attributesActionWithPreviousAd: !!submission_information[:add_id_info_tracks_action]
148
+ }
113
149
 
114
150
  if idfa_declaration
115
151
  UI.verbose("Updating IDFA delcaration")
@@ -120,29 +156,37 @@ module Deliver
120
156
  version.create_idfa_declaration(attributes: attributes)
121
157
  UI.verbose("Created IDFA delcaration")
122
158
  end
159
+
160
+ updated_idfa = true
123
161
  end
124
162
 
125
- UI.success("Successfully updated IDFA delcarations")
163
+ UI.success("Successfully updated IDFA delcarations on App Store Connect") if updated_idfa
126
164
  end
127
165
 
128
166
  def update_submission_information(options, app)
129
167
  submission_information = options[:submission_information] || {}
130
- if submission_information.include?(:content_rights_contains_third_party_content)
131
- value = if submission_information[:content_rights_contains_third_party_content]
168
+ submission_information = submission_information.collect { |k, v| [k.to_sym, v] }.to_h
169
+
170
+ content_rights = submission_information[:content_rights_contains_third_party_content]
171
+
172
+ unless content_rights.nil?
173
+ value = if content_rights
132
174
  Spaceship::ConnectAPI::App::ContentRightsDeclaration::USES_THIRD_PARTY_CONTENT
133
175
  else
134
176
  Spaceship::ConnectAPI::App::ContentRightsDeclaration::DOES_NOT_USE_THIRD_PARTY_CONTENT
135
177
  end
136
178
 
137
- UI.success("Updating contents rights declaration on App Store Connect")
179
+ UI.verbose("Updating contents rights declaration on App Store Connect")
138
180
  app.update(attributes: {
139
181
  contentRightsDeclaration: value
140
182
  })
183
+ UI.success("Successfully updated contents rights declaration on App Store Connect")
141
184
  end
142
185
  end
143
186
 
144
187
  def wait_for_build_processing_to_be_complete(app: nil, platform: nil, options: nil)
145
188
  app_version = options[:app_version]
189
+
146
190
  app_version ||= FastlaneCore::IpaFileAnalyser.fetch_app_version(options[:ipa]) if options[:ipa]
147
191
  app_version ||= FastlaneCore::PkgFileAnalyser.fetch_app_version(options[:pkg]) if options[:pkg]
148
192
 
@@ -156,11 +200,14 @@ module Deliver
156
200
  build_version: app_build,
157
201
  poll_interval: 15,
158
202
  return_when_build_appears: false,
159
- return_spaceship_testflight_build: false
203
+ return_spaceship_testflight_build: false,
204
+ select_latest: true
160
205
  )
161
206
 
162
- unless latest_build.app_version == app_version && latest_build.version == app_build
163
- UI.important("Uploaded app #{app_version} - #{app_build}, but received build #{latest_build.app_version} - #{latest_build.version}.")
207
+ if !app_version.nil? && !app_build.nil?
208
+ unless latest_build.app_version == app_version && latest_build.version == app_build
209
+ UI.important("Uploaded app #{app_version} - #{app_build}, but received build #{latest_build.app_version} - #{latest_build.version}.")
210
+ end
164
211
  end
165
212
 
166
213
  return latest_build
@@ -192,26 +192,82 @@ module Deliver
192
192
  # Update categories
193
193
  app_info = app.fetch_edit_app_info
194
194
  if app_info
195
- app_info.update_categories(
196
- primary_category_id: Spaceship::ConnectAPI::AppCategory.map_category_from_itc(
197
- options[:primary_category].to_s.strip
198
- ),
199
- secondary_category_id: Spaceship::ConnectAPI::AppCategory.map_category_from_itc(
200
- options[:secondary_category].to_s.strip
201
- ),
202
- primary_subcategory_one_id: Spaceship::ConnectAPI::AppCategory.map_subcategory_from_itc(
203
- options[:primary_first_sub_category].to_s.strip
204
- ),
205
- primary_subcategory_two_id: Spaceship::ConnectAPI::AppCategory.map_subcategory_from_itc(
206
- options[:primary_second_sub_category].to_s.strip
207
- ),
208
- secondary_subcategory_one_id: Spaceship::ConnectAPI::AppCategory.map_subcategory_from_itc(
209
- options[:secondary_first_sub_category].to_s.strip
210
- ),
211
- secondary_subcategory_two_id: Spaceship::ConnectAPI::AppCategory.map_subcategory_from_itc(
212
- options[:secondary_second_sub_category].to_s.strip
195
+ category_id_map = {}
196
+
197
+ primary_category = options[:primary_category].to_s.strip
198
+ secondary_category = options[:secondary_category].to_s.strip
199
+ primary_first_sub_category = options[:primary_first_sub_category].to_s.strip
200
+ primary_second_sub_category = options[:primary_second_sub_category].to_s.strip
201
+ secondary_first_sub_category = options[:secondary_first_sub_category].to_s.strip
202
+ secondary_second_sub_category = options[:secondary_second_sub_category].to_s.strip
203
+
204
+ mapped_values = {}
205
+
206
+ # Only update primary and secondar category if explicitly set
207
+ unless primary_category.empty?
208
+ mapped = Spaceship::ConnectAPI::AppCategory.map_category_from_itc(
209
+ primary_category
210
+ )
211
+
212
+ mapped_values[primary_category] = mapped
213
+ category_id_map[:primary_category_id] = mapped
214
+ end
215
+ unless secondary_category.empty?
216
+ mapped = Spaceship::ConnectAPI::AppCategory.map_category_from_itc(
217
+ secondary_category
213
218
  )
214
- )
219
+
220
+ mapped_values[secondary_category] = mapped
221
+ category_id_map[:secondary_category_id] = mapped
222
+ end
223
+
224
+ # Only set if primary category is going to be set
225
+ unless primary_category.empty?
226
+ mapped = Spaceship::ConnectAPI::AppCategory.map_subcategory_from_itc(
227
+ primary_first_sub_category
228
+ )
229
+
230
+ mapped_values[primary_first_sub_category] = mapped
231
+ category_id_map[:primary_subcategory_one_id] = mapped
232
+ end
233
+ unless primary_category.empty?
234
+ mapped = Spaceship::ConnectAPI::AppCategory.map_subcategory_from_itc(
235
+ primary_second_sub_category
236
+ )
237
+
238
+ mapped_values[primary_second_sub_category] = mapped
239
+ category_id_map[:primary_subcategory_two_id] = mapped
240
+ end
241
+
242
+ # Only set if secondary category is going to be set
243
+ unless secondary_category.empty?
244
+ mapped = Spaceship::ConnectAPI::AppCategory.map_subcategory_from_itc(
245
+ secondary_first_sub_category
246
+ )
247
+
248
+ mapped_values[secondary_first_sub_category] = mapped
249
+ category_id_map[:secondary_subcategory_one_id] = mapped
250
+ end
251
+ unless secondary_category.empty?
252
+ mapped = Spaceship::ConnectAPI::AppCategory.map_subcategory_from_itc(
253
+ secondary_second_sub_category
254
+ )
255
+
256
+ mapped_values[secondary_second_sub_category] = mapped
257
+ category_id_map[:secondary_subcategory_two_id] = mapped
258
+ end
259
+
260
+ # Print deprecation warnings if category was mapped
261
+ has_mapped_values = false
262
+ mapped_values.each do |k, v|
263
+ next if k.nil? || v.nil?
264
+ next if k == v
265
+ has_mapped_values = true
266
+ UI.deprecated("Category '#{k}' from iTunesConnect as been deprecated. Please replace with '#{v}'")
267
+ end
268
+ UI.deprecated("You can find more info at https://docs.fastlane.tools/actions/deliver/#reference") if has_mapped_values
269
+
270
+ app_info.update_categories(category_id_map: category_id_map)
215
271
  end
216
272
 
217
273
  # Update phased release
@@ -343,7 +399,7 @@ module Deliver
343
399
 
344
400
  localizations = app_info.get_app_info_localizations
345
401
 
346
- languages = options[:languages] || []
402
+ languages = (options[:languages] || []).reject { |lang| lang == "default" }
347
403
  locales_to_enable = languages - localizations.map(&:locale)
348
404
 
349
405
  if locales_to_enable.count > 0
@@ -378,7 +434,7 @@ module Deliver
378
434
 
379
435
  localizations = version.get_app_store_version_localizations
380
436
 
381
- languages = options[:languages] || []
437
+ languages = (options[:languages] || []).reject { |lang| lang == "default" }
382
438
  locales_to_enable = languages - localizations.map(&:locale)
383
439
 
384
440
  if locales_to_enable.count > 0
@@ -517,13 +573,28 @@ module Deliver
517
573
  UI.message("Setting the app's age rating...")
518
574
 
519
575
  # Maping from legacy ITC values to App Store Connect Values
576
+ mapped_values = {}
520
577
  attributes = {}
521
578
  json.each do |k, v|
522
579
  new_key = Spaceship::ConnectAPI::AgeRatingDeclaration.map_key_from_itc(k)
523
580
  new_value = Spaceship::ConnectAPI::AgeRatingDeclaration.map_value_from_itc(new_key, v)
581
+
582
+ mapped_values[k] = new_key
583
+ mapped_values[v] = new_value
584
+
524
585
  attributes[new_key] = new_value
525
586
  end
526
587
 
588
+ # Print deprecation warnings if category was mapped
589
+ has_mapped_values = false
590
+ mapped_values.each do |k, v|
591
+ next if k.nil? || v.nil?
592
+ next if k == v
593
+ has_mapped_values = true
594
+ UI.deprecated("Age rating '#{k}' from iTunesConnect as been deprecated. Please replace with '#{v}'")
595
+ end
596
+ UI.deprecated("You can find more info at https://docs.fastlane.tools/actions/deliver/#reference") if has_mapped_values
597
+
527
598
  age_rating_delcaration = version.fetch_age_rating_declaration
528
599
  age_rating_delcaration.update(attributes: attributes)
529
600
  end