fastlane 2.159.0 → 2.160.0

This diff has not been reviewed by any users.
Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +78 -78
  3. data/deliver/lib/deliver/options.rb +17 -1
  4. data/deliver/lib/deliver/runner.rb +36 -8
  5. data/deliver/lib/deliver/upload_metadata.rb +31 -5
  6. data/deliver/lib/deliver/upload_price_tier.rb +7 -2
  7. data/fastlane/lib/fastlane/actions/clean_build_artifacts.rb +1 -0
  8. data/fastlane/lib/fastlane/actions/docs/frame_screenshots.md +1 -0
  9. data/fastlane/lib/fastlane/actions/download_dsyms.rb +30 -6
  10. data/fastlane/lib/fastlane/version.rb +1 -1
  11. data/fastlane/swift/Deliverfile.swift +1 -1
  12. data/fastlane/swift/DeliverfileProtocol.swift +10 -2
  13. data/fastlane/swift/Fastlane.swift +53 -20
  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 +1 -1
  18. data/fastlane/swift/Precheckfile.swift +1 -1
  19. data/fastlane/swift/PrecheckfileProtocol.swift +9 -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/frameit/lib/frameit/editor.rb +1 -0
  27. data/pilot/lib/pilot/options.rb +2 -2
  28. data/precheck/lib/precheck/options.rb +16 -0
  29. data/precheck/lib/precheck/runner.rb +20 -1
  30. data/spaceship/lib/spaceship/connect_api/models/app.rb +17 -9
  31. data/spaceship/lib/spaceship/connect_api/models/app_info.rb +1 -0
  32. data/spaceship/lib/spaceship/connect_api/models/app_screenshot_set.rb +2 -2
  33. data/spaceship/lib/spaceship/connect_api/models/app_store_version.rb +3 -5
  34. data/spaceship/lib/spaceship/connect_api/models/app_store_version_localization.rb +3 -5
  35. data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +11 -6
  36. metadata +16 -18
  37. data/spaceship/lib/spaceship/connect_api/models/.app.rb.swp +0 -0
  38. data/spaceship/lib/spaceship/connect_api/models/.app_store_version.rb.swp +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 580e666fe7cc2465dab2cf2b222e64043365b10445aa3ebc747a88cbb3dd39ea
4
- data.tar.gz: a87f27692ad0f8f0341f60fbd077468ab7d9f6a52fc6d7c380339ca054a32ec6
3
+ metadata.gz: 1397a58b9e5db2690af6f035c6b0599471135fca731aa8ca32d9332e92aa0f4d
4
+ data.tar.gz: 28074ccdc0e5948e4d2882d45207229fae454f5712d8a3448e7306bba339a81f
5
5
  SHA512:
6
- metadata.gz: 5efd5d62be52c22f814bad1afc08e446b60cc97338c205ab10b84357c875d22b1429b5b442e892b7a3d4f67ddd874ed0b101025b4f7ea66c4a26713b044a43f5
7
- data.tar.gz: b60237273ab6edb899e46b8ae2db68d8064ae476e34139f9b5e653e7f89b6a4159f12a1895d50984e2f2f762723bc9ead7a9c9ccc629d28525d0a592af169522
6
+ metadata.gz: 0cd4759b7d14605eba44cc49c2ba83989b4b2435ecc0b02d9ce7a162c10c67202504eec4ea4e4cd255f866b929419ee6f670828e6992b34a4845789a870daaea
7
+ data.tar.gz: 9c1e740b44e8022f87ef2009caaad53bc2ea4c6eb00abe80477c8945bac056e0b6de7c88d90a8e1b85a4ad27ce62fd417b1529e4e1c97c52d321a0f269192cba
data/README.md CHANGED
@@ -34,23 +34,17 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
34
34
  <!-- This table is regenerated and resorted on each release -->
35
35
  <table id='team'>
36
36
  <tr>
37
- <td id='josh-holtz'>
38
- <a href='https://github.com/joshdholtz'>
39
- <img src='https://github.com/joshdholtz.png?size=140'>
40
- </a>
41
- <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
42
- </td>
43
- <td id='jan-piotrowski'>
44
- <a href='https://github.com/janpio'>
45
- <img src='https://github.com/janpio.png?size=140'>
37
+ <td id='fumiya-nakamura'>
38
+ <a href='https://github.com/nafu'>
39
+ <img src='https://github.com/nafu.png?size=140'>
46
40
  </a>
47
- <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
41
+ <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
48
42
  </td>
49
- <td id='jérôme-lacoste'>
50
- <a href='https://github.com/lacostej'>
51
- <img src='https://github.com/lacostej.png?size=140'>
43
+ <td id='stefan-natchev'>
44
+ <a href='https://github.com/snatchev'>
45
+ <img src='https://github.com/snatchev.png?size=140'>
52
46
  </a>
53
- <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
47
+ <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
54
48
  </td>
55
49
  <td id='andrew-mcburney'>
56
50
  <a href='https://github.com/armcburney'>
@@ -58,51 +52,57 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
58
52
  </a>
59
53
  <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
60
54
  </td>
61
- <td id='jorge-revuelta-h'>
62
- <a href='https://github.com/minuscorp'>
63
- <img src='https://github.com/minuscorp.png?size=140'>
55
+ <td id='aaron-brager'>
56
+ <a href='https://github.com/getaaron'>
57
+ <img src='https://github.com/getaaron.png?size=140'>
64
58
  </a>
65
- <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
59
+ <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
60
+ </td>
61
+ <td id='jimmy-dee'>
62
+ <a href='https://github.com/jdee'>
63
+ <img src='https://github.com/jdee.png?size=140'>
64
+ </a>
65
+ <h4 align='center'>Jimmy Dee</h4>
66
66
  </td>
67
67
  </tr>
68
68
  <tr>
69
- <td id='luka-mirosevic'>
70
- <a href='https://github.com/lmirosevic'>
71
- <img src='https://github.com/lmirosevic.png?size=140'>
69
+ <td id='maksym-grebenets'>
70
+ <a href='https://github.com/mgrebenets'>
71
+ <img src='https://github.com/mgrebenets.png?size=140'>
72
72
  </a>
73
- <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
73
+ <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
74
74
  </td>
75
- <td id='stefan-natchev'>
76
- <a href='https://github.com/snatchev'>
77
- <img src='https://github.com/snatchev.png?size=140'>
75
+ <td id='felix-krause'>
76
+ <a href='https://github.com/KrauseFx'>
77
+ <img src='https://github.com/KrauseFx.png?size=140'>
78
78
  </a>
79
- <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
79
+ <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
80
80
  </td>
81
- <td id='manu-wallner'>
82
- <a href='https://github.com/milch'>
83
- <img src='https://github.com/milch.png?size=140'>
81
+ <td id='max-ott'>
82
+ <a href='https://github.com/max-ott'>
83
+ <img src='https://github.com/max-ott.png?size=140'>
84
84
  </a>
85
- <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
85
+ <h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
86
86
  </td>
87
- <td id='fumiya-nakamura'>
88
- <a href='https://github.com/nafu'>
89
- <img src='https://github.com/nafu.png?size=140'>
87
+ <td id='jorge-revuelta-h'>
88
+ <a href='https://github.com/minuscorp'>
89
+ <img src='https://github.com/minuscorp.png?size=140'>
90
90
  </a>
91
- <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
91
+ <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
92
92
  </td>
93
- <td id='iulian-onofrei'>
94
- <a href='https://github.com/revolter'>
95
- <img src='https://github.com/revolter.png?size=140'>
93
+ <td id='kohki-miki'>
94
+ <a href='https://github.com/giginet'>
95
+ <img src='https://github.com/giginet.png?size=140'>
96
96
  </a>
97
- <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
97
+ <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
98
98
  </td>
99
99
  </tr>
100
100
  <tr>
101
- <td id='max-ott'>
102
- <a href='https://github.com/max-ott'>
103
- <img src='https://github.com/max-ott.png?size=140'>
101
+ <td id='joshua-liebowitz'>
102
+ <a href='https://github.com/taquitos'>
103
+ <img src='https://github.com/taquitos.png?size=140'>
104
104
  </a>
105
- <h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
105
+ <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
106
106
  </td>
107
107
  <td id='olivier-halligon'>
108
108
  <a href='https://github.com/AliSoftware'>
@@ -110,43 +110,43 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
110
110
  </a>
111
111
  <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
112
112
  </td>
113
- <td id='aaron-brager'>
114
- <a href='https://github.com/getaaron'>
115
- <img src='https://github.com/getaaron.png?size=140'>
113
+ <td id='daniel-jankowski'>
114
+ <a href='https://github.com/mollyIV'>
115
+ <img src='https://github.com/mollyIV.png?size=140'>
116
116
  </a>
117
- <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
117
+ <h4 align='center'><a href='https://twitter.com/mollyIV'>Daniel Jankowski</a></h4>
118
118
  </td>
119
- <td id='helmut-januschka'>
120
- <a href='https://github.com/hjanuschka'>
121
- <img src='https://github.com/hjanuschka.png?size=140'>
119
+ <td id='jan-piotrowski'>
120
+ <a href='https://github.com/janpio'>
121
+ <img src='https://github.com/janpio.png?size=140'>
122
122
  </a>
123
- <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
123
+ <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
124
124
  </td>
125
- <td id='matthew-ellis'>
126
- <a href='https://github.com/matthewellis'>
127
- <img src='https://github.com/matthewellis.png?size=140'>
125
+ <td id='luka-mirosevic'>
126
+ <a href='https://github.com/lmirosevic'>
127
+ <img src='https://github.com/lmirosevic.png?size=140'>
128
128
  </a>
129
- <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
129
+ <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
130
130
  </td>
131
131
  </tr>
132
132
  <tr>
133
- <td id='joshua-liebowitz'>
134
- <a href='https://github.com/taquitos'>
135
- <img src='https://github.com/taquitos.png?size=140'>
133
+ <td id='josh-holtz'>
134
+ <a href='https://github.com/joshdholtz'>
135
+ <img src='https://github.com/joshdholtz.png?size=140'>
136
136
  </a>
137
- <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
137
+ <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
138
138
  </td>
139
- <td id='daniel-jankowski'>
140
- <a href='https://github.com/mollyIV'>
141
- <img src='https://github.com/mollyIV.png?size=140'>
139
+ <td id='helmut-januschka'>
140
+ <a href='https://github.com/hjanuschka'>
141
+ <img src='https://github.com/hjanuschka.png?size=140'>
142
142
  </a>
143
- <h4 align='center'><a href='https://twitter.com/mollyIV'>Daniel Jankowski</a></h4>
143
+ <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
144
144
  </td>
145
- <td id='maksym-grebenets'>
146
- <a href='https://github.com/mgrebenets'>
147
- <img src='https://github.com/mgrebenets.png?size=140'>
145
+ <td id='matthew-ellis'>
146
+ <a href='https://github.com/matthewellis'>
147
+ <img src='https://github.com/matthewellis.png?size=140'>
148
148
  </a>
149
- <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
149
+ <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
150
150
  </td>
151
151
  <td id='danielle-tomlinson'>
152
152
  <a href='https://github.com/endocrimes'>
@@ -154,25 +154,25 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
154
154
  </a>
155
155
  <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
156
156
  </td>
157
- <td id='kohki-miki'>
158
- <a href='https://github.com/giginet'>
159
- <img src='https://github.com/giginet.png?size=140'>
157
+ <td id='iulian-onofrei'>
158
+ <a href='https://github.com/revolter'>
159
+ <img src='https://github.com/revolter.png?size=140'>
160
160
  </a>
161
- <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
161
+ <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
162
162
  </td>
163
163
  </tr>
164
164
  <tr>
165
- <td id='felix-krause'>
166
- <a href='https://github.com/KrauseFx'>
167
- <img src='https://github.com/KrauseFx.png?size=140'>
165
+ <td id='manu-wallner'>
166
+ <a href='https://github.com/milch'>
167
+ <img src='https://github.com/milch.png?size=140'>
168
168
  </a>
169
- <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
169
+ <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
170
170
  </td>
171
- <td id='jimmy-dee'>
172
- <a href='https://github.com/jdee'>
173
- <img src='https://github.com/jdee.png?size=140'>
171
+ <td id='jérôme-lacoste'>
172
+ <a href='https://github.com/lacostej'>
173
+ <img src='https://github.com/lacostej.png?size=140'>
174
174
  </a>
175
- <h4 align='center'>Jimmy Dee</h4>
175
+ <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
176
176
  </td>
177
177
  </table>
178
178
 
@@ -12,6 +12,22 @@ module Deliver
12
12
  user ||= ENV["DELIVER_USER"]
13
13
 
14
14
  [
15
+ FastlaneCore::ConfigItem.new(key: :api_key_path,
16
+ env_name: "DELIVER_API_KEY_PATH",
17
+ 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)",
18
+ optional: true,
19
+ conflicting_options: [:username],
20
+ verify_block: proc do |value|
21
+ UI.user_error!("Couldn't find API key JSON file at path '#{value}'") unless File.exist?(value)
22
+ end),
23
+ FastlaneCore::ConfigItem.new(key: :api_key,
24
+ env_name: "DELIVER_API_KEY",
25
+ 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)",
26
+ type: Hash,
27
+ optional: true,
28
+ sensitive: true,
29
+ conflicting_options: [:api_key_path, :username]),
30
+
15
31
  FastlaneCore::ConfigItem.new(key: :username,
16
32
  short_option: "-u",
17
33
  env_name: "DELIVER_USERNAME",
@@ -129,7 +145,7 @@ module Deliver
129
145
  default_value: false),
130
146
  FastlaneCore::ConfigItem.new(key: :skip_app_version_update,
131
147
  env_name: "DELIVER_SKIP_APP_VERSION_UPDATE",
132
- description: "Don't update app version for submission",
148
+ description: "Dont create or update the app version that is being prepared for submission",
133
149
  is_string: false,
134
150
  default_value: false),
135
151
 
@@ -26,11 +26,22 @@ module Deliver
26
26
  end
27
27
 
28
28
  def login
29
- # Team selection passed though FASTLANE_TEAM_ID and FASTLANE_TEAM_NAME environment variables
30
- # Prompts select team if multiple teams and none specified
31
- UI.message("Login to App Store Connect (#{options[:username]})")
32
- Spaceship::ConnectAPI.login(options[:username], nil, use_portal: false, use_tunes: true)
33
- UI.message("Login successful")
29
+ if api_token
30
+ UI.message("Creating authorization token for App Store Connect API")
31
+ Spaceship::ConnectAPI.token = api_token
32
+ else
33
+ # Team selection passed though FASTLANE_TEAM_ID and FASTLANE_TEAM_NAME environment variables
34
+ # Prompts select team if multiple teams and none specified
35
+ UI.message("Login to App Store Connect (#{options[:username]})")
36
+ Spaceship::ConnectAPI.login(options[:username], nil, use_portal: false, use_tunes: true)
37
+ UI.message("Login successful")
38
+ end
39
+ end
40
+
41
+ def api_token
42
+ @api_token ||= Spaceship::ConnectAPI::Token.create(options[:api_key]) if options[:api_key]
43
+ @api_token ||= Spaceship::ConnectAPI::Token.from_json_file(options[:api_key_path]) if options[:api_key_path]
44
+ return @api_token
34
45
  end
35
46
 
36
47
  def run
@@ -67,11 +78,21 @@ module Deliver
67
78
  precheck_options = {
68
79
  default_rule_level: options[:precheck_default_rule_level],
69
80
  include_in_app_purchases: options[:precheck_include_in_app_purchases],
70
- app_identifier: options[:app_identifier],
71
- username: options[:username],
72
- platform: options[:platform]
81
+ app_identifier: options[:app_identifier]
73
82
  }
74
83
 
84
+ if options[:api_key] || options[:api_key_path]
85
+ if options[:precheck_include_in_app_purchases]
86
+ UI.user_error!("Precheck cannot check In-app purchases with the App Store Connect API Key (yet). Exclude In-app purchases from precheck or use Apple ID login")
87
+ end
88
+
89
+ precheck_options[:api_key] = options[:api_key]
90
+ precheck_options[:api_key_path] = options[:api_key_path]
91
+ else
92
+ precheck_options[:username] = options[:username]
93
+ precheck_options[:platform] = options[:platform]
94
+ end
95
+
75
96
  precheck_config = FastlaneCore::Configuration.create(Precheck::Options.available_options, precheck_options)
76
97
  Precheck.config = precheck_config
77
98
 
@@ -175,10 +196,17 @@ module Deliver
175
196
 
176
197
  private
177
198
 
199
+ # If App Store Connect API token, use token.
178
200
  # If itc_provider was explicitly specified, use it.
179
201
  # If there are multiple teams, infer the provider from the selected team name.
180
202
  # If there are fewer than two teams, don't infer the provider.
181
203
  def transporter_for_selected_team
204
+ # Use JWT auth
205
+ unless api_token.nil?
206
+ api_token.refresh! if api_token.expired?
207
+ return FastlaneCore::ItunesTransporter.new(nil, nil, false, nil, api_token.text)
208
+ end
209
+
182
210
  tunes_client = Spaceship::ConnectAPI.client.tunes_client
183
211
 
184
212
  generic_transporter = FastlaneCore::ItunesTransporter.new(options[:username], nil, false, options[:itc_provider])
@@ -96,7 +96,7 @@ module Deliver
96
96
 
97
97
  if v.nil?
98
98
  UI.message("Couldn't find live version, editing the current version on App Store Connect instead")
99
- version = app.get_edit_app_store_version(platform: platform)
99
+ version = fetch_edit_app_store_version(app, platform)
100
100
  # we don't want to update the localised_options and non_localised_options
101
101
  # as we also check for `options[:edit_live]` at other areas in the code
102
102
  # by not touching those 2 variables, deliver is more consistent with what the option says
@@ -105,7 +105,7 @@ module Deliver
105
105
  UI.message("Found live version")
106
106
  end
107
107
  else
108
- version = app.get_edit_app_store_version(platform: platform)
108
+ version = fetch_edit_app_store_version(app, platform)
109
109
  localised_options = (LOCALISED_VERSION_VALUES.keys + LOCALISED_APP_VALUES.keys)
110
110
  non_localised_options = NON_LOCALISED_VERSION_VALUES.keys
111
111
  end
@@ -206,7 +206,7 @@ module Deliver
206
206
  end
207
207
 
208
208
  # Update categories
209
- app_info = app.fetch_edit_app_info
209
+ app_info = fetch_edit_app_info(app)
210
210
  if app_info
211
211
  category_id_map = {}
212
212
 
@@ -414,9 +414,35 @@ module Deliver
414
414
  .uniq
415
415
  end
416
416
 
417
+ def fetch_edit_app_store_version(app, platform, wait_time: 10)
418
+ retry_if_nil("Cannot find edit app store version", wait_time: wait_time) do
419
+ app.get_edit_app_store_version(platform: platform)
420
+ end
421
+ end
422
+
423
+ def fetch_edit_app_info(app, wait_time: 10)
424
+ retry_if_nil("Cannot find edit app info", wait_time: wait_time) do
425
+ app.fetch_edit_app_info
426
+ end
427
+ end
428
+
429
+ def retry_if_nil(message, tries: 5, wait_time: 10)
430
+ loop do
431
+ tries -= 1
432
+
433
+ value = yield
434
+ return value if value
435
+
436
+ UI.message("#{message}... Retrying after #{wait_time} seconds (remaining: #{tries})")
437
+ sleep(wait_time)
438
+
439
+ return nil if tries.zero?
440
+ end
441
+ end
442
+
417
443
  # Finding languages to enable
418
444
  def verify_available_info_languages!(options, app, languages)
419
- app_info = app.fetch_edit_app_info
445
+ app_info = fetch_edit_app_info(app)
420
446
 
421
447
  unless app_info
422
448
  UI.user_error!("Cannot update languages - could not find an editable info")
@@ -451,7 +477,7 @@ module Deliver
451
477
  # Finding languages to enable
452
478
  def verify_available_version_languages!(options, app, languages)
453
479
  platform = Spaceship::ConnectAPI::Platform.map(options[:platform])
454
- version = app.get_edit_app_store_version(platform: platform)
480
+ version = fetch_edit_app_store_version(app, platform)
455
481
 
456
482
  unless version
457
483
  UI.user_error!("Cannot update languages - could not find an editable version for '#{platform}'")
@@ -14,9 +14,14 @@ module Deliver
14
14
  attributes = {}
15
15
  territory_ids = []
16
16
 
17
- app_prices = app.fetch_app_prices
17
+ # As of 2020-09-14:
18
+ # Official App Store Connect does not have an endpoint to get app prices for an app
19
+ # Need to get prices from the app's relationships
20
+ # Prices from app's relationship doess not have price tier so need to fetch app price with price tier relationship
21
+ app_prices = app.prices
18
22
  if app_prices.first
19
- old_price = app_prices.first.price_tier.id
23
+ app_price = Spaceship::ConnectAPI.get_app_price(app_price_id: app_prices.first.id, includes: "priceTier").first
24
+ old_price = app_price.price_tier.id
20
25
  else
21
26
  UI.message("App has no prices yet... Enabling all countries in App Store Connect")
22
27
  territory_ids = Spaceship::ConnectAPI::Territory.all.map(&:id)
@@ -23,6 +23,7 @@ module Fastlane
23
23
 
24
24
  Actions.lane_context[Actions::SharedValues::SIGH_PROFILE_PATHS] = nil
25
25
  Actions.lane_context[Actions::SharedValues::DSYM_PATHS] = nil
26
+ Actions.lane_context[Actions::SharedValues::DSYM_LATEST_UPLOADED_DATE] = nil
26
27
 
27
28
  UI.success('Cleaned up build artifacts 🐙')
28
29
  end
@@ -164,6 +164,7 @@ The `keyword` and `title` parameters are both used in `default` and `data`. They
164
164
  | `color` | The font color for the text. Specify a hex/html color code. | `#000000` (black) |
165
165
  | `font` | The font family for the text. Specify the (relative) path to the font file (e.g. an OpenType Font). | The default `imagemagick` font, which is system dependent. |
166
166
  | `font_size` | The font size for the text specified in points. If not specified or `0`, font will be scaled automatically to fit the available space. _frameit_ still shrinks the text, if it would not fit. | NA |
167
+ | `font_weight` | The [font weight for the text](https://imagemagick.org/script/command-line-options.php#weight). Specify an integer value (e.g. 900). | NA |
167
168
  | `text` | The text that should be used for the `keyword` or `title`. <p> Note: If you want to use localised text, use [`.strings` files](#strings-files). | NA |
168
169
 
169
170
  ### Example
@@ -2,6 +2,7 @@ module Fastlane
2
2
  module Actions
3
3
  module SharedValues
4
4
  DSYM_PATHS = :DSYM_PATHS
5
+ DSYM_LATEST_UPLOADED_DATE = :DSYM_LATEST_UPLOADED_DATE
5
6
  end
6
7
  class DownloadDsymsAction < Action
7
8
  # rubocop:disable Metrics/PerceivedComplexity
@@ -9,6 +10,7 @@ module Fastlane
9
10
  require 'openssl'
10
11
  require 'spaceship'
11
12
  require 'net/http'
13
+ require 'date'
12
14
 
13
15
  # Team selection passed though FASTLANE_ITC_TEAM_ID and FASTLANE_ITC_TEAM_NAME environment variables
14
16
  # Prompts select team if multiple teams and none specified
@@ -30,6 +32,7 @@ module Fastlane
30
32
  wait_for_dsym_processing = params[:wait_for_dsym_processing]
31
33
  wait_timeout = params[:wait_timeout]
32
34
  min_version = Gem::Version.new(params[:min_version]) if params[:min_version]
35
+ after_uploaded_date = DateTime.parse(params[:after_uploaded_date]) unless params[:after_uploaded_date].nil?
33
36
 
34
37
  platform = Spaceship::ConnectAPI::Platform.map(itc_platform)
35
38
 
@@ -81,6 +84,7 @@ module Fastlane
81
84
  builds.each do |build|
82
85
  asc_app_version = build.app_version
83
86
  asc_build_number = build.version
87
+ uploaded_date = DateTime.parse(build.uploaded_date)
84
88
 
85
89
  message = []
86
90
  message << "Found train (version): #{asc_app_version}"
@@ -97,6 +101,11 @@ module Fastlane
97
101
  next
98
102
  end
99
103
 
104
+ if after_uploaded_date && after_uploaded_date >= uploaded_date
105
+ UI.verbose("Upload date #{after_uploaded_date} not reached: #{uploaded_date}")
106
+ next
107
+ end
108
+
100
109
  message = []
101
110
  message << "Found build version: #{asc_build_number}"
102
111
  message << ", comparing to supplied build_number: #{build_number}" if build_number
@@ -108,11 +117,11 @@ module Fastlane
108
117
  end
109
118
 
110
119
  UI.verbose("Build_version: #{asc_build_number} matches #{build_number}, grabbing dsym_url") if build_number
111
- get_details_and_download_dsym(app: app, train: asc_app_version, build_number: asc_build_number, platform: itc_platform, wait_for_dsym_processing: wait_for_dsym_processing, wait_timeout: wait_timeout, output_directory: output_directory)
120
+ 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)
112
121
  end
113
122
  end
114
123
 
115
- def self.get_details_and_download_dsym(app: nil, train: nil, build_number: nil, platform: nil, wait_for_dsym_processing: nil, wait_timeout: nil, output_directory: nil)
124
+ 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)
116
125
  start = Time.now
117
126
  download_url = nil
118
127
 
@@ -144,7 +153,7 @@ module Fastlane
144
153
  end
145
154
 
146
155
  if download_url
147
- self.download(download_url, app.bundle_id, train, build_number, output_directory)
156
+ self.download(download_url, app.bundle_id, train, build_number, uploaded_date, output_directory)
148
157
  return if build_number
149
158
  else
150
159
  UI.message("No dSYM URL for #{build_number} (#{train})")
@@ -165,13 +174,20 @@ module Fastlane
165
174
  return latest_build
166
175
  end
167
176
 
168
- def self.download(download_url, bundle_id, train_number, build_version, output_directory)
177
+ def self.download(download_url, bundle_id, train_number, build_version, uploaded_date, output_directory)
169
178
  result = self.download_file(download_url)
170
179
  path = write_dsym(result, bundle_id, train_number, build_version, output_directory)
171
180
  UI.success("🔑 Successfully downloaded dSYM file for #{train_number} - #{build_version} to '#{path}'")
172
181
 
173
182
  Actions.lane_context[SharedValues::DSYM_PATHS] ||= []
174
183
  Actions.lane_context[SharedValues::DSYM_PATHS] << File.expand_path(path)
184
+
185
+ unless uploaded_date.nil?
186
+ Actions.lane_context[SharedValues::DSYM_LATEST_UPLOADED_DATE] ||= uploaded_date
187
+ current_latest = Actions.lane_context[SharedValues::DSYM_LATEST_UPLOADED_DATE]
188
+ Actions.lane_context[SharedValues::DSYM_LATEST_UPLOADED_DATE] = [current_latest, uploaded_date].max
189
+ UI.verbose("Most recent build uploaded_date #{Actions.lane_context[SharedValues::DSYM_LATEST_UPLOADED_DATE]}")
190
+ end
175
191
  end
176
192
 
177
193
  def self.write_dsym(data, bundle_id, train_number, build_number, output_directory)
@@ -286,6 +302,12 @@ module Fastlane
286
302
  env_name: "DOWNLOAD_DSYMS_MIN_VERSION",
287
303
  description: "The minimum app version for dSYMs you wish to download",
288
304
  optional: true),
305
+ FastlaneCore::ConfigItem.new(key: :after_uploaded_date,
306
+ short_option: "-d",
307
+ env_name: "DOWNLOAD_DSYMS_AFTER_UPLOADED_DATE",
308
+ description: "The uploaded date after which you wish to download dSYMs",
309
+ optional: true,
310
+ is_string: true),
289
311
  FastlaneCore::ConfigItem.new(key: :output_directory,
290
312
  short_option: "-s",
291
313
  env_name: "DOWNLOAD_DSYMS_OUTPUT_DIRECTORY",
@@ -310,7 +332,8 @@ module Fastlane
310
332
 
311
333
  def self.output
312
334
  [
313
- ['DSYM_PATHS', 'An array to all the zipped dSYM files']
335
+ ['DSYM_PATHS', 'An array to all the zipped dSYM files'],
336
+ ['DSYM_LATEST_UPLOADED_DATE', 'Date of the most recent uploaded time of successfully downloaded dSYM files']
314
337
  ]
315
338
  end
316
339
 
@@ -332,7 +355,8 @@ module Fastlane
332
355
  'download_dsyms(version: "1.0.0", build_number: "345")',
333
356
  'download_dsyms(version: "1.0.1", build_number: 42)',
334
357
  'download_dsyms(version: "live")',
335
- 'download_dsyms(min_version: "1.2.3")'
358
+ 'download_dsyms(min_version: "1.2.3")',
359
+ 'download_dsyms(after_uploaded_date: "2020-09-11T19:00:00+01:00")'
336
360
  ]
337
361
  end
338
362