fastlane 2.159.0 → 2.160.0

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