fastlane 2.196.0 → 2.197.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +82 -82
  3. data/deliver/lib/assets/ScreenshotsHelp +29 -6
  4. data/deliver/lib/deliver/app_screenshot.rb +4 -4
  5. data/deliver/lib/deliver/upload_screenshots.rb +1 -1
  6. data/fastlane/lib/fastlane/actions/docs/upload_to_app_store.md.erb +1 -1
  7. data/fastlane/lib/fastlane/actions/download_dsyms.rb +47 -30
  8. data/fastlane/lib/fastlane/version.rb +1 -1
  9. data/fastlane/swift/Deliverfile.swift +1 -1
  10. data/fastlane/swift/DeliverfileProtocol.swift +1 -1
  11. data/fastlane/swift/Fastlane.swift +11 -3
  12. data/fastlane/swift/Gymfile.swift +1 -1
  13. data/fastlane/swift/GymfileProtocol.swift +1 -1
  14. data/fastlane/swift/Matchfile.swift +1 -1
  15. data/fastlane/swift/MatchfileProtocol.swift +1 -1
  16. data/fastlane/swift/Precheckfile.swift +1 -1
  17. data/fastlane/swift/PrecheckfileProtocol.swift +1 -1
  18. data/fastlane/swift/Scanfile.swift +1 -1
  19. data/fastlane/swift/ScanfileProtocol.swift +1 -1
  20. data/fastlane/swift/Screengrabfile.swift +1 -1
  21. data/fastlane/swift/ScreengrabfileProtocol.swift +1 -1
  22. data/fastlane/swift/Snapshotfile.swift +1 -1
  23. data/fastlane/swift/SnapshotfileProtocol.swift +1 -1
  24. data/fastlane/swift/formatting/Brewfile.lock.json +12 -12
  25. data/frameit/lib/frameit/editor.rb +16 -18
  26. data/frameit/lib/frameit/trim_box.rb +6 -0
  27. data/spaceship/lib/spaceship/connect_api/models/.build.rb.swp +0 -0
  28. data/spaceship/lib/spaceship/connect_api/models/build.rb +4 -2
  29. data/spaceship/lib/spaceship/connect_api/models/build_bundle.rb +59 -0
  30. data/spaceship/lib/spaceship/connect_api.rb +1 -0
  31. metadata +23 -21
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 470f259a547c6b79dcb0015c1688edcdedd67fce63d7a53d5fe47caee659b233
4
- data.tar.gz: 0dfac1fb999ccf2b25ebfd301dcd1347c9d6f67b469b8d785424fa8b26f9a0fb
3
+ metadata.gz: 471eff584bf9045c8387208af74f22d6556be211f98a16272b726d7354d7a12e
4
+ data.tar.gz: 66f352f900ba8669eb12a16d83f31b28372173207ef2c077312a029548429efd
5
5
  SHA512:
6
- metadata.gz: 8a7e5dec51ab3c6baebc067b7549429947bf471e112251a8eadbee68ac4f2ea79c096e4664321f54e614184d2303d2163e339d2b6d8856c807ed382bf8620d47
7
- data.tar.gz: 66090dc209412cce666bf4b29a0bf2f7103ed1dcec60097e01607f46e812d278c70c288a6ba615e891bc857f6ca0dda340e02d882849ab3e642aabd5a9013016
6
+ metadata.gz: a4fc178fa1af1418d7967d29085def077bd3887d3922c4d1308781930ced91ed858d2b3b0032ae2b9116316c32ebba6ae3ee25fd4e4380a336a4e3c8874852fd
7
+ data.tar.gz: 354898d403d3829ecbf42627d8b6fe549a78374aa2412c568a53e2dd66b84f8a220e5a480f5e0b7d92c6e89d844b53de9b25cba961d1b9b4976291061e08673e
data/README.md CHANGED
@@ -35,55 +35,43 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
35
35
  <!-- This table is regenerated and resorted on each release -->
36
36
  <table id='team'>
37
37
  <tr>
38
- <td id='stefan-natchev'>
39
- <a href='https://github.com/snatchev'>
40
- <img src='https://github.com/snatchev.png' width='140px;'>
41
- </a>
42
- <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
43
- </td>
44
- <td id='jorge-revuelta-h'>
45
- <a href='https://github.com/minuscorp'>
46
- <img src='https://github.com/minuscorp.png' width='140px;'>
47
- </a>
48
- <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
49
- </td>
50
- <td id='jérôme-lacoste'>
51
- <a href='https://github.com/lacostej'>
52
- <img src='https://github.com/lacostej.png' width='140px;'>
38
+ <td id='josh-holtz'>
39
+ <a href='https://github.com/joshdholtz'>
40
+ <img src='https://github.com/joshdholtz.png' width='140px;'>
53
41
  </a>
54
- <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
42
+ <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
55
43
  </td>
56
- <td id='olivier-halligon'>
57
- <a href='https://github.com/AliSoftware'>
58
- <img src='https://github.com/AliSoftware.png' width='140px;'>
44
+ <td id='fumiya-nakamura'>
45
+ <a href='https://github.com/nafu'>
46
+ <img src='https://github.com/nafu.png' width='140px;'>
59
47
  </a>
60
- <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
48
+ <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
61
49
  </td>
62
- <td id='roger-oba'>
63
- <a href='https://github.com/rogerluan'>
64
- <img src='https://github.com/rogerluan.png' width='140px;'>
50
+ <td id='danielle-tomlinson'>
51
+ <a href='https://github.com/endocrimes'>
52
+ <img src='https://github.com/endocrimes.png' width='140px;'>
65
53
  </a>
66
- <h4 align='center'><a href='https://twitter.com/rogerluan_'>Roger Oba</a></h4>
54
+ <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
67
55
  </td>
68
- </tr>
69
- <tr>
70
56
  <td id='maksym-grebenets'>
71
57
  <a href='https://github.com/mgrebenets'>
72
58
  <img src='https://github.com/mgrebenets.png' width='140px;'>
73
59
  </a>
74
60
  <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
75
61
  </td>
76
- <td id='manish-rathi'>
77
- <a href='https://github.com/crazymanish'>
78
- <img src='https://github.com/crazymanish.png' width='140px;'>
62
+ <td id='satoshi-namai'>
63
+ <a href='https://github.com/ainame'>
64
+ <img src='https://github.com/ainame.png' width='140px;'>
79
65
  </a>
80
- <h4 align='center'><a href='https://twitter.com/iammanishrathi'>Manish Rathi</a></h4>
66
+ <h4 align='center'><a href='https://twitter.com/ainame'>Satoshi Namai</a></h4>
81
67
  </td>
82
- <td id='helmut-januschka'>
83
- <a href='https://github.com/hjanuschka'>
84
- <img src='https://github.com/hjanuschka.png' width='140px;'>
68
+ </tr>
69
+ <tr>
70
+ <td id='roger-oba'>
71
+ <a href='https://github.com/rogerluan'>
72
+ <img src='https://github.com/rogerluan.png' width='140px;'>
85
73
  </a>
86
- <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
74
+ <h4 align='center'><a href='https://twitter.com/rogerluan_'>Roger Oba</a></h4>
87
75
  </td>
88
76
  <td id='matthew-ellis'>
89
77
  <a href='https://github.com/matthewellis'>
@@ -91,69 +79,69 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
91
79
  </a>
92
80
  <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
93
81
  </td>
94
- <td id='kohki-miki'>
95
- <a href='https://github.com/giginet'>
96
- <img src='https://github.com/giginet.png' width='140px;'>
82
+ <td id='olivier-halligon'>
83
+ <a href='https://github.com/AliSoftware'>
84
+ <img src='https://github.com/AliSoftware.png' width='140px;'>
97
85
  </a>
98
- <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
86
+ <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
87
+ </td>
88
+ <td id='helmut-januschka'>
89
+ <a href='https://github.com/hjanuschka'>
90
+ <img src='https://github.com/hjanuschka.png' width='140px;'>
91
+ </a>
92
+ <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
99
93
  </td>
100
- </tr>
101
- <tr>
102
94
  <td id='daniel-jankowski'>
103
95
  <a href='https://github.com/mollyIV'>
104
96
  <img src='https://github.com/mollyIV.png' width='140px;'>
105
97
  </a>
106
98
  <h4 align='center'><a href='https://twitter.com/mollyIV'>Daniel Jankowski</a></h4>
107
99
  </td>
108
- <td id='danielle-tomlinson'>
109
- <a href='https://github.com/endocrimes'>
110
- <img src='https://github.com/endocrimes.png' width='140px;'>
111
- </a>
112
- <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
113
- </td>
114
- <td id='fumiya-nakamura'>
115
- <a href='https://github.com/nafu'>
116
- <img src='https://github.com/nafu.png' width='140px;'>
117
- </a>
118
- <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
119
- </td>
100
+ </tr>
101
+ <tr>
120
102
  <td id='jan-piotrowski'>
121
103
  <a href='https://github.com/janpio'>
122
104
  <img src='https://github.com/janpio.png' width='140px;'>
123
105
  </a>
124
106
  <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
125
107
  </td>
126
- <td id='satoshi-namai'>
127
- <a href='https://github.com/ainame'>
128
- <img src='https://github.com/ainame.png' width='140px;'>
108
+ <td id='jorge-revuelta-h'>
109
+ <a href='https://github.com/minuscorp'>
110
+ <img src='https://github.com/minuscorp.png' width='140px;'>
129
111
  </a>
130
- <h4 align='center'><a href='https://twitter.com/ainame'>Satoshi Namai</a></h4>
112
+ <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
113
+ </td>
114
+ <td id='kohki-miki'>
115
+ <a href='https://github.com/giginet'>
116
+ <img src='https://github.com/giginet.png' width='140px;'>
117
+ </a>
118
+ <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
119
+ </td>
120
+ <td id='aaron-brager'>
121
+ <a href='https://github.com/getaaron'>
122
+ <img src='https://github.com/getaaron.png' width='140px;'>
123
+ </a>
124
+ <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
131
125
  </td>
132
- </tr>
133
- <tr>
134
126
  <td id='luka-mirosevic'>
135
127
  <a href='https://github.com/lmirosevic'>
136
128
  <img src='https://github.com/lmirosevic.png' width='140px;'>
137
129
  </a>
138
130
  <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
139
131
  </td>
132
+ </tr>
133
+ <tr>
140
134
  <td id='felix-krause'>
141
135
  <a href='https://github.com/KrauseFx'>
142
136
  <img src='https://github.com/KrauseFx.png' width='140px;'>
143
137
  </a>
144
138
  <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
145
139
  </td>
146
- <td id='josh-holtz'>
147
- <a href='https://github.com/joshdholtz'>
148
- <img src='https://github.com/joshdholtz.png' width='140px;'>
149
- </a>
150
- <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
151
- </td>
152
- <td id='aaron-brager'>
153
- <a href='https://github.com/getaaron'>
154
- <img src='https://github.com/getaaron.png' width='140px;'>
140
+ <td id='jérôme-lacoste'>
141
+ <a href='https://github.com/lacostej'>
142
+ <img src='https://github.com/lacostej.png' width='140px;'>
155
143
  </a>
156
- <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
144
+ <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
157
145
  </td>
158
146
  <td id='jimmy-dee'>
159
147
  <a href='https://github.com/jdee'>
@@ -161,31 +149,37 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
161
149
  </a>
162
150
  <h4 align='center'>Jimmy Dee</h4>
163
151
  </td>
164
- </tr>
165
- <tr>
166
- <td id='max-ott'>
167
- <a href='https://github.com/max-ott'>
168
- <img src='https://github.com/max-ott.png' width='140px;'>
152
+ <td id='manish-rathi'>
153
+ <a href='https://github.com/crazymanish'>
154
+ <img src='https://github.com/crazymanish.png' width='140px;'>
169
155
  </a>
170
- <h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
156
+ <h4 align='center'><a href='https://twitter.com/iammanishrathi'>Manish Rathi</a></h4>
171
157
  </td>
158
+ <td id='joshua-liebowitz'>
159
+ <a href='https://github.com/taquitos'>
160
+ <img src='https://github.com/taquitos.png' width='140px;'>
161
+ </a>
162
+ <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
163
+ </td>
164
+ </tr>
165
+ <tr>
172
166
  <td id='andrew-mcburney'>
173
167
  <a href='https://github.com/armcburney'>
174
168
  <img src='https://github.com/armcburney.png' width='140px;'>
175
169
  </a>
176
170
  <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
177
171
  </td>
178
- <td id='manu-wallner'>
179
- <a href='https://github.com/milch'>
180
- <img src='https://github.com/milch.png' width='140px;'>
172
+ <td id='max-ott'>
173
+ <a href='https://github.com/max-ott'>
174
+ <img src='https://github.com/max-ott.png' width='140px;'>
181
175
  </a>
182
- <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
176
+ <h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
183
177
  </td>
184
- <td id='joshua-liebowitz'>
185
- <a href='https://github.com/taquitos'>
186
- <img src='https://github.com/taquitos.png' width='140px;'>
178
+ <td id='stefan-natchev'>
179
+ <a href='https://github.com/snatchev'>
180
+ <img src='https://github.com/snatchev.png' width='140px;'>
187
181
  </a>
188
- <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
182
+ <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
189
183
  </td>
190
184
  <td id='iulian-onofrei'>
191
185
  <a href='https://github.com/revolter'>
@@ -193,6 +187,12 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
193
187
  </a>
194
188
  <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
195
189
  </td>
190
+ <td id='manu-wallner'>
191
+ <a href='https://github.com/milch'>
192
+ <img src='https://github.com/milch.png' width='140px;'>
193
+ </a>
194
+ <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
195
+ </td>
196
196
  </tr>
197
197
  </table>
198
198
 
@@ -1,7 +1,30 @@
1
- Put all screenshots you want to use inside the folder of its language (e.g. en-US).
2
- The device type will automatically be recognized using the image resolution. Apple TV screenshots
3
- should be stored in a subdirectory named appleTV with language folders inside of it. iMessage
4
- screenshots, like Apple TV screenshots, should also be stored in a subdirectory named iMessage
5
- with language folders inside of it.
1
+ ## Screenshots Naming Rules
6
2
 
7
- The screenshots can be named whatever you want, but keep in mind they are sorted alphabetically.
3
+ Put all screenshots you want to use inside the folder of its language (e.g. `en-US`).
4
+ The device type will automatically be recognized using the image resolution.
5
+
6
+ The screenshots can be named whatever you want, but keep in mind they are sorted
7
+ alphabetically, in a human-friendly way. See https://github.com/fastlane/fastlane/pull/18200 for more details.
8
+
9
+ ### Exceptions
10
+
11
+ #### iPad Pro (3rd Gen) 12.9"
12
+
13
+ Since iPad Pro (3rd Gen) 12.9" and iPad Pro (2nd Gen) 12.9" have the same image
14
+ resolution, screenshots of the iPad Pro (3rd gen) 12.9" must contain either the
15
+ string `iPad Pro (12.9-inch) (3rd generation)`, `IPAD_PRO_3GEN_129`, or `ipadPro129`
16
+ (App Store Connect's internal naming of the display family for the 3rd generation iPad Pro)
17
+ in its filename to be assigned the correct display family and to be uploaded to
18
+ the correct screenshot slot in your app's metadata.
19
+
20
+ ### Other Platforms
21
+
22
+ #### Apple TV
23
+
24
+ Apple TV screenshots should be stored in a subdirectory named `appleTV` with language
25
+ folders inside of it.
26
+
27
+ #### iMessage
28
+
29
+ iMessage screenshots, like the Apple TV ones, should also be stored in a subdirectory
30
+ named `iMessage`, with language folders inside of it.
@@ -322,10 +322,10 @@ module Deliver
322
322
 
323
323
  def self.resolve_ipadpro_conflict_if_needed(screen_size, filename)
324
324
  is_3rd_gen = [
325
- "iPad Pro (12.9-inch) (3rd generation)", # default simulator name has this
326
- "iPad Pro (12.9-inch) (4th generation)", # default simulator name has this
327
- "ipadPro129", # downloaded screenshots name has this,
328
- "3GEN" # downloaded screenshots name from App Store Connect API has this
325
+ "iPad Pro (12.9-inch) (3rd generation)", # Default simulator has this name
326
+ "iPad Pro (12.9-inch) (4th generation)", # Default simulator has this name
327
+ "IPAD_PRO_3GEN_129", # Screenshots downloaded from App Store Connect has this name
328
+ "ipadPro129" # Legacy: screenshots downloaded from iTunes Connect used to have this name
329
329
  ].any? { |key| filename.include?(key) }
330
330
  if is_3rd_gen
331
331
  if screen_size == ScreenSize::IOS_IPAD_PRO
@@ -157,7 +157,7 @@ module Deliver
157
157
 
158
158
  UI.verbose('Uploading jobs are completed')
159
159
 
160
- Helper.show_loading_indicator("Waiting for all the screenshots processed...")
160
+ Helper.show_loading_indicator("Waiting for all the screenshots to finish being processed...")
161
161
  states = wait_for_complete(iterator)
162
162
  Helper.hide_loading_indicator
163
163
  retry_upload_screenshots_if_needed(iterator, states, total_number_of_screenshots, tries, localizations, screenshots_per_language)
@@ -694,7 +694,7 @@ In this case, default values for keywords, urls, name and release notes are used
694
694
 
695
695
  [Starting March 20, 2019 Apple's App Store](https://developer.apple.com/news/?id=03202019a) requires 12.9-inch iPad Pro (3rd generation) screenshots additionally to the iPad Pro 2nd generation [screenshots](https://help.apple.com/app-store-connect/#/devd274dd925). As fastlane historically uses the screenshot dimensions to determine the "display family" of a screenshot, this poses a problem as both use the same dimensions and are recognized as the same device family.
696
696
 
697
- To solve this a screenshot of a 12.9-inch iPad Pro (3rd generation) must contain either the string `iPad Pro (12.9-inch) (3rd generation)` or `ipadPro129` (Apple's internal naming of the display family for the 3rd generation iPad Pro) in its filename to be assigned the correct display family and to be uploaded to the correct screenshot slot in your app's metadata.
697
+ To solve this a screenshot of a 12.9-inch iPad Pro (3rd generation) must contain either the string `iPad Pro (12.9-inch) (3rd generation)`, `IPAD_PRO_3GEN_129`, or `ipadPro129` (Apple's internal naming of the display family for the 3rd generation iPad Pro) in its filename to be assigned the correct display family and to be uploaded to the correct screenshot slot in your app's metadata.
698
698
 
699
699
  ## Automatically create screenshots
700
700
 
@@ -12,11 +12,18 @@ module Fastlane
12
12
  require 'net/http'
13
13
  require 'date'
14
14
 
15
- # Team selection passed though FASTLANE_ITC_TEAM_ID and FASTLANE_ITC_TEAM_NAME environment variables
16
- # Prompts select team if multiple teams and none specified
17
- UI.message("Login to App Store Connect (#{params[:username]})")
18
- Spaceship::ConnectAPI.login(params[:username], use_portal: false, use_tunes: true)
19
- UI.message("Login successful")
15
+ if (api_token = Spaceship::ConnectAPI::Token.from(hash: params[:api_key], filepath: params[:api_key_path]))
16
+ UI.message("Creating authorization token for App Store Connect API")
17
+ Spaceship::ConnectAPI.token = api_token
18
+ elsif !Spaceship::ConnectAPI.token.nil?
19
+ UI.message("Using existing authorization token for App Store Connect API")
20
+ else
21
+ # Team selection passed though FASTLANE_ITC_TEAM_ID and FASTLANE_ITC_TEAM_NAME environment variables
22
+ # Prompts select team if multiple teams and none specified
23
+ UI.message("Login to App Store Connect (#{params[:username]})")
24
+ Spaceship::ConnectAPI.login(params[:username], use_portal: false, use_tunes: true)
25
+ UI.message("Login successful")
26
+ end
20
27
 
21
28
  # Get App
22
29
  app = Spaceship::ConnectAPI::App.find(params[:app_identifier])
@@ -68,7 +75,7 @@ module Fastlane
68
75
 
69
76
  filter = { app: app.id }
70
77
  filter["preReleaseVersion.platform"] = platform
71
- build_resps = Spaceship::ConnectAPI.get_builds(filter: filter, sort: "-uploadedDate", includes: "preReleaseVersion").all_pages
78
+ build_resps = Spaceship::ConnectAPI.get_builds(filter: filter, sort: "-uploadedDate", includes: "preReleaseVersion,buildBundles").all_pages
72
79
  builds = build_resps.flat_map(&:to_models)
73
80
 
74
81
  builds.each do |build|
@@ -107,31 +114,24 @@ module Fastlane
107
114
  end
108
115
 
109
116
  UI.verbose("Build_version: #{asc_build_number} matches #{build_number}, grabbing dsym_url") if build_number
110
- get_details_and_download_dsym(app: app, train: asc_app_version, build_number: asc_build_number, uploaded_date: uploaded_date, platform: itc_platform, wait_for_dsym_processing: wait_for_dsym_processing, wait_timeout: wait_timeout, output_directory: output_directory)
117
+
118
+ build.build_bundles&.each do |build_bundle|
119
+ download_dsym(build_bundle: build_bundle, build: build, app: app, wait_for_dsym_processing: wait_for_dsym_processing, wait_timeout: wait_timeout, output_directory: output_directory)
120
+ end
111
121
  end
112
122
  end
113
123
 
114
- def self.get_details_and_download_dsym(app: nil, train: nil, build_number: nil, uploaded_date: nil, platform: nil, wait_for_dsym_processing: nil, wait_timeout: nil, output_directory: nil)
124
+ def self.download_dsym(build_bundle: nil, build: nil, app: nil, wait_for_dsym_processing: nil, wait_timeout: nil, output_directory: nil)
115
125
  start = Time.now
116
126
  download_url = nil
117
127
 
118
128
  loop do
119
- begin
120
- resp = Spaceship::Tunes.client.build_details(app_id: app.id, train: train, build_number: build_number, platform: platform)
121
-
122
- resp['apple_id'] = app.id
123
- build_details = Spaceship::Tunes::BuildDetails.factory(resp)
124
-
125
- download_url = build_details.dsym_url
126
- UI.verbose("dsym_url: #{download_url}")
127
- rescue Spaceship::TunesClient::ITunesConnectError => ex
128
- UI.error("Error accessing dSYM file for build\n\n#{build}\n\nException: #{ex}")
129
- end
129
+ download_url = build_bundle.dsym_url
130
130
 
131
131
  unless download_url
132
132
  if !wait_for_dsym_processing || (Time.now - start) > wait_timeout
133
133
  # In some cases, AppStoreConnect does not process the dSYMs, thus no error should be thrown.
134
- UI.message("Could not find any dSYM for #{build_number} (#{train})")
134
+ UI.message("Could not find any dSYM for #{build.version} (#{build.app_version})")
135
135
  else
136
136
  UI.message("Waiting for dSYM file to appear...")
137
137
  sleep(30)
@@ -143,10 +143,10 @@ module Fastlane
143
143
  end
144
144
 
145
145
  if download_url
146
- self.download(download_url, app.bundle_id, train, build_number, uploaded_date, output_directory)
147
- return if build_number
146
+ self.download(download_url, build, app, output_directory)
147
+ return if build.version
148
148
  else
149
- UI.message("No dSYM URL for #{build_number} (#{train})")
149
+ UI.message("No dSYM URL for #{build.version} (#{build.app_version})")
150
150
  end
151
151
  end
152
152
  # rubocop:enable Metrics/PerceivedComplexity
@@ -154,7 +154,7 @@ module Fastlane
154
154
  def self.get_latest_build!(app_id: nil, platform: nil)
155
155
  filter = { app: app_id }
156
156
  filter["preReleaseVersion.platform"] = platform
157
- latest_build = Spaceship::ConnectAPI.get_builds(filter: filter, sort: "-uploadedDate", includes: "preReleaseVersion").first
157
+ latest_build = Spaceship::ConnectAPI.get_builds(filter: filter, sort: "-uploadedDate", includes: "preReleaseVersion,buildBundles").first
158
158
 
159
159
  if latest_build.nil?
160
160
  UI.user_error!("Could not find any build for platform #{platform}") if platform
@@ -164,18 +164,18 @@ module Fastlane
164
164
  return latest_build
165
165
  end
166
166
 
167
- def self.download(download_url, bundle_id, train_number, build_version, uploaded_date, output_directory)
167
+ def self.download(download_url, build, app, output_directory)
168
168
  result = self.download_file(download_url)
169
- path = write_dsym(result, bundle_id, train_number, build_version, output_directory)
170
- UI.success("🔑 Successfully downloaded dSYM file for #{train_number} - #{build_version} to '#{path}'")
169
+ path = write_dsym(result, app.bundle_id, build.app_version, build.version, output_directory)
170
+ UI.success("🔑 Successfully downloaded dSYM file for #{build.app_version} - #{build.version} to '#{path}'")
171
171
 
172
172
  Actions.lane_context[SharedValues::DSYM_PATHS] ||= []
173
173
  Actions.lane_context[SharedValues::DSYM_PATHS] << File.expand_path(path)
174
174
 
175
- unless uploaded_date.nil?
176
- Actions.lane_context[SharedValues::DSYM_LATEST_UPLOADED_DATE] ||= uploaded_date
175
+ unless build.uploaded_date.nil?
176
+ Actions.lane_context[SharedValues::DSYM_LATEST_UPLOADED_DATE] ||= build.uploaded_date
177
177
  current_latest = Actions.lane_context[SharedValues::DSYM_LATEST_UPLOADED_DATE]
178
- Actions.lane_context[SharedValues::DSYM_LATEST_UPLOADED_DATE] = [current_latest, uploaded_date].max
178
+ Actions.lane_context[SharedValues::DSYM_LATEST_UPLOADED_DATE] = [current_latest, build.uploaded_date].max
179
179
  UI.verbose("Most recent build uploaded_date #{Actions.lane_context[SharedValues::DSYM_LATEST_UPLOADED_DATE]}")
180
180
  end
181
181
  end
@@ -234,6 +234,23 @@ module Fastlane
234
234
  user ||= CredentialsManager::AppfileConfig.try_fetch_value(:apple_id)
235
235
 
236
236
  [
237
+ FastlaneCore::ConfigItem.new(key: :api_key_path,
238
+ env_names: ["DOWNLOAD_DSYMS_API_KEY_PATH", "APP_STORE_CONNECT_API_KEY_PATH"],
239
+ description: "Path to your App Store Connect API Key JSON file (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key-json-file)",
240
+ optional: true,
241
+ conflicting_options: [:api_key],
242
+ verify_block: proc do |value|
243
+ UI.user_error!("Couldn't find API key JSON file at path '#{value}'") unless File.exist?(value)
244
+ end),
245
+ FastlaneCore::ConfigItem.new(key: :api_key,
246
+ env_names: ["DOWNLOAD_DSYMS_API_KEY", "APP_STORE_CONNECT_API_KEY"],
247
+ description: "Your App Store Connect API Key information (https://docs.fastlane.tools/app-store-connect-api/#use-return-value-and-pass-in-as-an-option)",
248
+ type: Hash,
249
+ default_value: Fastlane::Actions.lane_context[Fastlane::Actions::SharedValues::APP_STORE_CONNECT_API_KEY],
250
+ default_value_dynamic: true,
251
+ optional: true,
252
+ sensitive: true,
253
+ conflicting_options: [:api_key_path]),
237
254
  FastlaneCore::ConfigItem.new(key: :username,
238
255
  short_option: "-u",
239
256
  env_name: "DOWNLOAD_DSYMS_USERNAME",
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
- VERSION = '2.196.0'.freeze
2
+ VERSION = '2.197.0'.freeze
3
3
  DESCRIPTION = "The easiest way to automate beta deployments and releases for your iOS and Android apps".freeze
4
4
  MINIMUM_XCODE_RELEASE = "7.0".freeze
5
5
  RUBOCOP_REQUIREMENT = '1.12.1'.freeze
@@ -17,4 +17,4 @@ public class Deliverfile: DeliverfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.196.0
20
+ // Generated with fastlane 2.197.0
@@ -260,4 +260,4 @@ public extension DeliverfileProtocol {
260
260
 
261
261
  // Please don't remove the lines below
262
262
  // They are used to detect outdated files
263
- // FastlaneRunnerAPIVersion [0.9.85]
263
+ // FastlaneRunnerAPIVersion [0.9.86]
@@ -4013,6 +4013,8 @@ public func downloadAppPrivacyDetailsFromAppStore(username: String,
4013
4013
  Download dSYM files from App Store Connect for Bitcode apps
4014
4014
 
4015
4015
  - parameters:
4016
+ - apiKeyPath: Path to your App Store Connect API Key JSON file (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key-json-file)
4017
+ - apiKey: Your App Store Connect API Key information (https://docs.fastlane.tools/app-store-connect-api/#use-return-value-and-pass-in-as-an-option)
4016
4018
  - username: Your Apple ID Username for App Store Connect
4017
4019
  - appIdentifier: The bundle identifier of your app
4018
4020
  - teamId: The ID of your App Store Connect team if you're in multiple teams
@@ -4037,7 +4039,9 @@ public func downloadAppPrivacyDetailsFromAppStore(username: String,
4037
4039
  ```|
4038
4040
  >|
4039
4041
  */
4040
- public func downloadDsyms(username: String,
4042
+ public func downloadDsyms(apiKeyPath: OptionalConfigValue<String?> = .fastlaneDefault(nil),
4043
+ apiKey: OptionalConfigValue<[String: Any]?> = .fastlaneDefault(nil),
4044
+ username: String,
4041
4045
  appIdentifier: String,
4042
4046
  teamId: OptionalConfigValue<String?> = .fastlaneDefault(nil),
4043
4047
  teamName: OptionalConfigValue<String?> = .fastlaneDefault(nil),
@@ -4050,6 +4054,8 @@ public func downloadDsyms(username: String,
4050
4054
  waitForDsymProcessing: OptionalConfigValue<Bool> = .fastlaneDefault(false),
4051
4055
  waitTimeout: Int = 300)
4052
4056
  {
4057
+ let apiKeyPathArg = apiKeyPath.asRubyArgument(name: "api_key_path", type: nil)
4058
+ let apiKeyArg = apiKey.asRubyArgument(name: "api_key", type: nil)
4053
4059
  let usernameArg = RubyCommand.Argument(name: "username", value: username, type: nil)
4054
4060
  let appIdentifierArg = RubyCommand.Argument(name: "app_identifier", value: appIdentifier, type: nil)
4055
4061
  let teamIdArg = teamId.asRubyArgument(name: "team_id", type: nil)
@@ -4062,7 +4068,9 @@ public func downloadDsyms(username: String,
4062
4068
  let outputDirectoryArg = outputDirectory.asRubyArgument(name: "output_directory", type: nil)
4063
4069
  let waitForDsymProcessingArg = waitForDsymProcessing.asRubyArgument(name: "wait_for_dsym_processing", type: nil)
4064
4070
  let waitTimeoutArg = RubyCommand.Argument(name: "wait_timeout", value: waitTimeout, type: nil)
4065
- let array: [RubyCommand.Argument?] = [usernameArg,
4071
+ let array: [RubyCommand.Argument?] = [apiKeyPathArg,
4072
+ apiKeyArg,
4073
+ usernameArg,
4066
4074
  appIdentifierArg,
4067
4075
  teamIdArg,
4068
4076
  teamNameArg,
@@ -13242,4 +13250,4 @@ public let snapshotfile = Snapshotfile()
13242
13250
 
13243
13251
  // Please don't remove the lines below
13244
13252
  // They are used to detect outdated files
13245
- // FastlaneRunnerAPIVersion [0.9.138]
13253
+ // FastlaneRunnerAPIVersion [0.9.139]
@@ -17,4 +17,4 @@ public class Gymfile: GymfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.196.0
20
+ // Generated with fastlane 2.197.0
@@ -196,4 +196,4 @@ public extension GymfileProtocol {
196
196
 
197
197
  // Please don't remove the lines below
198
198
  // They are used to detect outdated files
199
- // FastlaneRunnerAPIVersion [0.9.88]
199
+ // FastlaneRunnerAPIVersion [0.9.89]
@@ -17,4 +17,4 @@ public class Matchfile: MatchfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.196.0
20
+ // Generated with fastlane 2.197.0
@@ -192,4 +192,4 @@ public extension MatchfileProtocol {
192
192
 
193
193
  // Please don't remove the lines below
194
194
  // They are used to detect outdated files
195
- // FastlaneRunnerAPIVersion [0.9.82]
195
+ // FastlaneRunnerAPIVersion [0.9.83]
@@ -17,4 +17,4 @@ public class Precheckfile: PrecheckfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.196.0
20
+ // Generated with fastlane 2.197.0
@@ -52,4 +52,4 @@ public extension PrecheckfileProtocol {
52
52
 
53
53
  // Please don't remove the lines below
54
54
  // They are used to detect outdated files
55
- // FastlaneRunnerAPIVersion [0.9.81]
55
+ // FastlaneRunnerAPIVersion [0.9.82]
@@ -17,4 +17,4 @@ public class Scanfile: ScanfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.196.0
20
+ // Generated with fastlane 2.197.0
@@ -296,4 +296,4 @@ public extension ScanfileProtocol {
296
296
 
297
297
  // Please don't remove the lines below
298
298
  // They are used to detect outdated files
299
- // FastlaneRunnerAPIVersion [0.9.93]
299
+ // FastlaneRunnerAPIVersion [0.9.94]
@@ -17,4 +17,4 @@ public class Screengrabfile: ScreengrabfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.196.0
20
+ // Generated with fastlane 2.197.0
@@ -96,4 +96,4 @@ public extension ScreengrabfileProtocol {
96
96
 
97
97
  // Please don't remove the lines below
98
98
  // They are used to detect outdated files
99
- // FastlaneRunnerAPIVersion [0.9.83]
99
+ // FastlaneRunnerAPIVersion [0.9.84]
@@ -17,4 +17,4 @@ public class Snapshotfile: SnapshotfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.196.0
20
+ // Generated with fastlane 2.197.0
@@ -200,4 +200,4 @@ public extension SnapshotfileProtocol {
200
200
 
201
201
  // Please don't remove the lines below
202
202
  // They are used to detect outdated files
203
- // FastlaneRunnerAPIVersion [0.9.77]
203
+ // FastlaneRunnerAPIVersion [0.9.78]
@@ -2,30 +2,30 @@
2
2
  "entries": {
3
3
  "brew": {
4
4
  "swiftformat": {
5
- "version": "0.48.16",
5
+ "version": "0.48.17",
6
6
  "bottle": {
7
7
  "rebuild": 0,
8
8
  "root_url": "https://ghcr.io/v2/homebrew/core",
9
9
  "files": {
10
10
  "arm64_big_sur": {
11
11
  "cellar": ":any_skip_relocation",
12
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:6e754174bb20c391ccebe2685d1ab2dcba66020f0bb0eb118c09272d9daebbbd",
13
- "sha256": "6e754174bb20c391ccebe2685d1ab2dcba66020f0bb0eb118c09272d9daebbbd"
12
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:e19dbc72ddf213203e940708f3de6d9ca9c88663b5176494d04b4c418e16954f",
13
+ "sha256": "e19dbc72ddf213203e940708f3de6d9ca9c88663b5176494d04b4c418e16954f"
14
14
  },
15
15
  "big_sur": {
16
16
  "cellar": ":any_skip_relocation",
17
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:a6d4e1a74a8904358df45ea9cc694dbf9b228e6fcf1bcf88bb9f5e18681411ac",
18
- "sha256": "a6d4e1a74a8904358df45ea9cc694dbf9b228e6fcf1bcf88bb9f5e18681411ac"
17
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:90056a4e3b03ef31cecfb5b9e278a44bea2abecdd26a202d00bc390dfbbeb352",
18
+ "sha256": "90056a4e3b03ef31cecfb5b9e278a44bea2abecdd26a202d00bc390dfbbeb352"
19
19
  },
20
20
  "catalina": {
21
21
  "cellar": ":any_skip_relocation",
22
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:c88cdbc2ade1ad4635fdafcb9b3ad23b6ba12aa50f5507bd2615dca2f9d21530",
23
- "sha256": "c88cdbc2ade1ad4635fdafcb9b3ad23b6ba12aa50f5507bd2615dca2f9d21530"
22
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:9647fdbfed2e7e2361974a5bfb99be4a112d914bd3e582afb4cdf7dc81e44cbf",
23
+ "sha256": "9647fdbfed2e7e2361974a5bfb99be4a112d914bd3e582afb4cdf7dc81e44cbf"
24
24
  },
25
25
  "mojave": {
26
26
  "cellar": ":any_skip_relocation",
27
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:0a4d4a8b561e961e8cd98c216fb4589cbbcf127c26fc25c81f794360295950ec",
28
- "sha256": "0a4d4a8b561e961e8cd98c216fb4589cbbcf127c26fc25c81f794360295950ec"
27
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:83231c218cca811795688e175d88ac4584d1c424566926f9d6ed36e9dbdfed75",
28
+ "sha256": "83231c218cca811795688e175d88ac4584d1c424566926f9d6ed36e9dbdfed75"
29
29
  }
30
30
  }
31
31
  }
@@ -43,9 +43,9 @@
43
43
  "macOS": "10.15.7"
44
44
  },
45
45
  "big_sur": {
46
- "HOMEBREW_VERSION": "3.2.16",
47
- "HOMEBREW_PREFIX": "/usr/local",
48
- "Homebrew/homebrew-core": "f01e43d7cecd622bb39ab48504bb01e350ab36db",
46
+ "HOMEBREW_VERSION": "3.2.17",
47
+ "HOMEBREW_PREFIX": "/opt/homebrew",
48
+ "Homebrew/homebrew-core": "d975bb4c6f50e8cafd6df9fc7f2ebf04d22ffa41",
49
49
  "CLT": "13.0.0.0.1.1630607135",
50
50
  "Xcode": "13.0",
51
51
  "macOS": "11.6"
@@ -467,26 +467,24 @@ module Frameit
467
467
  # Get matching trim box:
468
468
  trim_box = trim_boxes[key]
469
469
 
470
- # For side-by-side text images (e.g. stack_title is false) adjust the trim box based on top_vertical_trim_offset and bottom_vertical_trim_offset to maintain the text baseline:
471
- unless stack_title
472
- # Determine the trim area by maintaining the same vertical top offset based on the smallest value from all trim boxes (top_vertical_trim_offset).
473
- # When the vertical top offset is larger than the smallest vertical top offset, the trim box needs to be adjusted:
474
- if trim_box.offset_y > top_vertical_trim_offset
475
- # Increase the height of the trim box with the difference in vertical top offset:
476
- trim_box.height += trim_box.offset_y - top_vertical_trim_offset
477
- # Change the vertical top offset to match that of the others:
478
- trim_box.offset_y = top_vertical_trim_offset
479
-
480
- UI.verbose("Trim box for key \"#{key}\" is adjusted to align top: #{trim_box}\n")
481
- end
470
+ # Adjust the trim box based on top_vertical_trim_offset and bottom_vertical_trim_offset to maintain the text baseline:
471
+ # Determine the trim area by maintaining the same vertical top offset based on the smallest value from all trim boxes (top_vertical_trim_offset).
472
+ # When the vertical top offset is larger than the smallest vertical top offset, the trim box needs to be adjusted:
473
+ if trim_box.offset_y > top_vertical_trim_offset
474
+ # Increase the height of the trim box with the difference in vertical top offset:
475
+ trim_box.height += trim_box.offset_y - top_vertical_trim_offset
476
+ # Change the vertical top offset to match that of the others:
477
+ trim_box.offset_y = top_vertical_trim_offset
478
+
479
+ UI.verbose("Trim box for key \"#{key}\" is adjusted to align top: #{trim_box.json_string_format}")
480
+ end
482
481
 
483
- # Check if the height needs to be adjusted to reach the bottom offset:
484
- if (trim_box.offset_y + trim_box.height) < bottom_vertical_trim_offset
485
- # Set the height of the trim box to the difference between vertical bottom and top offset:
486
- trim_box.height = bottom_vertical_trim_offset - trim_box.offset_y
482
+ # Check if the height needs to be adjusted to reach the bottom offset:
483
+ if (trim_box.offset_y + trim_box.height) < bottom_vertical_trim_offset
484
+ # Set the height of the trim box to the difference between vertical bottom and top offset:
485
+ trim_box.height = bottom_vertical_trim_offset - trim_box.offset_y
487
486
 
488
- UI.verbose("Trim box for key \"#{key}\" is adjusted to align bottom: #{trim_box}\n")
489
- end
487
+ UI.verbose("Trim box for key \"#{key}\" is adjusted to align bottom: #{trim_box.json_string_format}")
490
488
  end
491
489
 
492
490
  # Crop image with (adjusted) trim box parameters in MiniMagick string format:
@@ -31,5 +31,11 @@ module Frameit
31
31
  # Convert trim box parameters to string with syntax: "<width>x<height>+<offset_x>+<offset_y>":
32
32
  return "#{@width}x#{@height}+#{@offset_x}+#{@offset_y}"
33
33
  end
34
+
35
+ # Get the trimbox parameters in a human readable JSON string format
36
+ def json_string_format
37
+ # Create a JSON string from the trim box parameters:
38
+ return "{\"width\" : #{@width}, \"height\" : #{@height} , \"offset_x\" : #{@offset_x}, \"offset_y\" : #{@offset_y}}"
39
+ end
34
40
  end
35
41
  end
@@ -19,6 +19,7 @@ module Spaceship
19
19
  attr_accessor :beta_build_metrics
20
20
  attr_accessor :beta_build_localizations
21
21
  attr_accessor :build_beta_detail
22
+ attr_accessor :build_bundles
22
23
  attr_accessor :pre_release_version
23
24
  attr_accessor :individual_testers
24
25
 
@@ -38,10 +39,11 @@ module Spaceship
38
39
  "betaBuildLocalizations" => "beta_build_localizations",
39
40
  "buildBetaDetail" => "build_beta_detail",
40
41
  "preReleaseVersion" => "pre_release_version",
41
- "individualTesters" => "individual_testers"
42
+ "individualTesters" => "individual_testers",
43
+ "buildBundles" => "build_bundles"
42
44
  })
43
45
 
44
- ESSENTIAL_INCLUDES = "app,buildBetaDetail,preReleaseVersion"
46
+ ESSENTIAL_INCLUDES = "app,buildBetaDetail,preReleaseVersion,buildBundles"
45
47
 
46
48
  module ProcessingState
47
49
  PROCESSING = "PROCESSING"
@@ -0,0 +1,59 @@
1
+ require_relative '../model'
2
+ module Spaceship
3
+ class ConnectAPI
4
+ class BuildBundle
5
+ include Spaceship::ConnectAPI::Model
6
+
7
+ attr_accessor :bundle_id
8
+ attr_accessor :bundle_type
9
+ attr_accessor :sdk_build
10
+ attr_accessor :platform_build
11
+ attr_accessor :file_name
12
+ attr_accessor :has_siri_kit
13
+ attr_accessor :has_on_demand_resources
14
+ attr_accessor :is_newsstand
15
+ attr_accessor :has_prerendered_icon
16
+ attr_accessor :uses_location_services
17
+ attr_accessor :is_ios_build_mac_app_store_compatible
18
+ attr_accessor :includes_symbols
19
+ attr_accessor :dsym_url
20
+ attr_accessor :supported_architectures
21
+ attr_accessor :required_capabilities
22
+ attr_accessor :device_protocols
23
+ attr_accessor :locales
24
+ attr_accessor :entitlements
25
+ attr_accessor :tracks_users
26
+
27
+ module BundleType
28
+ APP = "APP"
29
+ # APP_CLIP might be in here as well
30
+ end
31
+
32
+ attr_mapping({
33
+ "bundleId" => "bundle_id",
34
+ "bundleType" => "bundle_type",
35
+ "sdkBuild" => "sdk_build",
36
+ "platformBuild" => "platform_build",
37
+ "fileName" => "file_name",
38
+ "hasSirikit" => "has_siri_kit",
39
+ "hasOnDemandResources" => "has_on_demand_resources",
40
+ "isNewsstand" => "is_newsstand",
41
+ "hasPrerenderedIcon" => "has_prerendered_icon",
42
+ "usesLocationServices" => "uses_location_services",
43
+ "isIosBuildMacAppStoreCompatible" => "is_ios_build_mac_app_store_compatible",
44
+ "includesSymbols" => "includes_symbols",
45
+ "dSYMUrl" => "dsym_url",
46
+ "supportedArchitectures" => "supported_architectures",
47
+ "requiredCapabilities" => "required_capabilities",
48
+ "deviceProtocols" => "device_protocols",
49
+ "locales" => "locales",
50
+ "entitlements" => "entitlements",
51
+ "tracksUsers" => "tracks_users"
52
+ })
53
+
54
+ def self.type
55
+ return "buildBundles"
56
+ end
57
+ end
58
+ end
59
+ end
@@ -32,6 +32,7 @@ require 'spaceship/connect_api/models/beta_tester_metric'
32
32
  require 'spaceship/connect_api/models/build'
33
33
  require 'spaceship/connect_api/models/build_delivery'
34
34
  require 'spaceship/connect_api/models/build_beta_detail'
35
+ require 'spaceship/connect_api/models/build_bundle'
35
36
  require 'spaceship/connect_api/models/custom_app_organization'
36
37
  require 'spaceship/connect_api/models/custom_app_user'
37
38
  require 'spaceship/connect_api/models/pre_release_version'
metadata CHANGED
@@ -1,38 +1,38 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.196.0
4
+ version: 2.197.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Max Ott
8
- - Jérôme Lacoste
9
- - Luka Mirosevic
10
- - Daniel Jankowski
11
- - Satoshi Namai
12
- - Matthew Ellis
13
- - Jan Piotrowski
14
- - Andrew McBurney
15
- - Iulian Onofrei
16
- - Manish Rathi
17
- - Kohki Miki
18
8
  - Danielle Tomlinson
19
- - Roger Oba
20
- - Fumiya Nakamura
21
- - Felix Krause
22
- - Aaron Brager
23
9
  - Jimmy Dee
24
- - Helmut Januschka
25
- - Jorge Revuelta H
26
- - Olivier Halligon
27
- - Josh Holtz
10
+ - Manish Rathi
28
11
  - Manu Wallner
29
- - Joshua Liebowitz
30
12
  - Maksym Grebenets
13
+ - Iulian Onofrei
14
+ - Felix Krause
15
+ - Helmut Januschka
16
+ - Jan Piotrowski
31
17
  - Stefan Natchev
18
+ - Luka Mirosevic
19
+ - Joshua Liebowitz
20
+ - Fumiya Nakamura
21
+ - Kohki Miki
22
+ - Satoshi Namai
23
+ - Jérôme Lacoste
24
+ - Daniel Jankowski
25
+ - Aaron Brager
26
+ - Olivier Halligon
27
+ - Matthew Ellis
28
+ - Roger Oba
29
+ - Andrew McBurney
30
+ - Josh Holtz
31
+ - Jorge Revuelta H
32
32
  autorequire:
33
33
  bindir: bin
34
34
  cert_chain: []
35
- date: 2021-10-14 00:00:00.000000000 Z
35
+ date: 2021-10-22 00:00:00.000000000 Z
36
36
  dependencies:
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: xcodeproj
@@ -1654,6 +1654,7 @@ files:
1654
1654
  - spaceship/lib/spaceship/connect_api/client.rb
1655
1655
  - spaceship/lib/spaceship/connect_api/file_uploader.rb
1656
1656
  - spaceship/lib/spaceship/connect_api/model.rb
1657
+ - spaceship/lib/spaceship/connect_api/models/.build.rb.swp
1657
1658
  - spaceship/lib/spaceship/connect_api/models/age_rating_declaration.rb
1658
1659
  - spaceship/lib/spaceship/connect_api/models/app.rb
1659
1660
  - spaceship/lib/spaceship/connect_api/models/app_category.rb
@@ -1691,6 +1692,7 @@ files:
1691
1692
  - spaceship/lib/spaceship/connect_api/models/beta_tester_metric.rb
1692
1693
  - spaceship/lib/spaceship/connect_api/models/build.rb
1693
1694
  - spaceship/lib/spaceship/connect_api/models/build_beta_detail.rb
1695
+ - spaceship/lib/spaceship/connect_api/models/build_bundle.rb
1694
1696
  - spaceship/lib/spaceship/connect_api/models/build_delivery.rb
1695
1697
  - spaceship/lib/spaceship/connect_api/models/bundle_id.rb
1696
1698
  - spaceship/lib/spaceship/connect_api/models/bundle_id_capability.rb