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.
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