fastlane 2.157.0 → 2.158.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 (52) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +72 -72
  3. data/deliver/lib/deliver/app_screenshot_iterator.rb +1 -1
  4. data/deliver/lib/deliver/runner.rb +5 -3
  5. data/fastlane/lib/fastlane/actions/.hockey.rb.swp +0 -0
  6. data/fastlane/lib/fastlane/actions/{.git_commit.rb.swp → .slack.rb.swp} +0 -0
  7. data/fastlane/lib/fastlane/actions/.update_project_provisioning.rb.swp +0 -0
  8. data/fastlane/lib/fastlane/actions/app_store_build_number.rb +12 -8
  9. data/fastlane/lib/fastlane/actions/download_dsyms.rb +89 -68
  10. data/fastlane/lib/fastlane/actions/set_changelog.rb +3 -2
  11. data/fastlane/lib/fastlane/version.rb +1 -1
  12. data/fastlane/swift/Deliverfile.swift +1 -1
  13. data/fastlane/swift/DeliverfileProtocol.swift +1 -1
  14. data/fastlane/swift/Fastlane.swift +18 -12
  15. data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/xcuserdata/josh.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  16. data/fastlane/swift/Gymfile.swift +1 -1
  17. data/fastlane/swift/GymfileProtocol.swift +1 -1
  18. data/fastlane/swift/Matchfile.swift +1 -1
  19. data/fastlane/swift/MatchfileProtocol.swift +1 -1
  20. data/fastlane/swift/Precheckfile.swift +1 -1
  21. data/fastlane/swift/PrecheckfileProtocol.swift +5 -1
  22. data/fastlane/swift/Scanfile.swift +1 -1
  23. data/fastlane/swift/ScanfileProtocol.swift +1 -1
  24. data/fastlane/swift/Screengrabfile.swift +1 -1
  25. data/fastlane/swift/ScreengrabfileProtocol.swift +1 -1
  26. data/fastlane/swift/Snapshotfile.swift +1 -1
  27. data/fastlane/swift/SnapshotfileProtocol.swift +1 -1
  28. data/fastlane_core/lib/fastlane_core/command_executor.rb +1 -0
  29. data/match/lib/match/spaceship_ensure.rb +5 -5
  30. data/{fastlane/lib/fastlane/.erb_template_helper.rb.swp → pilot/lib/pilot/.manager.rb.swp} +0 -0
  31. data/pilot/lib/pilot/build_manager.rb +0 -3
  32. data/pilot/lib/pilot/manager.rb +1 -1
  33. data/precheck/lib/precheck/options.rb +9 -0
  34. data/precheck/lib/precheck/rule_processor.rb +94 -60
  35. data/precheck/lib/precheck/runner.rb +6 -4
  36. data/produce/lib/produce/itunes_connect.rb +3 -2
  37. data/screengrab/lib/screengrab/runner.rb +28 -10
  38. data/sigh/lib/assets/resign.sh +9 -6
  39. data/sigh/lib/sigh/runner.rb +3 -2
  40. data/spaceship/lib/spaceship/client.rb +1 -0
  41. data/spaceship/lib/spaceship/connect_api.rb +1 -0
  42. data/spaceship/lib/spaceship/{.DS_Store → connect_api/.DS_Store} +0 -0
  43. data/spaceship/lib/spaceship/connect_api/client.rb +32 -13
  44. data/spaceship/lib/spaceship/connect_api/file_uploader.rb +2 -0
  45. data/spaceship/lib/spaceship/connect_api/models/app.rb +5 -5
  46. data/spaceship/lib/spaceship/connect_api/models/app_price_point.rb +26 -0
  47. data/spaceship/lib/spaceship/connect_api/models/app_store_version.rb +7 -1
  48. data/spaceship/lib/spaceship/connect_api/models/app_store_version_phased_release.rb +21 -0
  49. data/spaceship/lib/spaceship/connect_api/spaceship.rb +10 -6
  50. data/spaceship/lib/spaceship/connect_api/testflight/testflight.rb +50 -50
  51. data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +20 -0
  52. metadata +25 -21
@@ -19,9 +19,10 @@ module Precheck
19
19
  title: "Summary for precheck #{Fastlane::VERSION}")
20
20
 
21
21
  unless Spaceship::Tunes.client
22
+ # Team selection passed though FASTLANE_ITC_TEAM_ID and FASTLANE_ITC_TEAM_NAME environment variables
23
+ # Prompts select team if multiple teams and none specified
22
24
  UI.message("Starting login with user '#{Precheck.config[:username]}'")
23
- Spaceship::Tunes.login(Precheck.config[:username])
24
- Spaceship::Tunes.select_team
25
+ Spaceship::ConnectAPI.login(Precheck.config[:username], use_portal: false, use_tunes: true)
25
26
 
26
27
  UI.message("Successfully logged in")
27
28
  end
@@ -160,11 +161,12 @@ module Precheck
160
161
  end
161
162
 
162
163
  def app
163
- Spaceship::Tunes::Application.find(Precheck.config[:app_identifier])
164
+ Spaceship::ConnectAPI::App.find(Precheck.config[:app_identifier])
164
165
  end
165
166
 
166
167
  def latest_app_version
167
- @latest_version ||= app.latest_version
168
+ platform = Spaceship::ConnectAPI::Platform.map(Precheck.config[:platform])
169
+ @latest_version ||= app.get_edit_app_store_version(platform: platform)
168
170
  end
169
171
 
170
172
  # Makes sure the current App ID exists. If not, it will show an appropriate error message
@@ -9,8 +9,9 @@ module Produce
9
9
  @full_bundle_identifier = app_identifier
10
10
  @full_bundle_identifier.gsub!('*', Produce.config[:bundle_identifier_suffix].to_s) if wildcard_bundle?
11
11
 
12
- Spaceship::ConnectAPI.login(Produce.config[:username], nil)
13
- Spaceship::ConnectAPI.client.select_team
12
+ # Team selection passed though FASTLANE_ITC_TEAM_ID and FASTLANE_ITC_TEAM_NAME environment variables
13
+ # Prompts select team if multiple teams and none specified
14
+ Spaceship::ConnectAPI.login(Produce.config[:username], nil, use_portal: false, use_tunes: true)
14
15
 
15
16
  create_new_app
16
17
  end
@@ -82,7 +82,7 @@ module Screengrab
82
82
  end
83
83
 
84
84
  def select_device
85
- adb = Fastlane::Helper::AdbHelper.new(adb_host: @config[:adb_host])
85
+ adb = Fastlane::Helper::AdbHelper.new(adb_path: @android_env.adb_path, adb_host: @config[:adb_host])
86
86
  devices = adb.load_all_devices
87
87
 
88
88
  UI.user_error!('There are no connected and authorized devices or emulators') if devices.empty?
@@ -299,9 +299,17 @@ module Screengrab
299
299
  device_screenshots_paths.each do |device_path|
300
300
  if_device_path_exists(@config[:app_package_name], device_serial, device_path) do |path|
301
301
  next unless path.include?(locale)
302
- run_adb_command("-s #{device_serial} pull #{path} #{tempdir}",
303
- print_all: false,
304
- print_command: true)
302
+ out = run_adb_command("-s #{device_serial} pull #{path} #{tempdir}",
303
+ print_all: false,
304
+ print_command: true,
305
+ raise_errors: false)
306
+ if out =~ /Permission denied/
307
+ dir = File.dirname(path)
308
+ base = File.basename(path)
309
+ run_adb_command("-s #{device_serial} shell run-as #{@config[:app_package_name]} 'tar -cC #{dir} #{base}' | tar -xvC #{tempdir}",
310
+ print_all: false,
311
+ print_command: true)
312
+ end
305
313
  end
306
314
  end
307
315
 
@@ -381,16 +389,26 @@ module Screengrab
381
389
  packages.split("\n").map { |package| package.gsub("package:", "") }
382
390
  end
383
391
 
384
- def run_adb_command(command, print_all: false, print_command: false)
392
+ def run_adb_command(command, print_all: false, print_command: false, raise_errors: true)
385
393
  adb_path = @android_env.adb_path.chomp("adb")
386
394
  adb_host = @config[:adb_host]
387
395
  host = adb_host.nil? ? '' : "-H #{adb_host} "
388
- output = @executor.execute(command: adb_path + "adb " + host + command,
389
- print_all: print_all,
390
- print_command: print_command) || ''
396
+ output = ''
397
+ begin
398
+ errout = nil
399
+ cmdout = @executor.execute(command: adb_path + "adb " + host + command,
400
+ print_all: print_all,
401
+ print_command: print_command,
402
+ error: raise_errors ? nil : proc { |out, status| errout = out }) || ''
403
+ output = errout || cmdout
404
+ rescue => ex
405
+ if raise_errors
406
+ raise ex
407
+ end
408
+ end
391
409
  output.lines.reject do |line|
392
- # Debug/Warning output from ADB}
393
- line.start_with?('adb: ')
410
+ # Debug/Warning output from ADB
411
+ line.start_with?('adb: ') && !line.start_with?('adb: error: ')
394
412
  end.join('') # Lines retain their newline chars
395
413
  end
396
414
 
@@ -72,6 +72,9 @@
72
72
  # new features June 2020
73
73
  # 1. enable (re)signing of OnDemandResources when ipa has been built for the appstore
74
74
  #
75
+ # new features August 2020
76
+ # 1. fixes usage for users with GNU-sed in their $PATH
77
+ #
75
78
 
76
79
  # Logging functions
77
80
 
@@ -762,7 +765,7 @@ function resign {
762
765
 
763
766
  # Get the entry from app's entitlements
764
767
  # Read it with PlistBuddy as XML, then strip the header and <plist></plist> part
765
- ENTITLEMENTS_VALUE="$(PlistBuddy -x -c "Print $KEY" "$APP_ENTITLEMENTS" 2>/dev/null | sed -e 's,.*<plist[^>]*>\(.*\)</plist>,\1,g')"
768
+ ENTITLEMENTS_VALUE="$(PlistBuddy -x -c "Print $KEY" "$APP_ENTITLEMENTS" 2>/dev/null | /usr/bin/sed -e 's,.*<plist[^>]*>\(.*\)</plist>,\1,g')"
766
769
  if [[ -z "$ENTITLEMENTS_VALUE" ]]; then
767
770
  log "No value for '$KEY'"
768
771
  continue
@@ -780,7 +783,7 @@ function resign {
780
783
  log "Certificate $CERTIFICATE matches a SHA1 pattern"
781
784
  local certificate_matches="$( security find-identity -v -p codesigning | grep -m 1 "$CERTIFICATE" )"
782
785
  if [ -n "$certificate_matches" ]; then
783
- certificate_name="$( sed -E s/[^\"]+\"\([^\"]+\)\".*/\\1/ <<< $certificate_matches )"
786
+ certificate_name="$(/usr/bin/sed -E s/[^\"]+\"\([^\"]+\)\".*/\\1/ <<< $certificate_matches )"
784
787
  log "Certificate name: $certificate_name"
785
788
  fi
786
789
  fi
@@ -807,18 +810,18 @@ function resign {
807
810
  # otherwise it interprets they key path as nested keys
808
811
  # TODO: Should be able to replace with echo ${KEY//\./\\\\.} and remove shellcheck disable directive
809
812
  # shellcheck disable=SC2001
810
- PLUTIL_KEY=$(echo "$KEY" | sed 's/\./\\\./g')
813
+ PLUTIL_KEY=$(echo "$KEY" | /usr/bin/sed 's/\./\\\./g')
811
814
  plutil -insert "$PLUTIL_KEY" -xml "$ENTITLEMENTS_VALUE" "$PATCHED_ENTITLEMENTS"
812
815
 
813
816
  # Patch the ID value if specified
814
817
  if [[ "$ID_TYPE" == "APP_ID" ]]; then
815
818
  # Replace old value with new value in patched entitlements
816
819
  log "Replacing old app identifier prefix '$OLD_APP_ID' with new value '$NEW_APP_ID'"
817
- sed -i .bak "s/$OLD_APP_ID/$NEW_APP_ID/g" "$PATCHED_ENTITLEMENTS"
820
+ /usr/bin/sed -i .bak "s/$OLD_APP_ID/$NEW_APP_ID/g" "$PATCHED_ENTITLEMENTS"
818
821
  elif [[ "$ID_TYPE" == "TEAM_ID" ]]; then
819
822
  # Replace old team identifier with new value
820
823
  log "Replacing old team ID '$OLD_TEAM_ID' with new team ID: '$NEW_TEAM_ID'"
821
- sed -i .bak "s/$OLD_TEAM_ID/$NEW_TEAM_ID/g" "$PATCHED_ENTITLEMENTS"
824
+ /usr/bin/sed -i .bak "s/$OLD_TEAM_ID/$NEW_TEAM_ID/g" "$PATCHED_ENTITLEMENTS"
822
825
  else
823
826
  continue
824
827
  fi
@@ -835,7 +838,7 @@ function resign {
835
838
  # e.g. <string>AB1GP98Q19.com.example.foo</string>
836
839
  # vs
837
840
  # com.example.foo
838
- sed -i .bak "s!${OLD_BUNDLE_ID}</string>!${NEW_BUNDLE_ID}</string>!g" "$PATCHED_ENTITLEMENTS"
841
+ /usr/bin/sed -i .bak "s!${OLD_BUNDLE_ID}</string>!${NEW_BUNDLE_ID}</string>!g" "$PATCHED_ENTITLEMENTS"
839
842
 
840
843
  log "Resigning application using certificate: '$CERTIFICATE'"
841
844
  log "and patched entitlements:"
@@ -17,9 +17,10 @@ module Sigh
17
17
  hide_keys: [:output_path],
18
18
  title: "Summary for sigh #{Fastlane::VERSION}")
19
19
 
20
+ # Team selection passed though FASTLANE_ITC_TEAM_ID and FASTLANE_ITC_TEAM_NAME environment variables
21
+ # Prompts select team if multiple teams and none specified
20
22
  UI.message("Starting login with user '#{Sigh.config[:username]}'")
21
- Spaceship::ConnectAPI.login(Sigh.config[:username], nil)
22
- Spaceship::ConnectAPI.select_team
23
+ Spaceship::ConnectAPI.login(Sigh.config[:username], nil, use_portal: true, use_tunes: false)
23
24
  UI.message("Successfully logged in")
24
25
 
25
26
  profiles = [] if Sigh.config[:skip_fetch_profiles]
@@ -6,6 +6,7 @@ require 'logger'
6
6
  require 'tmpdir'
7
7
  require 'cgi'
8
8
  require 'tempfile'
9
+ require 'openssl'
9
10
 
10
11
  require 'fastlane/version'
11
12
  require_relative 'helper/net_http_generic_request'
@@ -39,6 +39,7 @@ require 'spaceship/connect_api/models/app_info_localization'
39
39
  require 'spaceship/connect_api/models/app_preview_set'
40
40
  require 'spaceship/connect_api/models/app_preview'
41
41
  require 'spaceship/connect_api/models/app_price'
42
+ require 'spaceship/connect_api/models/app_price_point'
42
43
  require 'spaceship/connect_api/models/app_price_tier'
43
44
  require 'spaceship/connect_api/models/app_store_review_attachment'
44
45
  require 'spaceship/connect_api/models/app_store_review_detail'
@@ -38,21 +38,30 @@ module Spaceship
38
38
  #
39
39
  # @param user (String) (optional): The username (usually the email address)
40
40
  # @param password (String) (optional): The password
41
- # @param team_id (String) (optional): The team id
41
+ # @param use_portal (Boolean) (optional): Whether to log in to Spaceship::Portal or not
42
+ # @param use_tunes (Boolean) (optional): Whether to log in to Spaceship::Tunes or not
43
+ # @param portal_team_id (String) (optional): The Spaceship::Portal team id
44
+ # @param tunes_team_id (String) (optional): The Spaceship::Tunes team id
42
45
  # @param team_name (String) (optional): The team name
43
46
  #
44
47
  # @raise InvalidUserCredentialsError: raised if authentication failed
45
48
  #
46
49
  # @return (Spaceship::ConnectAPI::Client) The client the login method was called for
47
- def self.login(user = nil, password = nil, team_id: nil, team_name: nil)
48
- tunes_client = TunesClient.login(user, password)
49
- portal_client = PortalClient.login(user, password)
50
-
51
- # The clients will automatically select the first team if none is given
52
- if !team_id.nil? || !team_name.nil?
53
- tunes_client.select_team(team_id: team_id, team_name: team_name)
54
- portal_client.select_team(team_id: team_id, team_name: team_name)
55
- end
50
+ def self.login(user = nil, password = nil, use_portal: true, use_tunes: true, portal_team_id: nil, tunes_team_id: nil, team_name: nil)
51
+ portal_client = Spaceship::Portal.login(user, password) if use_portal
52
+ tunes_client = Spaceship::Tunes.login(user, password) if use_tunes
53
+
54
+ # Check if environment variables are set for Spaceship::Portal or Spaceship::Tunes to select team
55
+ portal_team_id ||= ENV['FASTLANE_TEAM_ID']
56
+ portal_team_name = team_name || ENV['FASTLANE_TEAM_NAME']
57
+ tunes_team_id ||= ENV['FASTLANE_ITC_TEAM_ID']
58
+ tunes_team_name = team_name || ENV['FASTLANE_ITC_TEAM_NAME']
59
+
60
+ # The clients will prompt for a team selection if:
61
+ # 1. client exists
62
+ # 2. team_id and team_name are nil and user belongs to multiple teams
63
+ portal_client.select_team(team_id: portal_team_id, team_name: portal_team_name) if portal_client
64
+ tunes_client.select_team(team_id: tunes_team_id, team_name: tunes_team_name) if tunes_client
56
65
 
57
66
  return ConnectAPI::Client.new(tunes_client: tunes_client, portal_client: portal_client)
58
67
  end
@@ -84,6 +93,16 @@ module Spaceship
84
93
  )
85
94
  end
86
95
 
96
+ def portal_team_id
97
+ return nil if @portal_client.nil?
98
+ return @portal_client.team_id
99
+ end
100
+
101
+ def tunes_team_id
102
+ return nil if @tunes_client.nil?
103
+ return @tunes_client.team_id
104
+ end
105
+
87
106
  def in_house?
88
107
  if token
89
108
  if token.in_house.nil?
@@ -104,9 +123,9 @@ module Spaceship
104
123
  end
105
124
  end
106
125
 
107
- def select_team(team_id: nil, team_name: nil)
108
- @tunes_client.select_team(team_id: team_id, team_name: team_name)
109
- @portal_client.select_team(team_id: team_id, team_name: team_name)
126
+ def select_team(portal_team_id: nil, tunes_team_id: nil, team_name: nil)
127
+ @portal_client.select_team(team_id: portal_team_id, team_name: team_name) unless @portal_client.nil?
128
+ @tunes_client.select_team(team_id: tunes_team_id, team_name: team_name) unless @tunes_client.nil?
110
129
 
111
130
  # Updating the tunes and portal clients requires resetting
112
131
  # of the clients in the API modules
@@ -4,6 +4,8 @@ require 'faraday_middleware'
4
4
 
5
5
  require 'spaceship/globals'
6
6
 
7
+ require 'openssl'
8
+
7
9
  module Spaceship
8
10
  class ConnectAPI
9
11
  module FileUploader
@@ -192,7 +192,7 @@ module Spaceship
192
192
  .last
193
193
  end
194
194
 
195
- def get_live_app_store_version(platform: nil, includes: nil)
195
+ def get_live_app_store_version(platform: nil, includes: Spaceship::ConnectAPI::AppStoreVersion::ESSENTIAL_INCLUDES)
196
196
  platform ||= Spaceship::ConnectAPI::Platform::IOS
197
197
  filter = {
198
198
  appStoreState: Spaceship::ConnectAPI::AppStoreVersion::AppStoreState::READY_FOR_SALE,
@@ -201,7 +201,7 @@ module Spaceship
201
201
  return get_app_store_versions(filter: filter, includes: includes).first
202
202
  end
203
203
 
204
- def get_edit_app_store_version(platform: nil, includes: nil)
204
+ def get_edit_app_store_version(platform: nil, includes: Spaceship::ConnectAPI::AppStoreVersion::ESSENTIAL_INCLUDES)
205
205
  platform ||= Spaceship::ConnectAPI::Platform::IOS
206
206
  filter = {
207
207
  appStoreState: [
@@ -221,7 +221,7 @@ module Spaceship
221
221
  .last
222
222
  end
223
223
 
224
- def get_in_review_app_store_version(platform: nil, includes: nil)
224
+ def get_in_review_app_store_version(platform: nil, includes: Spaceship::ConnectAPI::AppStoreVersion::ESSENTIAL_INCLUDES)
225
225
  platform ||= Spaceship::ConnectAPI::Platform::IOS
226
226
  filter = {
227
227
  appStoreState: Spaceship::ConnectAPI::AppStoreVersion::AppStoreState::IN_REVIEW,
@@ -230,7 +230,7 @@ module Spaceship
230
230
  return get_app_store_versions(filter: filter, includes: includes).first
231
231
  end
232
232
 
233
- def get_pending_release_app_store_version(platform: nil, includes: nil)
233
+ def get_pending_release_app_store_version(platform: nil, includes: Spaceship::ConnectAPI::AppStoreVersion::ESSENTIAL_INCLUDES)
234
234
  platform ||= Spaceship::ConnectAPI::Platform::IOS
235
235
  filter = {
236
236
  appStoreState: Spaceship::ConnectAPI::AppStoreVersion::AppStoreState::PENDING_DEVELOPER_RELEASE,
@@ -239,7 +239,7 @@ module Spaceship
239
239
  return get_app_store_versions(filter: filter, includes: includes).first
240
240
  end
241
241
 
242
- def get_app_store_versions(filter: {}, includes: nil, limit: nil, sort: nil)
242
+ def get_app_store_versions(filter: {}, includes: Spaceship::ConnectAPI::AppStoreVersion::ESSENTIAL_INCLUDES, limit: nil, sort: nil)
243
243
  resps = Spaceship::ConnectAPI.get_app_store_versions(app_id: id, filter: filter, includes: includes, limit: limit, sort: sort).all_pages
244
244
  return resps.flat_map(&:to_models)
245
245
  end
@@ -0,0 +1,26 @@
1
+ require_relative '../model'
2
+ module Spaceship
3
+ class ConnectAPI
4
+ class AppPricePoint
5
+ include Spaceship::ConnectAPI::Model
6
+
7
+ attr_accessor :customer_price
8
+
9
+ attr_accessor :proceeds
10
+
11
+ attr_accessor :price_tier
12
+ attr_accessor :territory
13
+
14
+ attr_mapping({
15
+ "customerPrice" => "customer_price",
16
+ "proceeds" => "proceeds",
17
+ "priceTier" => "price_tier",
18
+ "territory" => "territory"
19
+ })
20
+
21
+ def self.type
22
+ return "appPricePoints"
23
+ end
24
+ end
25
+ end
26
+ end
@@ -55,9 +55,15 @@ module Spaceship
55
55
  "downloadable" => "downloadable",
56
56
  "createdDate" => "created_date",
57
57
 
58
- "appStoreVersionSubmission" => "app_store_version_submission"
58
+ "appStoreVersionSubmission" => "app_store_version_submission",
59
+ "build" => "build"
59
60
  })
60
61
 
62
+ ESSENTIAL_INCLUDES = [
63
+ "appStoreVersionSubmission",
64
+ "build"
65
+ ].join(",")
66
+
61
67
  def self.type
62
68
  return "appStoreVersions"
63
69
  end
@@ -11,6 +11,9 @@ module Spaceship
11
11
 
12
12
  module PhasedReleaseState
13
13
  INACTIVE = "INACTIVE"
14
+ ACTIVE = "ACTIVE"
15
+ PAUSED = "PAUSED"
16
+ COMPLETE = "COMPLETE"
14
17
  end
15
18
 
16
19
  attr_mapping({
@@ -28,9 +31,27 @@ module Spaceship
28
31
  # API
29
32
  #
30
33
 
34
+ def pause
35
+ update(PhasedReleaseState::PAUSED)
36
+ end
37
+
38
+ def resume
39
+ update(PhasedReleaseState::ACTIVE)
40
+ end
41
+
42
+ def complete
43
+ update(PhasedReleaseState::COMPLETE)
44
+ end
45
+
31
46
  def delete!(filter: {}, includes: nil, limit: nil, sort: nil)
32
47
  Spaceship::ConnectAPI.delete_app_store_version_phased_release(app_store_version_phased_release_id: id)
33
48
  end
49
+
50
+ private def update(state)
51
+ Spaceship::ConnectAPI.patch_app_store_version_phased_release(app_store_version_phased_release_id: id, attributes: {
52
+ phasedReleaseState: state
53
+ }).to_models.first
54
+ end
34
55
  end
35
56
  end
36
57
  end
@@ -68,14 +68,17 @@ module Spaceship
68
68
  #
69
69
  # @param user (String) (optional): The username (usually the email address)
70
70
  # @param password (String) (optional): The password
71
- # @param team_id (String) (optional): The team id
71
+ # @param use_portal (Boolean) (optional): Whether to log in to Spaceship::Portal or not
72
+ # @param use_tunes (Boolean) (optional): Whether to log in to Spaceship::Tunes or not
73
+ # @param portal_team_id (String) (optional): The Spaceship::Portal team id
74
+ # @param tunes_team_id (String) (optional): The Spaceship::Tunes team id
72
75
  # @param team_name (String) (optional): The team name
73
76
  #
74
77
  # @raise InvalidUserCredentialsError: raised if authentication failed
75
78
  #
76
79
  # @return (Spaceship::ConnectAPI::Client) The client the login method was called for
77
- def login(user = nil, password = nil, team_id: nil, team_name: nil)
78
- @client = ConnectAPI::Client.login(user, password, team_id: team_id, team_name: team_name)
80
+ def login(user = nil, password = nil, use_portal: true, use_tunes: true, portal_team_id: nil, tunes_team_id: nil, team_name: nil)
81
+ @client = ConnectAPI::Client.login(user, password, use_portal: use_portal, use_tunes: use_tunes, portal_team_id: portal_team_id, tunes_team_id: tunes_team_id, team_name: team_name)
79
82
  end
80
83
 
81
84
  # Open up the team selection for the user (if necessary).
@@ -83,11 +86,12 @@ module Spaceship
83
86
  # If the user is in multiple teams, a team selection is shown.
84
87
  # The user can then select a team by entering the number
85
88
  #
86
- # @param team_id (String) (optional): The ID of an App Store Connect team
89
+ # @param portal_team_id (String) (optional): The Spaceship::Portal team id
90
+ # @param tunes_team_id (String) (optional): The Spaceship::Tunes team id
87
91
  # @param team_name (String) (optional): The name of an App Store Connect team
88
- def select_team(team_id: nil, team_name: nil)
92
+ def select_team(portal_team_id: nil, tunes_team_id: nil, team_name: nil)
89
93
  return if client.nil?
90
- client.select_team(team_id: team_id, team_name: team_name)
94
+ client.select_team(portal_team_id: portal_team_id, tunes_team_id: tunes_team_id, team_name: team_name)
91
95
  end
92
96
  end
93
97
  end
@@ -18,13 +18,13 @@ module Spaceship
18
18
  #
19
19
 
20
20
  def get_apps(filter: {}, includes: nil, limit: nil, sort: nil)
21
- params = @test_flight_request_client.build_params(filter: filter, includes: includes, limit: limit, sort: sort)
22
- @test_flight_request_client.get("apps", params)
21
+ params = test_flight_request_client.build_params(filter: filter, includes: includes, limit: limit, sort: sort)
22
+ test_flight_request_client.get("apps", params)
23
23
  end
24
24
 
25
25
  def get_app(app_id: nil, includes: nil)
26
- params = @test_flight_request_client.build_params(filter: nil, includes: includes, limit: nil, sort: nil)
27
- @test_flight_request_client.get("apps/#{app_id}", params)
26
+ params = test_flight_request_client.build_params(filter: nil, includes: includes, limit: nil, sort: nil)
27
+ test_flight_request_client.get("apps/#{app_id}", params)
28
28
  end
29
29
 
30
30
  #
@@ -32,8 +32,8 @@ module Spaceship
32
32
  #
33
33
 
34
34
  def get_beta_app_localizations(filter: {}, includes: nil, limit: nil, sort: nil)
35
- params = @test_flight_request_client.build_params(filter: filter, includes: includes, limit: limit, sort: sort)
36
- @test_flight_request_client.get("betaAppLocalizations", params)
35
+ params = test_flight_request_client.build_params(filter: filter, includes: includes, limit: limit, sort: sort)
36
+ test_flight_request_client.get("betaAppLocalizations", params)
37
37
  end
38
38
 
39
39
  def post_beta_app_localizations(app_id: nil, attributes: {})
@@ -52,7 +52,7 @@ module Spaceship
52
52
  }
53
53
  }
54
54
 
55
- @test_flight_request_client.post("betaAppLocalizations", body)
55
+ test_flight_request_client.post("betaAppLocalizations", body)
56
56
  end
57
57
 
58
58
  def patch_beta_app_localizations(localization_id: nil, attributes: {})
@@ -64,7 +64,7 @@ module Spaceship
64
64
  }
65
65
  }
66
66
 
67
- @test_flight_request_client.patch("betaAppLocalizations/#{localization_id}", body)
67
+ test_flight_request_client.patch("betaAppLocalizations/#{localization_id}", body)
68
68
  end
69
69
 
70
70
  #
@@ -72,8 +72,8 @@ module Spaceship
72
72
  #
73
73
 
74
74
  def get_beta_app_review_detail(filter: {}, includes: nil, limit: nil, sort: nil)
75
- params = @test_flight_request_client.build_params(filter: filter, includes: includes, limit: limit, sort: sort)
76
- @test_flight_request_client.get("betaAppReviewDetails", params)
75
+ params = test_flight_request_client.build_params(filter: filter, includes: includes, limit: limit, sort: sort)
76
+ test_flight_request_client.get("betaAppReviewDetails", params)
77
77
  end
78
78
 
79
79
  def patch_beta_app_review_detail(app_id: nil, attributes: {})
@@ -85,7 +85,7 @@ module Spaceship
85
85
  }
86
86
  }
87
87
 
88
- @test_flight_request_client.patch("betaAppReviewDetails/#{app_id}", body)
88
+ test_flight_request_client.patch("betaAppReviewDetails/#{app_id}", body)
89
89
  end
90
90
 
91
91
  #
@@ -93,8 +93,8 @@ module Spaceship
93
93
  #
94
94
 
95
95
  def get_beta_app_review_submissions(filter: {}, includes: nil, limit: nil, sort: nil, cursor: nil)
96
- params = @test_flight_request_client.build_params(filter: filter, includes: includes, limit: limit, sort: sort, cursor: cursor)
97
- @test_flight_request_client.get("betaAppReviewSubmissions", params)
96
+ params = test_flight_request_client.build_params(filter: filter, includes: includes, limit: limit, sort: sort, cursor: cursor)
97
+ test_flight_request_client.get("betaAppReviewSubmissions", params)
98
98
  end
99
99
 
100
100
  def post_beta_app_review_submissions(build_id: nil)
@@ -112,12 +112,12 @@ module Spaceship
112
112
  }
113
113
  }
114
114
 
115
- @test_flight_request_client.post("betaAppReviewSubmissions", body)
115
+ test_flight_request_client.post("betaAppReviewSubmissions", body)
116
116
  end
117
117
 
118
118
  def delete_beta_app_review_submission(beta_app_review_submission_id: nil)
119
- params = @test_flight_request_client.build_params(filter: nil, includes: nil, limit: nil, sort: nil, cursor: nil)
120
- @test_flight_request_client.delete("betaAppReviewSubmissions/#{beta_app_review_submission_id}", params)
119
+ params = test_flight_request_client.build_params(filter: nil, includes: nil, limit: nil, sort: nil, cursor: nil)
120
+ test_flight_request_client.delete("betaAppReviewSubmissions/#{beta_app_review_submission_id}", params)
121
121
  end
122
122
 
123
123
  #
@@ -125,8 +125,8 @@ module Spaceship
125
125
  #
126
126
 
127
127
  def get_beta_build_localizations(filter: {}, includes: nil, limit: nil, sort: nil)
128
- params = @test_flight_request_client.build_params(filter: filter, includes: includes, limit: limit, sort: sort)
129
- @test_flight_request_client.get("betaBuildLocalizations", params)
128
+ params = test_flight_request_client.build_params(filter: filter, includes: includes, limit: limit, sort: sort)
129
+ test_flight_request_client.get("betaBuildLocalizations", params)
130
130
  end
131
131
 
132
132
  def post_beta_build_localizations(build_id: nil, attributes: {})
@@ -145,7 +145,7 @@ module Spaceship
145
145
  }
146
146
  }
147
147
 
148
- @test_flight_request_client.post("betaBuildLocalizations", body)
148
+ test_flight_request_client.post("betaBuildLocalizations", body)
149
149
  end
150
150
 
151
151
  def patch_beta_build_localizations(localization_id: nil, feedbackEmail: nil, attributes: {})
@@ -157,7 +157,7 @@ module Spaceship
157
157
  }
158
158
  }
159
159
 
160
- @test_flight_request_client.patch("betaBuildLocalizations/#{localization_id}", body)
160
+ test_flight_request_client.patch("betaBuildLocalizations/#{localization_id}", body)
161
161
  end
162
162
 
163
163
  #
@@ -165,8 +165,8 @@ module Spaceship
165
165
  #
166
166
 
167
167
  def get_beta_build_metrics(filter: {}, includes: nil, limit: nil, sort: nil)
168
- params = @test_flight_request_client.build_params(filter: filter, includes: includes, limit: limit, sort: sort)
169
- @test_flight_request_client.get("betaBuildMetrics", params)
168
+ params = test_flight_request_client.build_params(filter: filter, includes: includes, limit: limit, sort: sort)
169
+ test_flight_request_client.get("betaBuildMetrics", params)
170
170
  end
171
171
 
172
172
  #
@@ -174,8 +174,8 @@ module Spaceship
174
174
  #
175
175
 
176
176
  def get_beta_groups(filter: {}, includes: nil, limit: nil, sort: nil)
177
- params = @test_flight_request_client.build_params(filter: filter, includes: includes, limit: limit, sort: sort)
178
- @test_flight_request_client.get("betaGroups", params)
177
+ params = test_flight_request_client.build_params(filter: filter, includes: includes, limit: limit, sort: sort)
178
+ test_flight_request_client.get("betaGroups", params)
179
179
  end
180
180
 
181
181
  def add_beta_groups_to_build(build_id: nil, beta_group_ids: [])
@@ -188,7 +188,7 @@ module Spaceship
188
188
  end
189
189
  }
190
190
 
191
- @test_flight_request_client.post("builds/#{build_id}/relationships/betaGroups", body)
191
+ test_flight_request_client.post("builds/#{build_id}/relationships/betaGroups", body)
192
192
  end
193
193
 
194
194
  def create_beta_group(app_id: nil, group_name: nil, public_link_enabled: false, public_link_limit: 10_000, public_link_limit_enabled: false)
@@ -211,7 +211,7 @@ module Spaceship
211
211
  type: "betaGroups"
212
212
  }
213
213
  }
214
- @test_flight_request_client.post("betaGroups", body)
214
+ test_flight_request_client.post("betaGroups", body)
215
215
  end
216
216
 
217
217
  #
@@ -219,8 +219,8 @@ module Spaceship
219
219
  #
220
220
 
221
221
  def get_beta_testers(filter: {}, includes: nil, limit: nil, sort: nil)
222
- params = @test_flight_request_client.build_params(filter: filter, includes: includes, limit: limit, sort: sort)
223
- @test_flight_request_client.get("betaTesters", params)
222
+ params = test_flight_request_client.build_params(filter: filter, includes: includes, limit: limit, sort: sort)
223
+ test_flight_request_client.get("betaTesters", params)
224
224
  end
225
225
 
226
226
  # beta_testers - [{email: "", firstName: "", lastName: ""}]
@@ -248,7 +248,7 @@ module Spaceship
248
248
  }
249
249
  }
250
250
 
251
- @test_flight_request_client.post("bulkBetaTesterAssignments", body)
251
+ test_flight_request_client.post("bulkBetaTesterAssignments", body)
252
252
  end
253
253
 
254
254
  def delete_beta_tester_from_apps(beta_tester_id: nil, app_ids: [])
@@ -261,7 +261,7 @@ module Spaceship
261
261
  end
262
262
  }
263
263
 
264
- @test_flight_request_client.delete("betaTesters/#{beta_tester_id}/relationships/apps", nil, body)
264
+ test_flight_request_client.delete("betaTesters/#{beta_tester_id}/relationships/apps", nil, body)
265
265
  end
266
266
 
267
267
  def delete_beta_tester_from_beta_groups(beta_tester_id: nil, beta_group_ids: [])
@@ -274,7 +274,7 @@ module Spaceship
274
274
  end
275
275
  }
276
276
 
277
- @test_flight_request_client.delete("betaTesters/#{beta_tester_id}/relationships/betaGroups", nil, body)
277
+ test_flight_request_client.delete("betaTesters/#{beta_tester_id}/relationships/betaGroups", nil, body)
278
278
  end
279
279
 
280
280
  #
@@ -282,8 +282,8 @@ module Spaceship
282
282
  #
283
283
 
284
284
  def get_beta_tester_metrics(filter: {}, includes: nil, limit: nil, sort: nil)
285
- params = @test_flight_request_client.build_params(filter: filter, includes: includes, limit: limit, sort: sort)
286
- @test_flight_request_client.get("betaTesterMetrics", params)
285
+ params = test_flight_request_client.build_params(filter: filter, includes: includes, limit: limit, sort: sort)
286
+ test_flight_request_client.get("betaTesterMetrics", params)
287
287
  end
288
288
 
289
289
  #
@@ -291,17 +291,17 @@ module Spaceship
291
291
  #
292
292
 
293
293
  def get_builds(filter: {}, includes: "buildBetaDetail,betaBuildMetrics", limit: 10, sort: "uploadedDate", cursor: nil)
294
- params = @test_flight_request_client.build_params(filter: filter, includes: includes, limit: limit, sort: sort, cursor: cursor)
295
- @test_flight_request_client.get("builds", params)
294
+ params = test_flight_request_client.build_params(filter: filter, includes: includes, limit: limit, sort: sort, cursor: cursor)
295
+ test_flight_request_client.get("builds", params)
296
296
  end
297
297
 
298
298
  def get_build(build_id: nil, app_store_version_id: nil, includes: nil)
299
299
  if build_id
300
- params = @test_flight_request_client.build_params(filter: nil, includes: includes, limit: nil, sort: nil, cursor: nil)
301
- return @test_flight_request_client.get("builds/#{build_id}", params)
300
+ params = test_flight_request_client.build_params(filter: nil, includes: includes, limit: nil, sort: nil, cursor: nil)
301
+ return test_flight_request_client.get("builds/#{build_id}", params)
302
302
  elsif app_store_version_id
303
- params = @test_flight_request_client.build_params(filter: nil, includes: includes, limit: nil, sort: nil, cursor: nil)
304
- return @test_flight_request_client.get("appStoreVersions/#{app_store_version_id}/build", params)
303
+ params = test_flight_request_client.build_params(filter: nil, includes: includes, limit: nil, sort: nil, cursor: nil)
304
+ return test_flight_request_client.get("appStoreVersions/#{app_store_version_id}/build", params)
305
305
  else
306
306
  return nil
307
307
  end
@@ -316,7 +316,7 @@ module Spaceship
316
316
  }
317
317
  }
318
318
 
319
- @test_flight_request_client.patch("builds/#{build_id}", body)
319
+ test_flight_request_client.patch("builds/#{build_id}", body)
320
320
  end
321
321
 
322
322
  #
@@ -324,8 +324,8 @@ module Spaceship
324
324
  #
325
325
 
326
326
  def get_build_beta_details(filter: {}, includes: nil, limit: nil, sort: nil)
327
- params = @test_flight_request_client.build_params(filter: filter, includes: includes, limit: limit, sort: sort)
328
- @test_flight_request_client.get("buildBetaDetails", params)
327
+ params = test_flight_request_client.build_params(filter: filter, includes: includes, limit: limit, sort: sort)
328
+ test_flight_request_client.get("buildBetaDetails", params)
329
329
  end
330
330
 
331
331
  def patch_build_beta_details(build_beta_details_id: nil, attributes: {})
@@ -337,7 +337,7 @@ module Spaceship
337
337
  }
338
338
  }
339
339
 
340
- @test_flight_request_client.patch("buildBetaDetails/#{build_beta_details_id}", body)
340
+ test_flight_request_client.patch("buildBetaDetails/#{build_beta_details_id}", body)
341
341
  end
342
342
 
343
343
  #
@@ -345,8 +345,8 @@ module Spaceship
345
345
  #
346
346
 
347
347
  def get_build_deliveries(filter: {}, includes: nil, limit: nil, sort: nil)
348
- params = @test_flight_request_client.build_params(filter: filter, includes: includes, limit: limit, sort: sort)
349
- @test_flight_request_client.get("buildDeliveries", params)
348
+ params = test_flight_request_client.build_params(filter: filter, includes: includes, limit: limit, sort: sort)
349
+ test_flight_request_client.get("buildDeliveries", params)
350
350
  end
351
351
 
352
352
  #
@@ -354,8 +354,8 @@ module Spaceship
354
354
  #
355
355
 
356
356
  def get_pre_release_versions(filter: {}, includes: nil, limit: nil, sort: nil)
357
- params = @test_flight_request_client.build_params(filter: filter, includes: includes, limit: limit, sort: sort)
358
- @test_flight_request_client.get("preReleaseVersions", params)
357
+ params = test_flight_request_client.build_params(filter: filter, includes: includes, limit: limit, sort: sort)
358
+ test_flight_request_client.get("preReleaseVersions", params)
359
359
  end
360
360
 
361
361
  #
@@ -363,14 +363,14 @@ module Spaceship
363
363
  #
364
364
 
365
365
  def get_beta_feedback(filter: {}, includes: nil, limit: nil, sort: nil)
366
- params = @test_flight_request_client.build_params(filter: filter, includes: includes, limit: limit, sort: sort)
367
- @test_flight_request_client.get("betaFeedbacks", params)
366
+ params = test_flight_request_client.build_params(filter: filter, includes: includes, limit: limit, sort: sort)
367
+ test_flight_request_client.get("betaFeedbacks", params)
368
368
  end
369
369
 
370
370
  def delete_beta_feedback(feedback_id: nil)
371
371
  raise "Feedback id is nil" if feedback_id.nil?
372
372
 
373
- @test_flight_request_client.delete("betaFeedbacks/#{feedback_id}")
373
+ test_flight_request_client.delete("betaFeedbacks/#{feedback_id}")
374
374
  end
375
375
  end
376
376
  end