fastlane 2.152.0 → 2.155.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +76 -76
  3. data/deliver/lib/deliver/app_screenshot.rb +1 -1
  4. data/deliver/lib/deliver/commands_generator.rb +7 -4
  5. data/deliver/lib/deliver/detect_values.rb +9 -3
  6. data/deliver/lib/deliver/download_screenshots.rb +1 -3
  7. data/deliver/lib/deliver/html_generator.rb +8 -1
  8. data/deliver/lib/deliver/runner.rb +5 -10
  9. data/deliver/lib/deliver/setup.rb +92 -3
  10. data/deliver/lib/deliver/submit_for_review.rb +1 -3
  11. data/deliver/lib/deliver/upload_metadata.rb +46 -26
  12. data/deliver/lib/deliver/upload_price_tier.rb +1 -3
  13. data/deliver/lib/deliver/upload_screenshots.rb +75 -44
  14. data/{deliver/lib/deliver/.commands_generator.rb.swp → fastlane/lib/fastlane/.erb_template_helper.rb.swp} +0 -0
  15. data/{frameit/lib/frameit/.editor.rb.swp → fastlane/lib/fastlane/actions/.git_commit.rb.swp} +0 -0
  16. data/fastlane/lib/fastlane/actions/carthage.rb +7 -0
  17. data/fastlane/lib/fastlane/actions/create_keychain.rb +5 -1
  18. data/fastlane/lib/fastlane/actions/docs/frame_screenshots.md +3 -1
  19. data/fastlane/lib/fastlane/actions/docs/sync_code_signing.md +21 -2
  20. data/fastlane/lib/fastlane/actions/docs/upload_to_app_store.md.erb +4 -4
  21. data/fastlane/lib/fastlane/actions/download_dsyms.rb +4 -2
  22. data/fastlane/lib/fastlane/actions/erb.rb +10 -2
  23. data/fastlane/lib/fastlane/actions/git_pull.rb +13 -2
  24. data/fastlane/lib/fastlane/actions/sync_code_signing.rb +5 -0
  25. data/fastlane/lib/fastlane/runner.rb +3 -1
  26. data/fastlane/lib/fastlane/version.rb +1 -1
  27. data/fastlane/swift/Deliverfile.swift +1 -1
  28. data/fastlane/swift/DeliverfileProtocol.swift +1 -1
  29. data/fastlane/swift/Fastlane.swift +407 -189
  30. data/fastlane/swift/Gymfile.swift +1 -1
  31. data/fastlane/swift/GymfileProtocol.swift +1 -1
  32. data/fastlane/swift/Matchfile.swift +1 -1
  33. data/fastlane/swift/MatchfileProtocol.swift +10 -2
  34. data/fastlane/swift/Precheckfile.swift +1 -1
  35. data/fastlane/swift/PrecheckfileProtocol.swift +1 -1
  36. data/fastlane/swift/Scanfile.swift +1 -1
  37. data/fastlane/swift/ScanfileProtocol.swift +1 -1
  38. data/fastlane/swift/Screengrabfile.swift +1 -1
  39. data/fastlane/swift/ScreengrabfileProtocol.swift +1 -1
  40. data/fastlane/swift/Snapshotfile.swift +1 -1
  41. data/fastlane/swift/SnapshotfileProtocol.swift +9 -1
  42. data/fastlane_core/lib/fastlane_core/device_manager.rb +25 -6
  43. data/frameit/lib/frameit/editor.rb +11 -6
  44. data/gym/lib/gym/detect_values.rb +6 -3
  45. data/gym/lib/gym/module.rb +30 -0
  46. data/gym/lib/gym/runner.rb +23 -18
  47. data/match/lib/match/generator.rb +6 -0
  48. data/match/lib/match/options.rb +16 -4
  49. data/match/lib/match/runner.rb +13 -5
  50. data/match/lib/match/spaceship_ensure.rb +7 -9
  51. data/match/lib/match/storage/git_storage.rb +16 -2
  52. data/match/lib/match/storage/google_cloud_storage.rb +1 -1
  53. data/pilot/lib/pilot/build_manager.rb +9 -0
  54. data/pilot/lib/pilot/options.rb +1 -1
  55. data/scan/lib/scan/runner.rb +19 -6
  56. data/sigh/lib/sigh/.runner.rb.swp +0 -0
  57. data/sigh/lib/sigh/download_all.rb +42 -27
  58. data/sigh/lib/sigh/module.rb +26 -0
  59. data/sigh/lib/sigh/options.rb +2 -2
  60. data/sigh/lib/sigh/runner.rb +96 -35
  61. data/snapshot/lib/snapshot/options.rb +10 -0
  62. data/snapshot/lib/snapshot/simulator_launchers/launcher_configuration.rb +2 -0
  63. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +5 -0
  64. data/snapshot/lib/snapshot/test_command_generator.rb +3 -2
  65. data/snapshot/lib/snapshot/test_command_generator_xcode_8.rb +4 -1
  66. data/spaceship/lib/spaceship/connect_api.rb +1 -0
  67. data/spaceship/lib/spaceship/connect_api/client.rb +5 -3
  68. data/spaceship/lib/spaceship/connect_api/model.rb +15 -1
  69. data/spaceship/lib/spaceship/connect_api/models/.device.rb.swp +0 -0
  70. data/spaceship/lib/spaceship/connect_api/models/age_rating_declaration.rb +1 -0
  71. data/spaceship/lib/spaceship/connect_api/models/app.rb +61 -3
  72. data/spaceship/lib/spaceship/connect_api/models/app_info_localization.rb +1 -0
  73. data/spaceship/lib/spaceship/connect_api/models/app_preview.rb +1 -0
  74. data/spaceship/lib/spaceship/connect_api/models/app_screenshot.rb +44 -5
  75. data/spaceship/lib/spaceship/connect_api/models/app_store_review_detail.rb +1 -0
  76. data/spaceship/lib/spaceship/connect_api/models/app_store_version.rb +12 -0
  77. data/spaceship/lib/spaceship/connect_api/models/app_store_version_localization.rb +1 -0
  78. data/spaceship/lib/spaceship/connect_api/models/app_store_version_release_request.rb +12 -0
  79. data/spaceship/lib/spaceship/connect_api/models/build.rb +1 -0
  80. data/spaceship/lib/spaceship/connect_api/models/bundle_id.rb +17 -5
  81. data/spaceship/lib/spaceship/connect_api/models/bundle_id_capability.rb +41 -7
  82. data/spaceship/lib/spaceship/connect_api/models/idfa_declaration.rb +1 -0
  83. data/spaceship/lib/spaceship/connect_api/models/profile.rb +31 -1
  84. data/spaceship/lib/spaceship/connect_api/provisioning/client.rb +46 -4
  85. data/spaceship/lib/spaceship/connect_api/provisioning/provisioning.rb +41 -0
  86. data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +32 -1
  87. data/supply/lib/supply/client.rb +2 -1
  88. data/supply/lib/supply/options.rb +8 -1
  89. metadata +33 -58
  90. data/deliver/lib/deliver/.submit_for_review.rb.swp +0 -0
  91. data/deliver/lib/deliver/.upload_metadata.rb.swp +0 -0
@@ -116,6 +116,11 @@ module Snapshot
116
116
  description: "Enabling this option will automatically erase the simulator before running the application",
117
117
  default_value: false,
118
118
  is_string: false),
119
+ FastlaneCore::ConfigItem.new(key: :headless,
120
+ env_name: 'SNAPSHOT_HEADLESS',
121
+ description: "Enabling this option will prevent displaying the simulator window",
122
+ default_value: true,
123
+ type: Boolean),
119
124
  FastlaneCore::ConfigItem.new(key: :override_status_bar,
120
125
  env_name: 'SNAPSHOT_OVERRIDE_STATUS_BAR',
121
126
  description: "Enabling this option wil automatically override the status bar to show 9:41 AM, full battery, and full reception",
@@ -273,6 +278,11 @@ module Snapshot
273
278
  env_name: "SNAPSHOT_DISABLE_XCPRETTY",
274
279
  description: "Disable xcpretty formatting of build",
275
280
  type: Boolean,
281
+ optional: true),
282
+ FastlaneCore::ConfigItem.new(key: :suppress_xcode_output,
283
+ env_name: "SNAPSHOT_SUPPRESS_XCODE_OUTPUT",
284
+ description: "Suppress the output of xcodebuild to stdout. Output is still saved in buildlog_path",
285
+ type: Boolean,
276
286
  optional: true)
277
287
  ]
278
288
  end
@@ -7,6 +7,7 @@ module Snapshot
7
7
  attr_accessor :add_videos
8
8
  attr_accessor :clean
9
9
  attr_accessor :erase_simulator
10
+ attr_accessor :headless
10
11
  attr_accessor :localize_simulator
11
12
  attr_accessor :dark_mode
12
13
  attr_accessor :reinstall_app
@@ -34,6 +35,7 @@ module Snapshot
34
35
  @add_videos = snapshot_config[:add_videos]
35
36
  @clean = snapshot_config[:clean]
36
37
  @erase_simulator = snapshot_config[:erase_simulator]
38
+ @headless = snapshot_config[:headless]
37
39
  @localize_simulator = snapshot_config[:localize_simulator]
38
40
  @dark_mode = snapshot_config[:dark_mode]
39
41
  @reinstall_app = snapshot_config[:reinstall_app]
@@ -76,6 +76,11 @@ module Snapshot
76
76
  disable_slide_to_type(type)
77
77
  end
78
78
  end
79
+
80
+ unless launcher_config.headless
81
+ simulator_path = File.join(Helper.xcode_path, 'Applications', 'Simulator.app')
82
+ Helper.backticks("open -a #{simulator_path} -g", print: FastlaneCore::Globals.verbose?)
83
+ end
79
84
  end
80
85
 
81
86
  # pass an array of device types
@@ -33,8 +33,9 @@ module Snapshot
33
33
 
34
34
  xcpretty = "xcpretty #{Snapshot.config[:xcpretty_args]}"
35
35
  xcpretty << "--no-color" if Helper.colors_disabled?
36
-
37
- return pipe << "| #{xcpretty}"
36
+ pipe << "| #{xcpretty}"
37
+ pipe << "> /dev/null" if Snapshot.config[:suppress_xcode_output]
38
+ return pipe
38
39
  end
39
40
 
40
41
  def destination(devices)
@@ -24,7 +24,10 @@ module Snapshot
24
24
 
25
25
  def pipe(device_type, language, locale)
26
26
  log_path = xcodebuild_log_path(device_type: device_type, language: language, locale: locale)
27
- return ["| tee #{log_path.shellescape} | xcpretty #{Snapshot.config[:xcpretty_args]}"]
27
+ pipe = ["| tee #{log_path.shellescape}"]
28
+ pipe << "| xcpretty #{Snapshot.config[:xcpretty_args]}"
29
+ pipe << "> /dev/null" if Snapshot.config[:suppress_xcode_output]
30
+ return pipe
28
31
  end
29
32
 
30
33
  def destination(device_name)
@@ -42,6 +42,7 @@ require 'spaceship/connect_api/models/app_price'
42
42
  require 'spaceship/connect_api/models/app_price_tier'
43
43
  require 'spaceship/connect_api/models/app_store_review_attachment'
44
44
  require 'spaceship/connect_api/models/app_store_review_detail'
45
+ require 'spaceship/connect_api/models/app_store_version_release_request'
45
46
  require 'spaceship/connect_api/models/app_store_version_submission'
46
47
  require 'spaceship/connect_api/models/app_screenshot_set'
47
48
  require 'spaceship/connect_api/models/app_screenshot'
@@ -88,8 +88,8 @@ module Spaceship
88
88
  handle_response(response)
89
89
  end
90
90
 
91
- def post(url_or_path, body)
92
- response = with_asc_retry do
91
+ def post(url_or_path, body, tries: 5)
92
+ response = with_asc_retry(tries) do
93
93
  request(:post) do |req|
94
94
  req.url(url_or_path)
95
95
  req.body = body.to_json
@@ -129,7 +129,6 @@ module Spaceship
129
129
  tries = 1 if Object.const_defined?("SpecHelper")
130
130
  response = yield
131
131
 
132
- tries -= 1
133
132
  status = response.status if response
134
133
 
135
134
  if [500, 504].include?(status)
@@ -139,6 +138,7 @@ module Spaceship
139
138
 
140
139
  return response
141
140
  rescue => error
141
+ tries -= 1
142
142
  puts(error) if Spaceship::Globals.verbose?
143
143
  if tries.zero?
144
144
  return response
@@ -164,6 +164,8 @@ module Spaceship
164
164
 
165
165
  raise UnexpectedResponse, "Temporary App Store Connect error: #{response.body}" if response.body['statusCode'] == 'ERROR'
166
166
 
167
+ store_csrf_tokens(response)
168
+
167
169
  return Spaceship::ConnectAPI::Response.new(body: response.body, status: response.status, client: self)
168
170
  end
169
171
 
@@ -8,6 +8,7 @@ module Spaceship
8
8
  end
9
9
 
10
10
  attr_accessor :id
11
+ attr_accessor :reverse_attr_map
11
12
 
12
13
  def initialize(id, attributes)
13
14
  self.id = id
@@ -29,6 +30,7 @@ module Spaceship
29
30
  # Creates alias for :minOsVersion to :min_os_version
30
31
  #
31
32
  def attr_mapping(attr_map)
33
+ self.reverse_attr_map ||= attr_map.invert.each_with_object({}) { |(k, v), memo| memo[k.to_sym] = v; }
32
34
  attr_map.each do |key, value|
33
35
  # Actual
34
36
  reader = value.to_sym
@@ -50,6 +52,18 @@ module Spaceship
50
52
  end
51
53
  end
52
54
 
55
+ def reverse_attr_mapping(attributes)
56
+ return nil if attributes.nil?
57
+
58
+ # allows for getting map from either an instance or class execution
59
+ map = self.reverse_attr_map || self.class.reverse_attr_map
60
+
61
+ attributes.each_with_object({}) do |(k, v), memo|
62
+ key = map[k.to_sym] || k.to_sym
63
+ memo[key] = v
64
+ end
65
+ end
66
+
53
67
  def to_json(*options)
54
68
  instance_variables.map do |var|
55
69
  [var.to_s[1..-1], instance_variable_get(var)]
@@ -138,7 +152,7 @@ module Spaceship
138
152
  id == included_data["id"] && type == included_data["type"]
139
153
  end
140
154
 
141
- inflate_model(relationship_data, included)
155
+ inflate_model(relationship_data, included) if relationship_data
142
156
  end
143
157
 
144
158
  # Map a hash or an array of data
@@ -106,6 +106,7 @@ module Spaceship
106
106
  #
107
107
 
108
108
  def update(attributes: nil)
109
+ attributes = reverse_attr_mapping(attributes)
109
110
  Spaceship::ConnectAPI.patch_age_rating_declaration(age_rating_declaration_id: id, attributes: attributes)
110
111
  end
111
112
  end
@@ -10,11 +10,11 @@ module Spaceship
10
10
  attr_accessor :bundle_id
11
11
  attr_accessor :sku
12
12
  attr_accessor :primary_locale
13
+ attr_accessor :is_opted_in_to_distribute_ios_app_on_mac_app_store
13
14
  attr_accessor :removed
14
15
  attr_accessor :is_aag
15
-
16
+ attr_accessor :available_in_new_territories
16
17
  attr_accessor :content_rights_declaration
17
-
18
18
  attr_accessor :app_store_versions
19
19
 
20
20
  module ContentRightsDeclaration
@@ -27,8 +27,10 @@ module Spaceship
27
27
  "bundleId" => "bundle_id",
28
28
  "sku" => "sku",
29
29
  "primaryLocale" => "primary_locale",
30
+ "isOptedInToDistributeIosAppOnMacAppStore" => "is_opted_in_to_distribute_ios_app_on_mac_app_store",
30
31
  "removed" => "removed",
31
32
  "isAAG" => "is_aag",
33
+ "availableInNewTerritories" => "available_in_new_territories",
32
34
 
33
35
  "contentRightsDeclaration" => "content_rights_declaration",
34
36
 
@@ -71,6 +73,7 @@ module Spaceship
71
73
  end
72
74
 
73
75
  def update(attributes: nil, app_price_tier_id: nil, territory_ids: nil)
76
+ attributes = reverse_attr_mapping(attributes)
74
77
  return Spaceship::ConnectAPI.patch_app(app_id: id, attributes: attributes, app_price_tier_id: app_price_tier_id, territory_ids: territory_ids)
75
78
  end
76
79
 
@@ -78,6 +81,21 @@ module Spaceship
78
81
  # App Info
79
82
  #
80
83
 
84
+ def fetch_live_app_info(includes: Spaceship::ConnectAPI::AppInfo::ESSENTIAL_INCLUDES)
85
+ states = [
86
+ Spaceship::ConnectAPI::AppInfo::AppStoreState::READY_FOR_SALE,
87
+ Spaceship::ConnectAPI::AppInfo::AppStoreState::PENDING_DEVELOPER_RELEASE,
88
+ Spaceship::ConnectAPI::AppInfo::AppStoreState::PROCESSING_FOR_APP_STORE,
89
+ Spaceship::ConnectAPI::AppInfo::AppStoreState::IN_REVIEW
90
+ ]
91
+
92
+ filter = { app: id }
93
+ resp = Spaceship::ConnectAPI.get_app_infos(filter: filter, includes: includes)
94
+ return resp.to_models.select do |model|
95
+ states.include?(model.app_store_state)
96
+ end.first
97
+ end
98
+
81
99
  def fetch_edit_app_info(includes: Spaceship::ConnectAPI::AppInfo::ESSENTIAL_INCLUDES)
82
100
  states = [
83
101
  Spaceship::ConnectAPI::AppInfo::AppStoreState::PREPARE_FOR_SUBMISSION,
@@ -95,6 +113,16 @@ module Spaceship
95
113
  end.first
96
114
  end
97
115
 
116
+ #
117
+ # Available Territories
118
+ #
119
+
120
+ def fetch_available_territories(filter: {}, includes: nil, limit: nil, sort: nil)
121
+ filter ||= {}
122
+ resps = Spaceship::ConnectAPI.get_available_territories(app_id: id, filter: filter, includes: includes, limit: limit, sort: sort).all_pages
123
+ return resps.flat_map(&:to_models)
124
+ end
125
+
98
126
  #
99
127
  # App Pricing
100
128
  #
@@ -152,10 +180,22 @@ module Spaceship
152
180
  end
153
181
  end
154
182
 
183
+ def get_latest_app_store_version(platform: nil, includes: nil)
184
+ platform ||= Spaceship::ConnectAPI::Platform::IOS
185
+ filter = {
186
+ platform: platform
187
+ }
188
+
189
+ # Get the latest version
190
+ return get_app_store_versions(filter: filter, includes: includes)
191
+ .sort_by { |v| Date.parse(v.created_date) }
192
+ .last
193
+ end
194
+
155
195
  def get_live_app_store_version(platform: nil, includes: nil)
156
196
  platform ||= Spaceship::ConnectAPI::Platform::IOS
157
197
  filter = {
158
- appStoreState: [Spaceship::ConnectAPI::AppStoreVersion::AppStoreState::READY_FOR_SALE].join(","),
198
+ appStoreState: Spaceship::ConnectAPI::AppStoreVersion::AppStoreState::READY_FOR_SALE,
159
199
  platform: platform
160
200
  }
161
201
  return get_app_store_versions(filter: filter, includes: includes).first
@@ -181,6 +221,24 @@ module Spaceship
181
221
  .last
182
222
  end
183
223
 
224
+ def get_in_review_app_store_version(platform: nil, includes: nil)
225
+ platform ||= Spaceship::ConnectAPI::Platform::IOS
226
+ filter = {
227
+ appStoreState: Spaceship::ConnectAPI::AppStoreVersion::AppStoreState::IN_REVIEW,
228
+ platform: platform
229
+ }
230
+ return get_app_store_versions(filter: filter, includes: includes).first
231
+ end
232
+
233
+ def get_pending_release_app_store_version(platform: nil, includes: nil)
234
+ platform ||= Spaceship::ConnectAPI::Platform::IOS
235
+ filter = {
236
+ appStoreState: Spaceship::ConnectAPI::AppStoreVersion::AppStoreState::PENDING_DEVELOPER_RELEASE,
237
+ platform: platform
238
+ }
239
+ return get_app_store_versions(filter: filter, includes: includes).first
240
+ end
241
+
184
242
  def get_app_store_versions(filter: {}, includes: nil, limit: nil, sort: nil)
185
243
  resps = Spaceship::ConnectAPI.get_app_store_versions(app_id: id, filter: filter, includes: includes, limit: limit, sort: sort).all_pages
186
244
  return resps.flat_map(&:to_models)
@@ -27,6 +27,7 @@ module Spaceship
27
27
  #
28
28
 
29
29
  def update(attributes: nil)
30
+ attributes = reverse_attr_mapping(attributes)
30
31
  Spaceship::ConnectAPI.patch_app_info_localization(app_info_localization_id: id, attributes: attributes)
31
32
  end
32
33
 
@@ -119,6 +119,7 @@ module Spaceship
119
119
  end
120
120
 
121
121
  def update(attributes: nil)
122
+ attributes = reverse_attr_mapping(attributes)
122
123
  Spaceship::ConnectAPI.patch_app_preview(app_preview_id: id, attributes: attributes).first
123
124
  end
124
125
 
@@ -1,5 +1,6 @@
1
1
  require_relative '../model'
2
2
  require_relative '../file_uploader'
3
+ require_relative './app_screenshot_set'
3
4
  require 'spaceship/globals'
4
5
 
5
6
  require 'digest/md5'
@@ -9,6 +10,7 @@ module Spaceship
9
10
  class AppScreenshot
10
11
  include Spaceship::ConnectAPI::Model
11
12
 
13
+ attr_accessor :file_size
12
14
  attr_accessor :file_name
13
15
  attr_accessor :source_file_checksum
14
16
  attr_accessor :image_asset
@@ -19,6 +21,7 @@ module Spaceship
19
21
  attr_accessor :uploaded
20
22
 
21
23
  attr_mapping({
24
+ "fileSize" => "file_size",
22
25
  "fileName" => "file_name",
23
26
  "sourceFileChecksum" => "source_file_checksum",
24
27
  "imageAsset" => "image_asset",
@@ -33,6 +36,10 @@ module Spaceship
33
36
  return "appScreenshots"
34
37
  end
35
38
 
39
+ def awaiting_upload?
40
+ (asset_delivery_state || {})["state"] == "AWAITING_UPLOAD"
41
+ end
42
+
36
43
  def complete?
37
44
  (asset_delivery_state || {})["state"] == "COMPLETE"
38
45
  end
@@ -84,11 +91,43 @@ module Spaceship
84
91
  fileName: filename
85
92
  }
86
93
 
87
- # Create placeholder
88
- screenshot = Spaceship::ConnectAPI.post_app_screenshot(
89
- app_screenshot_set_id: app_screenshot_set_id,
90
- attributes: post_attributes
91
- ).first
94
+ # Create placeholder to upload screenshot
95
+ begin
96
+ screenshot = Spaceship::ConnectAPI.post_app_screenshot(
97
+ app_screenshot_set_id: app_screenshot_set_id,
98
+ attributes: post_attributes
99
+ ).first
100
+ rescue => error
101
+ # Sometimes creating a screenshot with the web session App Store Connect API
102
+ # will result in a false failure. The response will return a 503 but the database
103
+ # insert will eventually go through.
104
+ #
105
+ # When this is observed, we will poll until we find the matchin screenshot that
106
+ # is awaiting for upload and file size
107
+ #
108
+ # https://github.com/fastlane/fastlane/pull/16842
109
+ time = Time.now.to_i
110
+
111
+ timeout_minutes = (ENV["SPACESHIP_SCREENSHOT_UPLOAD_TIMEOUT"] || 20).to_i
112
+
113
+ loop do
114
+ puts("Waiting for screenshot to appear before uploading...")
115
+ sleep(30)
116
+
117
+ screenshots = Spaceship::ConnectAPI::AppScreenshotSet
118
+ .get(app_screenshot_set_id: app_screenshot_set_id)
119
+ .app_screenshots
120
+
121
+ screenshot = screenshots.find do |s|
122
+ s.awaiting_upload? && s.file_size == filesize
123
+ end
124
+
125
+ break if screenshot
126
+
127
+ time_diff = Time.now.to_i - time
128
+ raise error if time_diff >= (60 * timeout_minutes)
129
+ end
130
+ end
92
131
 
93
132
  # Upload the file
94
133
  upload_operations = screenshot.upload_operations
@@ -39,6 +39,7 @@ module Spaceship
39
39
  #
40
40
 
41
41
  def update(attributes: nil)
42
+ attributes = reverse_attr_mapping(attributes)
42
43
  return Spaceship::ConnectAPI.patch_app_store_review_detail(app_store_review_detail_id: id, attributes: attributes)
43
44
  end
44
45
 
@@ -1,4 +1,5 @@
1
1
  require_relative '../model'
2
+ require_relative './app_store_review_detail'
2
3
  require_relative './app_store_version_localization'
3
4
 
4
5
  module Spaceship
@@ -85,6 +86,7 @@ module Spaceship
85
86
  end
86
87
 
87
88
  def update(attributes: nil)
89
+ attributes = reverse_attr_mapping(attributes)
88
90
  return Spaceship::ConnectAPI.patch_app_store_version(app_store_version_id: id, attributes: attributes).first
89
91
  end
90
92
 
@@ -118,6 +120,7 @@ module Spaceship
118
120
  #
119
121
 
120
122
  def create_app_store_review_detail(attributes: nil)
123
+ attributes = Spaceship::ConnectAPI::AppStoreReviewDetail.reverse_attr_mapping(attributes)
121
124
  resp = Spaceship::ConnectAPI.post_app_store_review_detail(app_store_version_id: id, attributes: attributes)
122
125
  return resp.to_models.first
123
126
  end
@@ -155,6 +158,15 @@ module Spaceship
155
158
  return resp.to_models.first
156
159
  end
157
160
 
161
+ #
162
+ # App Store Version Release Requests
163
+ #
164
+
165
+ def create_app_store_version_release_request
166
+ resp = Spaceship::ConnectAPI.post_app_store_version_release_request(app_store_version_id: id)
167
+ return resp.to_models.first
168
+ end
169
+
158
170
  #
159
171
  # Build
160
172
  #
@@ -45,6 +45,7 @@ module Spaceship
45
45
  end
46
46
 
47
47
  def update(attributes: nil)
48
+ attributes = reverse_attr_mapping(attributes)
48
49
  Spaceship::ConnectAPI.patch_app_store_version_localization(app_store_version_localization_id: id, attributes: attributes)
49
50
  end
50
51