fastlane 2.170.0 → 2.171.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +74 -74
- data/deliver/lib/deliver/app_screenshot.rb +5 -7
- data/deliver/lib/deliver/app_screenshot_validator.rb +108 -0
- data/deliver/lib/deliver/loader.rb +13 -29
- data/deliver/lib/deliver/upload_metadata.rb +2 -0
- data/{spaceship/lib/spaceship/connect_api/models/.app_data_usage_data_protection.rb.swp → fastlane/lib/fastlane/actions/.github_api.rb.swp} +0 -0
- data/fastlane/lib/fastlane/actions/.set_github_release.rb.swp +0 -0
- data/fastlane/lib/fastlane/actions/add_git_tag.rb +12 -3
- data/fastlane/lib/fastlane/actions/docs/upload_to_testflight.md +5 -1
- data/fastlane/lib/fastlane/actions/download_app_privacy_details_from_app_store.rb +142 -0
- data/fastlane/lib/fastlane/actions/git_commit.rb +3 -3
- data/fastlane/lib/fastlane/actions/github_api.rb +14 -3
- data/fastlane/lib/fastlane/actions/nexus_upload.rb +1 -0
- data/fastlane/lib/fastlane/actions/pod_push.rb +9 -0
- data/fastlane/lib/fastlane/actions/push_to_git_remote.rb +9 -1
- data/fastlane/lib/fastlane/actions/set_github_release.rb +21 -8
- data/fastlane/lib/fastlane/actions/slack.rb +4 -5
- data/fastlane/lib/fastlane/actions/spm.rb +2 -2
- data/fastlane/lib/fastlane/actions/upload_app_privacy_details_to_app_store.rb +4 -2
- 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 +66 -13
- 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 +5 -1
- data/fastlane/swift/Scanfile.swift +1 -1
- data/fastlane/swift/ScanfileProtocol.swift +5 -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 +2 -2
- data/fastlane_core/lib/fastlane_core/helper.rb +1 -1
- data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +3 -4
- data/match/lib/match/encryption/openssl.rb +4 -2
- data/match/lib/match/storage/git_storage.rb +14 -10
- data/precheck/lib/precheck/options.rb +6 -1
- data/precheck/lib/precheck/rule_processor.rb +1 -1
- data/precheck/lib/precheck/runner.rb +1 -1
- data/scan/lib/scan/options.rb +5 -0
- data/scan/lib/scan/slack_poster.rb +1 -0
- data/screengrab/lib/screengrab/runner.rb +2 -0
- data/sigh/lib/sigh/runner.rb +1 -1
- data/snapshot/lib/snapshot/options.rb +1 -1
- data/spaceship/lib/spaceship/connect_api/api_client.rb +1 -1
- data/spaceship/lib/spaceship/connect_api/models/app.rb +6 -0
- data/spaceship/lib/spaceship/connect_api/models/app_store_version.rb +5 -1
- data/spaceship/lib/spaceship/connect_api/response.rb +3 -1
- metadata +21 -18
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b9c960e8f4391fa08e3b301c5f7718c118ee0031fb399e2582febb9b8b9860f8
|
|
4
|
+
data.tar.gz: 418236b3a2ab2b68f22e33858a5edf71af122e50e69b24824dd2186fa5a1db8f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d50a705046c0a22b2ab825556ca0fb22ed4b550e91eb44aaca92fcbf007fefd163dd8a7ee1dd91100db22caaf1a35f2e9af81b043bc074e58bfe195349dbdb9f
|
|
7
|
+
data.tar.gz: 65fd003a7c37db205744c3120b034b0de0339ed02db507a2f8346b0979d1aff0f980df152a7cf8d430ca5ce9baa4efe32edb3a491c7009211680c44ebd143038
|
data/README.md
CHANGED
|
@@ -34,17 +34,23 @@ 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='fumiya-nakamura'>
|
|
38
|
+
<a href='https://github.com/nafu'>
|
|
39
|
+
<img src='https://github.com/nafu.png?size=140'>
|
|
40
|
+
</a>
|
|
41
|
+
<h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
|
|
42
|
+
</td>
|
|
37
43
|
<td id='aaron-brager'>
|
|
38
44
|
<a href='https://github.com/getaaron'>
|
|
39
45
|
<img src='https://github.com/getaaron.png?size=140'>
|
|
40
46
|
</a>
|
|
41
47
|
<h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
|
|
42
48
|
</td>
|
|
43
|
-
<td id='
|
|
44
|
-
<a href='https://github.com/
|
|
45
|
-
<img src='https://github.com/
|
|
49
|
+
<td id='luka-mirosevic'>
|
|
50
|
+
<a href='https://github.com/lmirosevic'>
|
|
51
|
+
<img src='https://github.com/lmirosevic.png?size=140'>
|
|
46
52
|
</a>
|
|
47
|
-
<h4 align='center'><a href='https://twitter.com/
|
|
53
|
+
<h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
|
|
48
54
|
</td>
|
|
49
55
|
<td id='maksym-grebenets'>
|
|
50
56
|
<a href='https://github.com/mgrebenets'>
|
|
@@ -52,43 +58,51 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
|
|
|
52
58
|
</a>
|
|
53
59
|
<h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
|
|
54
60
|
</td>
|
|
55
|
-
<td id='
|
|
56
|
-
<a href='https://github.com/
|
|
57
|
-
<img src='https://github.com/
|
|
58
|
-
</a>
|
|
59
|
-
<h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
|
|
60
|
-
</td>
|
|
61
|
-
<td id='max-ott'>
|
|
62
|
-
<a href='https://github.com/max-ott'>
|
|
63
|
-
<img src='https://github.com/max-ott.png?size=140'>
|
|
61
|
+
<td id='olivier-halligon'>
|
|
62
|
+
<a href='https://github.com/AliSoftware'>
|
|
63
|
+
<img src='https://github.com/AliSoftware.png?size=140'>
|
|
64
64
|
</a>
|
|
65
|
-
<h4 align='center'><a href='https://twitter.com/
|
|
65
|
+
<h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
|
|
66
66
|
</td>
|
|
67
67
|
</tr>
|
|
68
68
|
<tr>
|
|
69
|
-
<td id='andrew-mcburney'>
|
|
70
|
-
<a href='https://github.com/armcburney'>
|
|
71
|
-
<img src='https://github.com/armcburney.png?size=140'>
|
|
72
|
-
</a>
|
|
73
|
-
<h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
|
|
74
|
-
</td>
|
|
75
69
|
<td id='jérôme-lacoste'>
|
|
76
70
|
<a href='https://github.com/lacostej'>
|
|
77
71
|
<img src='https://github.com/lacostej.png?size=140'>
|
|
78
72
|
</a>
|
|
79
73
|
<h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
|
|
80
74
|
</td>
|
|
81
|
-
<td id='
|
|
82
|
-
<a href='https://github.com/
|
|
83
|
-
<img src='https://github.com/
|
|
75
|
+
<td id='helmut-januschka'>
|
|
76
|
+
<a href='https://github.com/hjanuschka'>
|
|
77
|
+
<img src='https://github.com/hjanuschka.png?size=140'>
|
|
84
78
|
</a>
|
|
85
|
-
<h4 align='center'><a href='https://twitter.com/
|
|
79
|
+
<h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
|
|
86
80
|
</td>
|
|
87
|
-
<td id='
|
|
88
|
-
<a href='https://github.com/
|
|
89
|
-
<img src='https://github.com/
|
|
81
|
+
<td id='daniel-jankowski'>
|
|
82
|
+
<a href='https://github.com/mollyIV'>
|
|
83
|
+
<img src='https://github.com/mollyIV.png?size=140'>
|
|
90
84
|
</a>
|
|
91
|
-
<h4 align='center'><a href='https://twitter.com/
|
|
85
|
+
<h4 align='center'><a href='https://twitter.com/mollyIV'>Daniel Jankowski</a></h4>
|
|
86
|
+
</td>
|
|
87
|
+
<td id='manu-wallner'>
|
|
88
|
+
<a href='https://github.com/milch'>
|
|
89
|
+
<img src='https://github.com/milch.png?size=140'>
|
|
90
|
+
</a>
|
|
91
|
+
<h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
|
|
92
|
+
</td>
|
|
93
|
+
<td id='jimmy-dee'>
|
|
94
|
+
<a href='https://github.com/jdee'>
|
|
95
|
+
<img src='https://github.com/jdee.png?size=140'>
|
|
96
|
+
</a>
|
|
97
|
+
<h4 align='center'>Jimmy Dee</h4>
|
|
98
|
+
</td>
|
|
99
|
+
</tr>
|
|
100
|
+
<tr>
|
|
101
|
+
<td id='danielle-tomlinson'>
|
|
102
|
+
<a href='https://github.com/endocrimes'>
|
|
103
|
+
<img src='https://github.com/endocrimes.png?size=140'>
|
|
104
|
+
</a>
|
|
105
|
+
<h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
|
|
92
106
|
</td>
|
|
93
107
|
<td id='matthew-ellis'>
|
|
94
108
|
<a href='https://github.com/matthewellis'>
|
|
@@ -96,25 +110,31 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
|
|
|
96
110
|
</a>
|
|
97
111
|
<h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
|
|
98
112
|
</td>
|
|
99
|
-
|
|
100
|
-
<
|
|
113
|
+
<td id='jan-piotrowski'>
|
|
114
|
+
<a href='https://github.com/janpio'>
|
|
115
|
+
<img src='https://github.com/janpio.png?size=140'>
|
|
116
|
+
</a>
|
|
117
|
+
<h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
|
|
118
|
+
</td>
|
|
101
119
|
<td id='stefan-natchev'>
|
|
102
120
|
<a href='https://github.com/snatchev'>
|
|
103
121
|
<img src='https://github.com/snatchev.png?size=140'>
|
|
104
122
|
</a>
|
|
105
123
|
<h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
|
|
106
124
|
</td>
|
|
107
|
-
<td id='
|
|
108
|
-
<a href='https://github.com/
|
|
109
|
-
<img src='https://github.com/
|
|
125
|
+
<td id='andrew-mcburney'>
|
|
126
|
+
<a href='https://github.com/armcburney'>
|
|
127
|
+
<img src='https://github.com/armcburney.png?size=140'>
|
|
110
128
|
</a>
|
|
111
|
-
<h4 align='center'><a href='https://twitter.com/
|
|
129
|
+
<h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
|
|
112
130
|
</td>
|
|
113
|
-
|
|
114
|
-
<
|
|
115
|
-
<
|
|
131
|
+
</tr>
|
|
132
|
+
<tr>
|
|
133
|
+
<td id='max-ott'>
|
|
134
|
+
<a href='https://github.com/max-ott'>
|
|
135
|
+
<img src='https://github.com/max-ott.png?size=140'>
|
|
116
136
|
</a>
|
|
117
|
-
<h4 align='center'><a href='https://twitter.com/
|
|
137
|
+
<h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
|
|
118
138
|
</td>
|
|
119
139
|
<td id='iulian-onofrei'>
|
|
120
140
|
<a href='https://github.com/revolter'>
|
|
@@ -122,57 +142,37 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
|
|
|
122
142
|
</a>
|
|
123
143
|
<h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
|
|
124
144
|
</td>
|
|
125
|
-
<td id='olivier-halligon'>
|
|
126
|
-
<a href='https://github.com/AliSoftware'>
|
|
127
|
-
<img src='https://github.com/AliSoftware.png?size=140'>
|
|
128
|
-
</a>
|
|
129
|
-
<h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
|
|
130
|
-
</td>
|
|
131
|
-
</tr>
|
|
132
|
-
<tr>
|
|
133
|
-
<td id='daniel-jankowski'>
|
|
134
|
-
<a href='https://github.com/mollyIV'>
|
|
135
|
-
<img src='https://github.com/mollyIV.png?size=140'>
|
|
136
|
-
</a>
|
|
137
|
-
<h4 align='center'><a href='https://twitter.com/mollyIV'>Daniel Jankowski</a></h4>
|
|
138
|
-
</td>
|
|
139
|
-
<td id='manu-wallner'>
|
|
140
|
-
<a href='https://github.com/milch'>
|
|
141
|
-
<img src='https://github.com/milch.png?size=140'>
|
|
142
|
-
</a>
|
|
143
|
-
<h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
|
|
144
|
-
</td>
|
|
145
145
|
<td id='jorge-revuelta-h'>
|
|
146
146
|
<a href='https://github.com/minuscorp'>
|
|
147
147
|
<img src='https://github.com/minuscorp.png?size=140'>
|
|
148
148
|
</a>
|
|
149
149
|
<h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
|
|
150
150
|
</td>
|
|
151
|
-
<td id='
|
|
152
|
-
<a href='https://github.com/
|
|
153
|
-
<img src='https://github.com/
|
|
151
|
+
<td id='joshua-liebowitz'>
|
|
152
|
+
<a href='https://github.com/taquitos'>
|
|
153
|
+
<img src='https://github.com/taquitos.png?size=140'>
|
|
154
154
|
</a>
|
|
155
|
-
<h4 align='center'><a href='https://twitter.com/
|
|
155
|
+
<h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
|
|
156
156
|
</td>
|
|
157
|
-
<td id='
|
|
158
|
-
<a href='https://github.com/
|
|
159
|
-
<img src='https://github.com/
|
|
157
|
+
<td id='josh-holtz'>
|
|
158
|
+
<a href='https://github.com/joshdholtz'>
|
|
159
|
+
<img src='https://github.com/joshdholtz.png?size=140'>
|
|
160
160
|
</a>
|
|
161
|
-
<h4 align='center'>
|
|
161
|
+
<h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</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='felix-krause'>
|
|
166
|
+
<a href='https://github.com/KrauseFx'>
|
|
167
|
+
<img src='https://github.com/KrauseFx.png?size=140'>
|
|
168
168
|
</a>
|
|
169
|
-
<h4 align='center'><a href='https://twitter.com/
|
|
169
|
+
<h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</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
|
|
|
@@ -82,15 +82,12 @@ module Deliver
|
|
|
82
82
|
# @param path (String) path to the screenshot file
|
|
83
83
|
# @param language (String) Language of this screenshot (e.g. English)
|
|
84
84
|
# @param screen_size (Deliver::AppScreenshot::ScreenSize) the screen size, which
|
|
85
|
-
# will automatically be calculated when you don't set it.
|
|
85
|
+
# will automatically be calculated when you don't set it. (Deprecated)
|
|
86
86
|
def initialize(path, language, screen_size = nil)
|
|
87
|
+
UI.deprecated('`screen_size` for Deliver::AppScreenshot.new is deprecated in favor of the default behavior to calculate size automatically. Passed value is no longer validated.') if screen_size
|
|
87
88
|
self.path = path
|
|
88
89
|
self.language = language
|
|
89
|
-
screen_size
|
|
90
|
-
|
|
91
|
-
self.screen_size = screen_size
|
|
92
|
-
|
|
93
|
-
UI.error("Looks like the screenshot given (#{path}) does not match the requirements of #{screen_size}") unless self.is_valid?
|
|
90
|
+
self.screen_size = screen_size || self.class.calculate_screen_size(path)
|
|
94
91
|
end
|
|
95
92
|
|
|
96
93
|
# The iTC API requires a different notation for the device
|
|
@@ -161,6 +158,7 @@ module Deliver
|
|
|
161
158
|
|
|
162
159
|
# Validates the given screenshots (size and format)
|
|
163
160
|
def is_valid?
|
|
161
|
+
UI.deprecated('Deliver::AppScreenshot#is_valid? is deprecated in favor of Deliver::AppScreenshotValidator')
|
|
164
162
|
return false unless ["png", "PNG", "jpg", "JPG", "jpeg", "JPEG"].include?(self.path.split(".").last)
|
|
165
163
|
|
|
166
164
|
return self.screen_size == self.class.calculate_screen_size(self.path)
|
|
@@ -350,7 +348,7 @@ module Deliver
|
|
|
350
348
|
end
|
|
351
349
|
end
|
|
352
350
|
|
|
353
|
-
|
|
351
|
+
nil
|
|
354
352
|
end
|
|
355
353
|
end
|
|
356
354
|
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
require 'fastimage'
|
|
2
|
+
|
|
3
|
+
module Deliver
|
|
4
|
+
class AppScreenshotValidator
|
|
5
|
+
# A simple structure that holds error information as well as formatted error messages consistently
|
|
6
|
+
# Set `to_skip` to `true` when just needing to skip uploading rather than causing a crash.
|
|
7
|
+
class ValidationError
|
|
8
|
+
# Constants that can be given to `type` param
|
|
9
|
+
INVALID_SCREEN_SIZE = 'Invalid screen size'.freeze
|
|
10
|
+
UNACCEPTABLE_DEVICE = 'Not an accepted App Store Connect device'.freeze
|
|
11
|
+
INVALID_FILE_EXTENSION = 'Invalid file extension'.freeze
|
|
12
|
+
FILE_EXTENSION_MISMATCH = 'File extension mismatches its image format'.freeze
|
|
13
|
+
|
|
14
|
+
attr_reader :type, :path, :debug_info, :to_skip
|
|
15
|
+
|
|
16
|
+
def initialize(type: nil, path: nil, debug_info: nil, to_skip: false)
|
|
17
|
+
@type = type
|
|
18
|
+
@path = path
|
|
19
|
+
@debug_info = debug_info
|
|
20
|
+
@to_skip = to_skip
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def to_s
|
|
24
|
+
"#{to_skip ? '🏃 Skipping' : '🚫 Error'}: #{path} - #{type} (#{debug_info})"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def inspect
|
|
28
|
+
"\"#{type}\""
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Access each array by symbol returned from FastImage.type
|
|
33
|
+
ALLOWED_SCREENSHOT_FILE_EXTENSION = { png: ['png', 'PNG'], jpeg: ['jpg', 'JPG', 'jpeg', 'JPEG'] }.freeze
|
|
34
|
+
|
|
35
|
+
APP_SCREENSHOT_SPEC_URL = 'https://help.apple.com/app-store-connect/#/devd274dd925'.freeze
|
|
36
|
+
|
|
37
|
+
# Validate a screenshot and inform an error message via `errors` parameter. `errors` is mutated
|
|
38
|
+
# to append the messages and each message should contain the corresponding path to let users know which file is throwing the error.
|
|
39
|
+
#
|
|
40
|
+
# @param screenshot [AppScreenshot]
|
|
41
|
+
# @param errors [Array<Deliver::AppScreenshotValidator::ValidationError>] Pass an array object to add validation errors when detecting errors.
|
|
42
|
+
# This will be mutated to add more error objects as validation detects errors.
|
|
43
|
+
# @return [Boolean] true if given screenshot is valid
|
|
44
|
+
def self.validate(screenshot, errors)
|
|
45
|
+
# Given screenshot will be diagnosed and errors found are accumulated
|
|
46
|
+
errors_found = []
|
|
47
|
+
|
|
48
|
+
validate_screen_size(screenshot, errors_found)
|
|
49
|
+
validate_device_type(screenshot, errors_found)
|
|
50
|
+
validate_file_extension_and_format(screenshot, errors_found)
|
|
51
|
+
|
|
52
|
+
# Merge errors found into given errors array
|
|
53
|
+
errors_found.each { |error| errors.push(error) }
|
|
54
|
+
errors_found.empty?
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def self.validate_screen_size(screenshot, errors_found)
|
|
58
|
+
if screenshot.screen_size.nil?
|
|
59
|
+
errors_found << ValidationError.new(type: ValidationError::INVALID_SCREEN_SIZE,
|
|
60
|
+
path: screenshot.path,
|
|
61
|
+
debug_info: "Actual size is #{get_formatted_size(screenshot)}. See the specifications to fix #{APP_SCREENSHOT_SPEC_URL}")
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Checking if the device type exists in spaceship
|
|
66
|
+
# Ex: iPhone 6.1 inch isn't supported in App Store Connect but need
|
|
67
|
+
# to have it in there for frameit support
|
|
68
|
+
def self.validate_device_type(screenshot, errors_found)
|
|
69
|
+
if !screenshot.screen_size.nil? && screenshot.device_type.nil?
|
|
70
|
+
errors_found << ValidationError.new(type: ValidationError::UNACCEPTABLE_DEVICE,
|
|
71
|
+
path: screenshot.path,
|
|
72
|
+
debug_info: "Screen size #{screenshot.screen_size} is not accepted. See the specifications to fix #{APP_SCREENSHOT_SPEC_URL}",
|
|
73
|
+
to_skip: true)
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def self.validate_file_extension_and_format(screenshot, errors_found)
|
|
78
|
+
extension = File.extname(screenshot.path).delete('.')
|
|
79
|
+
valid_file_extensions = ALLOWED_SCREENSHOT_FILE_EXTENSION.values.flatten
|
|
80
|
+
is_valid_extension = valid_file_extensions.include?(extension)
|
|
81
|
+
|
|
82
|
+
unless is_valid_extension
|
|
83
|
+
errors_found << ValidationError.new(type: ValidationError::INVALID_FILE_EXTENSION,
|
|
84
|
+
path: screenshot.path,
|
|
85
|
+
debug_info: "Only #{valid_file_extensions.join(', ')} are allowed")
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
format = FastImage.type(screenshot.path)
|
|
89
|
+
is_extension_matched = ALLOWED_SCREENSHOT_FILE_EXTENSION[format] &&
|
|
90
|
+
ALLOWED_SCREENSHOT_FILE_EXTENSION[format].include?(extension)
|
|
91
|
+
|
|
92
|
+
# This error only appears when file extension is valid
|
|
93
|
+
if is_valid_extension && !is_extension_matched
|
|
94
|
+
expected_extension = ALLOWED_SCREENSHOT_FILE_EXTENSION[format].first
|
|
95
|
+
expected_filename = File.basename(screenshot.path, File.extname(screenshot.path)) + ".#{expected_extension}"
|
|
96
|
+
errors_found << ValidationError.new(type: ValidationError::FILE_EXTENSION_MISMATCH,
|
|
97
|
+
path: screenshot.path,
|
|
98
|
+
debug_info: %(Actual format is "#{format}". Rename the filename to "#{expected_filename}".))
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def self.get_formatted_size(screenshot)
|
|
103
|
+
size = FastImage.size(screenshot.path)
|
|
104
|
+
return size.join('x') if size
|
|
105
|
+
nil
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
require 'fastlane_core/languages'
|
|
2
|
-
require 'spaceship/tunes/tunes'
|
|
3
|
-
|
|
4
1
|
require_relative 'module'
|
|
5
2
|
require_relative 'app_screenshot'
|
|
3
|
+
require_relative 'app_screenshot_validator'
|
|
6
4
|
require_relative 'upload_metadata'
|
|
7
5
|
require_relative 'languages'
|
|
8
6
|
|
|
@@ -80,7 +78,7 @@ module Deliver
|
|
|
80
78
|
end
|
|
81
79
|
end
|
|
82
80
|
|
|
83
|
-
# Returns the list of valid app screenshot
|
|
81
|
+
# Returns the list of valid app screenshot. When detecting invalid screenshots, this will cause an error.
|
|
84
82
|
#
|
|
85
83
|
# @param root [String] A directory path
|
|
86
84
|
# @param ignore_validation [String] Set false not to raise the error when finding invalid folder name
|
|
@@ -100,36 +98,22 @@ module Deliver
|
|
|
100
98
|
end
|
|
101
99
|
|
|
102
100
|
errors = []
|
|
103
|
-
valid_screenshots = screenshots.select { |screenshot|
|
|
101
|
+
valid_screenshots = screenshots.select { |screenshot| Deliver::AppScreenshotValidator.validate(screenshot, errors) }
|
|
104
102
|
|
|
105
|
-
|
|
106
|
-
UI.important("Unaccepted device screenshots are detected! 🚫 Screenshot file will be skipped. 🏃")
|
|
107
|
-
errors.each { |error| UI.important(error) }
|
|
108
|
-
end
|
|
103
|
+
errors_to_skip, errors_to_crash = errors.partition(&:to_skip)
|
|
109
104
|
|
|
110
|
-
|
|
111
|
-
|
|
105
|
+
unless errors_to_skip.empty?
|
|
106
|
+
UI.important("🏃 Screenshots to be skipped are detected!")
|
|
107
|
+
errors_to_skip.each { |error| UI.message(error) }
|
|
108
|
+
end
|
|
112
109
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
# @param errors [Array<String>] Pass an array object to add error messages when finding an error
|
|
118
|
-
# @return [Boolean] true if given screenshot is valid
|
|
119
|
-
def self.validate_screenshot(screenshot, errors)
|
|
120
|
-
# Given screenshot will be diagnosed and errors found are accumulated
|
|
121
|
-
errors_found = []
|
|
122
|
-
|
|
123
|
-
# Checking if the device type exists in spaceship
|
|
124
|
-
# Ex: iPhone 6.1 inch isn't supported in App Store Connect but need
|
|
125
|
-
# to have it in there for frameit support
|
|
126
|
-
if screenshot.device_type.nil?
|
|
127
|
-
errors_found << "🏃 Skipping screenshot file: #{screenshot.path} - Not an accepted App Store Connect device..."
|
|
110
|
+
unless errors_to_crash.empty?
|
|
111
|
+
UI.important("🚫 Invalid screenshots were detected! Here are the reasons:")
|
|
112
|
+
errors_to_crash.each { |error| UI.error(error) }
|
|
113
|
+
UI.user_error!("Canceled uploading screenshots. Please check the error messages above and fix the screenshots.")
|
|
128
114
|
end
|
|
129
115
|
|
|
130
|
-
|
|
131
|
-
errors_found.each { |error| errors.push(error) }
|
|
132
|
-
errors_found.empty?
|
|
116
|
+
valid_screenshots
|
|
133
117
|
end
|
|
134
118
|
|
|
135
119
|
# Returns the list of language folders
|