fastlane 2.155.1 → 2.157.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 (67) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +72 -72
  3. data/deliver/lib/deliver.rb +1 -0
  4. data/deliver/lib/deliver/app_screenshot_iterator.rb +95 -0
  5. data/deliver/lib/deliver/detect_values.rb +4 -1
  6. data/deliver/lib/deliver/languages.rb +7 -0
  7. data/deliver/lib/deliver/loader.rb +4 -5
  8. data/deliver/lib/deliver/queue_worker.rb +64 -0
  9. data/deliver/lib/deliver/runner.rb +7 -5
  10. data/deliver/lib/deliver/upload_screenshots.rb +143 -128
  11. data/fastlane/lib/fastlane/actions/app_store_connect_api_key.rb +120 -0
  12. data/fastlane/lib/fastlane/actions/commit_version_bump.rb +1 -1
  13. data/fastlane/lib/fastlane/actions/docs/upload_to_play_store.md +2 -0
  14. data/fastlane/lib/fastlane/actions/docs/upload_to_testflight.md +17 -1
  15. data/fastlane/lib/fastlane/actions/set_changelog.rb +2 -2
  16. data/fastlane/lib/fastlane/actions/sonar.rb +5 -0
  17. data/fastlane/lib/fastlane/actions/spaceship_stats.rb +73 -0
  18. data/fastlane/lib/fastlane/actions/upload_to_testflight.rb +4 -0
  19. data/fastlane/lib/fastlane/version.rb +1 -1
  20. data/fastlane/swift/Deliverfile.swift +1 -1
  21. data/fastlane/swift/DeliverfileProtocol.swift +1 -1
  22. data/fastlane/swift/Fastlane.swift +68 -8
  23. data/fastlane/swift/Gymfile.swift +1 -1
  24. data/fastlane/swift/GymfileProtocol.swift +1 -1
  25. data/fastlane/swift/Matchfile.swift +1 -1
  26. data/fastlane/swift/MatchfileProtocol.swift +1 -1
  27. data/fastlane/swift/Precheckfile.swift +1 -1
  28. data/fastlane/swift/PrecheckfileProtocol.swift +1 -1
  29. data/fastlane/swift/Scanfile.swift +1 -1
  30. data/fastlane/swift/ScanfileProtocol.swift +1 -1
  31. data/fastlane/swift/Screengrabfile.swift +1 -1
  32. data/fastlane/swift/ScreengrabfileProtocol.swift +1 -1
  33. data/fastlane/swift/Snapshotfile.swift +1 -1
  34. data/fastlane/swift/SnapshotfileProtocol.swift +1 -1
  35. data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +71 -42
  36. data/fastlane_core/lib/fastlane_core/project.rb +1 -0
  37. data/gym/lib/gym/error_handler.rb +1 -1
  38. data/gym/lib/gym/generators/build_command_generator.rb +0 -1
  39. data/pilot/lib/pilot/build_manager.rb +18 -4
  40. data/pilot/lib/pilot/manager.rb +15 -5
  41. data/pilot/lib/pilot/options.rb +16 -0
  42. data/produce/lib/produce/itunes_connect.rb +2 -2
  43. data/scan/lib/scan/test_command_generator.rb +3 -1
  44. data/screengrab/lib/screengrab/runner.rb +8 -7
  45. data/sigh/lib/sigh/runner.rb +9 -5
  46. data/snapshot/lib/snapshot/test_command_generator_base.rb +3 -1
  47. data/spaceship/lib/spaceship.rb +4 -0
  48. data/spaceship/lib/spaceship/client.rb +2 -0
  49. data/spaceship/lib/spaceship/connect_api.rb +0 -15
  50. data/spaceship/lib/spaceship/connect_api/api_client.rb +270 -0
  51. data/spaceship/lib/spaceship/connect_api/client.rb +139 -213
  52. data/spaceship/lib/spaceship/connect_api/models/profile.rb +3 -2
  53. data/spaceship/lib/spaceship/connect_api/provisioning/client.rb +8 -17
  54. data/spaceship/lib/spaceship/connect_api/provisioning/provisioning.rb +75 -64
  55. data/spaceship/lib/spaceship/connect_api/spaceship.rb +94 -0
  56. data/spaceship/lib/spaceship/connect_api/testflight/client.rb +8 -17
  57. data/spaceship/lib/spaceship/connect_api/testflight/testflight.rb +288 -277
  58. data/spaceship/lib/spaceship/connect_api/token.rb +46 -5
  59. data/spaceship/lib/spaceship/connect_api/token_refresh_middleware.rb +24 -0
  60. data/spaceship/lib/spaceship/connect_api/tunes/client.rb +8 -17
  61. data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +717 -706
  62. data/spaceship/lib/spaceship/connect_api/users/client.rb +8 -17
  63. data/spaceship/lib/spaceship/connect_api/users/users.rb +28 -17
  64. data/spaceship/lib/spaceship/stats_middleware.rb +65 -0
  65. metadata +25 -18
  66. data/sigh/lib/sigh/.runner.rb.swp +0 -0
  67. data/spaceship/lib/spaceship/connect_api/models/.device.rb.swp +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b77c9dcff082266f510dfe52db1d9747eac32e620b8197e16582af61c03060b5
4
- data.tar.gz: 5d66ae9adcbaa02fd74fceac52bdaf89d33ae3abede5ac82015440abf0be8787
3
+ metadata.gz: 54d4961677c76fce8c6ecb5e8c89f9b28ea818abd3dc886217d8eaf4e198902b
4
+ data.tar.gz: a36d89c144e59c29e7dc94eeb8f51a72b3a50a9ed2813ca700d8ee7008d778de
5
5
  SHA512:
6
- metadata.gz: 928ee72847179a8eeec320a3c76bd61a43b02683a91cd018f398404ae15f5fe3c0b055b76a3fe203e9d5d3bad23f42e3bc677acbda33fcefec133f4c926c3a5c
7
- data.tar.gz: 64555183b72fac412fe507a9a55acef51348a1c260ad48aeba484a2f347e6f33a3e205b51b0d4c182dee2a112905292f7f7e03a030fae08b8765ed7fd943645d
6
+ metadata.gz: ef36ec87ab67fa77d75cb6836e994463de4f550e6ff0bc832690c734c09a8a21cd9644c90657d29894baf2b4b7e4d87269f7c8d350ce0300ee2b162f3a861870
7
+ data.tar.gz: d8a4392c60f47e7b7d73a374020c854694f27a91a59a23d33a6f0de2464efdd2b653bfb6a999faa3b1657a7aa4d29a097ef7d8cff34eeec5481bafb2e5612339
data/README.md CHANGED
@@ -34,11 +34,11 @@ 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='helmut-januschka'>
38
- <a href='https://github.com/hjanuschka'>
39
- <img src='https://github.com/hjanuschka.png?size=140'>
37
+ <td id='olivier-halligon'>
38
+ <a href='https://github.com/AliSoftware'>
39
+ <img src='https://github.com/AliSoftware.png?size=140'>
40
40
  </a>
41
- <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
41
+ <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
42
42
  </td>
43
43
  <td id='stefan-natchev'>
44
44
  <a href='https://github.com/snatchev'>
@@ -46,17 +46,17 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
46
46
  </a>
47
47
  <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
48
48
  </td>
49
- <td id='matthew-ellis'>
50
- <a href='https://github.com/matthewellis'>
51
- <img src='https://github.com/matthewellis.png?size=140'>
49
+ <td id='jan-piotrowski'>
50
+ <a href='https://github.com/janpio'>
51
+ <img src='https://github.com/janpio.png?size=140'>
52
52
  </a>
53
- <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
53
+ <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
54
54
  </td>
55
- <td id='olivier-halligon'>
56
- <a href='https://github.com/AliSoftware'>
57
- <img src='https://github.com/AliSoftware.png?size=140'>
55
+ <td id='max-ott'>
56
+ <a href='https://github.com/max-ott'>
57
+ <img src='https://github.com/max-ott.png?size=140'>
58
58
  </a>
59
- <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
59
+ <h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
60
60
  </td>
61
61
  <td id='jorge-revuelta-h'>
62
62
  <a href='https://github.com/minuscorp'>
@@ -66,29 +66,23 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
66
66
  </td>
67
67
  </tr>
68
68
  <tr>
69
- <td id='kohki-miki'>
70
- <a href='https://github.com/giginet'>
71
- <img src='https://github.com/giginet.png?size=140'>
72
- </a>
73
- <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
74
- </td>
75
- <td id='danielle-tomlinson'>
76
- <a href='https://github.com/endocrimes'>
77
- <img src='https://github.com/endocrimes.png?size=140'>
69
+ <td id='joshua-liebowitz'>
70
+ <a href='https://github.com/taquitos'>
71
+ <img src='https://github.com/taquitos.png?size=140'>
78
72
  </a>
79
- <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
73
+ <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
80
74
  </td>
81
- <td id='jan-piotrowski'>
82
- <a href='https://github.com/janpio'>
83
- <img src='https://github.com/janpio.png?size=140'>
75
+ <td id='manu-wallner'>
76
+ <a href='https://github.com/milch'>
77
+ <img src='https://github.com/milch.png?size=140'>
84
78
  </a>
85
- <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
79
+ <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
86
80
  </td>
87
- <td id='iulian-onofrei'>
88
- <a href='https://github.com/revolter'>
89
- <img src='https://github.com/revolter.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/Revolt666'>Iulian Onofrei</a></h4>
85
+ <h4 align='center'><a href='https://twitter.com/mollyIV'>Daniel Jankowski</a></h4>
92
86
  </td>
93
87
  <td id='jimmy-dee'>
94
88
  <a href='https://github.com/jdee'>
@@ -96,25 +90,25 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
96
90
  </a>
97
91
  <h4 align='center'>Jimmy Dee</h4>
98
92
  </td>
99
- </tr>
100
- <tr>
101
- <td id='felix-krause'>
102
- <a href='https://github.com/KrauseFx'>
103
- <img src='https://github.com/KrauseFx.png?size=140'>
93
+ <td id='maksym-grebenets'>
94
+ <a href='https://github.com/mgrebenets'>
95
+ <img src='https://github.com/mgrebenets.png?size=140'>
104
96
  </a>
105
- <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
97
+ <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
106
98
  </td>
107
- <td id='jérôme-lacoste'>
108
- <a href='https://github.com/lacostej'>
109
- <img src='https://github.com/lacostej.png?size=140'>
99
+ </tr>
100
+ <tr>
101
+ <td id='kohki-miki'>
102
+ <a href='https://github.com/giginet'>
103
+ <img src='https://github.com/giginet.png?size=140'>
110
104
  </a>
111
- <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
105
+ <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
112
106
  </td>
113
- <td id='daniel-jankowski'>
114
- <a href='https://github.com/mollyIV'>
115
- <img src='https://github.com/mollyIV.png?size=140'>
107
+ <td id='andrew-mcburney'>
108
+ <a href='https://github.com/armcburney'>
109
+ <img src='https://github.com/armcburney.png?size=140'>
116
110
  </a>
117
- <h4 align='center'><a href='https://twitter.com/mollyIV'>Daniel Jankowski</a></h4>
111
+ <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
118
112
  </td>
119
113
  <td id='luka-mirosevic'>
120
114
  <a href='https://github.com/lmirosevic'>
@@ -122,20 +116,6 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
122
116
  </a>
123
117
  <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
124
118
  </td>
125
- <td id='max-ott'>
126
- <a href='https://github.com/max-ott'>
127
- <img src='https://github.com/max-ott.png?size=140'>
128
- </a>
129
- <h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
130
- </td>
131
- </tr>
132
- <tr>
133
- <td id='joshua-liebowitz'>
134
- <a href='https://github.com/taquitos'>
135
- <img src='https://github.com/taquitos.png?size=140'>
136
- </a>
137
- <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
138
- </td>
139
119
  <td id='josh-holtz'>
140
120
  <a href='https://github.com/joshdholtz'>
141
121
  <img src='https://github.com/joshdholtz.png?size=140'>
@@ -148,31 +128,51 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
148
128
  </a>
149
129
  <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
150
130
  </td>
151
- <td id='manu-wallner'>
152
- <a href='https://github.com/milch'>
153
- <img src='https://github.com/milch.png?size=140'>
131
+ </tr>
132
+ <tr>
133
+ <td id='danielle-tomlinson'>
134
+ <a href='https://github.com/endocrimes'>
135
+ <img src='https://github.com/endocrimes.png?size=140'>
154
136
  </a>
155
- <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
137
+ <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
156
138
  </td>
157
- <td id='maksym-grebenets'>
158
- <a href='https://github.com/mgrebenets'>
159
- <img src='https://github.com/mgrebenets.png?size=140'>
139
+ <td id='matthew-ellis'>
140
+ <a href='https://github.com/matthewellis'>
141
+ <img src='https://github.com/matthewellis.png?size=140'>
160
142
  </a>
161
- <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
143
+ <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
162
144
  </td>
163
- </tr>
164
- <tr>
165
145
  <td id='aaron-brager'>
166
146
  <a href='https://github.com/getaaron'>
167
147
  <img src='https://github.com/getaaron.png?size=140'>
168
148
  </a>
169
149
  <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
170
150
  </td>
171
- <td id='andrew-mcburney'>
172
- <a href='https://github.com/armcburney'>
173
- <img src='https://github.com/armcburney.png?size=140'>
151
+ <td id='helmut-januschka'>
152
+ <a href='https://github.com/hjanuschka'>
153
+ <img src='https://github.com/hjanuschka.png?size=140'>
174
154
  </a>
175
- <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
155
+ <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
156
+ </td>
157
+ <td id='felix-krause'>
158
+ <a href='https://github.com/KrauseFx'>
159
+ <img src='https://github.com/KrauseFx.png?size=140'>
160
+ </a>
161
+ <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
162
+ </td>
163
+ </tr>
164
+ <tr>
165
+ <td id='iulian-onofrei'>
166
+ <a href='https://github.com/revolter'>
167
+ <img src='https://github.com/revolter.png?size=140'>
168
+ </a>
169
+ <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
170
+ </td>
171
+ <td id='jérôme-lacoste'>
172
+ <a href='https://github.com/lacostej'>
173
+ <img src='https://github.com/lacostej.png?size=140'>
174
+ </a>
175
+ <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
176
176
  </td>
177
177
  </table>
178
178
 
@@ -1,3 +1,4 @@
1
+ require_relative 'deliver/languages'
1
2
  require_relative 'deliver/loader'
2
3
  require_relative 'deliver/options'
3
4
  require_relative 'deliver/commands_generator'
@@ -0,0 +1,95 @@
1
+ module Deliver
2
+ # This is a convinient class that enumerates app store connect's screenshots in various degrees.
3
+ class AppScreenshotIterator
4
+ NUMBER_OF_THREADS = Helper.test? ? 1 : [ENV.fetch("DELIVER_NUMBER_OF_THREADS", 10).to_i, 10].min
5
+
6
+ # @param localizations [Array<Spaceship::ConnectAPI::AppStoreVersionLocalization>]
7
+ def initialize(localizations)
8
+ @localizations = localizations
9
+ end
10
+
11
+ # Iterate app_screenshot_set over localizations
12
+ #
13
+ # @yield [localization, app_screenshot_set]
14
+ # @yieldparam [optional, Spaceship::ConnectAPI::AppStoreVersionLocalization] localization
15
+ # @yieldparam [optional, Spaceship::ConnectAPI::AppStoreScreenshotSet] app_screenshot_set
16
+ def each_app_screenshot_set(localizations = @localizations, &block)
17
+ return enum_for(__method__, localizations) unless block_given?
18
+
19
+ # Collect app_screenshot_sets from localizations in parallel but
20
+ # limit the number of threads working at a time with using `lazy` and `force` controls
21
+ # to not attack App Store Connect
22
+ results = localizations.each_slice(NUMBER_OF_THREADS).lazy.map do |localizations_grouped|
23
+ localizations_grouped.map do |localization|
24
+ Thread.new do
25
+ [localization, localization.get_app_screenshot_sets]
26
+ end
27
+ end
28
+ end.flat_map do |threads|
29
+ threads.map { |t| t.join.value }
30
+ end.force
31
+
32
+ results.each do |localization, app_screenshot_sets|
33
+ app_screenshot_sets.each do |app_screenshot_set|
34
+ yield(localization, app_screenshot_set)
35
+ end
36
+ end
37
+ end
38
+
39
+ # Iterate app_screenshot over localizations and app_screenshot_sets
40
+ #
41
+ # @yield [localization, app_screenshot_set, app_screenshot]
42
+ # @yieldparam [optional, Spaceship::ConnectAPI::AppStoreVersionLocalization] localization
43
+ # @yieldparam [optional, Spaceship::ConnectAPI::AppStoreScreenshotSet] app_screenshot_set
44
+ # @yieldparam [optional, Spaceship::ConnectAPI::AppStoreScreenshot] app_screenshot
45
+ def each_app_screenshot(&block)
46
+ return enum_for(__method__) unless block_given?
47
+
48
+ each_app_screenshot_set do |localization, app_screenshot_set|
49
+ app_screenshot_set.app_screenshots.each do |app_screenshot|
50
+ yield(localization, app_screenshot_set, app_screenshot)
51
+ end
52
+ end
53
+ end
54
+
55
+ # Iterate given local app_screenshot over localizations and app_screenshot_sets with index within each app_screenshot_set
56
+ #
57
+ # @param screenshots_per_language [Hash<String, Array<Deliver::AppScreenshot>]
58
+ # @yield [localization, app_screenshot_set, app_screenshot, index]
59
+ # @yieldparam [optional, Spaceship::ConnectAPI::AppStoreVersionLocalization] localization
60
+ # @yieldparam [optional, Spaceship::ConnectAPI::AppStoreScreenshotSet] app_screenshot_set
61
+ # @yieldparam [optional, Deliver::AppScreenshot] screenshot
62
+ # @yieldparam [optional, Integer] index a number reperesents which position the screenshot will be
63
+ def each_local_screenshot(screenshots_per_language, &block)
64
+ return enum_for(__method__, screenshots_per_language) unless block_given?
65
+
66
+ # filter unnecessary localizations
67
+ supported_localizations = @localizations.reject { |l| screenshots_per_language[l.locale].nil? }
68
+
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
76
+
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)
81
+
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 })
86
+
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
92
+ end
93
+ end
94
+ end
95
+ 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
- all_languages = Spaceship::Tunes.client.available_languages
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
- if Helper.test?
28
- available_languages = FastlaneCore::Languages::ALL_LANGUAGES
29
- else
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
@@ -0,0 +1,64 @@
1
+ require 'thread'
2
+
3
+ module Deliver
4
+ # This dispatches jobs to worker threads and make it work in parallel.
5
+ # It's suitable for I/O bounds works and not for CPU bounds works.
6
+ # Use this when you have all the items that you'll process in advance.
7
+ # Simply enqueue them to this and call `QueueWorker#start`.
8
+ class QueueWorker
9
+ # @param concurrency (Numeric) - A number of threads to be created
10
+ # @param block (Proc) - A task you want to execute with enqueued items
11
+ def initialize(concurrency, &block)
12
+ @concurrency = concurrency
13
+ @block = block
14
+ @queue = Queue.new
15
+ end
16
+
17
+ # @param job (Object) - An arbitary object that keeps parameters
18
+ def enqueue(job)
19
+ @queue.push(job)
20
+ end
21
+
22
+ # Call this after you enqueuned all the jobs you want to process
23
+ # This method blocks current thread until all the enqueued jobs are processed
24
+ def start
25
+ threads = []
26
+ @concurrency.times do
27
+ threads << Thread.new do
28
+ while running? && !empty?
29
+ job = @queue.pop
30
+ @block.call(job) if job
31
+ end
32
+ end
33
+ end
34
+
35
+ wait_for_complete
36
+ threads.each(&:join)
37
+ end
38
+
39
+ private
40
+
41
+ def running?
42
+ !@queue.closed?
43
+ end
44
+
45
+ def empty?
46
+ @queue.empty?
47
+ end
48
+
49
+ def wait_for_complete
50
+ wait_thread = Thread.new do
51
+ loop do
52
+ if @queue.empty?
53
+ @queue.close
54
+ break
55
+ end
56
+
57
+ sleep(1)
58
+ end
59
+ end
60
+
61
+ wait_thread.join
62
+ end
63
+ end
64
+ end
@@ -27,8 +27,8 @@ module Deliver
27
27
 
28
28
  def login
29
29
  UI.message("Login to App Store Connect (#{options[:username]})")
30
- Spaceship::Tunes.login(options[:username])
31
- Spaceship::Tunes.select_team
30
+ Spaceship::ConnectAPI.login(options[:username])
31
+ Spaceship::ConnectAPI.select_team
32
32
  UI.message("Login successful")
33
33
  end
34
34
 
@@ -177,17 +177,19 @@ module Deliver
177
177
  # If there are multiple teams, infer the provider from the selected team name.
178
178
  # If there are fewer than two teams, don't infer the provider.
179
179
  def transporter_for_selected_team
180
+ tunes_client = Spaceship::ConnectAPI.client.tunes_client
181
+
180
182
  generic_transporter = FastlaneCore::ItunesTransporter.new(options[:username], nil, false, options[:itc_provider])
181
- return generic_transporter unless options[:itc_provider].nil? && Spaceship::Tunes.client.teams.count > 1
183
+ return generic_transporter unless options[:itc_provider].nil? && tunes_client.teams.count > 1
182
184
 
183
185
  begin
184
- team = Spaceship::Tunes.client.teams.find { |t| t['contentProvider']['contentProviderId'].to_s == Spaceship::Tunes.client.team_id }
186
+ team = tunes_client.teams.find { |t| t['contentProvider']['contentProviderId'].to_s == tunes_client.team_id }
185
187
  name = team['contentProvider']['name']
186
188
  provider_id = generic_transporter.provider_ids[name]
187
189
  UI.verbose("Inferred provider id #{provider_id} for team #{name}.")
188
190
  return FastlaneCore::ItunesTransporter.new(options[:username], nil, false, provider_id)
189
191
  rescue => ex
190
- UI.verbose("Couldn't infer a provider short name for team with id #{Spaceship::Tunes.client.team_id} automatically: #{ex}. Proceeding without provider short name.")
192
+ 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
193
  return generic_transporter
192
194
  end
193
195
  end