fastlane 2.233.1 → 2.235.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 (104) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +105 -104
  3. data/bin/fastlane +2 -2
  4. data/deliver/lib/deliver/app_clip_header_image.rb +18 -0
  5. data/deliver/lib/deliver/commands_generator.rb +17 -0
  6. data/deliver/lib/deliver/download_app_clip_header_images.rb +64 -0
  7. data/deliver/lib/deliver/languages.rb +36 -3
  8. data/deliver/lib/deliver/loader.rb +41 -0
  9. data/deliver/lib/deliver/options.rb +23 -0
  10. data/deliver/lib/deliver/runner.rb +8 -0
  11. data/deliver/lib/deliver/upload_app_clip_default_experience_header_images.rb +188 -0
  12. data/deliver/lib/deliver/upload_app_clip_default_experience_metadata.rb +229 -0
  13. data/deliver/lib/deliver/upload_metadata.rb +71 -7
  14. data/deliver/lib/deliver/upload_price_tier.rb +4 -2
  15. data/deliver/lib/deliver/upload_screenshots.rb +1 -1
  16. data/fastlane/lib/fastlane/actions/app_store_connect_api_key.rb +2 -2
  17. data/fastlane/lib/fastlane/actions/appium.rb +1 -1
  18. data/fastlane/lib/fastlane/actions/appledoc.rb +1 -1
  19. data/fastlane/lib/fastlane/actions/create_app_on_managed_play_store.rb +2 -2
  20. data/fastlane/lib/fastlane/actions/docs/upload_to_app_store.md.erb +100 -0
  21. data/fastlane/lib/fastlane/actions/gcovr.rb +1 -1
  22. data/fastlane/lib/fastlane/actions/get_version_number.rb +2 -12
  23. data/fastlane/lib/fastlane/actions/increment_version_number.rb +33 -0
  24. data/fastlane/lib/fastlane/actions/install_on_device.rb +1 -1
  25. data/fastlane/lib/fastlane/actions/ipa.rb +2 -2
  26. data/fastlane/lib/fastlane/actions/lcov.rb +1 -1
  27. data/fastlane/lib/fastlane/actions/notarize.rb +1 -148
  28. data/fastlane/lib/fastlane/actions/oclint.rb +1 -1
  29. data/fastlane/lib/fastlane/actions/slack.rb +9 -3
  30. data/fastlane/lib/fastlane/actions/sonar.rb +1 -1
  31. data/fastlane/lib/fastlane/actions/sourcedocs.rb +1 -1
  32. data/fastlane/lib/fastlane/actions/swiftlint.rb +1 -1
  33. data/fastlane/lib/fastlane/actions/testfairy.rb +1 -3
  34. data/fastlane/lib/fastlane/actions/validate_play_store_json_key.rb +4 -4
  35. data/fastlane/lib/fastlane/actions/xcodebuild.rb +1 -1
  36. data/fastlane/lib/fastlane/actions/xctool.rb +1 -1
  37. data/fastlane/lib/fastlane/documentation/markdown_docs_generator.rb +3 -1
  38. data/fastlane/lib/fastlane/helper/xcodebuild_formatter_helper.rb +1 -1
  39. data/fastlane/lib/fastlane/helper/xcodeproj_helper.rb +155 -0
  40. data/fastlane/lib/fastlane/helper/xcodes_helper.rb +1 -1
  41. data/fastlane/lib/fastlane/notification/slack.rb +9 -4
  42. data/fastlane/lib/fastlane/plugins/template/%gem_name%.gemspec.erb +1 -1
  43. data/fastlane/lib/fastlane/plugins/template/.rubocop.yml +2 -1
  44. data/fastlane/lib/fastlane/swift_runner_upgrader.rb +1 -1
  45. data/fastlane/lib/fastlane/version.rb +2 -2
  46. data/fastlane/swift/Deliverfile.swift +1 -1
  47. data/fastlane/swift/DeliverfileProtocol.swift +36 -1
  48. data/fastlane/swift/Fastlane.swift +109 -29
  49. data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.pbxproj +4 -4
  50. data/fastlane/swift/Gymfile.swift +1 -1
  51. data/fastlane/swift/GymfileProtocol.swift +1 -1
  52. data/fastlane/swift/Matchfile.swift +1 -1
  53. data/fastlane/swift/MatchfileProtocol.swift +1 -1
  54. data/fastlane/swift/Precheckfile.swift +1 -1
  55. data/fastlane/swift/PrecheckfileProtocol.swift +1 -1
  56. data/fastlane/swift/Scanfile.swift +1 -1
  57. data/fastlane/swift/ScanfileProtocol.swift +1 -1
  58. data/fastlane/swift/Screengrabfile.swift +1 -1
  59. data/fastlane/swift/ScreengrabfileProtocol.swift +1 -1
  60. data/fastlane/swift/Snapshotfile.swift +1 -1
  61. data/fastlane/swift/SnapshotfileProtocol.swift +1 -1
  62. data/fastlane_core/lib/fastlane_core/clipboard.rb +1 -1
  63. data/fastlane_core/lib/fastlane_core/command_executor.rb +13 -5
  64. data/fastlane_core/lib/fastlane_core/helper.rb +14 -1
  65. data/fastlane_core/lib/fastlane_core/languages.rb +1 -1
  66. data/frameit/lib/frameit/dependency_checker.rb +1 -1
  67. data/frameit/lib/frameit/device_types.rb +18 -0
  68. data/frameit/lib/frameit/editor.rb +2 -2
  69. data/frameit/lib/frameit/offsets.rb +3 -2
  70. data/internal/README.md +11 -0
  71. data/match/lib/match/nuke.rb +60 -40
  72. data/match/lib/match/storage/git_storage.rb +1 -1
  73. data/pilot/lib/pilot/build_manager.rb +69 -2
  74. data/pilot/lib/pilot/options.rb +23 -0
  75. data/produce/lib/produce/available_default_languages.rb +12 -1
  76. data/scan/lib/scan/detect_values.rb +5 -0
  77. data/screengrab/lib/screengrab/reports_generator.rb +2 -2
  78. data/screengrab/lib/screengrab/runner.rb +14 -15
  79. data/sigh/lib/assets/resign.sh +6 -10
  80. data/sigh/lib/sigh/resign.rb +2 -2
  81. data/snapshot/lib/snapshot/reports_generator.rb +9 -2
  82. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher.rb +1 -1
  83. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +9 -9
  84. data/spaceship/lib/assets/languageMapping.json +66 -0
  85. data/spaceship/lib/spaceship/connect_api/models/app.rb +14 -1
  86. data/spaceship/lib/spaceship/connect_api/models/app_clip.rb +18 -0
  87. data/spaceship/lib/spaceship/connect_api/models/app_clip_app_store_review_detail.rb +34 -0
  88. data/spaceship/lib/spaceship/connect_api/models/app_clip_default_experience.rb +43 -0
  89. data/spaceship/lib/spaceship/connect_api/models/app_clip_default_experience_localization.rb +49 -0
  90. data/spaceship/lib/spaceship/connect_api/models/app_clip_header_image.rb +159 -0
  91. data/spaceship/lib/spaceship/connect_api/models/app_store_version.rb +5 -1
  92. data/spaceship/lib/spaceship/connect_api/models/beta_app_clip_invocation.rb +44 -0
  93. data/spaceship/lib/spaceship/connect_api/models/beta_app_clip_invocation_localization.rb +35 -0
  94. data/spaceship/lib/spaceship/connect_api/models/build_bundle.rb +1 -1
  95. data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +291 -0
  96. data/spaceship/lib/spaceship/connect_api.rb +7 -0
  97. data/spaceship/lib/spaceship/portal/portal_client.rb +1 -1
  98. data/spaceship/lib/spaceship/portal/provisioning_profile.rb +63 -25
  99. data/spaceship/lib/spaceship/two_step_or_factor_client.rb +2 -1
  100. data/supply/lib/supply/client.rb +75 -62
  101. data/supply/lib/supply/options.rb +2 -2
  102. data/supply/lib/supply/reader.rb +16 -0
  103. data/supply/lib/supply/uploader.rb +1 -1
  104. metadata +53 -41
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c0eca61fa0396713a78e6de08eaca27b99061aa3316be3f456fd34b5aea05368
4
- data.tar.gz: 1d31711ddcd3b0c745587cc2eb1adbcadefe599f40442efe06c65f4b78c50e8c
3
+ metadata.gz: 14907c8841271cfdc5ca71eeb8b413b39772478ec3691d1301fb1c4432dc9768
4
+ data.tar.gz: eaf7da1b6040142a160972fe8f42a88bf4c10912375b217877262cba144707c0
5
5
  SHA512:
6
- metadata.gz: 44249e561611f1f9cd093155561bc034e6c257abc1b8a0d45f2a7b36f8a8daf857cb0a9ec2a4efb40c056d135f595dff8313c4df157beb17ff0e7f823e37d1d9
7
- data.tar.gz: 16e33277c3dfa404406a1664e6c1cb240e2df037052e437a3f525c7943956606d67b45688af945119ec29a034ef9ba3a8bb95505217edff32831d644838f9f30
6
+ metadata.gz: 29080ed1e5e25292a2a95dd9ae6e1def90246c84d4331d78a153818fc73f8bf1f67ee7a886e0e54b67966ffcf72c462088d197f213ca5e2d71f94c701146f4db
7
+ data.tar.gz: 5bdea3d658146484366f97e4a52a301e0ec0a6aa203b616fc35676846865b27d3a9d1789991907639179268fc1b77ed24387c1ea82792e71945d17dff9af8480
data/README.md CHANGED
@@ -10,6 +10,7 @@
10
10
  [![Homebrew](https://img.shields.io/badge/dynamic/json.svg?url=https://formulae.brew.sh/api/formula/fastlane.json&query=$.versions.stable&label=homebrew)](https://formulae.brew.sh/formula/fastlane)
11
11
  [![Build Status](https://img.shields.io/circleci/project/github/fastlane/fastlane/master.svg)](https://circleci.com/gh/fastlane/fastlane)
12
12
  [![PRs welcome!](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/fastlane/fastlane/blob/master/CONTRIBUTING.md)
13
+ [![OpenCollective!](https://opencollective.com/fastlane/tiers/badge.svg)](https://opencollective.com/fastlane)
13
14
 
14
15
  _fastlane_ is a tool for iOS and Android developers to automate tedious tasks like generating screenshots, dealing with provisioning profiles, and releasing your application.
15
16
 
@@ -35,55 +36,75 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
35
36
  <!-- This table is regenerated and resorted on each release -->
36
37
  <table id='team'>
37
38
  <tr>
38
- <td id='jorge-revuelta-h'>
39
- <a href='https://github.com/minuscorp'>
40
- <img src='https://github.com/minuscorp.png' width='140px;'>
39
+ <td id='jimmy-dee'>
40
+ <a href='https://github.com/jdee'>
41
+ <img src='https://github.com/jdee.png' width='140px;'>
41
42
  </a>
42
- <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
43
+ <h4 align='center'>Jimmy Dee</h4>
43
44
  </td>
44
- <td id='łukasz-grabowski'>
45
- <a href='https://github.com/lucgrabowski'>
46
- <img src='https://github.com/lucgrabowski.png' width='140px;'>
45
+ <td id='jérôme-lacoste'>
46
+ <a href='https://github.com/lacostej'>
47
+ <img src='https://github.com/lacostej.png' width='140px;'>
47
48
  </a>
48
- <h4 align='center'>Łukasz Grabowski</h4>
49
+ <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
49
50
  </td>
50
- <td id='fumiya-nakamura'>
51
- <a href='https://github.com/nafu'>
52
- <img src='https://github.com/nafu.png' width='140px;'>
51
+ <td id='stefan-natchev'>
52
+ <a href='https://github.com/snatchev'>
53
+ <img src='https://github.com/snatchev.png' width='140px;'>
53
54
  </a>
54
- <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
55
+ <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
55
56
  </td>
56
- <td id='josh-holtz'>
57
- <a href='https://github.com/joshdholtz'>
58
- <img src='https://github.com/joshdholtz.png' width='140px;'>
57
+ <td id='kohki-miki'>
58
+ <a href='https://github.com/giginet'>
59
+ <img src='https://github.com/giginet.png' width='140px;'>
59
60
  </a>
60
- <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
61
+ <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
61
62
  </td>
62
- <td id='aaron-brager'>
63
- <a href='https://github.com/getaaron'>
64
- <img src='https://github.com/getaaron.png' width='140px;'>
63
+ <td id='iulian-onofrei'>
64
+ <a href='https://github.com/revolter'>
65
+ <img src='https://github.com/revolter.png' width='140px;'>
65
66
  </a>
66
- <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
67
+ <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
67
68
  </td>
68
69
  </tr>
69
70
  <tr>
70
- <td id='jérôme-lacoste'>
71
- <a href='https://github.com/lacostej'>
72
- <img src='https://github.com/lacostej.png' width='140px;'>
71
+ <td id='manu-wallner'>
72
+ <a href='https://github.com/milch'>
73
+ <img src='https://github.com/milch.png' width='140px;'>
73
74
  </a>
74
- <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
75
+ <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
75
76
  </td>
76
- <td id='andrew-mcburney'>
77
- <a href='https://github.com/armcburney'>
78
- <img src='https://github.com/armcburney.png' width='140px;'>
77
+ <td id='helmut-januschka'>
78
+ <a href='https://github.com/hjanuschka'>
79
+ <img src='https://github.com/hjanuschka.png' width='140px;'>
79
80
  </a>
80
- <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
81
+ <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
81
82
  </td>
82
- <td id='kohki-miki'>
83
- <a href='https://github.com/giginet'>
84
- <img src='https://github.com/giginet.png' width='140px;'>
83
+ <td id='roger-oba'>
84
+ <a href='https://github.com/rogerluan'>
85
+ <img src='https://github.com/rogerluan.png' width='140px;'>
85
86
  </a>
86
- <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
87
+ <h4 align='center'><a href='https://twitter.com/rogerluan_'>Roger Oba</a></h4>
88
+ </td>
89
+ <td id='fumiya-nakamura'>
90
+ <a href='https://github.com/nafu'>
91
+ <img src='https://github.com/nafu.png' width='140px;'>
92
+ </a>
93
+ <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
94
+ </td>
95
+ <td id='manish-rathi'>
96
+ <a href='https://github.com/crazymanish'>
97
+ <img src='https://github.com/crazymanish.png' width='140px;'>
98
+ </a>
99
+ <h4 align='center'><a href='https://twitter.com/iammanishrathi'>Manish Rathi</a></h4>
100
+ </td>
101
+ </tr>
102
+ <tr>
103
+ <td id='max-ott'>
104
+ <a href='https://github.com/max-ott'>
105
+ <img src='https://github.com/max-ott.png' width='140px;'>
106
+ </a>
107
+ <h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
87
108
  </td>
88
109
  <td id='olivier-halligon'>
89
110
  <a href='https://github.com/AliSoftware'>
@@ -91,19 +112,17 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
91
112
  </a>
92
113
  <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
93
114
  </td>
94
- <td id='connor-tumbleson'>
95
- <a href='https://github.com/ibotpeaches'>
96
- <img src='https://github.com/ibotpeaches.png' width='140px;'>
115
+ <td id='daniel-jankowski'>
116
+ <a href='https://github.com/mollyIV'>
117
+ <img src='https://github.com/mollyIV.png' width='140px;'>
97
118
  </a>
98
- <h4 align='center'><a href='https://twitter.com/ibotpeaches'>Connor Tumbleson</a></h4>
119
+ <h4 align='center'><a href='https://twitter.com/mollyIV'>Daniel Jankowski</a></h4>
99
120
  </td>
100
- </tr>
101
- <tr>
102
- <td id='satoshi-namai'>
103
- <a href='https://github.com/ainame'>
104
- <img src='https://github.com/ainame.png' width='140px;'>
121
+ <td id='andrew-mcburney'>
122
+ <a href='https://github.com/armcburney'>
123
+ <img src='https://github.com/armcburney.png' width='140px;'>
105
124
  </a>
106
- <h4 align='center'><a href='https://twitter.com/ainame'>Satoshi Namai</a></h4>
125
+ <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
107
126
  </td>
108
127
  <td id='maksym-grebenets'>
109
128
  <a href='https://github.com/mgrebenets'>
@@ -111,37 +130,51 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
111
130
  </a>
112
131
  <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
113
132
  </td>
114
- <td id='stefan-natchev'>
115
- <a href='https://github.com/snatchev'>
116
- <img src='https://github.com/snatchev.png' width='140px;'>
133
+ </tr>
134
+ <tr>
135
+ <td id='jorge-revuelta-h'>
136
+ <a href='https://github.com/minuscorp'>
137
+ <img src='https://github.com/minuscorp.png' width='140px;'>
117
138
  </a>
118
- <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
139
+ <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
119
140
  </td>
120
- <td id='max-ott'>
121
- <a href='https://github.com/max-ott'>
122
- <img src='https://github.com/max-ott.png' width='140px;'>
141
+ <td id='aaron-brager'>
142
+ <a href='https://github.com/getaaron'>
143
+ <img src='https://github.com/getaaron.png' width='140px;'>
123
144
  </a>
124
- <h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
145
+ <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
125
146
  </td>
126
- <td id='iulian-onofrei'>
127
- <a href='https://github.com/revolter'>
128
- <img src='https://github.com/revolter.png' width='140px;'>
147
+ <td id='josh-holtz'>
148
+ <a href='https://github.com/joshdholtz'>
149
+ <img src='https://github.com/joshdholtz.png' width='140px;'>
129
150
  </a>
130
- <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
151
+ <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
152
+ </td>
153
+ <td id='satoshi-namai'>
154
+ <a href='https://github.com/ainame'>
155
+ <img src='https://github.com/ainame.png' width='140px;'>
156
+ </a>
157
+ <h4 align='center'><a href='https://twitter.com/ainame'>Satoshi Namai</a></h4>
131
158
  </td>
132
- </tr>
133
- <tr>
134
159
  <td id='matthew-ellis'>
135
160
  <a href='https://github.com/matthewellis'>
136
161
  <img src='https://github.com/matthewellis.png' width='140px;'>
137
162
  </a>
138
163
  <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
139
164
  </td>
140
- <td id='manish-rathi'>
141
- <a href='https://github.com/crazymanish'>
142
- <img src='https://github.com/crazymanish.png' width='140px;'>
165
+ </tr>
166
+ <tr>
167
+ <td id='luka-mirosevic'>
168
+ <a href='https://github.com/lmirosevic'>
169
+ <img src='https://github.com/lmirosevic.png' width='140px;'>
143
170
  </a>
144
- <h4 align='center'><a href='https://twitter.com/iammanishrathi'>Manish Rathi</a></h4>
171
+ <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
172
+ </td>
173
+ <td id='connor-tumbleson'>
174
+ <a href='https://github.com/ibotpeaches'>
175
+ <img src='https://github.com/ibotpeaches.png' width='140px;'>
176
+ </a>
177
+ <h4 align='center'><a href='https://twitter.com/ibotpeaches'>Connor Tumbleson</a></h4>
145
178
  </td>
146
179
  <td id='danielle-tomlinson'>
147
180
  <a href='https://github.com/endocrimes'>
@@ -149,63 +182,31 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
149
182
  </a>
150
183
  <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
151
184
  </td>
152
- <td id='joshua-liebowitz'>
153
- <a href='https://github.com/taquitos'>
154
- <img src='https://github.com/taquitos.png' width='140px;'>
155
- </a>
156
- <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
157
- </td>
158
- <td id='jan-piotrowski'>
159
- <a href='https://github.com/janpio'>
160
- <img src='https://github.com/janpio.png' width='140px;'>
161
- </a>
162
- <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
163
- </td>
164
- </tr>
165
- <tr>
166
- <td id='helmut-januschka'>
167
- <a href='https://github.com/hjanuschka'>
168
- <img src='https://github.com/hjanuschka.png' width='140px;'>
169
- </a>
170
- <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
171
- </td>
172
185
  <td id='felix-krause'>
173
186
  <a href='https://github.com/KrauseFx'>
174
187
  <img src='https://github.com/KrauseFx.png' width='140px;'>
175
188
  </a>
176
189
  <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
177
190
  </td>
178
- <td id='jimmy-dee'>
179
- <a href='https://github.com/jdee'>
180
- <img src='https://github.com/jdee.png' width='140px;'>
181
- </a>
182
- <h4 align='center'>Jimmy Dee</h4>
183
- </td>
184
- <td id='daniel-jankowski'>
185
- <a href='https://github.com/mollyIV'>
186
- <img src='https://github.com/mollyIV.png' width='140px;'>
187
- </a>
188
- <h4 align='center'><a href='https://twitter.com/mollyIV'>Daniel Jankowski</a></h4>
189
- </td>
190
- <td id='manu-wallner'>
191
- <a href='https://github.com/milch'>
192
- <img src='https://github.com/milch.png' width='140px;'>
191
+ <td id='joshua-liebowitz'>
192
+ <a href='https://github.com/taquitos'>
193
+ <img src='https://github.com/taquitos.png' width='140px;'>
193
194
  </a>
194
- <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
195
+ <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
195
196
  </td>
196
197
  </tr>
197
198
  <tr>
198
- <td id='luka-mirosevic'>
199
- <a href='https://github.com/lmirosevic'>
200
- <img src='https://github.com/lmirosevic.png' width='140px;'>
199
+ <td id='jan-piotrowski'>
200
+ <a href='https://github.com/janpio'>
201
+ <img src='https://github.com/janpio.png' width='140px;'>
201
202
  </a>
202
- <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
203
+ <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
203
204
  </td>
204
- <td id='roger-oba'>
205
- <a href='https://github.com/rogerluan'>
206
- <img src='https://github.com/rogerluan.png' width='140px;'>
205
+ <td id='łukasz-grabowski'>
206
+ <a href='https://github.com/lucgrabowski'>
207
+ <img src='https://github.com/lucgrabowski.png' width='140px;'>
207
208
  </a>
208
- <h4 align='center'><a href='https://twitter.com/rogerluan_'>Roger Oba</a></h4>
209
+ <h4 align='center'>Łukasz Grabowski</h4>
209
210
  </td>
210
211
  </table>
211
212
 
data/bin/fastlane CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- if RUBY_VERSION < '2.7.0'
4
- abort("fastlane requires Ruby 2.7.0 or higher")
3
+ if RUBY_VERSION < '3.0.0'
4
+ abort("fastlane requires Ruby 3.0.0 or higher")
5
5
  end
6
6
 
7
7
  def self.windows?
@@ -0,0 +1,18 @@
1
+ require 'fastimage'
2
+
3
+ require_relative 'module'
4
+
5
+ module Deliver
6
+ # AppClipHeaderImage represents one app clip header image for one specific locale.
7
+ class AppClipHeaderImage
8
+ attr_accessor :path
9
+ attr_accessor :language
10
+
11
+ # @param path (String) path to the app clip header image file
12
+ # @param language (String) Language of this app clip header image (e.g. en-US)
13
+ def initialize(path, language)
14
+ self.path = path
15
+ self.language = language
16
+ end
17
+ end
18
+ end
@@ -3,6 +3,7 @@ require 'fastlane/version'
3
3
  require 'fastlane_core/ui/help_formatter'
4
4
 
5
5
  require_relative 'download_screenshots'
6
+ require_relative 'download_app_clip_header_images'
6
7
  require_relative 'options'
7
8
  require_relative 'module'
8
9
  require_relative 'generate_summary'
@@ -152,6 +153,22 @@ module Deliver
152
153
  end
153
154
  end
154
155
 
156
+ command :download_app_clip_header_images do |c|
157
+ c.syntax = 'fastlane deliver download_app_clip_header_images'
158
+ c.description = "Downloads all existing app clip header images from App Store Connect and stores them in the app_clip_header_images folder"
159
+
160
+ FastlaneCore::CommanderGenerator.new.generate(deliverfile_options, command: c)
161
+
162
+ c.action do |args, options|
163
+ options = FastlaneCore::Configuration.create(deliverfile_options(skip_verification: true), options.__hash__)
164
+ options.load_configuration_file("Deliverfile")
165
+ Deliver::Runner.new(options, skip_version: true) # to login...
166
+ containing = FastlaneCore::Helper.fastlane_enabled_folder_path
167
+ path = options[:app_clip_header_images_path] || File.join(containing, 'app_clip_header_images')
168
+ Deliver::DownloadAppClipHeaderImages.run(options, path)
169
+ end
170
+ end
171
+
155
172
  command :download_metadata do |c|
156
173
  c.syntax = 'fastlane deliver download_metadata'
157
174
  c.description = "Downloads existing metadata and stores it locally. This overwrites the local files."
@@ -0,0 +1,64 @@
1
+ require_relative 'module'
2
+ require 'spaceship'
3
+
4
+ module Deliver
5
+ class DownloadAppClipHeaderImages
6
+ def self.run(options, path)
7
+ UI.message("Downloading all existing app clip header images...")
8
+ download(options, path)
9
+ UI.success("Successfully downloaded all existing app clip header images")
10
+ rescue => ex
11
+ UI.error(ex)
12
+ UI.error("Couldn't download already existing app clip header images from App Store Connect.")
13
+ end
14
+
15
+ def self.download(options, folder_path)
16
+ app = Deliver.cache[:app]
17
+
18
+ platform = Spaceship::ConnectAPI::Platform.map(options[:platform])
19
+ if options[:use_live_version]
20
+ version = app.get_live_app_store_version(platform: platform, includes: Spaceship::ConnectAPI::AppStoreVersion::ESSENTIAL_INCLUDES + ",appClipDefaultExperience")
21
+ UI.user_error!("Could not find a live version on App Store Connect. Try using '--use_live_version false'") if version.nil?
22
+ else
23
+ version = app.get_edit_app_store_version(platform: platform, includes: Spaceship::ConnectAPI::AppStoreVersion::ESSENTIAL_INCLUDES + ",appClipDefaultExperience")
24
+ UI.user_error!("Could not find an edit version on App Store Connect. Try using '--use_live_version true'") if version.nil?
25
+ end
26
+
27
+ default_experience = version.app_clip_default_experience
28
+ UI.user_error!("Cannot download app clip header images if no default experience exists for version '#{version.version_string}'") unless default_experience
29
+
30
+ localizations = Spaceship::ConnectAPI::AppClipDefaultExperienceLocalization.find_all(app_clip_default_experience_id: default_experience.id, includes: 'appClipHeaderImage')
31
+
32
+ threads = []
33
+ localizations.each do |localization|
34
+ threads << Thread.new do
35
+ download_app_clip_header_image(folder_path, localization)
36
+ end
37
+ end
38
+ threads.each(&:join)
39
+ end
40
+
41
+ def self.download_app_clip_header_image(folder_path, localization)
42
+ language = localization.locale
43
+ app_clip_header_image = localization.app_clip_header_image
44
+
45
+ file_name = app_clip_header_image.file_name
46
+ original_file_extension = File.extname(file_name).strip.downcase[1..-1]
47
+
48
+ url = app_clip_header_image.image_asset_url(type: original_file_extension)
49
+ return if url.nil?
50
+
51
+ UI.message("Downloading existing app clip header image '#{file_name}' for language '#{language}'")
52
+
53
+ containing_folder = File.join(folder_path, language)
54
+ begin
55
+ FileUtils.mkdir_p(containing_folder)
56
+ rescue
57
+ # if it's already there
58
+ end
59
+
60
+ path = File.join(containing_folder, file_name)
61
+ File.binwrite(path, FastlaneCore::Helper.open_uri(url).read)
62
+ end
63
+ end
64
+ end
@@ -1,7 +1,40 @@
1
+ require 'fastlane_core/languages'
2
+
1
3
  module Deliver
2
4
  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 available)
5
- ALL_LANGUAGES = %w[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]
5
+ ALL_LANGUAGES = FastlaneCore::Languages::ALL_LANGUAGES
6
+
7
+ # Detects all enabled languages from various sources
8
+ # @param options [Hash] The options hash containing language settings
9
+ # @param localized_values_keys [Array<Symbol>] Keys to check for localized values in options
10
+ # @param metadata_path [String, nil] Path to metadata folder to check for language folders
11
+ # @param ignore_validation [Boolean] Whether to ignore language directory validation
12
+ # @return [Array<String>] List of unique enabled language codes
13
+ def self.detect_languages(options:, localized_values_keys: [], metadata_path: nil, ignore_validation: false)
14
+ require_relative 'loader'
15
+
16
+ enabled_languages = options[:languages] || []
17
+
18
+ # Get all languages used in existing localized settings
19
+ localized_values_keys.each do |key|
20
+ current = options[key]
21
+ next unless current && current.kind_of?(Hash)
22
+ current.each do |language, value|
23
+ enabled_languages << language unless enabled_languages.include?(language)
24
+ end
25
+ end
26
+
27
+ # Check folder list if metadata_path is provided (an empty folder signifies a language is required)
28
+ if metadata_path
29
+ Loader.language_folders(metadata_path, ignore_validation).each do |lang_folder|
30
+ enabled_languages << lang_folder.basename unless enabled_languages.include?(lang_folder.basename)
31
+ end
32
+ end
33
+
34
+ # Mapping to strings because :default symbol can be passed in
35
+ enabled_languages
36
+ .map(&:to_s)
37
+ .uniq
38
+ end
6
39
  end
7
40
  end
@@ -1,6 +1,7 @@
1
1
  require_relative 'module'
2
2
  require_relative 'app_screenshot'
3
3
  require_relative 'app_screenshot_validator'
4
+ require_relative 'app_clip_header_image'
4
5
  require_relative 'upload_metadata'
5
6
  require_relative 'languages'
6
7
 
@@ -109,6 +110,46 @@ module Deliver
109
110
  valid_screenshots
110
111
  end
111
112
 
113
+ # Returns the list of valid app clip header images. When detecting invalid header images, this
114
+ # will cause an error. There may only be a max of one image per language and each image must be
115
+ # exactly 1800x1200.
116
+ #
117
+ # @param root [String] A directory path
118
+ # @param ignore_validation [String] Set false not to raise the error when
119
+ # finding invalid folder name @return [Array<Deliver::AppClipHeaderImage>]
120
+ # The list of AppClipHeaderImage that exists under given `root` directory
121
+ def self.load_app_clip_header_images(root, ignore_validation)
122
+ language_folders_list = language_folders(root, ignore_validation, true)
123
+
124
+ # Load images from all language folders (including default)
125
+ app_clip_header_images = language_folders_list.flat_map do |language_folder|
126
+ paths = language_folder.file_paths
127
+ paths.map { |path| AppClipHeaderImage.new(path, language_folder.language) }
128
+ end
129
+
130
+ # validate the header images are 1800x1200 in size
131
+ app_clip_header_images.each do |header_image|
132
+ size = FastImage.size(header_image.path)
133
+ if size.nil?
134
+ UI.user_error!("Unable to read app clip header image file: #{header_image.path}")
135
+ end
136
+ size = size.join('x')
137
+ unless size.eql?("1800x1200")
138
+ UI.user_error!("App clip header images must be exactly 1800x1200 in size. Offending image has size #{size}: '#{header_image.path}'")
139
+ end
140
+ end
141
+
142
+ # validate there is only one header image per language
143
+ # Filter out nil languages (e.g., from default folder) before validation
144
+ app_clip_header_images.map(&:language).compact.each do |language|
145
+ if app_clip_header_images.find_all { |header_image| header_image.language.eql?(language) }.length > 1
146
+ UI.user_error!("There can only be one app clip header image per language. The language #{language} has more than one image.")
147
+ end
148
+ end
149
+
150
+ app_clip_header_images
151
+ end
152
+
112
153
  # Returns the list of language folders
113
154
  #
114
155
  # @param roort [String] A directory path to get the list of language folders
@@ -127,6 +127,14 @@ module Deliver
127
127
  env_name: "DELIVER_SCREENSHOTS_PATH",
128
128
  description: "Path to the folder containing the screenshots",
129
129
  optional: true),
130
+ FastlaneCore::ConfigItem.new(key: :app_clip_header_images_path,
131
+ env_name: "DELIVER_APP_CLIP_HEADER_IMAGES_PATH",
132
+ description: "Path to the folder containing the app clip header images",
133
+ optional: true),
134
+ FastlaneCore::ConfigItem.new(key: :app_clip_default_experience_metadata_path,
135
+ env_name: "DELIVER_APP_CLIP_DEFAULT_EXPERIENCE_METADATA_PATH",
136
+ description: "Path to the folder containing the app clip default experience metadata",
137
+ optional: true),
130
138
 
131
139
  # app previews (videos)
132
140
  FastlaneCore::ConfigItem.new(key: :app_previews_path,
@@ -404,6 +412,10 @@ module Deliver
404
412
  description: "Metadata: A hash containing the review information",
405
413
  optional: true,
406
414
  type: Hash),
415
+ FastlaneCore::ConfigItem.new(key: :app_clip_review_information,
416
+ description: "Metadata: A hash containing the app clip review information",
417
+ optional: true,
418
+ type: Hash),
407
419
  FastlaneCore::ConfigItem.new(key: :app_review_attachment_file,
408
420
  env_name: "DELIVER_APP_REVIEW_ATTACHMENT_FILE",
409
421
  description: "Metadata: Path to the app review attachment file",
@@ -484,6 +496,17 @@ module Deliver
484
496
  optional: true,
485
497
  default_value: true),
486
498
 
499
+ # app clip default experience
500
+ FastlaneCore::ConfigItem.new(key: :app_clip_default_experience_subtitle,
501
+ env_name: "DELIVER_APP_CLIP_DEFAULT_EXPERIENCE_SUBTITLE",
502
+ description: "The localized subtitle for the default app clip experience",
503
+ optional: true,
504
+ type: Hash),
505
+ FastlaneCore::ConfigItem.new(key: :app_clip_default_experience_action,
506
+ env_name: "DELIVER_APP_CLIP_DEFAULT_EXPERIENCE_ACTION",
507
+ description: "Action for the default app clip experience (OPEN, VIEW, PLAY)",
508
+ optional: true),
509
+
487
510
  # internal
488
511
  FastlaneCore::ConfigItem.new(key: :app,
489
512
  short_option: "-p",
@@ -9,6 +9,8 @@ require_relative 'html_generator'
9
9
  require_relative 'submit_for_review'
10
10
  require_relative 'upload_price_tier'
11
11
  require_relative 'upload_metadata'
12
+ require_relative 'upload_app_clip_default_experience_metadata'
13
+ require_relative 'upload_app_clip_default_experience_header_images'
12
14
  require_relative 'upload_screenshots'
13
15
  require_relative 'sync_screenshots'
14
16
  require_relative 'sync_app_previews'
@@ -136,6 +138,12 @@ module Deliver
136
138
 
137
139
  # Upload all metadata, screenshots, pricing information, etc. to App Store Connect
138
140
  def upload_metadata
141
+ # App clip experience metadata upload must happen before the upload metadata step. The app
142
+ # clip app store review detail upload depends on there being a valid app clip default
143
+ # experience on the edit version.
144
+ UploadAppClipDefaultExperienceMetadata.new.upload_metadata(options)
145
+ UploadAppClipDefaultExperienceHeaderImages.new.find_and_upload(options)
146
+
139
147
  upload_metadata = UploadMetadata.new(options)
140
148
  upload_screenshots = UploadScreenshots.new
141
149