fastlane 2.156.1 → 2.157.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +82 -82
- data/deliver/lib/deliver.rb +1 -0
- data/deliver/lib/deliver/app_screenshot_iterator.rb +26 -29
- data/deliver/lib/deliver/detect_values.rb +4 -1
- data/deliver/lib/deliver/languages.rb +7 -0
- data/deliver/lib/deliver/loader.rb +4 -5
- data/deliver/lib/deliver/runner.rb +8 -5
- data/deliver/lib/deliver/upload_screenshots.rb +34 -17
- data/fastlane/lib/fastlane/actions/{.git_commit.rb.swp → .ensure_git_status_clean.rb.swp} +0 -0
- data/fastlane/lib/fastlane/actions/.hockey.rb.swp +0 -0
- data/fastlane/lib/fastlane/actions/.slack.rb.swp +0 -0
- data/fastlane/lib/fastlane/actions/.update_project_provisioning.rb.swp +0 -0
- data/fastlane/lib/fastlane/actions/app_store_build_number.rb +12 -8
- data/fastlane/lib/fastlane/actions/app_store_connect_api_key.rb +120 -0
- data/fastlane/lib/fastlane/actions/commit_version_bump.rb +1 -1
- data/fastlane/lib/fastlane/actions/docs/upload_to_play_store.md +2 -0
- data/fastlane/lib/fastlane/actions/docs/upload_to_testflight.md +17 -1
- data/fastlane/lib/fastlane/actions/download_dsyms.rb +89 -68
- data/fastlane/lib/fastlane/actions/set_changelog.rb +3 -2
- data/fastlane/lib/fastlane/actions/sonar.rb +5 -0
- data/fastlane/lib/fastlane/actions/spaceship_stats.rb +73 -0
- data/fastlane/lib/fastlane/actions/upload_to_testflight.rb +4 -0
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/fastlane/swift/Deliverfile.swift +1 -1
- data/fastlane/swift/DeliverfileProtocol.swift +1 -1
- data/fastlane/swift/Fastlane.swift +78 -18
- data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/xcuserdata/josh.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- data/fastlane/swift/Gymfile.swift +1 -1
- data/fastlane/swift/GymfileProtocol.swift +1 -1
- data/fastlane/swift/Matchfile.swift +1 -1
- data/fastlane/swift/MatchfileProtocol.swift +1 -1
- data/fastlane/swift/Precheckfile.swift +1 -1
- data/fastlane/swift/PrecheckfileProtocol.swift +1 -1
- data/fastlane/swift/Scanfile.swift +1 -1
- data/fastlane/swift/ScanfileProtocol.swift +1 -1
- data/fastlane/swift/Screengrabfile.swift +1 -1
- data/fastlane/swift/ScreengrabfileProtocol.swift +1 -1
- data/fastlane/swift/Snapshotfile.swift +1 -1
- data/fastlane/swift/SnapshotfileProtocol.swift +1 -1
- data/fastlane_core/lib/fastlane_core/command_executor.rb +1 -0
- data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +71 -42
- data/gym/lib/gym/error_handler.rb +1 -1
- data/match/lib/match/spaceship_ensure.rb +5 -5
- data/{fastlane/lib/fastlane/.erb_template_helper.rb.swp → pilot/lib/pilot/.manager.rb.swp} +0 -0
- data/pilot/lib/pilot/build_manager.rb +15 -4
- data/pilot/lib/pilot/manager.rb +15 -5
- data/pilot/lib/pilot/options.rb +16 -0
- data/produce/lib/produce/itunes_connect.rb +3 -2
- data/screengrab/lib/screengrab/runner.rb +29 -10
- data/sigh/lib/assets/resign.sh +9 -6
- data/sigh/lib/sigh/runner.rb +5 -4
- data/spaceship/lib/spaceship.rb +4 -0
- data/spaceship/lib/spaceship/client.rb +3 -0
- data/spaceship/lib/spaceship/connect_api.rb +1 -15
- data/spaceship/lib/spaceship/{.DS_Store → connect_api/.DS_Store} +0 -0
- data/spaceship/lib/spaceship/connect_api/api_client.rb +270 -0
- data/spaceship/lib/spaceship/connect_api/client.rb +155 -210
- data/spaceship/lib/spaceship/connect_api/file_uploader.rb +2 -0
- data/spaceship/lib/spaceship/connect_api/models/app.rb +5 -5
- data/spaceship/lib/spaceship/connect_api/models/app_price_point.rb +26 -0
- data/spaceship/lib/spaceship/connect_api/models/app_store_version.rb +7 -1
- data/spaceship/lib/spaceship/connect_api/provisioning/client.rb +8 -17
- data/spaceship/lib/spaceship/connect_api/provisioning/provisioning.rb +75 -64
- data/spaceship/lib/spaceship/connect_api/spaceship.rb +98 -0
- data/spaceship/lib/spaceship/connect_api/testflight/client.rb +8 -17
- data/spaceship/lib/spaceship/connect_api/testflight/testflight.rb +288 -277
- data/spaceship/lib/spaceship/connect_api/token.rb +46 -5
- data/spaceship/lib/spaceship/connect_api/token_refresh_middleware.rb +24 -0
- data/spaceship/lib/spaceship/connect_api/tunes/client.rb +8 -17
- data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +725 -706
- data/spaceship/lib/spaceship/connect_api/users/client.rb +8 -17
- data/spaceship/lib/spaceship/connect_api/users/users.rb +28 -17
- data/spaceship/lib/spaceship/stats_middleware.rb +65 -0
- metadata +33 -22
- data/spaceship/lib/spaceship/connect_api/.client.rb.swp +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 724ffba6ca23aa124bf2c5493e9bb4eda084ce2361eb9c1ee2db3eb04c3a25cc
|
4
|
+
data.tar.gz: 51d3469c018497d533e66922626264fe6b561b71ec30351a1c578e500ed2b7fa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e4f3bd7df2c383ae03f2550a9a7847e2913d3d6a048ad7efa14e4bf145156da2590b5c75c12eb303d14e6aaa838be7cadf8f6986b76d3121c2fdaacd7a0c2104
|
7
|
+
data.tar.gz: '0853ba7ad4d7725e0c1ab9f89e733e1ec361dee2abdbc835aace640216d7d0f3796afafd8e852f8b5a2d8cdae9d5347c064946c3eccfd9242065455602558796'
|
data/README.md
CHANGED
@@ -34,29 +34,43 @@ 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='matthew-ellis'>
|
38
|
+
<a href='https://github.com/matthewellis'>
|
39
|
+
<img src='https://github.com/matthewellis.png?size=140'>
|
40
|
+
</a>
|
41
|
+
<h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
|
42
|
+
</td>
|
37
43
|
<td id='jorge-revuelta-h'>
|
38
44
|
<a href='https://github.com/minuscorp'>
|
39
45
|
<img src='https://github.com/minuscorp.png?size=140'>
|
40
46
|
</a>
|
41
47
|
<h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
|
42
48
|
</td>
|
43
|
-
<td id='
|
44
|
-
<a href='https://github.com/
|
45
|
-
<img src='https://github.com/
|
49
|
+
<td id='jan-piotrowski'>
|
50
|
+
<a href='https://github.com/janpio'>
|
51
|
+
<img src='https://github.com/janpio.png?size=140'>
|
46
52
|
</a>
|
47
|
-
<h4 align='center'><a href='https://twitter.com/
|
53
|
+
<h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
|
48
54
|
</td>
|
49
|
-
<td id='
|
50
|
-
<a href='https://github.com/
|
51
|
-
<img src='https://github.com/
|
55
|
+
<td id='jérôme-lacoste'>
|
56
|
+
<a href='https://github.com/lacostej'>
|
57
|
+
<img src='https://github.com/lacostej.png?size=140'>
|
52
58
|
</a>
|
53
|
-
<h4 align='center'><a href='https://twitter.com/
|
59
|
+
<h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
|
54
60
|
</td>
|
55
|
-
<td id='
|
56
|
-
<a href='https://github.com/
|
57
|
-
<img src='https://github.com/
|
61
|
+
<td id='olivier-halligon'>
|
62
|
+
<a href='https://github.com/AliSoftware'>
|
63
|
+
<img src='https://github.com/AliSoftware.png?size=140'>
|
58
64
|
</a>
|
59
|
-
<h4 align='center'><a href='https://twitter.com/
|
65
|
+
<h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
|
66
|
+
</td>
|
67
|
+
</tr>
|
68
|
+
<tr>
|
69
|
+
<td id='aaron-brager'>
|
70
|
+
<a href='https://github.com/getaaron'>
|
71
|
+
<img src='https://github.com/getaaron.png?size=140'>
|
72
|
+
</a>
|
73
|
+
<h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
|
60
74
|
</td>
|
61
75
|
<td id='fumiya-nakamura'>
|
62
76
|
<a href='https://github.com/nafu'>
|
@@ -64,6 +78,24 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
|
|
64
78
|
</a>
|
65
79
|
<h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
|
66
80
|
</td>
|
81
|
+
<td id='joshua-liebowitz'>
|
82
|
+
<a href='https://github.com/taquitos'>
|
83
|
+
<img src='https://github.com/taquitos.png?size=140'>
|
84
|
+
</a>
|
85
|
+
<h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
|
86
|
+
</td>
|
87
|
+
<td id='helmut-januschka'>
|
88
|
+
<a href='https://github.com/hjanuschka'>
|
89
|
+
<img src='https://github.com/hjanuschka.png?size=140'>
|
90
|
+
</a>
|
91
|
+
<h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
|
92
|
+
</td>
|
93
|
+
<td id='luka-mirosevic'>
|
94
|
+
<a href='https://github.com/lmirosevic'>
|
95
|
+
<img src='https://github.com/lmirosevic.png?size=140'>
|
96
|
+
</a>
|
97
|
+
<h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
|
98
|
+
</td>
|
67
99
|
</tr>
|
68
100
|
<tr>
|
69
101
|
<td id='max-ott'>
|
@@ -72,69 +104,49 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
|
|
72
104
|
</a>
|
73
105
|
<h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
|
74
106
|
</td>
|
75
|
-
<td id='
|
76
|
-
<a href='https://github.com/
|
77
|
-
<img src='https://github.com/
|
78
|
-
</a>
|
79
|
-
<h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
|
80
|
-
</td>
|
81
|
-
<td id='jérôme-lacoste'>
|
82
|
-
<a href='https://github.com/lacostej'>
|
83
|
-
<img src='https://github.com/lacostej.png?size=140'>
|
84
|
-
</a>
|
85
|
-
<h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
|
86
|
-
</td>
|
87
|
-
<td id='joshua-liebowitz'>
|
88
|
-
<a href='https://github.com/taquitos'>
|
89
|
-
<img src='https://github.com/taquitos.png?size=140'>
|
107
|
+
<td id='josh-holtz'>
|
108
|
+
<a href='https://github.com/joshdholtz'>
|
109
|
+
<img src='https://github.com/joshdholtz.png?size=140'>
|
90
110
|
</a>
|
91
|
-
<h4 align='center'><a href='https://twitter.com/
|
111
|
+
<h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
|
92
112
|
</td>
|
93
|
-
<td id='
|
94
|
-
<a href='https://github.com/
|
95
|
-
<img src='https://github.com/
|
113
|
+
<td id='maksym-grebenets'>
|
114
|
+
<a href='https://github.com/mgrebenets'>
|
115
|
+
<img src='https://github.com/mgrebenets.png?size=140'>
|
96
116
|
</a>
|
97
|
-
<h4 align='center'><a href='https://twitter.com/
|
117
|
+
<h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
|
98
118
|
</td>
|
99
|
-
</tr>
|
100
|
-
<tr>
|
101
119
|
<td id='jimmy-dee'>
|
102
120
|
<a href='https://github.com/jdee'>
|
103
121
|
<img src='https://github.com/jdee.png?size=140'>
|
104
122
|
</a>
|
105
123
|
<h4 align='center'>Jimmy Dee</h4>
|
106
124
|
</td>
|
107
|
-
<td id='
|
108
|
-
<a href='https://github.com/
|
109
|
-
<img src='https://github.com/
|
110
|
-
</a>
|
111
|
-
<h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
|
112
|
-
</td>
|
113
|
-
<td id='kohki-miki'>
|
114
|
-
<a href='https://github.com/giginet'>
|
115
|
-
<img src='https://github.com/giginet.png?size=140'>
|
125
|
+
<td id='manu-wallner'>
|
126
|
+
<a href='https://github.com/milch'>
|
127
|
+
<img src='https://github.com/milch.png?size=140'>
|
116
128
|
</a>
|
117
|
-
<h4 align='center'><a href='https://twitter.com/
|
129
|
+
<h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
|
118
130
|
</td>
|
119
|
-
|
120
|
-
<
|
121
|
-
<
|
131
|
+
</tr>
|
132
|
+
<tr>
|
133
|
+
<td id='felix-krause'>
|
134
|
+
<a href='https://github.com/KrauseFx'>
|
135
|
+
<img src='https://github.com/KrauseFx.png?size=140'>
|
122
136
|
</a>
|
123
|
-
<h4 align='center'><a href='https://twitter.com/
|
137
|
+
<h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
|
124
138
|
</td>
|
125
|
-
<td id='
|
126
|
-
<a href='https://github.com/
|
127
|
-
<img src='https://github.com/
|
139
|
+
<td id='danielle-tomlinson'>
|
140
|
+
<a href='https://github.com/endocrimes'>
|
141
|
+
<img src='https://github.com/endocrimes.png?size=140'>
|
128
142
|
</a>
|
129
|
-
<h4 align='center'><a href='https://twitter.com/
|
143
|
+
<h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
|
130
144
|
</td>
|
131
|
-
|
132
|
-
<
|
133
|
-
<
|
134
|
-
<a href='https://github.com/hjanuschka'>
|
135
|
-
<img src='https://github.com/hjanuschka.png?size=140'>
|
145
|
+
<td id='iulian-onofrei'>
|
146
|
+
<a href='https://github.com/revolter'>
|
147
|
+
<img src='https://github.com/revolter.png?size=140'>
|
136
148
|
</a>
|
137
|
-
<h4 align='center'><a href='https://twitter.com/
|
149
|
+
<h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
|
138
150
|
</td>
|
139
151
|
<td id='daniel-jankowski'>
|
140
152
|
<a href='https://github.com/mollyIV'>
|
@@ -142,37 +154,25 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
|
|
142
154
|
</a>
|
143
155
|
<h4 align='center'><a href='https://twitter.com/mollyIV'>Daniel Jankowski</a></h4>
|
144
156
|
</td>
|
145
|
-
<td id='
|
146
|
-
<a href='https://github.com/
|
147
|
-
<img src='https://github.com/
|
148
|
-
</a>
|
149
|
-
<h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
|
150
|
-
</td>
|
151
|
-
<td id='aaron-brager'>
|
152
|
-
<a href='https://github.com/getaaron'>
|
153
|
-
<img src='https://github.com/getaaron.png?size=140'>
|
154
|
-
</a>
|
155
|
-
<h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
|
156
|
-
</td>
|
157
|
-
<td id='matthew-ellis'>
|
158
|
-
<a href='https://github.com/matthewellis'>
|
159
|
-
<img src='https://github.com/matthewellis.png?size=140'>
|
157
|
+
<td id='stefan-natchev'>
|
158
|
+
<a href='https://github.com/snatchev'>
|
159
|
+
<img src='https://github.com/snatchev.png?size=140'>
|
160
160
|
</a>
|
161
|
-
<h4 align='center'><a href='https://twitter.com/
|
161
|
+
<h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
|
162
162
|
</td>
|
163
163
|
</tr>
|
164
164
|
<tr>
|
165
|
-
<td id='
|
166
|
-
<a href='https://github.com/
|
167
|
-
<img src='https://github.com/
|
165
|
+
<td id='andrew-mcburney'>
|
166
|
+
<a href='https://github.com/armcburney'>
|
167
|
+
<img src='https://github.com/armcburney.png?size=140'>
|
168
168
|
</a>
|
169
|
-
<h4 align='center'><a href='https://twitter.com/
|
169
|
+
<h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
|
170
170
|
</td>
|
171
|
-
<td id='
|
172
|
-
<a href='https://github.com/
|
173
|
-
<img src='https://github.com/
|
171
|
+
<td id='kohki-miki'>
|
172
|
+
<a href='https://github.com/giginet'>
|
173
|
+
<img src='https://github.com/giginet.png?size=140'>
|
174
174
|
</a>
|
175
|
-
<h4 align='center'><a href='https://twitter.com/
|
175
|
+
<h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
|
176
176
|
</td>
|
177
177
|
</table>
|
178
178
|
|
data/deliver/lib/deliver.rb
CHANGED
@@ -13,14 +13,14 @@ module Deliver
|
|
13
13
|
# @yield [localization, app_screenshot_set]
|
14
14
|
# @yieldparam [optional, Spaceship::ConnectAPI::AppStoreVersionLocalization] localization
|
15
15
|
# @yieldparam [optional, Spaceship::ConnectAPI::AppStoreScreenshotSet] app_screenshot_set
|
16
|
-
def each_app_screenshot_set(&block)
|
17
|
-
return enum_for(__method__) unless block_given?
|
16
|
+
def each_app_screenshot_set(localizations = @localizations, &block)
|
17
|
+
return enum_for(__method__, localizations) unless block_given?
|
18
18
|
|
19
19
|
# Collect app_screenshot_sets from localizations in parallel but
|
20
20
|
# limit the number of threads working at a time with using `lazy` and `force` controls
|
21
21
|
# to not attack App Store Connect
|
22
|
-
results =
|
23
|
-
|
22
|
+
results = localizations.each_slice(NUMBER_OF_THREADS).lazy.map do |localizations_grouped|
|
23
|
+
localizations_grouped.map do |localization|
|
24
24
|
Thread.new do
|
25
25
|
[localization, localization.get_app_screenshot_sets]
|
26
26
|
end
|
@@ -63,35 +63,32 @@ module Deliver
|
|
63
63
|
def each_local_screenshot(screenshots_per_language, &block)
|
64
64
|
return enum_for(__method__, screenshots_per_language) unless block_given?
|
65
65
|
|
66
|
-
#
|
67
|
-
|
68
|
-
screenshots_per_language.map do |language, screenshots_for_language|
|
69
|
-
localization = @localizations.find { |l| l.locale == language }
|
70
|
-
[localization, screenshots_for_language]
|
71
|
-
end.reject do |localization, _|
|
72
|
-
localization.nil?
|
73
|
-
end.each do |localization, screenshots_for_language|
|
74
|
-
iterate_over_screenshots_per_language(localization, screenshots_for_language, &block)
|
75
|
-
end
|
76
|
-
end
|
66
|
+
# filter unnecessary localizations
|
67
|
+
supported_localizations = @localizations.reject { |l| screenshots_per_language[l.locale].nil? }
|
77
68
|
|
78
|
-
|
69
|
+
# build a hash that can access app_screenshot_set corresponding to given locale and display_type
|
70
|
+
# via parallelized each_app_screenshot_set to gain performance
|
71
|
+
app_screenshot_set_per_locale_and_display_type = each_app_screenshot_set(supported_localizations)
|
72
|
+
.each_with_object({}) do |(localization, app_screenshot_set), hash|
|
73
|
+
hash[localization.locale] ||= {}
|
74
|
+
hash[localization.locale][app_screenshot_set.screenshot_display_type] = app_screenshot_set
|
75
|
+
end
|
79
76
|
|
80
|
-
|
81
|
-
|
82
|
-
|
77
|
+
# iterate over screenshots per localization
|
78
|
+
screenshots_per_language.each do |language, screenshots_for_language|
|
79
|
+
localization = supported_localizations.find { |l| l.locale == language }
|
80
|
+
screenshots_per_display_type = screenshots_for_language.reject { |screenshot| screenshot.device_type.nil? }.group_by(&:device_type)
|
83
81
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
iterate_over_screenshots_per_display_type(localization, app_screenshot_set, screenshots, &block)
|
89
|
-
end
|
90
|
-
end
|
82
|
+
screenshots_per_display_type.each do |display_type, screenshots|
|
83
|
+
# create AppScreenshotSet for given display_type if it doesn't exsit
|
84
|
+
app_screenshot_set = (app_screenshot_set_per_locale_and_display_type[language] || {})[display_type]
|
85
|
+
app_screenshot_set ||= localization.create_app_screenshot_set(attributes: { screenshotDisplayType: display_type })
|
91
86
|
|
92
|
-
|
93
|
-
|
94
|
-
|
87
|
+
# iterate over screenshots per display size with index
|
88
|
+
screenshots.each.with_index do |screenshot, index|
|
89
|
+
yield(localization, app_screenshot_set, screenshot, index)
|
90
|
+
end
|
91
|
+
end
|
95
92
|
end
|
96
93
|
end
|
97
94
|
end
|
@@ -5,6 +5,7 @@ require 'spaceship/tunes/tunes'
|
|
5
5
|
require 'spaceship/tunes/application'
|
6
6
|
|
7
7
|
require_relative 'module'
|
8
|
+
require_relative 'languages'
|
8
9
|
|
9
10
|
module Deliver
|
10
11
|
class DetectValues
|
@@ -88,7 +89,9 @@ module Deliver
|
|
88
89
|
languages = options[:languages]
|
89
90
|
return unless languages
|
90
91
|
|
91
|
-
|
92
|
+
# 2020-08-24 - Available locales are not available as an endpoint in App Store Connect
|
93
|
+
# Update with Spaceship::Tunes.client.available_languages.sort (as long as endpoint is avilable)
|
94
|
+
all_languages = Deliver::Languages::ALL_LANGUAGES
|
92
95
|
diff = languages - all_languages
|
93
96
|
|
94
97
|
unless diff.empty?
|
@@ -0,0 +1,7 @@
|
|
1
|
+
module Deliver
|
2
|
+
module Languages
|
3
|
+
# 2020-08-24 - Available locales are not available as an endpoint in App Store Connect
|
4
|
+
# Update with Spaceship::Tunes.client.available_languages.sort (as long as endpoint is avilable)
|
5
|
+
ALL_LANGUAGES = ["ar-SA", "ca", "cs", "da", "de-DE", "el", "en-AU", "en-CA", "en-GB", "en-US", "es-ES", "es-MX", "fi", "fr-CA", "fr-FR", "he", "hi", "hr", "hu", "id", "it", "ja", "ko", "ms", "nl-NL", "no", "pl", "pt-BR", "pt-PT", "ro", "ru", "sk", "sv", "th", "tr", "uk", "vi", "zh-Hans", "zh-Hant"]
|
6
|
+
end
|
7
|
+
end
|
@@ -3,6 +3,7 @@ require 'spaceship/tunes/tunes'
|
|
3
3
|
|
4
4
|
require_relative 'module'
|
5
5
|
require_relative 'upload_metadata'
|
6
|
+
require_relative 'languages'
|
6
7
|
|
7
8
|
module Deliver
|
8
9
|
module Loader
|
@@ -24,11 +25,9 @@ module Deliver
|
|
24
25
|
def self.language_folders(root, ignore_validation)
|
25
26
|
folders = Dir.glob(File.join(root, '*'))
|
26
27
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
available_languages = Spaceship::Tunes.client.available_languages.sort
|
31
|
-
end
|
28
|
+
# 2020-08-24 - Available locales are not available as an endpoint in App Store Connect
|
29
|
+
# Update with Spaceship::Tunes.client.available_languages.sort (as long as endpoint is avilable)
|
30
|
+
available_languages = Deliver::Languages::ALL_LANGUAGES
|
32
31
|
|
33
32
|
allowed_directory_names_with_case = (available_languages + SPECIAL_DIR_NAMES)
|
34
33
|
allowed_directory_names = allowed_directory_names_with_case.map(&:downcase).freeze
|
@@ -26,9 +26,10 @@ 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
|
29
31
|
UI.message("Login to App Store Connect (#{options[:username]})")
|
30
|
-
Spaceship::
|
31
|
-
Spaceship::Tunes.select_team
|
32
|
+
Spaceship::ConnectAPI.login(options[:username], nil, use_portal: false, use_tunes: true)
|
32
33
|
UI.message("Login successful")
|
33
34
|
end
|
34
35
|
|
@@ -177,17 +178,19 @@ module Deliver
|
|
177
178
|
# If there are multiple teams, infer the provider from the selected team name.
|
178
179
|
# If there are fewer than two teams, don't infer the provider.
|
179
180
|
def transporter_for_selected_team
|
181
|
+
tunes_client = Spaceship::ConnectAPI.client.tunes_client
|
182
|
+
|
180
183
|
generic_transporter = FastlaneCore::ItunesTransporter.new(options[:username], nil, false, options[:itc_provider])
|
181
|
-
return generic_transporter unless options[:itc_provider].nil? &&
|
184
|
+
return generic_transporter unless options[:itc_provider].nil? && tunes_client.teams.count > 1
|
182
185
|
|
183
186
|
begin
|
184
|
-
team =
|
187
|
+
team = tunes_client.teams.find { |t| t['contentProvider']['contentProviderId'].to_s == tunes_client.team_id }
|
185
188
|
name = team['contentProvider']['name']
|
186
189
|
provider_id = generic_transporter.provider_ids[name]
|
187
190
|
UI.verbose("Inferred provider id #{provider_id} for team #{name}.")
|
188
191
|
return FastlaneCore::ItunesTransporter.new(options[:username], nil, false, provider_id)
|
189
192
|
rescue => ex
|
190
|
-
UI.verbose("Couldn't infer a provider short name for team with id #{
|
193
|
+
UI.verbose("Couldn't infer a provider short name for team with id #{tunes_client.team_id} automatically: #{ex}. Proceeding without provider short name.")
|
191
194
|
return generic_transporter
|
192
195
|
end
|
193
196
|
end
|
@@ -179,21 +179,40 @@ module Deliver
|
|
179
179
|
# Verify all screenshots states on App Store Connect are okay
|
180
180
|
def retry_upload_screenshots_if_needed(iterator, states, number_of_screenshots, tries, localizations, screenshots_per_language)
|
181
181
|
is_failure = states.fetch("FAILED", 0) > 0
|
182
|
-
is_missing_screenshot =
|
182
|
+
is_missing_screenshot = !screenshots_per_language.empty? && !verify_local_screenshots_are_uploaded(iterator, screenshots_per_language)
|
183
|
+
return unless is_failure || is_missing_screenshot
|
183
184
|
|
184
|
-
if
|
185
|
-
|
186
|
-
|
187
|
-
UI.user_error!("Failed verification of all screenshots uploaded... #{incomplete_screenshot_count} incomplete screenshot(s) still exist")
|
188
|
-
else
|
189
|
-
UI.error("Failed to upload all screenshots... Tries remaining: #{tries}")
|
190
|
-
# Delete bad entries before retry
|
191
|
-
iterator.each_app_screenshot do |_, _, app_screenshot|
|
192
|
-
app_screenshot.delete! unless app_screenshot.complete?
|
193
|
-
end
|
194
|
-
upload_screenshots(localizations, screenshots_per_language, tries: tries)
|
185
|
+
if tries.zero?
|
186
|
+
iterator.each_app_screenshot.select { |_, _, app_screenshot| app_screenshot.error? }.each do |localization, _, app_screenshot|
|
187
|
+
UI.error("#{app_screenshot.file_name} for #{localization.locale} has error(s) - #{app_screenshot.error_messages.join(', ')}")
|
195
188
|
end
|
189
|
+
incomplete_screenshot_count = states.reject { |k, v| k == 'COMPLETE' }.reduce(0) { |sum, (k, v)| sum + v }
|
190
|
+
UI.user_error!("Failed verification of all screenshots uploaded... #{incomplete_screenshot_count} incomplete screenshot(s) still exist")
|
191
|
+
else
|
192
|
+
UI.error("Failed to upload all screenshots... Tries remaining: #{tries}")
|
193
|
+
# Delete bad entries before retry
|
194
|
+
iterator.each_app_screenshot do |_, _, app_screenshot|
|
195
|
+
app_screenshot.delete! unless app_screenshot.complete?
|
196
|
+
end
|
197
|
+
upload_screenshots(localizations, screenshots_per_language, tries: tries)
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
# Return `true` if all the local screenshots are uploaded to App Store Connect
|
202
|
+
def verify_local_screenshots_are_uploaded(iterator, screenshots_per_language)
|
203
|
+
# Check if local screenshots' checksum exist on App Store Connect
|
204
|
+
checksum_to_app_screenshot = iterator.each_app_screenshot.map { |_, _, app_screenshot| [app_screenshot.source_file_checksum, app_screenshot] }.to_h
|
205
|
+
|
206
|
+
missing_local_screenshots = iterator.each_local_screenshot(screenshots_per_language).select do |_, _, local_screenshot, index|
|
207
|
+
checksum = UploadScreenshots.calculate_checksum(local_screenshot.path)
|
208
|
+
checksum_to_app_screenshot[checksum].nil? && index < 10 # if index is more than 10, it's skipped
|
209
|
+
end
|
210
|
+
|
211
|
+
missing_local_screenshots.each do |_, _, screenshot, _|
|
212
|
+
UI.error("#{screenshot.path} is missing on App Store Connect.")
|
196
213
|
end
|
214
|
+
|
215
|
+
missing_local_screenshots.empty?
|
197
216
|
end
|
198
217
|
|
199
218
|
def sort_screenshots(localizations)
|
@@ -285,11 +304,9 @@ module Deliver
|
|
285
304
|
|
286
305
|
# helper method so Spaceship::Tunes.client.available_languages is easier to test
|
287
306
|
def self.available_languages
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
Spaceship::Tunes.client.available_languages
|
292
|
-
end
|
307
|
+
# 2020-08-24 - Available locales are not available as an endpoint in App Store Connect
|
308
|
+
# Update with Spaceship::Tunes.client.available_languages.sort (as long as endpoint is avilable)
|
309
|
+
Deliver::Languages::ALL_LANGUAGES
|
293
310
|
end
|
294
311
|
|
295
312
|
# helper method to mock this step in tests
|