fastlane 2.170.0 → 2.171.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +74 -74
  3. data/deliver/lib/deliver/app_screenshot.rb +5 -7
  4. data/deliver/lib/deliver/app_screenshot_validator.rb +108 -0
  5. data/deliver/lib/deliver/loader.rb +13 -29
  6. data/deliver/lib/deliver/upload_metadata.rb +2 -0
  7. data/{spaceship/lib/spaceship/connect_api/models/.app_data_usage_data_protection.rb.swp → fastlane/lib/fastlane/actions/.github_api.rb.swp} +0 -0
  8. data/fastlane/lib/fastlane/actions/.set_github_release.rb.swp +0 -0
  9. data/fastlane/lib/fastlane/actions/add_git_tag.rb +12 -3
  10. data/fastlane/lib/fastlane/actions/docs/upload_to_testflight.md +5 -1
  11. data/fastlane/lib/fastlane/actions/download_app_privacy_details_from_app_store.rb +142 -0
  12. data/fastlane/lib/fastlane/actions/git_commit.rb +3 -3
  13. data/fastlane/lib/fastlane/actions/github_api.rb +14 -3
  14. data/fastlane/lib/fastlane/actions/nexus_upload.rb +1 -0
  15. data/fastlane/lib/fastlane/actions/pod_push.rb +9 -0
  16. data/fastlane/lib/fastlane/actions/push_to_git_remote.rb +9 -1
  17. data/fastlane/lib/fastlane/actions/set_github_release.rb +21 -8
  18. data/fastlane/lib/fastlane/actions/slack.rb +4 -5
  19. data/fastlane/lib/fastlane/actions/spm.rb +2 -2
  20. data/fastlane/lib/fastlane/actions/upload_app_privacy_details_to_app_store.rb +4 -2
  21. data/fastlane/lib/fastlane/version.rb +1 -1
  22. data/fastlane/swift/Deliverfile.swift +1 -1
  23. data/fastlane/swift/DeliverfileProtocol.swift +1 -1
  24. data/fastlane/swift/Fastlane.swift +66 -13
  25. data/fastlane/swift/Gymfile.swift +1 -1
  26. data/fastlane/swift/GymfileProtocol.swift +1 -1
  27. data/fastlane/swift/Matchfile.swift +1 -1
  28. data/fastlane/swift/MatchfileProtocol.swift +1 -1
  29. data/fastlane/swift/Precheckfile.swift +1 -1
  30. data/fastlane/swift/PrecheckfileProtocol.swift +5 -1
  31. data/fastlane/swift/Scanfile.swift +1 -1
  32. data/fastlane/swift/ScanfileProtocol.swift +5 -1
  33. data/fastlane/swift/Screengrabfile.swift +1 -1
  34. data/fastlane/swift/ScreengrabfileProtocol.swift +1 -1
  35. data/fastlane/swift/Snapshotfile.swift +1 -1
  36. data/fastlane/swift/SnapshotfileProtocol.swift +2 -2
  37. data/fastlane_core/lib/fastlane_core/helper.rb +1 -1
  38. data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +3 -4
  39. data/match/lib/match/encryption/openssl.rb +4 -2
  40. data/match/lib/match/storage/git_storage.rb +14 -10
  41. data/precheck/lib/precheck/options.rb +6 -1
  42. data/precheck/lib/precheck/rule_processor.rb +1 -1
  43. data/precheck/lib/precheck/runner.rb +1 -1
  44. data/scan/lib/scan/options.rb +5 -0
  45. data/scan/lib/scan/slack_poster.rb +1 -0
  46. data/screengrab/lib/screengrab/runner.rb +2 -0
  47. data/sigh/lib/sigh/runner.rb +1 -1
  48. data/snapshot/lib/snapshot/options.rb +1 -1
  49. data/spaceship/lib/spaceship/connect_api/api_client.rb +1 -1
  50. data/spaceship/lib/spaceship/connect_api/models/app.rb +6 -0
  51. data/spaceship/lib/spaceship/connect_api/models/app_store_version.rb +5 -1
  52. data/spaceship/lib/spaceship/connect_api/response.rb +3 -1
  53. metadata +21 -18
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 77bbcab6a1ba00a457477ca27ddaca5f81485448e5022897e9c7ef43ff566991
4
- data.tar.gz: 188796684ccb2fed018b9e4ada265a176aa074d09812592ce24d22c69fc48b7b
3
+ metadata.gz: b9c960e8f4391fa08e3b301c5f7718c118ee0031fb399e2582febb9b8b9860f8
4
+ data.tar.gz: 418236b3a2ab2b68f22e33858a5edf71af122e50e69b24824dd2186fa5a1db8f
5
5
  SHA512:
6
- metadata.gz: 298f64e50908a6b7e40faa8e160d5e8b064054c2622bcaec9008f0aa861de6022187e0968a4398af07940d0f6383fbbfcb49cdc9136dab6cf6995f497f4d5440
7
- data.tar.gz: 98361a556a41a534a68eddad93af5418be1bdcc8ae7b41b69308d109c37582896336ee5ff0e4ce791696320eacd7c21fc757125ef1bf8cfa7e945231ad279b87
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='helmut-januschka'>
44
- <a href='https://github.com/hjanuschka'>
45
- <img src='https://github.com/hjanuschka.png?size=140'>
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/hjanuschka'>Helmut Januschka</a></h4>
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='danielle-tomlinson'>
56
- <a href='https://github.com/endocrimes'>
57
- <img src='https://github.com/endocrimes.png?size=140'>
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/ott_max'>Max Ott</a></h4>
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='joshua-liebowitz'>
82
- <a href='https://github.com/taquitos'>
83
- <img src='https://github.com/taquitos.png?size=140'>
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/taquitos'>Joshua Liebowitz</a></h4>
79
+ <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
86
80
  </td>
87
- <td id='fumiya-nakamura'>
88
- <a href='https://github.com/nafu'>
89
- <img src='https://github.com/nafu.png?size=140'>
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/nafu003'>Fumiya Nakamura</a></h4>
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
- </tr>
100
- <tr>
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='luka-mirosevic'>
108
- <a href='https://github.com/lmirosevic'>
109
- <img src='https://github.com/lmirosevic.png?size=140'>
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/lmirosevic'>Luka Mirosevic</a></h4>
129
+ <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
112
130
  </td>
113
- <td id='felix-krause'>
114
- <a href='https://github.com/KrauseFx'>
115
- <img src='https://github.com/KrauseFx.png?size=140'>
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/KrauseFx'>Felix Krause</a></h4>
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='kohki-miki'>
152
- <a href='https://github.com/giginet'>
153
- <img src='https://github.com/giginet.png?size=140'>
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/giginet'>Kohki Miki</a></h4>
155
+ <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
156
156
  </td>
157
- <td id='jimmy-dee'>
158
- <a href='https://github.com/jdee'>
159
- <img src='https://github.com/jdee.png?size=140'>
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'>Jimmy Dee</h4>
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='jan-piotrowski'>
166
- <a href='https://github.com/janpio'>
167
- <img src='https://github.com/janpio.png?size=140'>
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/Sujan'>Jan Piotrowski</a></h4>
169
+ <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
170
170
  </td>
171
- <td id='josh-holtz'>
172
- <a href='https://github.com/joshdholtz'>
173
- <img src='https://github.com/joshdholtz.png?size=140'>
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/joshdholtz'>Josh Holtz</a></h4>
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 ||= self.class.calculate_screen_size(path)
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
- UI.user_error!("Unsupported screen size #{size} for path '#{path}'")
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| validate_screenshot(screenshot, errors) }
101
+ valid_screenshots = screenshots.select { |screenshot| Deliver::AppScreenshotValidator.validate(screenshot, errors) }
104
102
 
105
- unless errors.empty?
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
- valid_screenshots
111
- end
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
- # Validate a screenshot and inform an error message via `errors` parameters. `errors` is mutated
114
- # to append the messages and each message should contain the corresponding path to let users know which file gets the error.
115
- #
116
- # @param screenshot [AppScreenshot]
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
- # Merge errors found into given errors array
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
@@ -1,3 +1,5 @@
1
+ require 'spaceship'
2
+
1
3
  require_relative 'module'
2
4
  require_relative 'queue_worker'
3
5