fastlane_hotfix 2.165.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 (868) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +1 -0
  3. data/LICENSE +21 -0
  4. data/README.md +208 -0
  5. data/bin/bin-proxy +19 -0
  6. data/bin/fastlane +23 -0
  7. data/cert/README.md +17 -0
  8. data/cert/lib/cert.rb +4 -0
  9. data/cert/lib/cert/commands_generator.rb +60 -0
  10. data/cert/lib/cert/module.rb +16 -0
  11. data/cert/lib/cert/options.rb +132 -0
  12. data/cert/lib/cert/runner.rb +239 -0
  13. data/credentials_manager/README.md +64 -0
  14. data/credentials_manager/lib/credentials_manager.rb +7 -0
  15. data/credentials_manager/lib/credentials_manager/account_manager.rb +157 -0
  16. data/credentials_manager/lib/credentials_manager/appfile_config.rb +196 -0
  17. data/credentials_manager/lib/credentials_manager/cli.rb +69 -0
  18. data/deliver/README.md +17 -0
  19. data/deliver/lib/assets/DeliverfileDefault +3 -0
  20. data/deliver/lib/assets/DeliverfileDefault.swift +13 -0
  21. data/deliver/lib/assets/ScreenshotsHelp +7 -0
  22. data/deliver/lib/assets/summary.html.erb +299 -0
  23. data/deliver/lib/deliver.rb +15 -0
  24. data/deliver/lib/deliver/app_screenshot.rb +354 -0
  25. data/deliver/lib/deliver/app_screenshot_iterator.rb +95 -0
  26. data/deliver/lib/deliver/commands_generator.rb +190 -0
  27. data/deliver/lib/deliver/detect_values.rb +102 -0
  28. data/deliver/lib/deliver/download_screenshots.rb +76 -0
  29. data/deliver/lib/deliver/generate_summary.rb +13 -0
  30. data/deliver/lib/deliver/html_generator.rb +78 -0
  31. data/deliver/lib/deliver/languages.rb +7 -0
  32. data/deliver/lib/deliver/loader.rb +55 -0
  33. data/deliver/lib/deliver/module.rb +18 -0
  34. data/deliver/lib/deliver/options.rb +465 -0
  35. data/deliver/lib/deliver/queue_worker.rb +49 -0
  36. data/deliver/lib/deliver/runner.rb +233 -0
  37. data/deliver/lib/deliver/setup.rb +199 -0
  38. data/deliver/lib/deliver/submit_for_review.rb +214 -0
  39. data/deliver/lib/deliver/upload_metadata.rb +688 -0
  40. data/deliver/lib/deliver/upload_price_tier.rb +40 -0
  41. data/deliver/lib/deliver/upload_screenshots.rb +333 -0
  42. data/fastlane/README.md +11 -0
  43. data/fastlane/lib/assets/ActionDetails.md.erb +106 -0
  44. data/fastlane/lib/assets/Actions.md.erb +43 -0
  45. data/fastlane/lib/assets/AppfileTemplate +6 -0
  46. data/fastlane/lib/assets/AppfileTemplate.swift +7 -0
  47. data/fastlane/lib/assets/AppfileTemplateAndroid +2 -0
  48. data/fastlane/lib/assets/DefaultFastfileTemplate +20 -0
  49. data/fastlane/lib/assets/DefaultFastfileTemplate.swift +13 -0
  50. data/fastlane/lib/assets/completions/completion.bash +23 -0
  51. data/fastlane/lib/assets/completions/completion.fish +39 -0
  52. data/fastlane/lib/assets/completions/completion.sh +12 -0
  53. data/fastlane/lib/assets/completions/completion.zsh +23 -0
  54. data/fastlane/lib/assets/custom_action_template.rb +82 -0
  55. data/fastlane/lib/assets/mailgun_html_template.erb +142 -0
  56. data/fastlane/lib/assets/report_template.xml.erb +15 -0
  57. data/fastlane/lib/assets/s3_html_template.erb +105 -0
  58. data/fastlane/lib/assets/s3_plist_template.erb +31 -0
  59. data/fastlane/lib/assets/s3_version_template.erb +4 -0
  60. data/fastlane/lib/fastlane.rb +53 -0
  61. data/fastlane/lib/fastlane/action.rb +198 -0
  62. data/fastlane/lib/fastlane/action_collector.rb +35 -0
  63. data/fastlane/lib/fastlane/actions/README.md +5 -0
  64. data/fastlane/lib/fastlane/actions/actions_helper.rb +185 -0
  65. data/fastlane/lib/fastlane/actions/adb.rb +78 -0
  66. data/fastlane/lib/fastlane/actions/adb_devices.rb +71 -0
  67. data/fastlane/lib/fastlane/actions/add_extra_platforms.rb +45 -0
  68. data/fastlane/lib/fastlane/actions/add_git_tag.rb +122 -0
  69. data/fastlane/lib/fastlane/actions/app_store_build_number.rb +249 -0
  70. data/fastlane/lib/fastlane/actions/app_store_connect_api_key.rb +134 -0
  71. data/fastlane/lib/fastlane/actions/appaloosa.rb +266 -0
  72. data/fastlane/lib/fastlane/actions/appetize.rb +188 -0
  73. data/fastlane/lib/fastlane/actions/appetize_viewing_url_generator.rb +146 -0
  74. data/fastlane/lib/fastlane/actions/appium.rb +206 -0
  75. data/fastlane/lib/fastlane/actions/appledoc.rb +226 -0
  76. data/fastlane/lib/fastlane/actions/appstore.rb +14 -0
  77. data/fastlane/lib/fastlane/actions/apteligent.rb +105 -0
  78. data/fastlane/lib/fastlane/actions/artifactory.rb +157 -0
  79. data/fastlane/lib/fastlane/actions/automatic_code_signing.rb +226 -0
  80. data/fastlane/lib/fastlane/actions/backup_file.rb +41 -0
  81. data/fastlane/lib/fastlane/actions/backup_xcarchive.rb +135 -0
  82. data/fastlane/lib/fastlane/actions/badge.rb +155 -0
  83. data/fastlane/lib/fastlane/actions/build_and_upload_to_appetize.rb +107 -0
  84. data/fastlane/lib/fastlane/actions/build_android_app.rb +14 -0
  85. data/fastlane/lib/fastlane/actions/build_app.rb +165 -0
  86. data/fastlane/lib/fastlane/actions/build_ios_app.rb +47 -0
  87. data/fastlane/lib/fastlane/actions/build_mac_app.rb +46 -0
  88. data/fastlane/lib/fastlane/actions/bundle_install.rb +156 -0
  89. data/fastlane/lib/fastlane/actions/capture_android_screenshots.rb +63 -0
  90. data/fastlane/lib/fastlane/actions/capture_ios_screenshots.rb +61 -0
  91. data/fastlane/lib/fastlane/actions/capture_screenshots.rb +14 -0
  92. data/fastlane/lib/fastlane/actions/carthage.rb +230 -0
  93. data/fastlane/lib/fastlane/actions/cert.rb +14 -0
  94. data/fastlane/lib/fastlane/actions/changelog_from_git_commits.rb +197 -0
  95. data/fastlane/lib/fastlane/actions/chatwork.rb +94 -0
  96. data/fastlane/lib/fastlane/actions/check_app_store_metadata.rb +54 -0
  97. data/fastlane/lib/fastlane/actions/clean_build_artifacts.rb +72 -0
  98. data/fastlane/lib/fastlane/actions/clean_cocoapods_cache.rb +52 -0
  99. data/fastlane/lib/fastlane/actions/clear_derived_data.rb +70 -0
  100. data/fastlane/lib/fastlane/actions/clipboard.rb +52 -0
  101. data/fastlane/lib/fastlane/actions/cloc.rb +89 -0
  102. data/fastlane/lib/fastlane/actions/cocoapods.rb +170 -0
  103. data/fastlane/lib/fastlane/actions/commit_github_file.rb +186 -0
  104. data/fastlane/lib/fastlane/actions/commit_version_bump.rb +301 -0
  105. data/fastlane/lib/fastlane/actions/copy_artifacts.rb +114 -0
  106. data/fastlane/lib/fastlane/actions/crashlytics.rb +211 -0
  107. data/fastlane/lib/fastlane/actions/create_app_on_managed_play_store.rb +174 -0
  108. data/fastlane/lib/fastlane/actions/create_app_online.rb +75 -0
  109. data/fastlane/lib/fastlane/actions/create_keychain.rb +177 -0
  110. data/fastlane/lib/fastlane/actions/create_pull_request.rb +265 -0
  111. data/fastlane/lib/fastlane/actions/danger.rb +131 -0
  112. data/fastlane/lib/fastlane/actions/debug.rb +32 -0
  113. data/fastlane/lib/fastlane/actions/default_platform.rb +47 -0
  114. data/fastlane/lib/fastlane/actions/delete_keychain.rb +68 -0
  115. data/fastlane/lib/fastlane/actions/deliver.rb +14 -0
  116. data/fastlane/lib/fastlane/actions/deploygate.rb +210 -0
  117. data/fastlane/lib/fastlane/actions/device_grid/README.md +157 -0
  118. data/fastlane/lib/fastlane/actions/docs/build_app.md +245 -0
  119. data/fastlane/lib/fastlane/actions/docs/capture_android_screenshots.md +333 -0
  120. data/fastlane/lib/fastlane/actions/docs/capture_ios_screenshots.md +371 -0
  121. data/fastlane/lib/fastlane/actions/docs/check_app_store_metadata.md +103 -0
  122. data/fastlane/lib/fastlane/actions/docs/create_app_online.md +282 -0
  123. data/fastlane/lib/fastlane/actions/docs/frame_screenshots.md +349 -0
  124. data/fastlane/lib/fastlane/actions/docs/get_certificates.md +86 -0
  125. data/fastlane/lib/fastlane/actions/docs/get_provisioning_profile.md +223 -0
  126. data/fastlane/lib/fastlane/actions/docs/get_push_certificate.md +134 -0
  127. data/fastlane/lib/fastlane/actions/docs/run_tests.md +151 -0
  128. data/fastlane/lib/fastlane/actions/docs/sync_code_signing.md +573 -0
  129. data/fastlane/lib/fastlane/actions/docs/upload_to_app_store.md.erb +725 -0
  130. data/fastlane/lib/fastlane/actions/docs/upload_to_play_store.md +203 -0
  131. data/fastlane/lib/fastlane/actions/docs/upload_to_testflight.md +250 -0
  132. data/fastlane/lib/fastlane/actions/dotgpg_environment.rb +57 -0
  133. data/fastlane/lib/fastlane/actions/download.rb +76 -0
  134. data/fastlane/lib/fastlane/actions/download_dsyms.rb +369 -0
  135. data/fastlane/lib/fastlane/actions/download_from_play_store.rb +61 -0
  136. data/fastlane/lib/fastlane/actions/dsym_zip.rb +93 -0
  137. data/fastlane/lib/fastlane/actions/echo.rb +14 -0
  138. data/fastlane/lib/fastlane/actions/ensure_bundle_exec.rb +59 -0
  139. data/fastlane/lib/fastlane/actions/ensure_env_vars.rb +58 -0
  140. data/fastlane/lib/fastlane/actions/ensure_git_branch.rb +69 -0
  141. data/fastlane/lib/fastlane/actions/ensure_git_status_clean.rb +92 -0
  142. data/fastlane/lib/fastlane/actions/ensure_no_debug_code.rb +135 -0
  143. data/fastlane/lib/fastlane/actions/ensure_xcode_version.rb +125 -0
  144. data/fastlane/lib/fastlane/actions/environment_variable.rb +77 -0
  145. data/fastlane/lib/fastlane/actions/erb.rb +96 -0
  146. data/fastlane/lib/fastlane/actions/fastlane_version.rb +15 -0
  147. data/fastlane/lib/fastlane/actions/flock.rb +82 -0
  148. data/fastlane/lib/fastlane/actions/frame_screenshots.rb +64 -0
  149. data/fastlane/lib/fastlane/actions/frameit.rb +14 -0
  150. data/fastlane/lib/fastlane/actions/gcovr.rb +163 -0
  151. data/fastlane/lib/fastlane/actions/get_build_number.rb +106 -0
  152. data/fastlane/lib/fastlane/actions/get_build_number_repository.rb +120 -0
  153. data/fastlane/lib/fastlane/actions/get_certificates.rb +77 -0
  154. data/fastlane/lib/fastlane/actions/get_github_release.rb +166 -0
  155. data/fastlane/lib/fastlane/actions/get_info_plist_value.rb +78 -0
  156. data/fastlane/lib/fastlane/actions/get_ipa_info_plist_value.rb +82 -0
  157. data/fastlane/lib/fastlane/actions/get_managed_play_store_publishing_rights.rb +120 -0
  158. data/fastlane/lib/fastlane/actions/get_provisioning_profile.rb +101 -0
  159. data/fastlane/lib/fastlane/actions/get_push_certificate.rb +87 -0
  160. data/fastlane/lib/fastlane/actions/get_version_number.rb +200 -0
  161. data/fastlane/lib/fastlane/actions/git_add.rb +93 -0
  162. data/fastlane/lib/fastlane/actions/git_branch.rb +61 -0
  163. data/fastlane/lib/fastlane/actions/git_commit.rb +80 -0
  164. data/fastlane/lib/fastlane/actions/git_pull.rb +64 -0
  165. data/fastlane/lib/fastlane/actions/git_submodule_update.rb +52 -0
  166. data/fastlane/lib/fastlane/actions/git_tag_exists.rb +74 -0
  167. data/fastlane/lib/fastlane/actions/github_api.rb +262 -0
  168. data/fastlane/lib/fastlane/actions/google_play_track_release_names.rb +74 -0
  169. data/fastlane/lib/fastlane/actions/google_play_track_version_codes.rb +77 -0
  170. data/fastlane/lib/fastlane/actions/gradle.rb +329 -0
  171. data/fastlane/lib/fastlane/actions/gym.rb +10 -0
  172. data/fastlane/lib/fastlane/actions/hg_add_tag.rb +48 -0
  173. data/fastlane/lib/fastlane/actions/hg_commit_version_bump.rb +183 -0
  174. data/fastlane/lib/fastlane/actions/hg_ensure_clean_status.rb +53 -0
  175. data/fastlane/lib/fastlane/actions/hg_push.rb +64 -0
  176. data/fastlane/lib/fastlane/actions/hipchat.rb +200 -0
  177. data/fastlane/lib/fastlane/actions/hockey.rb +406 -0
  178. data/fastlane/lib/fastlane/actions/ifttt.rb +96 -0
  179. data/fastlane/lib/fastlane/actions/import.rb +49 -0
  180. data/fastlane/lib/fastlane/actions/import_certificate.rb +77 -0
  181. data/fastlane/lib/fastlane/actions/import_from_git.rb +83 -0
  182. data/fastlane/lib/fastlane/actions/increment_build_number.rb +117 -0
  183. data/fastlane/lib/fastlane/actions/increment_version_number.rb +180 -0
  184. data/fastlane/lib/fastlane/actions/install_on_device.rb +95 -0
  185. data/fastlane/lib/fastlane/actions/install_provisioning_profile.rb +58 -0
  186. data/fastlane/lib/fastlane/actions/install_xcode_plugin.rb +91 -0
  187. data/fastlane/lib/fastlane/actions/installr.rb +132 -0
  188. data/fastlane/lib/fastlane/actions/ipa.rb +246 -0
  189. data/fastlane/lib/fastlane/actions/is_ci.rb +51 -0
  190. data/fastlane/lib/fastlane/actions/jazzy.rb +56 -0
  191. data/fastlane/lib/fastlane/actions/jira.rb +115 -0
  192. data/fastlane/lib/fastlane/actions/lane_context.rb +60 -0
  193. data/fastlane/lib/fastlane/actions/last_git_commit.rb +58 -0
  194. data/fastlane/lib/fastlane/actions/last_git_tag.rb +60 -0
  195. data/fastlane/lib/fastlane/actions/latest_testflight_build_number.rb +155 -0
  196. data/fastlane/lib/fastlane/actions/lcov.rb +102 -0
  197. data/fastlane/lib/fastlane/actions/mailgun.rb +197 -0
  198. data/fastlane/lib/fastlane/actions/make_changelog_from_jenkins.rb +81 -0
  199. data/fastlane/lib/fastlane/actions/match.rb +14 -0
  200. data/fastlane/lib/fastlane/actions/min_fastlane_version.rb +57 -0
  201. data/fastlane/lib/fastlane/actions/modify_services.rb +173 -0
  202. data/fastlane/lib/fastlane/actions/nexus_upload.rb +230 -0
  203. data/fastlane/lib/fastlane/actions/notarize.rb +193 -0
  204. data/fastlane/lib/fastlane/actions/notification.rb +75 -0
  205. data/fastlane/lib/fastlane/actions/notify.rb +40 -0
  206. data/fastlane/lib/fastlane/actions/number_of_commits.rb +75 -0
  207. data/fastlane/lib/fastlane/actions/oclint.rb +269 -0
  208. data/fastlane/lib/fastlane/actions/onesignal.rb +186 -0
  209. data/fastlane/lib/fastlane/actions/opt_out_crash_reporting.rb +33 -0
  210. data/fastlane/lib/fastlane/actions/opt_out_usage.rb +40 -0
  211. data/fastlane/lib/fastlane/actions/pem.rb +14 -0
  212. data/fastlane/lib/fastlane/actions/pilot.rb +14 -0
  213. data/fastlane/lib/fastlane/actions/pod_lib_lint.rb +189 -0
  214. data/fastlane/lib/fastlane/actions/pod_push.rb +173 -0
  215. data/fastlane/lib/fastlane/actions/podio_item.rb +217 -0
  216. data/fastlane/lib/fastlane/actions/precheck.rb +14 -0
  217. data/fastlane/lib/fastlane/actions/println.rb +14 -0
  218. data/fastlane/lib/fastlane/actions/produce.rb +14 -0
  219. data/fastlane/lib/fastlane/actions/prompt.rb +119 -0
  220. data/fastlane/lib/fastlane/actions/push_git_tags.rb +76 -0
  221. data/fastlane/lib/fastlane/actions/push_to_git_remote.rb +127 -0
  222. data/fastlane/lib/fastlane/actions/puts.rb +68 -0
  223. data/fastlane/lib/fastlane/actions/read_podspec.rb +90 -0
  224. data/fastlane/lib/fastlane/actions/recreate_schemes.rb +46 -0
  225. data/fastlane/lib/fastlane/actions/register_device.rb +151 -0
  226. data/fastlane/lib/fastlane/actions/register_devices.rb +214 -0
  227. data/fastlane/lib/fastlane/actions/reset_git_repo.rb +121 -0
  228. data/fastlane/lib/fastlane/actions/reset_simulator_contents.rb +92 -0
  229. data/fastlane/lib/fastlane/actions/resign.rb +132 -0
  230. data/fastlane/lib/fastlane/actions/restore_file.rb +44 -0
  231. data/fastlane/lib/fastlane/actions/rocket.rb +83 -0
  232. data/fastlane/lib/fastlane/actions/rsync.rb +74 -0
  233. data/fastlane/lib/fastlane/actions/ruby_version.rb +56 -0
  234. data/fastlane/lib/fastlane/actions/run_tests.rb +114 -0
  235. data/fastlane/lib/fastlane/actions/s3.rb +174 -0
  236. data/fastlane/lib/fastlane/actions/say.rb +56 -0
  237. data/fastlane/lib/fastlane/actions/scan.rb +14 -0
  238. data/fastlane/lib/fastlane/actions/scp.rb +114 -0
  239. data/fastlane/lib/fastlane/actions/screengrab.rb +14 -0
  240. data/fastlane/lib/fastlane/actions/set_build_number_repository.rb +76 -0
  241. data/fastlane/lib/fastlane/actions/set_changelog.rb +204 -0
  242. data/fastlane/lib/fastlane/actions/set_github_release.rb +274 -0
  243. data/fastlane/lib/fastlane/actions/set_info_plist_value.rb +92 -0
  244. data/fastlane/lib/fastlane/actions/set_pod_key.rb +78 -0
  245. data/fastlane/lib/fastlane/actions/setup_ci.rb +132 -0
  246. data/fastlane/lib/fastlane/actions/setup_circle_ci.rb +58 -0
  247. data/fastlane/lib/fastlane/actions/setup_jenkins.rb +202 -0
  248. data/fastlane/lib/fastlane/actions/setup_travis.rb +57 -0
  249. data/fastlane/lib/fastlane/actions/sh.rb +71 -0
  250. data/fastlane/lib/fastlane/actions/sigh.rb +14 -0
  251. data/fastlane/lib/fastlane/actions/skip_docs.rb +52 -0
  252. data/fastlane/lib/fastlane/actions/slack.rb +288 -0
  253. data/fastlane/lib/fastlane/actions/slather.rb +329 -0
  254. data/fastlane/lib/fastlane/actions/snapshot.rb +14 -0
  255. data/fastlane/lib/fastlane/actions/sonar.rb +177 -0
  256. data/fastlane/lib/fastlane/actions/spaceship_logs.rb +135 -0
  257. data/fastlane/lib/fastlane/actions/spaceship_stats.rb +73 -0
  258. data/fastlane/lib/fastlane/actions/splunkmint.rb +156 -0
  259. data/fastlane/lib/fastlane/actions/spm.rb +138 -0
  260. data/fastlane/lib/fastlane/actions/ssh.rb +162 -0
  261. data/fastlane/lib/fastlane/actions/supply.rb +14 -0
  262. data/fastlane/lib/fastlane/actions/swiftlint.rb +240 -0
  263. data/fastlane/lib/fastlane/actions/sync_code_signing.rb +109 -0
  264. data/fastlane/lib/fastlane/actions/team_id.rb +42 -0
  265. data/fastlane/lib/fastlane/actions/team_name.rb +42 -0
  266. data/fastlane/lib/fastlane/actions/testfairy.rb +285 -0
  267. data/fastlane/lib/fastlane/actions/testflight.rb +14 -0
  268. data/fastlane/lib/fastlane/actions/tryouts.rb +149 -0
  269. data/fastlane/lib/fastlane/actions/twitter.rb +89 -0
  270. data/fastlane/lib/fastlane/actions/typetalk.rb +93 -0
  271. data/fastlane/lib/fastlane/actions/unlock_keychain.rb +132 -0
  272. data/fastlane/lib/fastlane/actions/update_app_group_identifiers.rb +91 -0
  273. data/fastlane/lib/fastlane/actions/update_app_identifier.rb +124 -0
  274. data/fastlane/lib/fastlane/actions/update_code_signing_settings.rb +203 -0
  275. data/fastlane/lib/fastlane/actions/update_fastlane.rb +137 -0
  276. data/fastlane/lib/fastlane/actions/update_icloud_container_identifiers.rb +99 -0
  277. data/fastlane/lib/fastlane/actions/update_info_plist.rb +143 -0
  278. data/fastlane/lib/fastlane/actions/update_keychain_access_groups.rb +94 -0
  279. data/fastlane/lib/fastlane/actions/update_plist.rb +115 -0
  280. data/fastlane/lib/fastlane/actions/update_project_code_signing.rb +76 -0
  281. data/fastlane/lib/fastlane/actions/update_project_provisioning.rb +173 -0
  282. data/fastlane/lib/fastlane/actions/update_project_team.rb +95 -0
  283. data/fastlane/lib/fastlane/actions/update_urban_airship_configuration.rb +91 -0
  284. data/fastlane/lib/fastlane/actions/update_url_schemes.rb +123 -0
  285. data/fastlane/lib/fastlane/actions/upload_symbols_to_crashlytics.rb +231 -0
  286. data/fastlane/lib/fastlane/actions/upload_symbols_to_sentry.rb +165 -0
  287. data/fastlane/lib/fastlane/actions/upload_to_app_store.rb +67 -0
  288. data/fastlane/lib/fastlane/actions/upload_to_play_store.rb +80 -0
  289. data/fastlane/lib/fastlane/actions/upload_to_play_store_internal_app_sharing.rb +78 -0
  290. data/fastlane/lib/fastlane/actions/upload_to_testflight.rb +119 -0
  291. data/fastlane/lib/fastlane/actions/validate_play_store_json_key.rb +104 -0
  292. data/fastlane/lib/fastlane/actions/verify_build.rb +199 -0
  293. data/fastlane/lib/fastlane/actions/verify_pod_keys.rb +67 -0
  294. data/fastlane/lib/fastlane/actions/verify_xcode.rb +159 -0
  295. data/fastlane/lib/fastlane/actions/version_bump_podspec.rb +105 -0
  296. data/fastlane/lib/fastlane/actions/version_get_podspec.rb +71 -0
  297. data/fastlane/lib/fastlane/actions/xcode_install.rb +105 -0
  298. data/fastlane/lib/fastlane/actions/xcode_select.rb +68 -0
  299. data/fastlane/lib/fastlane/actions/xcode_server_get_assets.rb +312 -0
  300. data/fastlane/lib/fastlane/actions/xcodebuild.rb +641 -0
  301. data/fastlane/lib/fastlane/actions/xcov.rb +66 -0
  302. data/fastlane/lib/fastlane/actions/xctool.rb +55 -0
  303. data/fastlane/lib/fastlane/actions/xcversion.rb +55 -0
  304. data/fastlane/lib/fastlane/actions/zip.rb +120 -0
  305. data/fastlane/lib/fastlane/auto_complete.rb +82 -0
  306. data/fastlane/lib/fastlane/boolean.rb +5 -0
  307. data/fastlane/lib/fastlane/cli_tools_distributor.rb +207 -0
  308. data/fastlane/lib/fastlane/command_line_handler.rb +49 -0
  309. data/fastlane/lib/fastlane/commands_generator.rb +369 -0
  310. data/fastlane/lib/fastlane/configuration_helper.rb +26 -0
  311. data/fastlane/lib/fastlane/core_ext/bundler_monkey_patch.rb +14 -0
  312. data/fastlane/lib/fastlane/documentation/actions_list.rb +214 -0
  313. data/fastlane/lib/fastlane/documentation/docs_generator.rb +89 -0
  314. data/fastlane/lib/fastlane/documentation/markdown_docs_generator.rb +228 -0
  315. data/fastlane/lib/fastlane/environment_printer.rb +303 -0
  316. data/fastlane/lib/fastlane/erb_template_helper.rb +30 -0
  317. data/fastlane/lib/fastlane/fast_file.rb +439 -0
  318. data/fastlane/lib/fastlane/fastlane_require.rb +75 -0
  319. data/fastlane/lib/fastlane/features.rb +4 -0
  320. data/fastlane/lib/fastlane/helper/README.md +29 -0
  321. data/fastlane/lib/fastlane/helper/adb_helper.rb +66 -0
  322. data/fastlane/lib/fastlane/helper/crashlytics_helper.rb +157 -0
  323. data/fastlane/lib/fastlane/helper/dotenv_helper.rb +50 -0
  324. data/fastlane/lib/fastlane/helper/gem_helper.rb +26 -0
  325. data/fastlane/lib/fastlane/helper/git_helper.rb +137 -0
  326. data/fastlane/lib/fastlane/helper/gradle_helper.rb +62 -0
  327. data/fastlane/lib/fastlane/helper/lane_helper.rb +13 -0
  328. data/fastlane/lib/fastlane/helper/podspec_helper.rb +75 -0
  329. data/fastlane/lib/fastlane/helper/s3_client_helper.rb +78 -0
  330. data/fastlane/lib/fastlane/helper/sh_helper.rb +134 -0
  331. data/fastlane/lib/fastlane/helper/xcodeproj_helper.rb +12 -0
  332. data/fastlane/lib/fastlane/helper/xcversion_helper.rb +25 -0
  333. data/fastlane/lib/fastlane/junit_generator.rb +27 -0
  334. data/fastlane/lib/fastlane/lane.rb +97 -0
  335. data/fastlane/lib/fastlane/lane_list.rb +137 -0
  336. data/fastlane/lib/fastlane/lane_manager.rb +130 -0
  337. data/fastlane/lib/fastlane/lane_manager_base.rb +92 -0
  338. data/fastlane/lib/fastlane/markdown_table_formatter.rb +62 -0
  339. data/fastlane/lib/fastlane/new_action.rb +47 -0
  340. data/fastlane/lib/fastlane/one_off.rb +45 -0
  341. data/fastlane/lib/fastlane/other_action.rb +29 -0
  342. data/fastlane/lib/fastlane/plugins/plugin_fetcher.rb +55 -0
  343. data/fastlane/lib/fastlane/plugins/plugin_generator.rb +86 -0
  344. data/fastlane/lib/fastlane/plugins/plugin_generator_ui.rb +19 -0
  345. data/fastlane/lib/fastlane/plugins/plugin_info.rb +49 -0
  346. data/fastlane/lib/fastlane/plugins/plugin_info_collector.rb +159 -0
  347. data/fastlane/lib/fastlane/plugins/plugin_manager.rb +399 -0
  348. data/fastlane/lib/fastlane/plugins/plugin_search.rb +46 -0
  349. data/fastlane/lib/fastlane/plugins/plugin_update_manager.rb +70 -0
  350. data/fastlane/lib/fastlane/plugins/plugins.rb +12 -0
  351. data/fastlane/lib/fastlane/plugins/template/%gem_name%.gemspec.erb +35 -0
  352. data/fastlane/lib/fastlane/plugins/template/.circleci/config.yml +43 -0
  353. data/fastlane/lib/fastlane/plugins/template/.github/workflows/test.yml +29 -0
  354. data/fastlane/lib/fastlane/plugins/template/.gitignore +12 -0
  355. data/fastlane/lib/fastlane/plugins/template/.rspec +5 -0
  356. data/fastlane/lib/fastlane/plugins/template/.rubocop.yml +188 -0
  357. data/fastlane/lib/fastlane/plugins/template/.travis.yml +4 -0
  358. data/fastlane/lib/fastlane/plugins/template/Gemfile +6 -0
  359. data/fastlane/lib/fastlane/plugins/template/LICENSE.erb +21 -0
  360. data/fastlane/lib/fastlane/plugins/template/README.md.erb +52 -0
  361. data/fastlane/lib/fastlane/plugins/template/Rakefile +9 -0
  362. data/fastlane/lib/fastlane/plugins/template/fastlane/Fastfile.erb +3 -0
  363. data/fastlane/lib/fastlane/plugins/template/fastlane/Pluginfile.erb +1 -0
  364. data/fastlane/lib/fastlane/plugins/template/lib/fastlane/plugin/%plugin_name%.rb.erb +16 -0
  365. data/fastlane/lib/fastlane/plugins/template/lib/fastlane/plugin/%plugin_name%/actions/%plugin_name%_action.rb.erb +47 -0
  366. data/fastlane/lib/fastlane/plugins/template/lib/fastlane/plugin/%plugin_name%/helper/%plugin_name%_helper.rb.erb +16 -0
  367. data/fastlane/lib/fastlane/plugins/template/lib/fastlane/plugin/%plugin_name%/version.rb.erb +5 -0
  368. data/fastlane/lib/fastlane/plugins/template/spec/%plugin_name%_action_spec.rb.erb +9 -0
  369. data/fastlane/lib/fastlane/plugins/template/spec/spec_helper.rb.erb +15 -0
  370. data/fastlane/lib/fastlane/runner.rb +378 -0
  371. data/fastlane/lib/fastlane/server/action_command.rb +61 -0
  372. data/fastlane/lib/fastlane/server/action_command_return.rb +14 -0
  373. data/fastlane/lib/fastlane/server/command_executor.rb +7 -0
  374. data/fastlane/lib/fastlane/server/command_parser.rb +44 -0
  375. data/fastlane/lib/fastlane/server/control_command.rb +23 -0
  376. data/fastlane/lib/fastlane/server/json_return_value_processor.rb +72 -0
  377. data/fastlane/lib/fastlane/server/socket_server.rb +238 -0
  378. data/fastlane/lib/fastlane/server/socket_server_action_command_executor.rb +101 -0
  379. data/fastlane/lib/fastlane/setup/setup.rb +355 -0
  380. data/fastlane/lib/fastlane/setup/setup_android.rb +97 -0
  381. data/fastlane/lib/fastlane/setup/setup_ios.rb +504 -0
  382. data/fastlane/lib/fastlane/shells.rb +6 -0
  383. data/fastlane/lib/fastlane/supported_platforms.rb +28 -0
  384. data/fastlane/lib/fastlane/swift_fastlane_api_generator.rb +477 -0
  385. data/fastlane/lib/fastlane/swift_fastlane_function.rb +419 -0
  386. data/fastlane/lib/fastlane/swift_lane_manager.rb +296 -0
  387. data/fastlane/lib/fastlane/swift_runner_upgrader.rb +210 -0
  388. data/fastlane/lib/fastlane/tools.rb +33 -0
  389. data/fastlane/lib/fastlane/version.rb +6 -0
  390. data/fastlane/swift/Actions.swift +16 -0
  391. data/fastlane/swift/Appfile.swift +15 -0
  392. data/fastlane/swift/ArgumentProcessor.swift +89 -0
  393. data/fastlane/swift/ControlCommand.swift +74 -0
  394. data/fastlane/swift/Deliverfile.swift +20 -0
  395. data/fastlane/swift/DeliverfileProtocol.swift +259 -0
  396. data/fastlane/swift/Fastfile.swift +16 -0
  397. data/fastlane/swift/Fastlane.swift +9402 -0
  398. data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.pbxproj +434 -0
  399. data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  400. data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  401. data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/xcshareddata/xcschemes/FastlaneRunner.xcscheme +97 -0
  402. data/fastlane/swift/FastlaneSwiftRunner/README.txt +10 -0
  403. data/fastlane/swift/Gymfile.swift +20 -0
  404. data/fastlane/swift/GymfileProtocol.swift +187 -0
  405. data/fastlane/swift/LaneFileProtocol.swift +149 -0
  406. data/fastlane/swift/MainProcess.swift +77 -0
  407. data/fastlane/swift/Matchfile.swift +20 -0
  408. data/fastlane/swift/MatchfileProtocol.swift +187 -0
  409. data/fastlane/swift/Plugins.swift +16 -0
  410. data/fastlane/swift/Precheckfile.swift +20 -0
  411. data/fastlane/swift/PrecheckfileProtocol.swift +51 -0
  412. data/fastlane/swift/RubyCommand.swift +157 -0
  413. data/fastlane/swift/RubyCommandable.swift +43 -0
  414. data/fastlane/swift/Runner.swift +275 -0
  415. data/fastlane/swift/RunnerArgument.swift +20 -0
  416. data/fastlane/swift/Scanfile.swift +20 -0
  417. data/fastlane/swift/ScanfileProtocol.swift +263 -0
  418. data/fastlane/swift/Screengrabfile.swift +20 -0
  419. data/fastlane/swift/ScreengrabfileProtocol.swift +99 -0
  420. data/fastlane/swift/Snapshotfile.swift +20 -0
  421. data/fastlane/swift/SnapshotfileProtocol.swift +187 -0
  422. data/fastlane/swift/SocketClient.swift +327 -0
  423. data/fastlane/swift/SocketClientDelegateProtocol.swift +21 -0
  424. data/fastlane/swift/SocketResponse.swift +82 -0
  425. data/fastlane/swift/formatting/Brewfile +1 -0
  426. data/fastlane/swift/formatting/Brewfile.lock.json +47 -0
  427. data/fastlane/swift/formatting/Rakefile +18 -0
  428. data/fastlane/swift/main.swift +47 -0
  429. data/fastlane/swift/upgrade_manifest.json +1 -0
  430. data/fastlane_core/README.md +79 -0
  431. data/fastlane_core/lib/assets/XMLTemplate.xml.erb +12 -0
  432. data/fastlane_core/lib/fastlane_core.rb +46 -0
  433. data/fastlane_core/lib/fastlane_core/analytics/action_completion_context.rb +34 -0
  434. data/fastlane_core/lib/fastlane_core/analytics/action_launch_context.rb +38 -0
  435. data/fastlane_core/lib/fastlane_core/analytics/analytics_event_builder.rb +23 -0
  436. data/fastlane_core/lib/fastlane_core/analytics/analytics_ingester_client.rb +54 -0
  437. data/fastlane_core/lib/fastlane_core/analytics/analytics_session.rb +70 -0
  438. data/fastlane_core/lib/fastlane_core/analytics/app_identifier_guesser.rb +64 -0
  439. data/fastlane_core/lib/fastlane_core/android_package_name_guesser.rb +79 -0
  440. data/fastlane_core/lib/fastlane_core/build_watcher.rb +96 -0
  441. data/fastlane_core/lib/fastlane_core/cert_checker.rb +144 -0
  442. data/fastlane_core/lib/fastlane_core/command_executor.rb +100 -0
  443. data/fastlane_core/lib/fastlane_core/configuration/commander_generator.rb +103 -0
  444. data/fastlane_core/lib/fastlane_core/configuration/config_item.rb +321 -0
  445. data/fastlane_core/lib/fastlane_core/configuration/configuration.rb +332 -0
  446. data/fastlane_core/lib/fastlane_core/configuration/configuration_file.rb +182 -0
  447. data/fastlane_core/lib/fastlane_core/core_ext/cfpropertylist.rb +23 -0
  448. data/fastlane_core/lib/fastlane_core/core_ext/shellwords.rb +63 -0
  449. data/fastlane_core/lib/fastlane_core/core_ext/string.rb +17 -0
  450. data/fastlane_core/lib/fastlane_core/device_manager.rb +374 -0
  451. data/fastlane_core/lib/fastlane_core/env.rb +9 -0
  452. data/fastlane_core/lib/fastlane_core/fastlane_folder.rb +72 -0
  453. data/fastlane_core/lib/fastlane_core/fastlane_pty.rb +57 -0
  454. data/fastlane_core/lib/fastlane_core/feature/feature.rb +51 -0
  455. data/fastlane_core/lib/fastlane_core/features.rb +4 -0
  456. data/fastlane_core/lib/fastlane_core/globals.rb +27 -0
  457. data/fastlane_core/lib/fastlane_core/helper.rb +437 -0
  458. data/fastlane_core/lib/fastlane_core/ios_app_identifier_guesser.rb +112 -0
  459. data/fastlane_core/lib/fastlane_core/ipa_file_analyser.rb +63 -0
  460. data/fastlane_core/lib/fastlane_core/ipa_upload_package_builder.rb +52 -0
  461. data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +595 -0
  462. data/fastlane_core/lib/fastlane_core/keychain_importer.rb +120 -0
  463. data/fastlane_core/lib/fastlane_core/languages.rb +16 -0
  464. data/fastlane_core/lib/fastlane_core/module.rb +31 -0
  465. data/fastlane_core/lib/fastlane_core/pkg_file_analyser.rb +51 -0
  466. data/fastlane_core/lib/fastlane_core/pkg_upload_package_builder.rb +48 -0
  467. data/fastlane_core/lib/fastlane_core/print_table.rb +131 -0
  468. data/fastlane_core/lib/fastlane_core/project.rb +509 -0
  469. data/fastlane_core/lib/fastlane_core/provisioning_profile.rb +124 -0
  470. data/fastlane_core/lib/fastlane_core/string_filters.rb +51 -0
  471. data/fastlane_core/lib/fastlane_core/swag.rb +85 -0
  472. data/fastlane_core/lib/fastlane_core/tag_version.rb +31 -0
  473. data/fastlane_core/lib/fastlane_core/test_parser.rb +107 -0
  474. data/fastlane_core/lib/fastlane_core/ui/disable_colors.rb +17 -0
  475. data/fastlane_core/lib/fastlane_core/ui/errors.rb +1 -0
  476. data/fastlane_core/lib/fastlane_core/ui/errors/fastlane_common_error.rb +19 -0
  477. data/fastlane_core/lib/fastlane_core/ui/errors/fastlane_crash.rb +11 -0
  478. data/fastlane_core/lib/fastlane_core/ui/errors/fastlane_error.rb +25 -0
  479. data/fastlane_core/lib/fastlane_core/ui/errors/fastlane_exception.rb +19 -0
  480. data/fastlane_core/lib/fastlane_core/ui/errors/fastlane_shell_error.rb +11 -0
  481. data/fastlane_core/lib/fastlane_core/ui/fastlane_runner.rb +294 -0
  482. data/fastlane_core/lib/fastlane_core/ui/github_issue_inspector_reporter.rb +62 -0
  483. data/fastlane_core/lib/fastlane_core/ui/implementations/shell.rb +159 -0
  484. data/fastlane_core/lib/fastlane_core/ui/interface.rb +205 -0
  485. data/fastlane_core/lib/fastlane_core/ui/ui.rb +26 -0
  486. data/fastlane_core/lib/fastlane_core/update_checker/changelog.rb +37 -0
  487. data/fastlane_core/lib/fastlane_core/update_checker/update_checker.rb +109 -0
  488. data/frameit/README.md +17 -0
  489. data/frameit/lib/assets/empty.png +0 -0
  490. data/frameit/lib/frameit.rb +13 -0
  491. data/frameit/lib/frameit/commands_generator.rb +140 -0
  492. data/frameit/lib/frameit/config_parser.rb +136 -0
  493. data/frameit/lib/frameit/dependency_checker.rb +22 -0
  494. data/frameit/lib/frameit/device.rb +90 -0
  495. data/frameit/lib/frameit/device_types.rb +144 -0
  496. data/frameit/lib/frameit/editor.rb +560 -0
  497. data/frameit/lib/frameit/frame_downloader.rb +85 -0
  498. data/frameit/lib/frameit/mac_editor.rb +35 -0
  499. data/frameit/lib/frameit/module.rb +42 -0
  500. data/frameit/lib/frameit/offsets.rb +28 -0
  501. data/frameit/lib/frameit/options.rb +112 -0
  502. data/frameit/lib/frameit/runner.rb +97 -0
  503. data/frameit/lib/frameit/screenshot.rb +134 -0
  504. data/frameit/lib/frameit/strings_parser.rb +46 -0
  505. data/frameit/lib/frameit/template_finder.rb +45 -0
  506. data/frameit/lib/frameit/trim_box.rb +35 -0
  507. data/gym/README.md +17 -0
  508. data/gym/lib/assets/GymfileTemplate +13 -0
  509. data/gym/lib/assets/GymfileTemplate.swift +13 -0
  510. data/gym/lib/assets/wrap_xcodebuild/xcbuild-safe.sh +61 -0
  511. data/gym/lib/gym.rb +9 -0
  512. data/gym/lib/gym/code_signing_mapping.rb +210 -0
  513. data/gym/lib/gym/commands_generator.rb +78 -0
  514. data/gym/lib/gym/detect_values.rb +206 -0
  515. data/gym/lib/gym/error_handler.rb +306 -0
  516. data/gym/lib/gym/generators/README.md +1 -0
  517. data/gym/lib/gym/generators/build_command_generator.rb +147 -0
  518. data/gym/lib/gym/generators/package_command_generator.rb +68 -0
  519. data/gym/lib/gym/generators/package_command_generator_xcode7.rb +232 -0
  520. data/gym/lib/gym/manager.rb +22 -0
  521. data/gym/lib/gym/module.rb +74 -0
  522. data/gym/lib/gym/options.rb +286 -0
  523. data/gym/lib/gym/runner.rb +365 -0
  524. data/gym/lib/gym/xcode.rb +27 -0
  525. data/gym/lib/gym/xcodebuild_fixes/README.md +9 -0
  526. data/gym/lib/gym/xcodebuild_fixes/generic_archive_fix.rb +35 -0
  527. data/match/README.md +17 -0
  528. data/match/lib/assets/MatchfileTemplate +11 -0
  529. data/match/lib/assets/MatchfileTemplate.swift +9 -0
  530. data/match/lib/assets/READMETemplate.md +59 -0
  531. data/match/lib/match.rb +14 -0
  532. data/match/lib/match/change_password.rb +53 -0
  533. data/match/lib/match/commands_generator.rb +190 -0
  534. data/match/lib/match/encryption.rb +49 -0
  535. data/match/lib/match/encryption/interface.rb +17 -0
  536. data/match/lib/match/encryption/openssl.rb +161 -0
  537. data/match/lib/match/generator.rb +122 -0
  538. data/match/lib/match/importer.rb +157 -0
  539. data/match/lib/match/migrate.rb +109 -0
  540. data/match/lib/match/module.rb +32 -0
  541. data/match/lib/match/nuke.rb +350 -0
  542. data/match/lib/match/options.rb +315 -0
  543. data/match/lib/match/runner.rb +369 -0
  544. data/match/lib/match/setup.rb +40 -0
  545. data/match/lib/match/spaceship_ensure.rb +97 -0
  546. data/match/lib/match/storage.rb +46 -0
  547. data/match/lib/match/storage/git_storage.rb +250 -0
  548. data/match/lib/match/storage/google_cloud_storage.rb +382 -0
  549. data/match/lib/match/storage/interface.rb +119 -0
  550. data/match/lib/match/storage/s3_storage.rb +205 -0
  551. data/match/lib/match/table_printer.rb +51 -0
  552. data/match/lib/match/utils.rb +75 -0
  553. data/pem/README.md +17 -0
  554. data/pem/lib/pem.rb +4 -0
  555. data/pem/lib/pem/commands_generator.rb +47 -0
  556. data/pem/lib/pem/manager.rb +112 -0
  557. data/pem/lib/pem/module.rb +19 -0
  558. data/pem/lib/pem/options.rb +103 -0
  559. data/pilot/README.md +17 -0
  560. data/pilot/lib/pilot.rb +9 -0
  561. data/pilot/lib/pilot/build_manager.rb +546 -0
  562. data/pilot/lib/pilot/commands_generator.rb +174 -0
  563. data/pilot/lib/pilot/features.rb +0 -0
  564. data/pilot/lib/pilot/manager.rb +90 -0
  565. data/pilot/lib/pilot/module.rb +11 -0
  566. data/pilot/lib/pilot/options.rb +303 -0
  567. data/pilot/lib/pilot/tester_exporter.rb +58 -0
  568. data/pilot/lib/pilot/tester_importer.rb +53 -0
  569. data/pilot/lib/pilot/tester_manager.rb +168 -0
  570. data/pilot/lib/pilot/tester_util.rb +0 -0
  571. data/precheck/README.md +17 -0
  572. data/precheck/lib/assets/PrecheckfileTemplate +27 -0
  573. data/precheck/lib/assets/PrecheckfileTemplate.swift +19 -0
  574. data/precheck/lib/precheck.rb +3 -0
  575. data/precheck/lib/precheck/commands_generator.rb +74 -0
  576. data/precheck/lib/precheck/item_to_check.rb +58 -0
  577. data/precheck/lib/precheck/module.rb +21 -0
  578. data/precheck/lib/precheck/options.rb +104 -0
  579. data/precheck/lib/precheck/rule.rb +171 -0
  580. data/precheck/lib/precheck/rule_check_result.rb +19 -0
  581. data/precheck/lib/precheck/rule_processor.rb +265 -0
  582. data/precheck/lib/precheck/rules/abstract_text_match_rule.rb +80 -0
  583. data/precheck/lib/precheck/rules/all.rb +1 -0
  584. data/precheck/lib/precheck/rules/copyright_date_rule.rb +37 -0
  585. data/precheck/lib/precheck/rules/curse_words_rule.rb +62 -0
  586. data/precheck/lib/precheck/rules/custom_text_rule.rb +35 -0
  587. data/precheck/lib/precheck/rules/free_stuff_iap_rule.rb +31 -0
  588. data/precheck/lib/precheck/rules/future_functionality_rule.rb +33 -0
  589. data/precheck/lib/precheck/rules/negative_apple_sentiment_rule.rb +37 -0
  590. data/precheck/lib/precheck/rules/other_platforms_rule.rb +43 -0
  591. data/precheck/lib/precheck/rules/placeholder_words_rule.rb +31 -0
  592. data/precheck/lib/precheck/rules/rules_data/curse_word_hashes/en_us.txt +349 -0
  593. data/precheck/lib/precheck/rules/test_words_rule.rb +30 -0
  594. data/precheck/lib/precheck/rules/unreachable_urls_rule.rb +47 -0
  595. data/precheck/lib/precheck/runner.rb +197 -0
  596. data/produce/README.md +17 -0
  597. data/produce/lib/produce.rb +6 -0
  598. data/produce/lib/produce/available_default_languages.rb +51 -0
  599. data/produce/lib/produce/cloud_container.rb +82 -0
  600. data/produce/lib/produce/commands_generator.rb +236 -0
  601. data/produce/lib/produce/developer_center.rb +143 -0
  602. data/produce/lib/produce/group.rb +90 -0
  603. data/produce/lib/produce/itunes_connect.rb +139 -0
  604. data/produce/lib/produce/manager.rb +15 -0
  605. data/produce/lib/produce/merchant.rb +121 -0
  606. data/produce/lib/produce/module.rb +14 -0
  607. data/produce/lib/produce/options.rb +184 -0
  608. data/produce/lib/produce/service.rb +319 -0
  609. data/scan/README.md +17 -0
  610. data/scan/lib/assets/ScanfileTemplate +16 -0
  611. data/scan/lib/assets/ScanfileTemplate.swift +13 -0
  612. data/scan/lib/scan.rb +10 -0
  613. data/scan/lib/scan/commands_generator.rb +78 -0
  614. data/scan/lib/scan/detect_values.rb +224 -0
  615. data/scan/lib/scan/error_handler.rb +57 -0
  616. data/scan/lib/scan/manager.rb +38 -0
  617. data/scan/lib/scan/module.rb +32 -0
  618. data/scan/lib/scan/options.rb +445 -0
  619. data/scan/lib/scan/runner.rb +197 -0
  620. data/scan/lib/scan/slack_poster.rb +60 -0
  621. data/scan/lib/scan/test_command_generator.rb +174 -0
  622. data/scan/lib/scan/test_result_parser.rb +33 -0
  623. data/scan/lib/scan/xcpretty_reporter_options_generator.rb +85 -0
  624. data/screengrab/README.md +17 -0
  625. data/screengrab/lib/assets/ScreengrabfileTemplate +15 -0
  626. data/screengrab/lib/assets/ScreengrabfileTemplate.swift +15 -0
  627. data/screengrab/lib/screengrab.rb +7 -0
  628. data/screengrab/lib/screengrab/android_environment.rb +91 -0
  629. data/screengrab/lib/screengrab/commands_generator.rb +70 -0
  630. data/screengrab/lib/screengrab/dependency_checker.rb +58 -0
  631. data/screengrab/lib/screengrab/detect_values.rb +16 -0
  632. data/screengrab/lib/screengrab/module.rb +26 -0
  633. data/screengrab/lib/screengrab/options.rb +148 -0
  634. data/screengrab/lib/screengrab/page.html.erb +190 -0
  635. data/screengrab/lib/screengrab/reports_generator.rb +36 -0
  636. data/screengrab/lib/screengrab/runner.rb +449 -0
  637. data/screengrab/lib/screengrab/setup.rb +24 -0
  638. data/sigh/README.md +17 -0
  639. data/sigh/lib/assets/resign.sh +909 -0
  640. data/sigh/lib/sigh.rb +4 -0
  641. data/sigh/lib/sigh/commands_generator.rb +154 -0
  642. data/sigh/lib/sigh/download_all.rb +112 -0
  643. data/sigh/lib/sigh/local_manage.rb +145 -0
  644. data/sigh/lib/sigh/manager.rb +47 -0
  645. data/sigh/lib/sigh/module.rb +42 -0
  646. data/sigh/lib/sigh/options.rb +187 -0
  647. data/sigh/lib/sigh/repair.rb +34 -0
  648. data/sigh/lib/sigh/resign.rb +220 -0
  649. data/sigh/lib/sigh/runner.rb +402 -0
  650. data/snapshot/README.md +17 -0
  651. data/snapshot/lib/assets/SnapfileTemplate +37 -0
  652. data/snapshot/lib/assets/SnapfileTemplate.swift +41 -0
  653. data/snapshot/lib/assets/SnapshotHelper.swift +301 -0
  654. data/snapshot/lib/assets/SnapshotHelperXcode8.swift +172 -0
  655. data/snapshot/lib/snapshot.rb +19 -0
  656. data/snapshot/lib/snapshot/collector.rb +140 -0
  657. data/snapshot/lib/snapshot/commands_generator.rb +115 -0
  658. data/snapshot/lib/snapshot/dependency_checker.rb +69 -0
  659. data/snapshot/lib/snapshot/detect_values.rb +86 -0
  660. data/snapshot/lib/snapshot/error_handler.rb +24 -0
  661. data/snapshot/lib/snapshot/fixes/README.md +5 -0
  662. data/snapshot/lib/snapshot/fixes/hardware_keyboard_fix.rb +27 -0
  663. data/snapshot/lib/snapshot/fixes/simulator_shared_pasteboard.rb +16 -0
  664. data/snapshot/lib/snapshot/fixes/simulator_zoom_fix.rb +27 -0
  665. data/snapshot/lib/snapshot/latest_os_version.rb +34 -0
  666. data/snapshot/lib/snapshot/module.rb +44 -0
  667. data/snapshot/lib/snapshot/options.rb +290 -0
  668. data/snapshot/lib/snapshot/page.html.erb +285 -0
  669. data/snapshot/lib/snapshot/reports_generator.rb +139 -0
  670. data/snapshot/lib/snapshot/reset_simulators.rb +122 -0
  671. data/snapshot/lib/snapshot/runner.rb +146 -0
  672. data/snapshot/lib/snapshot/screenshot_flatten.rb +20 -0
  673. data/snapshot/lib/snapshot/screenshot_rotate.rb +36 -0
  674. data/snapshot/lib/snapshot/setup.rb +58 -0
  675. data/snapshot/lib/snapshot/simulator_launchers/launcher_configuration.rb +62 -0
  676. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher.rb +219 -0
  677. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +200 -0
  678. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_xcode_8.rb +113 -0
  679. data/snapshot/lib/snapshot/test_command_generator.rb +108 -0
  680. data/snapshot/lib/snapshot/test_command_generator_base.rb +128 -0
  681. data/snapshot/lib/snapshot/test_command_generator_xcode_8.rb +70 -0
  682. data/snapshot/lib/snapshot/update.rb +38 -0
  683. data/spaceship/README.md +183 -0
  684. data/spaceship/lib/assets/displayFamilies.json +181 -0
  685. data/spaceship/lib/assets/languageMapping.json +306 -0
  686. data/spaceship/lib/assets/languageMappingReadable.json +30 -0
  687. data/spaceship/lib/spaceship.rb +30 -0
  688. data/spaceship/lib/spaceship/base.rb +310 -0
  689. data/spaceship/lib/spaceship/client.rb +913 -0
  690. data/spaceship/lib/spaceship/commands_generator.rb +53 -0
  691. data/spaceship/lib/spaceship/connect_api.rb +116 -0
  692. data/spaceship/lib/spaceship/connect_api/api_client.rb +279 -0
  693. data/spaceship/lib/spaceship/connect_api/client.rb +216 -0
  694. data/spaceship/lib/spaceship/connect_api/file_uploader.rb +99 -0
  695. data/spaceship/lib/spaceship/connect_api/model.rb +172 -0
  696. data/spaceship/lib/spaceship/connect_api/models/age_rating_declaration.rb +114 -0
  697. data/spaceship/lib/spaceship/connect_api/models/app.rb +388 -0
  698. data/spaceship/lib/spaceship/connect_api/models/app_category.rb +94 -0
  699. data/spaceship/lib/spaceship/connect_api/models/app_info.rb +95 -0
  700. data/spaceship/lib/spaceship/connect_api/models/app_info_localization.rb +39 -0
  701. data/spaceship/lib/spaceship/connect_api/models/app_preview.rb +131 -0
  702. data/spaceship/lib/spaceship/connect_api/models/app_preview_set.rb +100 -0
  703. data/spaceship/lib/spaceship/connect_api/models/app_price.rb +22 -0
  704. data/spaceship/lib/spaceship/connect_api/models/app_price_point.rb +26 -0
  705. data/spaceship/lib/spaceship/connect_api/models/app_price_tier.rb +12 -0
  706. data/spaceship/lib/spaceship/connect_api/models/app_screenshot.rb +187 -0
  707. data/spaceship/lib/spaceship/connect_api/models/app_screenshot_set.rb +153 -0
  708. data/spaceship/lib/spaceship/connect_api/models/app_store_review_attachment.rb +71 -0
  709. data/spaceship/lib/spaceship/connect_api/models/app_store_review_detail.rb +51 -0
  710. data/spaceship/lib/spaceship/connect_api/models/app_store_version.rb +217 -0
  711. data/spaceship/lib/spaceship/connect_api/models/app_store_version_localization.rb +85 -0
  712. data/spaceship/lib/spaceship/connect_api/models/app_store_version_phased_release.rb +57 -0
  713. data/spaceship/lib/spaceship/connect_api/models/app_store_version_release_request.rb +12 -0
  714. data/spaceship/lib/spaceship/connect_api/models/app_store_version_submission.rb +26 -0
  715. data/spaceship/lib/spaceship/connect_api/models/beta_app_localization.rb +28 -0
  716. data/spaceship/lib/spaceship/connect_api/models/beta_app_review_detail.rb +32 -0
  717. data/spaceship/lib/spaceship/connect_api/models/beta_app_review_submission.rb +26 -0
  718. data/spaceship/lib/spaceship/connect_api/models/beta_build_localization.rb +20 -0
  719. data/spaceship/lib/spaceship/connect_api/models/beta_build_metric.rb +24 -0
  720. data/spaceship/lib/spaceship/connect_api/models/beta_feedback.rb +75 -0
  721. data/spaceship/lib/spaceship/connect_api/models/beta_group.rb +41 -0
  722. data/spaceship/lib/spaceship/connect_api/models/beta_screenshot.rb +18 -0
  723. data/spaceship/lib/spaceship/connect_api/models/beta_tester.rb +57 -0
  724. data/spaceship/lib/spaceship/connect_api/models/beta_tester_metric.rb +44 -0
  725. data/spaceship/lib/spaceship/connect_api/models/build.rb +172 -0
  726. data/spaceship/lib/spaceship/connect_api/models/build_beta_detail.rb +61 -0
  727. data/spaceship/lib/spaceship/connect_api/models/build_delivery.rb +36 -0
  728. data/spaceship/lib/spaceship/connect_api/models/bundle_id.rb +58 -0
  729. data/spaceship/lib/spaceship/connect_api/models/bundle_id_capability.rb +71 -0
  730. data/spaceship/lib/spaceship/connect_api/models/certificate.rb +102 -0
  731. data/spaceship/lib/spaceship/connect_api/models/custom_app_organization.rb +43 -0
  732. data/spaceship/lib/spaceship/connect_api/models/custom_app_user.rb +41 -0
  733. data/spaceship/lib/spaceship/connect_api/models/device.rb +58 -0
  734. data/spaceship/lib/spaceship/connect_api/models/idfa_declaration.rb +41 -0
  735. data/spaceship/lib/spaceship/connect_api/models/pre_release_version.rb +20 -0
  736. data/spaceship/lib/spaceship/connect_api/models/profile.rb +97 -0
  737. data/spaceship/lib/spaceship/connect_api/models/reset_ratings_request.rb +26 -0
  738. data/spaceship/lib/spaceship/connect_api/models/sandbox_tester.rb +64 -0
  739. data/spaceship/lib/spaceship/connect_api/models/territory.rb +27 -0
  740. data/spaceship/lib/spaceship/connect_api/models/user.rb +51 -0
  741. data/spaceship/lib/spaceship/connect_api/models/user_invitation.rb +59 -0
  742. data/spaceship/lib/spaceship/connect_api/provisioning/client.rb +92 -0
  743. data/spaceship/lib/spaceship/connect_api/provisioning/provisioning.rb +143 -0
  744. data/spaceship/lib/spaceship/connect_api/response.rb +67 -0
  745. data/spaceship/lib/spaceship/connect_api/spaceship.rb +102 -0
  746. data/spaceship/lib/spaceship/connect_api/testflight/client.rb +24 -0
  747. data/spaceship/lib/spaceship/connect_api/testflight/testflight.rb +391 -0
  748. data/spaceship/lib/spaceship/connect_api/token.rb +102 -0
  749. data/spaceship/lib/spaceship/connect_api/token_refresh_middleware.rb +24 -0
  750. data/spaceship/lib/spaceship/connect_api/tunes/client.rb +24 -0
  751. data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +1045 -0
  752. data/spaceship/lib/spaceship/connect_api/users/client.rb +24 -0
  753. data/spaceship/lib/spaceship/connect_api/users/users.rb +80 -0
  754. data/spaceship/lib/spaceship/du/du_client.rb +138 -0
  755. data/spaceship/lib/spaceship/du/upload_file.rb +58 -0
  756. data/spaceship/lib/spaceship/du/utilities.rb +99 -0
  757. data/spaceship/lib/spaceship/errors.rb +82 -0
  758. data/spaceship/lib/spaceship/globals.rb +12 -0
  759. data/spaceship/lib/spaceship/helper/net_http_generic_request.rb +20 -0
  760. data/spaceship/lib/spaceship/helper/plist_middleware.rb +16 -0
  761. data/spaceship/lib/spaceship/helper/rels_middleware.rb +28 -0
  762. data/spaceship/lib/spaceship/launcher.rb +99 -0
  763. data/spaceship/lib/spaceship/module.rb +8 -0
  764. data/spaceship/lib/spaceship/playground.rb +75 -0
  765. data/spaceship/lib/spaceship/portal/app.rb +201 -0
  766. data/spaceship/lib/spaceship/portal/app_group.rb +73 -0
  767. data/spaceship/lib/spaceship/portal/app_service.rb +87 -0
  768. data/spaceship/lib/spaceship/portal/certificate.rb +365 -0
  769. data/spaceship/lib/spaceship/portal/cloud_container.rb +74 -0
  770. data/spaceship/lib/spaceship/portal/device.rb +191 -0
  771. data/spaceship/lib/spaceship/portal/invite.rb +53 -0
  772. data/spaceship/lib/spaceship/portal/key.rb +101 -0
  773. data/spaceship/lib/spaceship/portal/legacy_wrapper.rb +21 -0
  774. data/spaceship/lib/spaceship/portal/merchant.rb +86 -0
  775. data/spaceship/lib/spaceship/portal/passbook.rb +78 -0
  776. data/spaceship/lib/spaceship/portal/person.rb +62 -0
  777. data/spaceship/lib/spaceship/portal/persons.rb +67 -0
  778. data/spaceship/lib/spaceship/portal/portal.rb +17 -0
  779. data/spaceship/lib/spaceship/portal/portal_base.rb +16 -0
  780. data/spaceship/lib/spaceship/portal/portal_client.rb +862 -0
  781. data/spaceship/lib/spaceship/portal/provisioning_profile.rb +559 -0
  782. data/spaceship/lib/spaceship/portal/provisioning_profile_template.rb +52 -0
  783. data/spaceship/lib/spaceship/portal/spaceship.rb +154 -0
  784. data/spaceship/lib/spaceship/portal/ui/select_team.rb +116 -0
  785. data/spaceship/lib/spaceship/portal/website_push.rb +88 -0
  786. data/spaceship/lib/spaceship/provider.rb +13 -0
  787. data/spaceship/lib/spaceship/spaceauth_runner.rb +74 -0
  788. data/spaceship/lib/spaceship/stats_middleware.rb +65 -0
  789. data/spaceship/lib/spaceship/test_flight.rb +10 -0
  790. data/spaceship/lib/spaceship/test_flight/app_test_info.rb +40 -0
  791. data/spaceship/lib/spaceship/test_flight/base.rb +39 -0
  792. data/spaceship/lib/spaceship/test_flight/beta_review_info.rb +19 -0
  793. data/spaceship/lib/spaceship/test_flight/build.rb +242 -0
  794. data/spaceship/lib/spaceship/test_flight/build_trains.rb +50 -0
  795. data/spaceship/lib/spaceship/test_flight/client.rb +361 -0
  796. data/spaceship/lib/spaceship/test_flight/export_compliance.rb +12 -0
  797. data/spaceship/lib/spaceship/test_flight/group.rb +131 -0
  798. data/spaceship/lib/spaceship/test_flight/test_info.rb +56 -0
  799. data/spaceship/lib/spaceship/test_flight/tester.rb +136 -0
  800. data/spaceship/lib/spaceship/tunes/app_analytics.rb +168 -0
  801. data/spaceship/lib/spaceship/tunes/app_details.rb +147 -0
  802. data/spaceship/lib/spaceship/tunes/app_image.rb +51 -0
  803. data/spaceship/lib/spaceship/tunes/app_ratings.rb +58 -0
  804. data/spaceship/lib/spaceship/tunes/app_review.rb +55 -0
  805. data/spaceship/lib/spaceship/tunes/app_review_attachment.rb +49 -0
  806. data/spaceship/lib/spaceship/tunes/app_screenshot.rb +12 -0
  807. data/spaceship/lib/spaceship/tunes/app_status.rb +63 -0
  808. data/spaceship/lib/spaceship/tunes/app_submission.rb +161 -0
  809. data/spaceship/lib/spaceship/tunes/app_trailer.rb +64 -0
  810. data/spaceship/lib/spaceship/tunes/app_version.rb +970 -0
  811. data/spaceship/lib/spaceship/tunes/app_version_common.rb +35 -0
  812. data/spaceship/lib/spaceship/tunes/app_version_generated_promocodes.rb +28 -0
  813. data/spaceship/lib/spaceship/tunes/app_version_history.rb +52 -0
  814. data/spaceship/lib/spaceship/tunes/app_version_promocodes.rb +27 -0
  815. data/spaceship/lib/spaceship/tunes/app_version_ref.rb +15 -0
  816. data/spaceship/lib/spaceship/tunes/app_version_states_history.rb +27 -0
  817. data/spaceship/lib/spaceship/tunes/application.rb +453 -0
  818. data/spaceship/lib/spaceship/tunes/availability.rb +164 -0
  819. data/spaceship/lib/spaceship/tunes/b2b_organization.rb +50 -0
  820. data/spaceship/lib/spaceship/tunes/b2b_user.rb +30 -0
  821. data/spaceship/lib/spaceship/tunes/build.rb +263 -0
  822. data/spaceship/lib/spaceship/tunes/build_details.rb +184 -0
  823. data/spaceship/lib/spaceship/tunes/build_train.rb +181 -0
  824. data/spaceship/lib/spaceship/tunes/developer_response.rb +23 -0
  825. data/spaceship/lib/spaceship/tunes/device_type.rb +17 -0
  826. data/spaceship/lib/spaceship/tunes/display_family.rb +84 -0
  827. data/spaceship/lib/spaceship/tunes/errors.rb +17 -0
  828. data/spaceship/lib/spaceship/tunes/iap.rb +168 -0
  829. data/spaceship/lib/spaceship/tunes/iap_detail.rb +264 -0
  830. data/spaceship/lib/spaceship/tunes/iap_families.rb +68 -0
  831. data/spaceship/lib/spaceship/tunes/iap_family_details.rb +90 -0
  832. data/spaceship/lib/spaceship/tunes/iap_family_list.rb +28 -0
  833. data/spaceship/lib/spaceship/tunes/iap_list.rb +76 -0
  834. data/spaceship/lib/spaceship/tunes/iap_status.rb +56 -0
  835. data/spaceship/lib/spaceship/tunes/iap_subscription_pricing_info.rb +46 -0
  836. data/spaceship/lib/spaceship/tunes/iap_subscription_pricing_tier.rb +25 -0
  837. data/spaceship/lib/spaceship/tunes/iap_type.rb +45 -0
  838. data/spaceship/lib/spaceship/tunes/language_converter.rb +65 -0
  839. data/spaceship/lib/spaceship/tunes/language_item.rb +61 -0
  840. data/spaceship/lib/spaceship/tunes/legacy_wrapper.rb +13 -0
  841. data/spaceship/lib/spaceship/tunes/member.rb +84 -0
  842. data/spaceship/lib/spaceship/tunes/members.rb +35 -0
  843. data/spaceship/lib/spaceship/tunes/pricing_info.rb +42 -0
  844. data/spaceship/lib/spaceship/tunes/pricing_tier.rb +25 -0
  845. data/spaceship/lib/spaceship/tunes/sandbox_tester.rb +74 -0
  846. data/spaceship/lib/spaceship/tunes/spaceship.rb +39 -0
  847. data/spaceship/lib/spaceship/tunes/territory.rb +39 -0
  848. data/spaceship/lib/spaceship/tunes/transit_app_file.rb +23 -0
  849. data/spaceship/lib/spaceship/tunes/tunes.rb +35 -0
  850. data/spaceship/lib/spaceship/tunes/tunes_base.rb +17 -0
  851. data/spaceship/lib/spaceship/tunes/tunes_client.rb +1644 -0
  852. data/spaceship/lib/spaceship/tunes/user_detail.rb +15 -0
  853. data/spaceship/lib/spaceship/tunes/version_set.rb +26 -0
  854. data/spaceship/lib/spaceship/two_step_or_factor_client.rb +346 -0
  855. data/spaceship/lib/spaceship/ui.rb +27 -0
  856. data/supply/README.md +17 -0
  857. data/supply/lib/supply.rb +53 -0
  858. data/supply/lib/supply/apk_listing.rb +14 -0
  859. data/supply/lib/supply/client.rb +551 -0
  860. data/supply/lib/supply/commands_generator.rb +67 -0
  861. data/supply/lib/supply/languages.rb +88 -0
  862. data/supply/lib/supply/listing.rb +32 -0
  863. data/supply/lib/supply/options.rb +324 -0
  864. data/supply/lib/supply/reader.rb +41 -0
  865. data/supply/lib/supply/release_listing.rb +18 -0
  866. data/supply/lib/supply/setup.rb +122 -0
  867. data/supply/lib/supply/uploader.rb +480 -0
  868. metadata +1832 -0
@@ -0,0 +1,64 @@
1
+ require_relative 'tunes_base'
2
+
3
+ module Spaceship
4
+ module Tunes
5
+ # Represents a preview video hosted on App Store Connect. Used for icons, screenshots, etc
6
+ class AppTrailer < TunesBase
7
+ attr_accessor :video_asset_token
8
+
9
+ attr_accessor :picture_asset_token
10
+
11
+ attr_accessor :descriptionXML
12
+
13
+ attr_accessor :preview_frame_time_code
14
+
15
+ attr_accessor :video_url
16
+
17
+ attr_accessor :preview_image_url
18
+
19
+ attr_accessor :full_sized_preview_image_url
20
+
21
+ attr_accessor :device_type
22
+
23
+ attr_accessor :language
24
+
25
+ attr_mapping(
26
+ 'videoAssetToken' => :video_asset_token,
27
+ 'pictureAssetToken' => :picture_asset_token,
28
+ 'descriptionXML' => :descriptionXML,
29
+ 'previewFrameTimeCode' => :preview_frame_time_code,
30
+ 'isPortrait' => :is_portrait,
31
+ 'videoUrl' => :video_url,
32
+ 'previewImageUrl' => :preview_image_url,
33
+ 'fullSizedPreviewImageUrl' => :full_sized_preview_image_url,
34
+ 'contentType' => :content_type,
35
+ 'videoStatus' => :video_status
36
+ )
37
+
38
+ def reset!(attrs = {})
39
+ update_raw_data!({
40
+ video_asset_token: nil,
41
+ picture_asset_token: nil,
42
+ descriptionXML: nil,
43
+ preview_frame_time_code: nil,
44
+ is_portrait: nil,
45
+ video_url: nil,
46
+ preview_image_url: nil,
47
+ full_sized_preview_image_url: nil,
48
+ content_type: nil,
49
+ video_status: nil,
50
+ device_type: nil,
51
+ language: nil
52
+ }.merge(attrs))
53
+ end
54
+
55
+ private
56
+
57
+ def update_raw_data!(hash)
58
+ hash.each do |k, v|
59
+ self.send("#{k}=", v)
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,970 @@
1
+
2
+ require_relative 'tunes_client'
3
+ require_relative 'app_trailer'
4
+ require_relative 'app_screenshot'
5
+ require_relative 'app_image'
6
+ require_relative 'display_family'
7
+ require_relative 'app_version_generated_promocodes'
8
+ require_relative 'language_item'
9
+ require_relative 'transit_app_file'
10
+ require_relative 'build'
11
+ require_relative 'app_status'
12
+ require_relative 'app_review_attachment'
13
+
14
+ module Spaceship
15
+ module Tunes
16
+ # Represents an editable version of an App Store Connect Application
17
+ # This can either be the live or the edit version retrieved via the app
18
+ # rubocop:disable Metrics/ClassLength
19
+ class AppVersion < TunesBase
20
+ # @return (Spaceship::Tunes::Application) A reference to the application
21
+ # this version is for
22
+ attr_accessor :application
23
+
24
+ # @return (String) The platform value of this version.
25
+ attr_accessor :platform
26
+
27
+ # @return (String) The version number of this version
28
+ attr_accessor :version
29
+
30
+ # @return (String) The copyright information of this app
31
+ attr_accessor :copyright
32
+
33
+ # @return (String) The appType number of this version
34
+ attr_accessor :app_type
35
+
36
+ # @return (Spaceship::Tunes::AppStatus) What's the current status of this app
37
+ # e.g. Waiting for Review, Ready for Sale, ...
38
+ attr_reader :app_status
39
+
40
+ # @return (Bool) Is that the version that's currently available in the App Store?
41
+ attr_accessor :is_live
42
+
43
+ # @return (String) App Status (e.g. 'readyForSale'). You should use `app_status` instead
44
+ attr_accessor :raw_status
45
+
46
+ # @return (String) Build Version
47
+ attr_accessor :build_version
48
+
49
+ # @return (Bool)
50
+ attr_accessor :can_reject_version
51
+
52
+ # @return (Bool)
53
+ attr_accessor :can_prepare_for_upload
54
+
55
+ # @return (Bool)
56
+ attr_accessor :can_send_version_live
57
+
58
+ # @return (Bool) Should the app automatically be released once it's approved?
59
+ attr_accessor :release_on_approval
60
+
61
+ # @return (Fixnum) Milliseconds for releasing in GMT (e.g. 1480435200000 = Tue, 29 Nov 2016 16:00:00 GMT).
62
+ # Use nil to unset. Setting this will supercede the release_on_approval field, so this field must be nil
63
+ # for release_on_approval to be used.
64
+ attr_accessor :auto_release_date
65
+
66
+ # @return (Bool) Should the rating of the app be reset?
67
+ attr_accessor :ratings_reset
68
+
69
+ # @return (Bool)
70
+ attr_accessor :can_beta_test
71
+
72
+ # @return (Bool) Does the binary contain a watch binary?
73
+ attr_accessor :supports_apple_watch
74
+
75
+ # @return (Spaceship::Tunes::AppImage) the structure containing information about the large app icon (1024x1024)
76
+ attr_accessor :large_app_icon
77
+
78
+ # @return (Spaceship::Tunes::AppImage) the structure containing information about the large watch icon (1024x1024)
79
+ attr_accessor :watch_app_icon
80
+
81
+ # @return (Integer) a unqiue ID for this version generated by App Store Connect
82
+ attr_accessor :version_id
83
+
84
+ # @return (Spaceship::Tunes::AppReviewAttachment) the structure containing information about the review attachment file
85
+ attr_accessor :review_attachment_file
86
+
87
+ ####
88
+ # GeoJson
89
+ ####
90
+ # @return (Spaceship::Tunes::TransitAppFile) the structure containing information about the geo json. Can be nil
91
+ attr_accessor :transit_app_file
92
+
93
+ ####
94
+ # Trade Representative Contact Information
95
+ ####
96
+ # @return (String) Trade Representative Contact Information Trade Name. This attribute isn't editable
97
+ attr_accessor :trade_representative_trade_name
98
+
99
+ # @return (String) Trade Representative Contact Information First Name
100
+ attr_accessor :trade_representative_first_name
101
+
102
+ # @return (String) Trade Representative Contact Information Last Name
103
+ attr_accessor :trade_representative_last_name
104
+
105
+ # @return (String) Trade Representative Contact Information Address Line 1
106
+ attr_accessor :trade_representative_address_line_1
107
+
108
+ # @return (String) Trade Representative Contact Information Address Line 2
109
+ attr_accessor :trade_representative_address_line_2
110
+
111
+ # @return (String) Trade Representative Contact Information Address Line 3
112
+ attr_accessor :trade_representative_address_line_3
113
+
114
+ # @return (String) Trade Representative Contact Information City Name
115
+ attr_accessor :trade_representative_city_name
116
+
117
+ # @return (String) Trade Representative Contact Information State
118
+ attr_accessor :trade_representative_state
119
+
120
+ # @return (String) Trade Representative Contact Information Country
121
+ attr_accessor :trade_representative_country
122
+
123
+ # @return (String) Trade Representative Contact Information Postal Code
124
+ attr_accessor :trade_representative_postal_code
125
+
126
+ # @return (String) Trade Representative Contact Information Phone Number
127
+ attr_accessor :trade_representative_phone_number
128
+
129
+ # @return (String) Trade Representative Contact Information Email Address
130
+ attr_accessor :trade_representative_email
131
+
132
+ # @return (Boolean) Display Trade Representative Contact Information on the Korean App Store or not
133
+ attr_accessor :trade_representative_is_displayed_on_app_store
134
+
135
+ ####
136
+ # App Review Information
137
+ ####
138
+ # @return (String) App Review Information First Name
139
+ attr_accessor :review_first_name
140
+
141
+ # @return (String) App Review Information Last Name
142
+ attr_accessor :review_last_name
143
+
144
+ # @return (String) App Review Information Phone Number
145
+ attr_accessor :review_phone_number
146
+
147
+ # @return (String) App Review Information Email Address
148
+ attr_accessor :review_email
149
+
150
+ # @return (Boolean) The checkbox that indiciates if a demo account
151
+ # is needed. Is set automatically depending on if a user and pass
152
+ # are set
153
+ attr_reader :review_user_needed
154
+
155
+ # @return (String) App Review Information Demo Account User Name
156
+ attr_accessor :review_demo_user
157
+
158
+ # @return (String) App Review Information Demo Account Password
159
+ attr_accessor :review_demo_password
160
+
161
+ # @return (String) App Review Information Notes
162
+ attr_accessor :review_notes
163
+
164
+ ####
165
+ # Localized values
166
+ ####
167
+
168
+ # @return (Array) Raw access the all available languages. You shouldn't use it probably
169
+ attr_accessor :languages
170
+
171
+ # @return (Hash) A hash representing the keywords in all languages
172
+ attr_reader :keywords
173
+
174
+ # @return (Hash) A hash representing the promotionalText in all languages
175
+ attr_reader :promotional_text
176
+
177
+ # @return (Hash) A hash representing the description in all languages
178
+ attr_reader :description
179
+
180
+ # @return (Hash) The changelog
181
+ attr_reader :release_notes
182
+
183
+ # @return (Hash) A hash representing the support url in all languages
184
+ attr_reader :support_url
185
+
186
+ # @return (Hash) A hash representing the marketing url in all languages
187
+ attr_reader :marketing_url
188
+
189
+ # @return (Hash) Represents the screenshots of this app version (read-only)
190
+ attr_reader :screenshots
191
+
192
+ # @return (Hash) Represents the trailers of this app version (read-only)
193
+ attr_reader :trailers
194
+
195
+ # @return (Hash) A hash representing all in-app purchases that can get submitted with this version
196
+ attr_reader :in_app_purchases
197
+
198
+ # @return (Hash) Represents the phased_release hash (read-only)
199
+ # For now, please use the `toggle_phased_release` method and call `.save!`
200
+ # as the API will probably change in the future
201
+ attr_reader :phased_release
202
+
203
+ # Currently phased_release doesn't seem to have all the features enabled
204
+ #
205
+ # => {"state"=>{"value"=>"NOT_STARTED", "isEditable"=>true, "isRequired"=>false, "errorKeys"=>nil},
206
+ # "startDate"=>nil,
207
+ # "lastPaused"=>nil,
208
+ # "pausedDuration"=>nil,
209
+ # "totalPauseDays"=>30,
210
+ # "currentDayNumber"=>nil,
211
+ # "dayPercentageMap"=>{"1"=>1, "2"=>2, "3"=>5, "4"=>10, "5"=>20, "6"=>50, "7"=>100},
212
+ # "isEnabled"=>true}
213
+ #
214
+ def toggle_phased_release(enabled: false)
215
+ state = (enabled ? "INACTIVE" : "NOT_STARTED")
216
+
217
+ self.phased_release["state"]["value"] = state
218
+ end
219
+
220
+ attr_mapping({
221
+ 'appType' => :app_type,
222
+ 'platform' => :platform,
223
+ 'canBetaTest' => :can_beta_test,
224
+ 'canPrepareForUpload' => :can_prepare_for_upload,
225
+ 'canRejectVersion' => :can_reject_version,
226
+ 'canSendVersionLive' => :can_send_version_live,
227
+ 'copyright.value' => :copyright,
228
+ 'details.value' => :languages,
229
+ 'largeAppIcon.value.originalFileName' => :app_icon_original_name,
230
+ 'largeAppIcon.value.url' => :app_icon_url,
231
+ 'releaseOnApproval.value' => :release_on_approval,
232
+ 'autoReleaseDate.value' => :auto_release_date,
233
+ 'ratingsReset.value' => :ratings_reset,
234
+ 'status' => :raw_status,
235
+ 'preReleaseBuild.buildVersion' => :build_version,
236
+ 'supportsAppleWatch' => :supports_apple_watch,
237
+ 'versionId' => :version_id,
238
+ 'version.value' => :version,
239
+ 'submittableAddOns.value' => :in_app_purchases,
240
+ 'phasedRelease' => :phased_release,
241
+
242
+ # GeoJson
243
+ # 'transitAppFile.value' => :transit_app_file
244
+
245
+ # Trade Representative Contact Information
246
+
247
+ 'appStoreInfo.tradeName.value' => :trade_representative_trade_name,
248
+ 'appStoreInfo.firstName.value' => :trade_representative_first_name,
249
+ 'appStoreInfo.lastName.value' => :trade_representative_last_name,
250
+ 'appStoreInfo.addressLine1.value' => :trade_representative_address_line_1,
251
+ 'appStoreInfo.addressLine2.value' => :trade_representative_address_line_2,
252
+ 'appStoreInfo.addressLine3.value' => :trade_representative_address_line_3,
253
+ 'appStoreInfo.cityName.value' => :trade_representative_city_name,
254
+ 'appStoreInfo.state.value' => :trade_representative_state,
255
+ 'appStoreInfo.country.value' => :trade_representative_country,
256
+ 'appStoreInfo.postalCode.value' => :trade_representative_postal_code,
257
+ 'appStoreInfo.phoneNumber.value' => :trade_representative_phone_number,
258
+ 'appStoreInfo.emailAddress.value' => :trade_representative_email,
259
+ 'appStoreInfo.shouldDisplayInStore.value' => :trade_representative_is_displayed_on_app_store,
260
+
261
+ # App Review Information
262
+ 'appReviewInfo.firstName.value' => :review_first_name,
263
+ 'appReviewInfo.lastName.value' => :review_last_name,
264
+ 'appReviewInfo.phoneNumber.value' => :review_phone_number,
265
+ 'appReviewInfo.emailAddress.value' => :review_email,
266
+ 'appReviewInfo.reviewNotes.value' => :review_notes,
267
+ 'appReviewInfo.accountRequired.value' => :review_user_needed,
268
+ 'appReviewInfo.userName.value' => :review_demo_user,
269
+ 'appReviewInfo.password.value' => :review_demo_password
270
+ })
271
+
272
+ class << self
273
+ # Create a new object based on a hash.
274
+ # This is used to create a new object based on the server response.
275
+ def factory(attrs)
276
+ obj = self.new(attrs)
277
+ obj.unfold_languages
278
+
279
+ return obj
280
+ end
281
+
282
+ # @param application (Spaceship::Tunes::Application) The app this version is for
283
+ # @param app_id (String) The unique Apple ID of this app
284
+ # @param is_live (Boolean)
285
+ def find(application, app_id, is_live, platform: nil)
286
+ # we only support applications
287
+ raise "We do not support BUNDLE types right now" if application.type == 'BUNDLE'
288
+
289
+ # too bad the "id" field is empty, it forces us to make more requests to the server
290
+ # these could also be cached
291
+ attrs = client.app_version(app_id, is_live, platform: platform)
292
+ return nil unless attrs
293
+
294
+ attrs[:application] = application
295
+ attrs[:is_live] = is_live
296
+
297
+ return self.factory(attrs)
298
+ end
299
+ end
300
+
301
+ # @return (Bool) Is that version currently available in the App Store?
302
+ def is_live?
303
+ is_live
304
+ end
305
+
306
+ def review_user_needed
307
+ (self.review_demo_user.to_s + self.review_demo_password.to_s).length > 0
308
+ end
309
+
310
+ # Call this method to make sure the given languages are available for this app
311
+ # You should call this method before accessing the name, description and other localized values
312
+ # This will create the new language if it's not available yet and do nothing if everything's there
313
+ # Important: Due to a bug you have to fetch the `edit_version` again, as it doesn't get refreshed immediately
314
+ def create_languages(languages)
315
+ languages = [languages] if languages.kind_of?(String)
316
+ raise "Please pass an array" unless languages.kind_of?(Array)
317
+
318
+ copy_from = self.languages.find { |a| a['language'] == 'en-US' } || self.languages.first
319
+
320
+ languages.each do |language|
321
+ # First, see if it's already available
322
+ found = self.languages.find do |local|
323
+ local['language'] == language
324
+ end
325
+ next if found
326
+
327
+ new_language = copy_from.clone
328
+ new_language['language'] = language
329
+
330
+ self.languages << new_language
331
+ end
332
+ nil
333
+ end
334
+
335
+ def current_build_number
336
+ if self.is_live?
337
+ build_version
338
+ else
339
+ if candidate_builds.length > 0
340
+ candidate_builds.sort_by(&:upload_date).last.build_version
341
+ end
342
+ end
343
+ end
344
+
345
+ # Returns an array of all builds that can be sent to review
346
+ def candidate_builds
347
+ res = client.candidate_builds(self.application.apple_id, self.version_id)
348
+ builds = []
349
+ res.each do |attrs|
350
+ next unless attrs["type"] == "BUILD" # I don't know if it can be something else.
351
+ attrs[:apple_id] = self.application.apple_id
352
+ builds << Tunes::Build.factory(attrs)
353
+ end
354
+ return builds
355
+ end
356
+
357
+ # Select a build to be submitted for Review.
358
+ # You have to pass a build you got from - candidate_builds
359
+ # Don't forget to call save! after calling this method
360
+ def select_build(build)
361
+ raw_data.set(['preReleaseBuildVersionString', 'value'], build.build_version)
362
+ raw_data.set(['preReleaseBuildTrainVersionString'], build.train_version)
363
+ raw_data.set(['preReleaseBuildUploadDate'], build.upload_date)
364
+ true
365
+ end
366
+
367
+ # Set the age restriction rating
368
+ # Call it like this:
369
+ # v.update_rating({
370
+ # 'CARTOON_FANTASY_VIOLENCE' => 0,
371
+ # 'MATURE_SUGGESTIVE' => 2,
372
+ # 'UNRESTRICTED_WEB_ACCESS' => 0,
373
+ # 'GAMBLING_CONTESTS' => 0
374
+ # })
375
+ #
376
+ # Available Values
377
+ # https://docs.fastlane.tools/actions/deliver/#reference
378
+ def update_rating(hash)
379
+ raise "Must be a hash" unless hash.kind_of?(Hash)
380
+
381
+ hash.each do |key, value|
382
+ to_edit = self.raw_data['ratings']['nonBooleanDescriptors'].find do |current|
383
+ current['name'].include?(key)
384
+ end
385
+
386
+ if to_edit
387
+ to_set = "NONE" if value == 0
388
+ to_set = "INFREQUENT_MILD" if value == 1
389
+ to_set = "FREQUENT_INTENSE" if value == 2
390
+ raise "Invalid value '#{value}' for '#{key}', must be 0-2" unless to_set
391
+ to_edit['level'] = "ITC.apps.ratings.level.#{to_set}"
392
+ else
393
+ # Maybe it's a boolean descriptor?
394
+ to_edit = self.raw_data['ratings']['booleanDescriptors'].find do |current|
395
+ current['name'].include?(key)
396
+ end
397
+
398
+ if to_edit
399
+ to_set = "NO"
400
+ to_set = "YES" if value.to_i > 0
401
+ to_edit['level'] = "ITC.apps.ratings.level.#{to_set}"
402
+ else
403
+ raise "Could not find option '#{key}' in the list of available options"
404
+ end
405
+ end
406
+ end
407
+ true
408
+ end
409
+
410
+ # Push all changes that were made back to App Store Connect
411
+ def save!
412
+ client.update_app_version!(application.apple_id, self.version_id, raw_data)
413
+ end
414
+
415
+ # @return (String) An URL to this specific resource. You can enter this URL into your browser
416
+ def url
417
+ url = "https://appstoreconnect.apple.com/WebObjects/iTunesConnect.woa/ra/ng/app/#{application.apple_id}/#{self.platform}/versioninfo/"
418
+ url += "deliverable" if self.is_live?
419
+ return url
420
+ end
421
+
422
+ # Private methods
423
+ def setup
424
+ status = raw_data['status']
425
+ @app_status = Tunes::AppStatus.get_from_string(status)
426
+
427
+ setup_large_app_icon
428
+ setup_watch_app_icon
429
+ setup_review_attachment_file if supports_review_attachment_file?
430
+ setup_transit_app_file if supports_app_transit?
431
+ setup_screenshots
432
+ setup_trailers
433
+ end
434
+
435
+ # This method will generate the required keys/values
436
+ # for App Store Connect to validate the uploaded image
437
+ def generate_image_metadata(image_data, original_file_name)
438
+ {
439
+ assetToken: image_data["token"],
440
+ originalFileName: original_file_name,
441
+ size: image_data["length"],
442
+ height: image_data["height"],
443
+ width: image_data["width"],
444
+ checksum: image_data["md5"]
445
+ }
446
+ end
447
+
448
+ # This method will generate the required keys/values
449
+ # for App Store Connect to validate the review attachment file
450
+ def generate_review_attachment_file(review_attachment_data, review_attachment_file)
451
+ {
452
+ assetToken: review_attachment_data["token"],
453
+ name: File.basename(review_attachment_file),
454
+ fileType: Utilities.content_type(review_attachment_file),
455
+ url: nil
456
+ }
457
+ end
458
+
459
+ # Uploads or removes the large icon
460
+ # @param icon_path (String): The path to the icon. Use nil to remove it
461
+ def upload_large_icon!(icon_path)
462
+ unless icon_path
463
+ @large_app_icon.reset!
464
+ return
465
+ end
466
+ upload_image = UploadFile.from_path(icon_path)
467
+ image_data = client.upload_large_icon(self, upload_image)
468
+
469
+ raw_data["largeAppIcon"]["value"] = generate_image_metadata(image_data, upload_image.file_name)
470
+ end
471
+
472
+ # Uploads or removes the watch icon
473
+ # @param icon_path (String): The path to the icon. Use nil to remove it
474
+ def upload_watch_icon!(icon_path)
475
+ unless icon_path
476
+ @watch_app_icon.reset!
477
+ return
478
+ end
479
+ upload_image = UploadFile.from_path(icon_path)
480
+ image_data = client.upload_watch_icon(self, upload_image)
481
+
482
+ raw_data["watchAppIcon"]["value"] = generate_image_metadata(image_data, upload_image.file_name)
483
+ end
484
+
485
+ # Uploads or removes the transit app file
486
+ # @param icon_path (String): The path to the geojson file. Use nil to remove it
487
+ def upload_geojson!(geojson_path)
488
+ unless geojson_path
489
+ raw_data["transitAppFile"]["value"] = nil
490
+ @transit_app_file = nil
491
+ return
492
+ end
493
+ upload_file = UploadFile.from_path(geojson_path)
494
+ geojson_data = client.upload_geojson(self, upload_file)
495
+
496
+ @transit_app_file = Tunes::TransitAppFile.factory({}) if @transit_app_file.nil?
497
+ @transit_app_file .url = nil # response.headers['Location']
498
+ @transit_app_file.asset_token = geojson_data["token"]
499
+ @transit_app_file.name = upload_file.file_name
500
+ @transit_app_file.time_stamp = Time.now.to_i * 1000 # works without but...
501
+ end
502
+
503
+ # Uploads or removes a screenshot
504
+ # @param icon_path (String): The path to the screenshot. Use nil to remove it
505
+ # @param sort_order (Fixnum): The sort_order, from 1 to 5
506
+ # @param language (String): The language for this screenshot
507
+ # @param device (string): The device for this screenshot
508
+ # @param is_messages (Bool): True if the screenshot is for iMessage
509
+ def upload_screenshot!(screenshot_path, sort_order, language, device, is_messages)
510
+ raise "sort_order must be higher than 0" unless sort_order > 0
511
+ raise "sort_order must not be > 10" if sort_order > 10
512
+ # this will also check both language and device parameters
513
+ device_lang_screenshots = screenshots_data_for_language_and_device(language, device, is_messages)["value"]
514
+
515
+ existing_sort_orders = device_lang_screenshots.map { |s| s["value"]["sortOrder"] }
516
+ if screenshot_path # adding / replacing
517
+ upload_file = UploadFile.from_path(screenshot_path)
518
+ screenshot_data = client.upload_screenshot(self, upload_file, device, is_messages)
519
+
520
+ # Since October 2016 we also need to pass the size, height, width and checksum
521
+ # otherwise App Store Connect validation will fail at a later point
522
+ new_screenshot = {
523
+ "value" => {
524
+ "assetToken" => screenshot_data["token"],
525
+ "sortOrder" => sort_order,
526
+ "originalFileName" => upload_file.file_name,
527
+ "size" => screenshot_data["length"],
528
+ "height" => screenshot_data["height"],
529
+ "width" => screenshot_data["width"],
530
+ "checksum" => screenshot_data["md5"]
531
+ }
532
+ }
533
+
534
+ # We disable "scaling" for this device type / language combination
535
+ # We only set this, if we actually successfully uploaded a new screenshot
536
+ # for this device / language combination
537
+ # if this value is not set, iTC will fallback to another device type for screenshots
538
+ language_details = raw_data_details.find { |d| d["language"] == language }["displayFamilies"]["value"]
539
+ device_language_details = language_details.find { |display_family| display_family['name'] == device }
540
+ scaled_key = is_messages ? "messagesScaled" : "scaled"
541
+ device_language_details[scaled_key]["value"] = false
542
+
543
+ if existing_sort_orders.include?(sort_order) # replace
544
+ device_lang_screenshots[existing_sort_orders.index(sort_order)] = new_screenshot
545
+ else # add
546
+ device_lang_screenshots << new_screenshot
547
+ end
548
+ else # removing
549
+ raise "cannot remove screenshot with non existing sort_order" unless existing_sort_orders.include?(sort_order)
550
+ device_lang_screenshots.delete_at(existing_sort_orders.index(sort_order))
551
+ end
552
+ setup_screenshots
553
+ end
554
+
555
+ # Uploads, removes a trailer video
556
+ #
557
+ # A preview image for the video is required by ITC and is usually automatically extracted by your browser.
558
+ # This method will either automatically extract it from the video (using `ffmpeg`) or allow you
559
+ # to specify it using +preview_image_path+.
560
+ # If the preview image is specified, `ffmpeg` will not be used. The image resolution will be checked against
561
+ # expectations (which might be different from the trailer resolution.
562
+ #
563
+ # It is recommended to extract the preview image using the spaceship related tools in order to ensure
564
+ # the appropriate format and resolution are used.
565
+ #
566
+ # Note: to extract its resolution and a screenshot preview, the `ffmpeg` tool will be used
567
+ #
568
+ # @param trailer_path (String): The path to the trailer. Use nil to remove it
569
+ # @param sort_order (Fixnum): The sort_order, from 1 to 5
570
+ # @param language (String): The language for this screenshot
571
+ # @param device (String): The device for this screenshot
572
+ # @param timestamp (String): The optional timestamp of the screenshot to grab
573
+ # @param preview_image_path (String): The optional image path for the video preview
574
+ def upload_trailer!(trailer_path, sort_order, language, device, timestamp = "05.00", preview_image_path = nil)
575
+ raise "No app trailer supported for iphone35" if device == 'iphone35'
576
+ raise "sort_order must be higher than 0" unless sort_order > 0
577
+ raise "sort_order must not be > 3" if sort_order > 3
578
+
579
+ device_lang_trailers = trailer_data_for_language_and_device(language, device)["value"]
580
+ existing_sort_orders = device_lang_trailers.map { |s| s["value"]["sortPosition"] }
581
+
582
+ if trailer_path # adding / replacing trailer
583
+ raise "Invalid timestamp #{timestamp}" if (timestamp =~ /^[0-9][0-9].[0-9][0-9]$/).nil?
584
+
585
+ if preview_image_path
586
+ check_preview_screenshot_resolution(preview_image_path, device)
587
+ video_preview_path = preview_image_path
588
+ else
589
+ # IDEA: optimization, we could avoid fetching the screenshot if the timestamp hasn't changed
590
+ video_preview_resolution = video_preview_resolution_for(device, trailer_path)
591
+
592
+ # Keep a reference of the video_preview here to avoid Ruby getting rid of the Tempfile in the meanwhile
593
+ video_preview = Utilities.grab_video_preview(trailer_path, timestamp, video_preview_resolution)
594
+ video_preview_path = video_preview.path
595
+ end
596
+ video_preview_file = UploadFile.from_path(video_preview_path)
597
+ video_preview_data = client.upload_trailer_preview(self, video_preview_file, device)
598
+
599
+ upload_file = UploadFile.from_path(trailer_path)
600
+ trailer_data = client.upload_trailer(self, upload_file)
601
+
602
+ ts = "00:00:#{timestamp}"
603
+ ts[8] = ':'
604
+
605
+ new_trailer = {
606
+ "value" => {
607
+ "videoAssetToken" => trailer_data["responses"][0]["token"],
608
+ "descriptionXML" => trailer_data["responses"][0]["descriptionDoc"],
609
+ "contentType" => upload_file.content_type,
610
+ "sortPosition" => sort_order,
611
+ "size" => video_preview_data["length"],
612
+ "width" => video_preview_data["width"],
613
+ "height" => video_preview_data["height"],
614
+ "checksum" => video_preview_data["md5"],
615
+ "pictureAssetToken" => video_preview_data["token"],
616
+ "previewFrameTimeCode" => ts.to_s,
617
+ "isPortrait" => Utilities.portrait?(video_preview_path)
618
+ }
619
+ }
620
+
621
+ if existing_sort_orders.include?(sort_order) # replace
622
+ device_lang_trailers[existing_sort_orders.index(sort_order)] = new_trailer
623
+ else # add
624
+ device_lang_trailers << new_trailer
625
+ end
626
+ else # removing trailer
627
+ raise "cannot remove trailer with non existing sort_order" unless existing_sort_orders.include?(sort_order)
628
+ device_lang_trailers.delete_at(existing_sort_orders.index(sort_order))
629
+ end
630
+ setup_trailers
631
+ end
632
+
633
+ # Uploads, app review attachments
634
+ #
635
+ # while submitting for review, ITC allow developers to attach file.
636
+ #
637
+ # Following list can be found at https://appstoreconnect.apple.com
638
+ # on iOS app edit version, above the attachment label/button there is
639
+ # a question mark if it is press the a dialog is shown which has the list.
640
+ #
641
+ # File types allowed by Apple are: pdf, doc, docx, rtf, pages, xls, xlsx, numbers
642
+ # zip, rar, plist, crash, jpg, png, mp4 or avi.
643
+ #
644
+ #
645
+ # @param review_attachment_path (String): The path to the attachment file.
646
+ def upload_review_attachment!(review_attachment_path)
647
+ raise 'cannot upload review attachment for live edition.' if self.is_live?
648
+
649
+ if !review_attachment_path || review_attachment_path.size < 1
650
+ @review_attachment_file.reset!
651
+ return
652
+ end
653
+
654
+ raise "cannot find file: #{review_attachment_path}." unless File.exist?(review_attachment_path)
655
+
656
+ review_attachment_file = UploadFile.from_path(review_attachment_path)
657
+ review_attachment_data = client.upload_app_review_attachment(self, review_attachment_file)
658
+ raw_data["appReviewInfo"]["attachmentFiles"]["value"] = generate_review_attachment_file(review_attachment_data, review_attachment_path)
659
+ end
660
+
661
+ # Prefill name, keywords, etc...
662
+ def unfold_languages
663
+ {
664
+ keywords: :keywords,
665
+ description: :description,
666
+ supportUrl: :support_url,
667
+ marketingUrl: :marketing_url,
668
+ releaseNotes: :release_notes,
669
+ promotionalText: :promotional_text
670
+ }.each do |json, attribute|
671
+ instance_variable_set("@#{attribute}".to_sym, LanguageItem.new(json, languages))
672
+ end
673
+ end
674
+
675
+ def release!
676
+ client.release!(self.application.apple_id, self.version_id)
677
+ end
678
+
679
+ def release_to_all_users!
680
+ client.release_to_all_users!(self.application.apple_id, self.version_id)
681
+ end
682
+
683
+ #####################################################
684
+ # @!group Promo codes
685
+ #####################################################
686
+ def generate_promocodes!(quantity)
687
+ data = client.generate_app_version_promocodes!(
688
+ app_id: self.application.apple_id,
689
+ version_id: self.version_id,
690
+ quantity: quantity
691
+ )
692
+ Tunes::AppVersionGeneratedPromocodes.factory(data)
693
+ end
694
+
695
+ # These methods takes care of properly parsing values that
696
+ # are not returned in the right format, e.g. boolean as string
697
+ def release_on_approval
698
+ super == 'true'
699
+ end
700
+
701
+ def supports_apple_watch
702
+ !super.nil?
703
+ end
704
+
705
+ def reject!
706
+ raise 'Version not rejectable' unless can_reject_version
707
+ client.reject!(self.application.apple_id, self.version_id)
708
+ end
709
+
710
+ private
711
+
712
+ def setup_large_app_icon
713
+ large_app_icon = raw_data["largeAppIcon"]["value"]
714
+ @large_app_icon = nil
715
+ @large_app_icon = Tunes::AppImage.factory(large_app_icon) if large_app_icon
716
+ end
717
+
718
+ def setup_watch_app_icon
719
+ watch_app_icon = raw_data["watchAppIcon"]["value"]
720
+ @watch_app_icon = nil
721
+ @watch_app_icon = Tunes::AppImage.factory(watch_app_icon) if watch_app_icon
722
+ end
723
+
724
+ def setup_review_attachment_file
725
+ review_attachment_file = raw_data["appReviewInfo"]["attachmentFiles"]["value"]
726
+ @review_attachment_file = nil
727
+ @review_attachment_file = Tunes::AppReviewAttachment.factory(review_attachment_file)
728
+ end
729
+
730
+ def supports_review_attachment_file?
731
+ raw_data["appReviewInfo"]["attachmentFiles"] && raw_data["appReviewInfo"]["attachmentFiles"]["value"]
732
+ end
733
+
734
+ def supports_app_transit?
735
+ raw_data["transitAppFile"] != nil
736
+ end
737
+
738
+ def setup_transit_app_file
739
+ transit_app_file = raw_data["transitAppFile"]["value"]
740
+ @transit_app_file = nil
741
+ @transit_app_file = Tunes::TransitAppFile.factory(transit_app_file) if transit_app_file
742
+ end
743
+
744
+ def screenshots_data_for_language_and_device(language, device, is_messages)
745
+ data_field = is_messages ? "messagesScreenshots" : "screenshots"
746
+ container_data_for_language_and_device(data_field, language, device)
747
+ end
748
+
749
+ def trailer_data_for_language_and_device(language, device)
750
+ container_data_for_language_and_device("trailers", language, device)
751
+ end
752
+
753
+ def container_data_for_language_and_device(data_field, language, device)
754
+ raise "#{device} isn't a valid device name" unless DisplayFamily.find(device)
755
+
756
+ languages = raw_data_details.select { |d| d["language"] == language }
757
+ # IDEA: better error for non existing language
758
+ raise "#{language} isn't an activated language" unless languages.count > 0
759
+ lang_details = languages[0]
760
+ display_families = lang_details["displayFamilies"]["value"]
761
+ device_details = display_families.find { |display_family| display_family['name'] == device }
762
+ raise "Couldn't find device family for #{device}" if device_details.nil?
763
+ raise "Unexpected state: missing device details for #{device}" unless device_details.key?(data_field)
764
+ return device_details[data_field]
765
+ rescue => ex
766
+ raise "App Store Connect error: #{ex}"
767
+ end
768
+
769
+ def setup_screenshots
770
+ # Enable Scaling for all screen sizes that don't have at least one screenshot or at least one trailer (app_preview)
771
+ # We automatically disable scaling once we upload at least one screenshot
772
+ language_details = raw_data_details.each do |current_language|
773
+ language_details = (current_language["displayFamilies"] || {})["value"]
774
+ (language_details || []).each do |device_language_details|
775
+ # Do not enable scaling if a screenshot already exists
776
+ next if device_language_details["screenshots"].nil?
777
+ next if device_language_details["screenshots"]["value"].count > 0
778
+
779
+ # Do not enable scaling if a trailer already exists
780
+ next if device_language_details["trailers"].nil?
781
+ next if device_language_details["trailers"]["value"].count > 0
782
+
783
+ # The current row includes screenshots for all device types
784
+ # so we need to enable scaling for both iOS and watchOS apps
785
+ device_language_details["scaled"]["value"] = true if device_language_details["scaled"]
786
+ device_language_details["messagesScaled"]["value"] = true if device_language_details["messagesScaled"]
787
+ # we unset `scaled` or `messagesScaled` as soon as we upload a
788
+ # screenshot for this device/language combination
789
+ end
790
+ end
791
+
792
+ @screenshots = {}
793
+ raw_data_details.each do |row|
794
+ # Now that's one language right here
795
+ @screenshots[row['language']] = setup_screenshots_for(row) + setup_messages_screenshots_for(row)
796
+ end
797
+ end
798
+
799
+ # generates the nested data structure to represent screenshots
800
+ def setup_screenshots_for(row)
801
+ return [] if row.nil? || row["displayFamilies"].nil?
802
+
803
+ display_families = row.fetch("displayFamilies", {}).fetch("value", nil)
804
+ return [] unless display_families
805
+
806
+ result = []
807
+
808
+ display_families.each do |display_family|
809
+ # {
810
+ # "name": "iphone6Plus",
811
+ # "scaled": {
812
+ # "value": false,
813
+ # "isEditable": false,
814
+ # "isRequired": false,
815
+ # "errorKeys": null
816
+ # },
817
+ # "screenshots": {
818
+ # "value": [{
819
+ # "value": {
820
+ # "assetToken": "Purple62/v4/08/0a/04/080a0430-c2cc-2577-f491-9e0a09c58ffe/mzl.pbcpzqyg.jpg",
821
+ # "sortOrder": 1,
822
+ # "type": null,
823
+ # "originalFileName": "ios-414-1.jpg"
824
+ # },
825
+ # "isEditable": true,
826
+ # "isRequired": false,
827
+ # "errorKeys": null
828
+ # }, {
829
+ # "value": {
830
+ # "assetToken": "Purple71/v4/de/81/aa/de81aa10-64f6-332e-c974-9ee46adab675/mzl.cshkjvwl.jpg",
831
+ # "sortOrder": 2,
832
+ # "type": null,
833
+ # "originalFileName": "ios-414-2.jpg"
834
+ # },
835
+ # "isEditable": true,
836
+ # "isRequired": false,
837
+ # "errorKeys": null
838
+ # }],
839
+ # "messagesScaled": {
840
+ # "value": false,
841
+ # "isEditable": false,
842
+ # "isRequired": false,
843
+ # "errorKeys": null
844
+ # },
845
+ # "messagesScreenshots": {
846
+ # "value": [{
847
+ # "value": {
848
+ # "assetToken": "Purple62/v4/08/0a/04/080a0430-c2cc-2577-f491-9e0a09c58ffe/mzl.pbcpzqyg.jpg",
849
+ # "sortOrder": 1,
850
+ # "type": null,
851
+ # "originalFileName": "ios-414-1.jpg"
852
+ # },
853
+ # "isEditable": true,
854
+ # "isRequired": false,
855
+ # "errorKeys": null
856
+ # }, {
857
+ # "value": {
858
+ # "assetToken": "Purple71/v4/de/81/aa/de81aa10-64f6-332e-c974-9ee46adab675/mzl.cshkjvwl.jpg",
859
+ # "sortOrder": 2,
860
+ # "type": null,
861
+ # "originalFileName": "ios-414-2.jpg"
862
+ # },
863
+ # "isEditable": true,
864
+ # "isRequired": false,
865
+ # "errorKeys": null
866
+ # }],
867
+ # "isEditable": true,
868
+ # "isRequired": false,
869
+ # "errorKeys": null
870
+ # },
871
+ # "trailer": {
872
+ # "value": null,
873
+ # "isEditable": true,
874
+ # "isRequired": false,
875
+ # "errorKeys": null
876
+ # }
877
+ # }
878
+
879
+ display_family.fetch("screenshots", {}).fetch("value", []).each do |screenshot|
880
+ screenshot_data = screenshot["value"]
881
+ data = {
882
+ device_type: display_family['name'],
883
+ language: row["language"]
884
+ }.merge(screenshot_data)
885
+ result << Tunes::AppScreenshot.factory(data)
886
+ end
887
+ end
888
+
889
+ return result
890
+ end
891
+
892
+ # generates the nested data structure to represent screenshots
893
+ def setup_messages_screenshots_for(row)
894
+ return [] if row.nil? || row["displayFamilies"].nil?
895
+
896
+ display_families = row.fetch("displayFamilies", {}).fetch("value", nil)
897
+ return [] unless display_families
898
+
899
+ result = []
900
+
901
+ display_families.each do |display_family|
902
+ display_family_screenshots = display_family.fetch("messagesScreenshots", {})
903
+ next unless display_family_screenshots
904
+ display_family_screenshots.fetch("value", []).each do |screenshot|
905
+ screenshot_data = screenshot["value"]
906
+ data = {
907
+ device_type: display_family['name'],
908
+ language: row["language"],
909
+ is_imessage: true # to identify imessage screenshots later on (e.g: during download)
910
+ }.merge(screenshot_data)
911
+ result << Tunes::AppScreenshot.factory(data)
912
+ end
913
+ end
914
+
915
+ return result
916
+ end
917
+
918
+ def setup_trailers
919
+ @trailers = {}
920
+ raw_data_details.each do |row|
921
+ # Now that's one language right here
922
+ @trailers[row["language"]] = setup_trailers_for(row)
923
+ end
924
+ end
925
+
926
+ # generates the nested data structure to represent trailers
927
+ def setup_trailers_for(row)
928
+ return [] if row.nil? || row["displayFamilies"].nil?
929
+
930
+ display_families = row.fetch("displayFamilies", {}).fetch("value", nil)
931
+ return [] unless display_families
932
+
933
+ result = []
934
+
935
+ display_families.each do |display_family|
936
+ display_family.fetch("trailers", {}).fetch("value", []).each do |trailer|
937
+ trailer_data = trailer["value"]
938
+ data = {
939
+ device_type: display_family['name'],
940
+ language: row["language"]
941
+ }.merge(trailer_data)
942
+ result << Tunes::AppTrailer.factory(data)
943
+ end
944
+ end
945
+
946
+ return result
947
+ end
948
+
949
+ # identify the required resolution for this particular video screenshot
950
+ def video_preview_resolution_for(device, video_path)
951
+ is_portrait = Utilities.portrait?(video_path)
952
+ TunesClient.video_preview_resolution_for(device, is_portrait)
953
+ end
954
+
955
+ # ensure the specified preview screenshot has the expected resolution the specified target +device+
956
+ def check_preview_screenshot_resolution(preview_screenshot_path, device)
957
+ is_portrait = Utilities.portrait?(preview_screenshot_path)
958
+ expected_resolution = TunesClient.video_preview_resolution_for(device, is_portrait)
959
+ actual_resolution = Utilities.resolution(preview_screenshot_path)
960
+ orientation = is_portrait ? "portrait" : "landscape"
961
+ raise "Invalid #{orientation} screenshot resolution for device #{device}. Should be #{expected_resolution}" unless actual_resolution == expected_resolution
962
+ end
963
+
964
+ def raw_data_details
965
+ raw_data["details"]["value"]
966
+ end
967
+ end
968
+ # rubocop:enable Metrics/ClassLength
969
+ end
970
+ end