fastlane 2.204.2 → 2.205.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +96 -96
  3. data/deliver/lib/deliver/runner.rb +2 -2
  4. data/fastlane/lib/fastlane/actions/badge.rb +1 -1
  5. data/fastlane/lib/fastlane/actions/get_version_number.rb +1 -1
  6. data/fastlane/lib/fastlane/actions/git_commit.rb +4 -6
  7. data/fastlane/lib/fastlane/actions/read_podspec.rb +1 -1
  8. data/fastlane/lib/fastlane/commands_generator.rb +2 -1
  9. data/fastlane/lib/fastlane/swift_runner_upgrader.rb +6 -7
  10. data/fastlane/lib/fastlane/version.rb +1 -1
  11. data/fastlane/swift/Deliverfile.swift +1 -1
  12. data/fastlane/swift/DeliverfileProtocol.swift +1 -1
  13. data/fastlane/swift/Fastlane.swift +8 -8
  14. data/fastlane/swift/Gymfile.swift +1 -1
  15. data/fastlane/swift/GymfileProtocol.swift +1 -1
  16. data/fastlane/swift/Matchfile.swift +1 -1
  17. data/fastlane/swift/MatchfileProtocol.swift +2 -2
  18. data/fastlane/swift/Precheckfile.swift +1 -1
  19. data/fastlane/swift/PrecheckfileProtocol.swift +1 -1
  20. data/fastlane/swift/Scanfile.swift +1 -1
  21. data/fastlane/swift/ScanfileProtocol.swift +1 -1
  22. data/fastlane/swift/Screengrabfile.swift +1 -1
  23. data/fastlane/swift/ScreengrabfileProtocol.swift +1 -1
  24. data/fastlane/swift/Snapshotfile.swift +1 -1
  25. data/fastlane/swift/SnapshotfileProtocol.swift +1 -1
  26. data/fastlane/swift/SocketClient.swift +2 -2
  27. data/fastlane/swift/formatting/Brewfile.lock.json +14 -14
  28. data/fastlane_core/README.md +1 -0
  29. data/frameit/lib/frameit/.device.rb.swp +0 -0
  30. data/frameit/lib/frameit/.device_types.rb.swp +0 -0
  31. data/frameit/lib/frameit/.editor.rb.swp +0 -0
  32. data/frameit/lib/frameit/.offsets.rb.swp +0 -0
  33. data/frameit/lib/frameit/.runner.rb.swp +0 -0
  34. data/frameit/lib/frameit/.screenshot.rb.swp +0 -0
  35. data/match/lib/match/encryption/openssl.rb +1 -1
  36. data/match/lib/match/options.rb +1 -1
  37. data/pilot/lib/pilot/build_manager.rb +2 -2
  38. data/scan/lib/scan/runner.rb +5 -1
  39. data/snapshot/lib/assets/SnapshotHelper.swift +2 -2
  40. data/spaceship/lib/spaceship/client.rb +13 -25
  41. data/spaceship/lib/spaceship/connect_api/.response.rb.swp +0 -0
  42. data/spaceship/lib/spaceship/connect_api/models/.app.rb.swp +0 -0
  43. data/spaceship/lib/spaceship/connect_api/models/.review_submission.rb.swp +0 -0
  44. data/spaceship/lib/spaceship/connect_api/models/app.rb +2 -1
  45. data/spaceship/lib/spaceship/connect_api/models/review_submission.rb +1 -0
  46. data/spaceship/lib/spaceship/portal/certificate.rb +4 -3
  47. data/spaceship/lib/spaceship/tunes/app_ratings.rb +6 -6
  48. data/spaceship/lib/spaceship/tunes/iap_families.rb +1 -1
  49. data/spaceship/lib/spaceship/tunes/tunes.rb +0 -1
  50. data/spaceship/lib/spaceship/tunes/tunes_client.rb +16 -19
  51. data/supply/lib/supply/client.rb +2 -7
  52. data/trainer/lib/assets/junit.xml.erb +9 -1
  53. data/trainer/lib/trainer/junit_generator.rb +1 -1
  54. data/trainer/lib/trainer/options.rb +1 -1
  55. data/trainer/lib/trainer/test_parser.rb +25 -3
  56. metadata +29 -21
  57. data/spaceship/lib/spaceship/tunes/user_detail.rb +0 -15
@@ -2,35 +2,35 @@
2
2
  "entries": {
3
3
  "brew": {
4
4
  "swiftformat": {
5
- "version": "0.49.3",
5
+ "version": "0.49.6",
6
6
  "bottle": {
7
7
  "rebuild": 0,
8
8
  "root_url": "https://ghcr.io/v2/homebrew/core",
9
9
  "files": {
10
10
  "arm64_monterey": {
11
11
  "cellar": ":any_skip_relocation",
12
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:3fd0427fdb74e0cc88da322ce2b2cd0b9e021fd286f34978b01b0bb62f9e8529",
13
- "sha256": "3fd0427fdb74e0cc88da322ce2b2cd0b9e021fd286f34978b01b0bb62f9e8529"
12
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:0e8e1fe019fd98a5cb6d75e31130eedcb65546693eb385a06948b940da7125d3",
13
+ "sha256": "0e8e1fe019fd98a5cb6d75e31130eedcb65546693eb385a06948b940da7125d3"
14
14
  },
15
15
  "arm64_big_sur": {
16
16
  "cellar": ":any_skip_relocation",
17
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:cc99c52385e32a1d2bb42625a535cac9835313e65ba84776cbe2ad49ae41167d",
18
- "sha256": "cc99c52385e32a1d2bb42625a535cac9835313e65ba84776cbe2ad49ae41167d"
17
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:916c5eaf7600aa9a6bf7fc4d3998b1b165b5b354de260ce6e13bbc4ff3167ff1",
18
+ "sha256": "916c5eaf7600aa9a6bf7fc4d3998b1b165b5b354de260ce6e13bbc4ff3167ff1"
19
19
  },
20
20
  "monterey": {
21
21
  "cellar": ":any_skip_relocation",
22
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:39877fc1115e6f15d20a76c30ddbb23d45f52fb95eb81382c4f4abe2b98eb03b",
23
- "sha256": "39877fc1115e6f15d20a76c30ddbb23d45f52fb95eb81382c4f4abe2b98eb03b"
22
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:8ddd11b5e105b148b8919e9c44d851e845e9c31ed7cf8a9b92b2369bd0df98d5",
23
+ "sha256": "8ddd11b5e105b148b8919e9c44d851e845e9c31ed7cf8a9b92b2369bd0df98d5"
24
24
  },
25
25
  "big_sur": {
26
26
  "cellar": ":any_skip_relocation",
27
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:ead4633c1ec372b7cc6995dba2d3352691b4086f501e0346629072873bccef99",
28
- "sha256": "ead4633c1ec372b7cc6995dba2d3352691b4086f501e0346629072873bccef99"
27
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:c1fd4ae18452ea62e6d33ca0554fa4df5f646a22abffe7f5d489c397945b7ea9",
28
+ "sha256": "c1fd4ae18452ea62e6d33ca0554fa4df5f646a22abffe7f5d489c397945b7ea9"
29
29
  },
30
30
  "catalina": {
31
31
  "cellar": ":any_skip_relocation",
32
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:359cd4f2c3eea7c28f485db06dc955d8b27eabab340420a0c52931004a3ee3e7",
33
- "sha256": "359cd4f2c3eea7c28f485db06dc955d8b27eabab340420a0c52931004a3ee3e7"
32
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:f1ffad5c8bbfe80659f51b7cc54062c736fed1ff79b71b8f648d8e4552d8b752",
33
+ "sha256": "f1ffad5c8bbfe80659f51b7cc54062c736fed1ff79b71b8f648d8e4552d8b752"
34
34
  }
35
35
  }
36
36
  }
@@ -56,12 +56,12 @@
56
56
  "macOS": "11.0.1"
57
57
  },
58
58
  "monterey": {
59
- "HOMEBREW_VERSION": "3.3.13-44-g8e97f60",
59
+ "HOMEBREW_VERSION": "3.4.3-43-g6e1b6a3",
60
60
  "HOMEBREW_PREFIX": "/opt/homebrew",
61
- "Homebrew/homebrew-core": "e240762241519818ce5ec468ac8b67daf17d64a2",
61
+ "Homebrew/homebrew-core": "2b1ab33f1beebecfdf4b584992272417d9492167",
62
62
  "CLT": "13.2.0.0.1.1638488800",
63
63
  "Xcode": "13.2.1",
64
- "macOS": "12.0.1"
64
+ "macOS": "12.2.1"
65
65
  }
66
66
  }
67
67
  }
@@ -23,6 +23,7 @@ You can hide the inline changelog by setting the `FASTLANE_HIDE_CHANGELOG` envir
23
23
 
24
24
  - To hide timestamps in each row, set the `FASTLANE_HIDE_TIMESTAMP` environment variable to true.
25
25
  - To disable output formatting, set the `FASTLANE_DISABLE_OUTPUT_FORMAT` environment variable to true.
26
+ - To prevent _fastlane_ from printing the plugins table on every lane run, set the `FASTLANE_HIDE_PLUGINS_TABLE` environment variable to true.
26
27
 
27
28
  ## Interacting with the user
28
29
 
Binary file
Binary file
Binary file
Binary file
@@ -135,7 +135,7 @@ module Match
135
135
  UI.crash!("Error encrypting '#{path}'")
136
136
  end
137
137
 
138
- # The encryption parameters in this implementations reflect the old behaviour which depended on the users' local OpenSSL version
138
+ # The encryption parameters in this implementations reflect the old behavior which depended on the users' local OpenSSL version
139
139
  # 1.0.x OpenSSL and earlier versions use MD5, 1.1.0c and newer uses SHA256, we try both before giving an error
140
140
  def decrypt_specific_file(path: nil, password: nil, hash_algorithm: "MD5")
141
141
  stored_data = Base64.decode64(File.read(path))
@@ -249,7 +249,7 @@ module Match
249
249
  default_value: false),
250
250
  FastlaneCore::ConfigItem.new(key: :force_for_new_certificates,
251
251
  env_name: "MATCH_FORCE_FOR_NEW_CERTIFICATES",
252
- description: "Renew the provisioning profiles if the device count on the developer portal has changed. Works only for the 'development' provisioning profile type. Requires 'include_all_certificates' option to be 'true'",
252
+ description: "Renew the provisioning profiles if the certificate count on the developer portal has changed. Works only for the 'development' provisioning profile type. Requires 'include_all_certificates' option to be 'true'",
253
253
  type: Boolean,
254
254
  default_value: false),
255
255
  FastlaneCore::ConfigItem.new(key: :skip_confirmation,
@@ -402,8 +402,8 @@ module Pilot
402
402
  return generic_transporter unless tunes_client.teams.count > 1
403
403
 
404
404
  begin
405
- team = tunes_client.teams.find { |t| t['contentProvider']['contentProviderId'].to_s == tunes_client.team_id }
406
- name = team['contentProvider']['name']
405
+ team = tunes_client.teams.find { |t| t['providerId'].to_s == tunes_client.team_id }
406
+ name = team['name']
407
407
  provider_id = generic_transporter.provider_ids[name]
408
408
  UI.verbose("Inferred provider id #{provider_id} for team #{name}.")
409
409
  return FastlaneCore::ItunesTransporter.new(options[:username], nil, false, provider_id)
@@ -188,6 +188,7 @@ module Scan
188
188
  number_of_tests: 0,
189
189
  number_of_failures: 0,
190
190
  number_of_retries: 0,
191
+ number_of_skipped: 0,
191
192
  number_of_tests_excluding_retries: 0,
192
193
  number_of_failures_excluding_retries: 0
193
194
  }
@@ -250,6 +251,7 @@ module Scan
250
251
  results[:number_of_failures] += data[:number_of_failures]
251
252
  results[:number_of_tests_excluding_retries] += data[:number_of_tests_excluding_retries]
252
253
  results[:number_of_failures_excluding_retries] += data[:number_of_failures_excluding_retries]
254
+ results[:number_of_skipped] += data[:number_of_skipped] || 0
253
255
  results[:number_of_retries] += data[:number_of_retries]
254
256
  end
255
257
 
@@ -266,6 +268,7 @@ module Scan
266
268
  results = trainer_test_results
267
269
 
268
270
  number_of_retries = results[:number_of_retries]
271
+ number_of_skipped = results[:number_of_skipped]
269
272
  number_of_tests = results[:number_of_tests_excluding_retries]
270
273
  number_of_failures = results[:number_of_failures_excluding_retries]
271
274
 
@@ -293,8 +296,9 @@ module Scan
293
296
  title: "Test Results",
294
297
  rows: [
295
298
  ["Number of tests", "#{number_of_tests}#{retries_str}"],
299
+ number_of_skipped > 0 ? ["Number of tests skipped", number_of_skipped] : nil,
296
300
  ["Number of failures", failures_str]
297
- ]
301
+ ].compact
298
302
  }))
299
303
  puts("")
300
304
 
@@ -165,7 +165,7 @@ open class Snapshot: NSObject {
165
165
  }
166
166
 
167
167
  let screenshot = XCUIScreen.main.screenshot()
168
- #if os(iOS)
168
+ #if os(iOS) && !targetEnvironment(macCatalyst)
169
169
  let image = XCUIDevice.shared.orientation.isLandscape ? fixLandscapeOrientation(image: screenshot.image) : screenshot.image
170
170
  #else
171
171
  let image = screenshot.image
@@ -306,4 +306,4 @@ private extension CGFloat {
306
306
 
307
307
  // Please don't remove the lines below
308
308
  // They are used to detect outdated configuration files
309
- // SnapshotHelperVersion [1.27]
309
+ // SnapshotHelperVersion [1.28]
@@ -70,10 +70,10 @@ module Spaceship
70
70
 
71
71
  # @return (Array) A list of all available teams
72
72
  def teams
73
- user_details_data['associatedAccounts'].sort_by do |team|
73
+ user_details_data['availableProviders'].sort_by do |team|
74
74
  [
75
- team['contentProvider']['name'],
76
- team['contentProvider']['contentProviderId']
75
+ team['name'],
76
+ team['providerId']
77
77
  ]
78
78
  end
79
79
  end
@@ -124,8 +124,8 @@ module Spaceship
124
124
  # "userName"=>"detlef@krausefx.com"}
125
125
  def user_details_data
126
126
  return @_cached_user_details if @_cached_user_details
127
- r = request(:get, '/WebObjects/iTunesConnect.woa/ra/user/detail')
128
- @_cached_user_details = parse_response(r, 'data')
127
+ r = request(:get, "https://appstoreconnect.apple.com/olympus/v1/session")
128
+ @_cached_user_details = parse_response(r)
129
129
  end
130
130
 
131
131
  # @return (String) The currently selected Team ID
@@ -135,7 +135,7 @@ module Spaceship
135
135
  if teams.count > 1
136
136
  puts("The current user is in #{teams.count} teams. Pass a team ID or call `select_team` to choose a team. Using the first one for now.")
137
137
  end
138
- @current_team_id ||= user_details_data['sessionToken']['contentProviderId']
138
+ @current_team_id ||= user_details_data['provider']['providerId']
139
139
  end
140
140
 
141
141
  # Set a new team ID which will be used from now on
@@ -144,12 +144,11 @@ module Spaceship
144
144
  # following confusing error message
145
145
  #
146
146
  # invalid content provider id
147
- #
148
147
  available_teams = teams.collect do |team|
149
148
  {
150
- team_id: (team["contentProvider"] || {})["contentProviderId"],
151
- public_team_id: (team["contentProvider"] || {})["contentProviderPublicId"],
152
- team_name: (team["contentProvider"] || {})["name"]
149
+ team_id: team["providerId"],
150
+ public_team_id: team["publicProviderId"],
151
+ team_name: team["name"]
153
152
  }
154
153
  end
155
154
 
@@ -163,21 +162,10 @@ module Spaceship
163
162
  end
164
163
 
165
164
  response = request(:post) do |req|
166
- req.url("https://appstoreconnect.apple.com/olympus/v1/providerSwitchRequests")
167
- req.body = {
168
- "data": {
169
- "type": "providerSwitchRequests",
170
- "relationships": {
171
- "provider": {
172
- "data": {
173
- "type": "providers",
174
- "id": result[:public_team_id]
175
- }
176
- }
177
- }
178
- }
179
- }.to_json
165
+ req.url("https://appstoreconnect.apple.com/olympus/v1/session")
166
+ req.body = { "provider": { "providerId": result[:team_id] } }.to_json
180
167
  req.headers['Content-Type'] = 'application/json'
168
+ req.headers['X-Requested-With'] = 'olympus-ui'
181
169
  end
182
170
 
183
171
  handle_itc_response(response.body)
@@ -546,7 +534,7 @@ module Spaceship
546
534
  raise AppleIDAndPrivacyAcknowledgementNeeded.new, "Need to acknowledge to Apple's Apple ID and Privacy statement. " \
547
535
  "Please manually log into https://appleid.apple.com (or https://appstoreconnect.apple.com) to acknowledge the statement. " \
548
536
  "Your account might also be asked to upgrade to 2FA. " \
549
- "Set SPACESHIP_SKIP_2FA_UPGRADE=1 for fastlane to automaticaly bypass 2FA upgrade if possible."
537
+ "Set SPACESHIP_SKIP_2FA_UPGRADE=1 for fastlane to automatically bypass 2FA upgrade if possible."
550
538
  elsif (response['Set-Cookie'] || "").include?("itctx")
551
539
  raise "Looks like your Apple ID is not enabled for App Store Connect, make sure to be able to login online"
552
540
  else
@@ -436,7 +436,8 @@ module Spaceship
436
436
  filter = {
437
437
  state: [
438
438
  Spaceship::ConnectAPI::ReviewSubmission::ReviewSubmissionState::WAITING_FOR_REVIEW,
439
- Spaceship::ConnectAPI::ReviewSubmission::ReviewSubmissionState::IN_REVIEW
439
+ Spaceship::ConnectAPI::ReviewSubmission::ReviewSubmissionState::IN_REVIEW,
440
+ Spaceship::ConnectAPI::ReviewSubmission::ReviewSubmissionState::UNRESOLVED_ISSUES
440
441
  ].join(","),
441
442
  platform: platform
442
443
  }
@@ -20,6 +20,7 @@ module Spaceship
20
20
  COMPLETE = "COMPLETE"
21
21
  IN_REVIEW = "IN_REVIEW"
22
22
  READY_FOR_REVIEW = "READY_FOR_REVIEW"
23
+ UNRESOLVED_ISSUES = "UNRESOLVED_ISSUES"
23
24
  WAITING_FOR_REVIEW = "WAITING_FOR_REVIEW"
24
25
  end
25
26
 
@@ -168,7 +168,7 @@ module Spaceship
168
168
  "R58UK2EWSO" => Production,
169
169
  "9RQEK7MSXA" => InHouse,
170
170
  "LA30L5BJEU" => Certificate,
171
- "BKLRAVXMGM" => DevelopmentPush,
171
+ "JKG5JZ54H7" => DevelopmentPush,
172
172
  "UPV3DW712I" => ProductionPush,
173
173
  "Y3B2F3TYSI" => Passbook,
174
174
  "3T2ZP62QW8" => WebsitePush,
@@ -178,12 +178,13 @@ module Spaceship
178
178
  }
179
179
 
180
180
  OLDER_IOS_CERTIFICATE_TYPES = [
181
- # those are also sent by the browser, but not sure what they represent
181
+ "3BQKVH9I2X", # old ProductionPush
182
+ "BKLRAVXMGM", # old DevelopmentPush
183
+ # those are also sent by the browser, but not sure what they represent:
182
184
  "T44PTHVNID",
183
185
  "DZQUP8189Y",
184
186
  "FGQUP4785Z",
185
187
  "S5WE21TULA",
186
- "3BQKVH9I2X", # ProductionPush,
187
188
  "FUOY7LWJET"
188
189
  ]
189
190
 
@@ -8,22 +8,22 @@ module Spaceship
8
8
  # this version is for
9
9
  attr_accessor :application
10
10
 
11
- # @return (Integer) total number of ratings recevied
11
+ # @return (Integer) total number of ratings received
12
12
  attr_accessor :rating_count
13
13
 
14
- # @return (Integer) total number of one star ratings recevied
14
+ # @return (Integer) total number of one star ratings received
15
15
  attr_accessor :one_star_rating_count
16
16
 
17
- # @return (Integer) total number of two star ratings recevied
17
+ # @return (Integer) total number of two star ratings received
18
18
  attr_accessor :two_star_rating_count
19
19
 
20
- # @return (Integer) total number of three star ratings recevied
20
+ # @return (Integer) total number of three star ratings received
21
21
  attr_accessor :three_star_rating_count
22
22
 
23
- # @return (Integer) total number of four star ratings recevied
23
+ # @return (Integer) total number of four star ratings received
24
24
  attr_accessor :four_star_rating_count
25
25
 
26
- # @return (Integer) total number of five star ratings recevied
26
+ # @return (Integer) total number of five star ratings received
27
27
  attr_accessor :five_star_rating_count
28
28
 
29
29
  attr_mapping({
@@ -7,7 +7,7 @@ module Spaceship
7
7
  attr_accessor :application
8
8
 
9
9
  # Create a new Purchase Family
10
- # a freshly created family has to have atleast one product.
10
+ # a freshly created family has to have at least one product.
11
11
  # the product will be created, and versions/pricing_intervals and so on
12
12
  # should be set by subsequent edit.
13
13
  # @param name (String) Familyname
@@ -14,7 +14,6 @@ require_relative 'app_version_ref'
14
14
  require_relative 'app_version_history'
15
15
  require_relative 'app_version_states_history'
16
16
  require_relative 'transit_app_file'
17
- require_relative 'user_detail'
18
17
  require_relative 'app_screenshot'
19
18
  require_relative 'language_converter'
20
19
  require_relative 'build'
@@ -9,7 +9,6 @@ require_relative 'errors'
9
9
  require_relative 'iap_subscription_pricing_tier'
10
10
  require_relative 'pricing_tier'
11
11
  require_relative 'territory'
12
- require_relative 'user_detail'
13
12
  module Spaceship
14
13
  # rubocop:disable Metrics/ClassLength
15
14
  class TunesClient < Spaceship::Client
@@ -72,13 +71,13 @@ module Spaceship
72
71
  puts("Looking for App Store Connect Team with name #{t_name}") if Spaceship::Globals.verbose?
73
72
 
74
73
  teams.each do |t|
75
- t_id = t['contentProvider']['contentProviderId'].to_s if t['contentProvider']['name'].casecmp(t_name).zero?
74
+ t_id = t['providerId'].to_s if t['name'].casecmp(t_name).zero?
76
75
  end
77
76
 
78
77
  puts("Could not find team with name '#{t_name}', trying to fallback to default team") if t_id.length.zero?
79
78
  end
80
79
 
81
- t_id = teams.first['contentProvider']['contentProviderId'].to_s if teams.count == 1
80
+ t_id = teams.first['providerId'].to_s if teams.count == 1
82
81
 
83
82
  if t_id.length > 0
84
83
  puts("Looking for App Store Connect Team with ID #{t_id}") if Spaceship::Globals.verbose?
@@ -92,11 +91,11 @@ module Spaceship
92
91
  loop do
93
92
  puts("Multiple #{'App Store Connect teams'.yellow} found, please enter the number of the team you want to use: ")
94
93
  if ENV["FASTLANE_HIDE_TEAM_INFORMATION"].to_s.length == 0
94
+ first_team = teams.first
95
95
  puts("Note: to automatically choose the team, provide either the App Store Connect Team ID, or the Team Name in your fastlane/Appfile:")
96
96
  puts("Alternatively you can pass the team name or team ID using the `FASTLANE_ITC_TEAM_ID` or `FASTLANE_ITC_TEAM_NAME` environment variable")
97
- first_team = teams.first["contentProvider"]
98
97
  puts("")
99
- puts(" itc_team_id \"#{first_team['contentProviderId']}\"")
98
+ puts(" itc_team_id \"#{first_team['providerId']}\"")
100
99
  puts("")
101
100
  puts("or")
102
101
  puts("")
@@ -106,7 +105,7 @@ module Spaceship
106
105
 
107
106
  # We're not using highline here, as spaceship doesn't have a dependency to fastlane_core or highline
108
107
  teams.each_with_index do |team, i|
109
- puts("#{i + 1}) \"#{team['contentProvider']['name']}\" (#{team['contentProvider']['contentProviderId']})")
108
+ puts("#{i + 1}) \"#{team['name']}\" (#{team['providerId']})")
110
109
  end
111
110
 
112
111
  unless Spaceship::Client::UserInterface.interactive?
@@ -119,7 +118,7 @@ module Spaceship
119
118
  team_to_use = teams[selected] if selected >= 0
120
119
 
121
120
  if team_to_use
122
- self.team_id = team_to_use['contentProvider']['contentProviderId'].to_s # actually set the team id here
121
+ self.team_id = team_to_use['providerId'].to_s # actually set the team id here
123
122
  return self.team_id
124
123
  end
125
124
  end
@@ -950,13 +949,6 @@ module Spaceship
950
949
  Spaceship::Tunes::AppVersionRef.factory(data)
951
950
  end
952
951
 
953
- # Fetches the User Detail information from ITC. This gets called often and almost never changes
954
- # so we cache it
955
- # @return [UserDetail] the response
956
- def user_detail_data
957
- @_cached_user_detail_data ||= Spaceship::Tunes::UserDetail.factory(user_details_data, self)
958
- end
959
-
960
952
  #####################################################
961
953
  # @!group CandiateBuilds
962
954
  #####################################################
@@ -992,7 +984,7 @@ module Spaceship
992
984
  tries -= 1
993
985
  if tries > 0
994
986
  logger.warn("Received temporary server error from App Store Connect. Retrying the request...")
995
- sleep(3) unless Object.const_defined?("SpecHelper")
987
+ sleep(3) unless Object.const_defined?(:SpecHelper)
996
988
  retry
997
989
  end
998
990
  end
@@ -1560,7 +1552,7 @@ module Spaceship
1560
1552
  msg = "App Store Connect temporary error received: '#{ex.message}'. Retrying after #{seconds_to_sleep} seconds (remaining: #{tries})..."
1561
1553
  puts(msg)
1562
1554
  logger.warn(msg)
1563
- sleep(seconds_to_sleep) unless Object.const_defined?("SpecHelper")
1555
+ sleep(seconds_to_sleep) unless Object.const_defined?(:SpecHelper)
1564
1556
  retry
1565
1557
  end
1566
1558
  raise ex # re-raise the exception
@@ -1570,7 +1562,7 @@ module Spaceship
1570
1562
  msg = "Potential server error received: '#{ex.message}'. Retrying after 10 seconds (remaining: #{potential_server_error_tries})..."
1571
1563
  puts(msg)
1572
1564
  logger.warn(msg)
1573
- sleep(seconds_to_sleep) unless Object.const_defined?("SpecHelper")
1565
+ sleep(seconds_to_sleep) unless Object.const_defined?(:SpecHelper)
1574
1566
  retry
1575
1567
  end
1576
1568
  raise ex
@@ -1582,9 +1574,14 @@ module Spaceship
1582
1574
  @sso_token_for_video = nil
1583
1575
  end
1584
1576
 
1585
- # the contentProviderIr found in the UserDetail instance
1577
+ # the contentProviderId found in the user details data
1586
1578
  def content_provider_id
1587
- @content_provider_id ||= user_detail_data.content_provider_id
1579
+ return @content_provider_id if @content_provider_id
1580
+
1581
+ provider = user_details_data["provider"]["providerId"]
1582
+ @content_provider_id ||= provider.to_s if provider
1583
+
1584
+ return @content_provider_id
1588
1585
  end
1589
1586
 
1590
1587
  # the ssoTokenForImage found in the AppVersionRef instance
@@ -266,14 +266,9 @@ module Supply
266
266
  filtered_tracks = tracks.select { |t| !t.releases.nil? && t.releases.any? { |r| r.name == version } }
267
267
 
268
268
  if filtered_tracks.length > 1
269
- # Production track takes precedence if version is present in multiple tracks
269
+ # Prefer tracks in production, beta, alpha, internal order
270
270
  # E.g.: A release might've been promoted from Alpha/Beta track. This means the release will be present in two or more tracks
271
- if filtered_tracks.any? { |t| t.track == Supply::Tracks::DEFAULT }
272
- filtered_tracks = filtered_tracks.select { |t| t.track == Supply::Tracks::DEFAULT }
273
- else
274
- # E.g.: A release might be in both Alpha & Beta (not sure if this is possible, just catching if it ever happens), giving Beta precedence.
275
- filtered_tracks = filtered_tracks.select { |t| t.track == Supply::Tracks::BETA }
276
- end
271
+ filtered_tracks = filtered_tracks.sort_by { |t| Supply::Tracks::DEFAULTS.index(t.track) || Float::INFINITY }
277
272
  end
278
273
 
279
274
  filtered_track = filtered_tracks.first
@@ -6,13 +6,21 @@
6
6
 
7
7
  <testsuites tests="<%= number_of_tests %>" failures="<%= number_of_failures %>">
8
8
  <% @results.each do |testsuite| %>
9
- <testsuite name=<%= (testsuite[:target_name].nil? ? testsuite[:test_name] : testsuite[:target_name]).encode(:xml => :attr) %> tests="<%= testsuite[:number_of_tests_excluding_retries] %>" failures="<%= testsuite[:number_of_failures_excluding_retries] %>" time="<%= testsuite[:duration] %>">
9
+ <testsuite name=<%= (testsuite[:target_name].nil? ? testsuite[:test_name] : testsuite[:target_name]).encode(:xml => :attr) %> tests="<%= testsuite[:number_of_tests_excluding_retries] %>" failures="<%= testsuite[:number_of_failures_excluding_retries] %>" <% if testsuite[:number_of_skipped] %>skipped="<%= testsuite[:number_of_skipped] %>" <% end %>time="<%= testsuite[:duration] %>">
10
+ <% unless testsuite[:configuration_name].nil? %>
11
+ <properties>
12
+ <property name="Configuration" value="<%= testsuite[:configuration_name] %>"/>
13
+ </properties>
14
+ <% end %>
10
15
  <% testsuite[:tests].each do |test| %>
11
16
  <testcase classname=<%= test[:test_group].encode(:xml => :attr) %> name=<%= test[:name].encode(:xml => :attr) %> time="<%= test[:duration] %>">
12
17
  <% (test[:failures] || []).each do |failure| %>
13
18
  <failure message=<%= failure[:failure_message].encode(:xml => :attr) %>>
14
19
  </failure>
15
20
  <% end %>
21
+ <% if test[:skipped] %>
22
+ <skipped/>
23
+ <% end %>
16
24
  </testcase>
17
25
  <% end %>
18
26
  </testsuite>
@@ -19,7 +19,7 @@ module Trainer
19
19
 
20
20
  xml = xml.gsub('system_', 'system-').delete("\e") # Jenkins can not parse 'ESC' symbol
21
21
 
22
- # We have to manuall clear empty lines
22
+ # We have to manually clear empty lines
23
23
  # They may contain white spaces
24
24
  clean_xml = []
25
25
  xml.each_line do |row|
@@ -32,7 +32,7 @@ module Trainer
32
32
  env_name: "TRAINER_OUTPUT_DIRECTORY",
33
33
  default_value: nil,
34
34
  optional: true,
35
- description: "Directoy in which the xml files should be written to. Same directory as source by default"),
35
+ description: "Directory in which the xml files should be written to. Same directory as source by default"),
36
36
  FastlaneCore::ConfigItem.new(key: :output_filename,
37
37
  short_option: "-f",
38
38
  env_name: "TRAINER_OUTPUT_FILENAME",
@@ -19,6 +19,7 @@ module Trainer
19
19
  attr_accessor :number_of_tests_excluding_retries
20
20
  attr_accessor :number_of_failures_excluding_retries
21
21
  attr_accessor :number_of_retries
22
+ attr_accessor :number_of_skipped
22
23
 
23
24
  # Returns a hash with the path being the key, and the value
24
25
  # defining if the tests were successful
@@ -89,7 +90,8 @@ module Trainer
89
90
  number_of_failures: tp.number_of_failures,
90
91
  number_of_tests_excluding_retries: tp.number_of_tests_excluding_retries,
91
92
  number_of_failures_excluding_retries: tp.number_of_failures_excluding_retries,
92
- number_of_retries: tp.number_of_retries
93
+ number_of_retries: tp.number_of_retries,
94
+ number_of_skipped: tp.number_of_skipped
93
95
  }
94
96
  end
95
97
  return_hash
@@ -116,12 +118,14 @@ module Trainer
116
118
  self.number_of_tests_excluding_retries = 0
117
119
  self.number_of_failures_excluding_retries = 0
118
120
  self.number_of_retries = 0
121
+ self.number_of_skipped = 0
119
122
  self.data.each do |thing|
120
123
  self.number_of_tests += thing[:number_of_tests].to_i
121
124
  self.number_of_failures += thing[:number_of_failures].to_i
122
125
  self.number_of_tests_excluding_retries += thing[:number_of_tests_excluding_retries].to_i
123
126
  self.number_of_failures_excluding_retries += thing[:number_of_failures_excluding_retries].to_i
124
127
  self.number_of_retries += thing[:number_of_retries].to_i
128
+ self.number_of_skipped += thing[:number_of_skipped].to_i
125
129
  end
126
130
  end
127
131
 
@@ -132,7 +136,7 @@ module Trainer
132
136
 
133
137
  # @return [Bool] were all tests successful? Is false if at least one test failed
134
138
  def tests_successful?
135
- self.data.collect { |a| a[:number_of_failures] }.all?(&:zero?)
139
+ self.data.collect { |a| a[:number_of_failures_excluding_retries] }.all?(&:zero?)
136
140
  end
137
141
 
138
142
  private
@@ -226,6 +230,8 @@ module Trainer
226
230
  all_summaries = summaries.map(&:summaries).flatten
227
231
  testable_summaries = all_summaries.map(&:testable_summaries).flatten
228
232
 
233
+ summaries_to_names = test_summaries_to_configuration_names(all_summaries)
234
+
229
235
  # Maps ActionTestableSummary to rows for junit generator
230
236
  rows = testable_summaries.map do |testable_summary|
231
237
  all_tests = testable_summary.all_tests.flatten
@@ -250,6 +256,7 @@ module Trainer
250
256
 
251
257
  info = tests_by_identifier[identifier] || {}
252
258
  info[:failure_count] ||= 0
259
+ info[:skip_count] ||= 0
253
260
  info[:success_count] ||= 0
254
261
 
255
262
  retry_count = info[:retry_count]
@@ -272,6 +279,9 @@ module Trainer
272
279
  }]
273
280
 
274
281
  info[:failure_count] += 1
282
+ elsif test.test_status == "Skipped"
283
+ test_row[:skipped] = true
284
+ info[:skip_count] += 1
275
285
  else
276
286
  info[:success_count] = 1
277
287
  end
@@ -309,6 +319,7 @@ module Trainer
309
319
  project_path: testable_summary.project_relative_path,
310
320
  target_name: testable_summary.target_name,
311
321
  test_name: testable_summary.name,
322
+ configuration_name: summaries_to_names[testable_summary],
312
323
  duration: all_tests.map(&:duration).inject(:+),
313
324
  tests: test_rows
314
325
  }
@@ -319,7 +330,8 @@ module Trainer
319
330
  # Used for seeing if any tests continued to fail after all of the Xcode 13 (and up) retries have finished
320
331
  unique_tests = tests_by_identifier.values || []
321
332
  row[:number_of_tests_excluding_retries] = unique_tests.count
322
- row[:number_of_failures_excluding_retries] = unique_tests.find_all { |a| a[:success_count] == 0 }.count
333
+ row[:number_of_skipped] = unique_tests.map { |a| a[:skip_count] }.inject(:+)
334
+ row[:number_of_failures_excluding_retries] = unique_tests.find_all { |a| (a[:success_count] + a[:skip_count]) == 0 }.count
323
335
  row[:number_of_retries] = unique_tests.map { |a| a[:retry_count] }.inject(:+)
324
336
 
325
337
  row
@@ -328,6 +340,16 @@ module Trainer
328
340
  self.data = rows
329
341
  end
330
342
 
343
+ def test_summaries_to_configuration_names(test_summaries)
344
+ summary_to_name = {}
345
+ test_summaries.each do |summary|
346
+ summary.testable_summaries.each do |testable_summary|
347
+ summary_to_name[testable_summary] = summary.name
348
+ end
349
+ end
350
+ summary_to_name
351
+ end
352
+
331
353
  # Convert the Hashes and Arrays in something more useful
332
354
  def parse_content(xcpretty_naming)
333
355
  self.data = self.raw_json["TestableSummaries"].collect do |testable_summary|