fastlane 2.74.0.beta.20180106010004 → 2.74.0.beta.20180107010004

Sign up to get free protection for your applications and to get access to all the features.
Files changed (310) hide show
  1. checksums.yaml +4 -4
  2. data/cert/lib/cert.rb +3 -17
  3. data/cert/lib/cert/commands_generator.rb +5 -0
  4. data/cert/lib/cert/module.rb +14 -0
  5. data/cert/lib/cert/options.rb +4 -2
  6. data/cert/lib/cert/runner.rb +7 -0
  7. data/credentials_manager/lib/credentials_manager.rb +3 -9
  8. data/credentials_manager/lib/credentials_manager/account_manager.rb +2 -0
  9. data/credentials_manager/lib/credentials_manager/appfile_config.rb +2 -0
  10. data/credentials_manager/lib/credentials_manager/cli.rb +2 -0
  11. data/deliver/lib/deliver.rb +15 -31
  12. data/deliver/lib/deliver/app_screenshot.rb +2 -0
  13. data/deliver/lib/deliver/commands_generator.rb +6 -1
  14. data/deliver/lib/deliver/detect_values.rb +9 -1
  15. data/deliver/lib/deliver/download_screenshots.rb +2 -0
  16. data/deliver/lib/deliver/generate_summary.rb +4 -0
  17. data/deliver/lib/deliver/html_generator.rb +2 -0
  18. data/deliver/lib/deliver/loader.rb +4 -0
  19. data/deliver/lib/deliver/module.rb +16 -0
  20. data/deliver/lib/deliver/options.rb +5 -2
  21. data/deliver/lib/deliver/runner.rb +14 -1
  22. data/deliver/lib/deliver/setup.rb +6 -2
  23. data/deliver/lib/deliver/submit_for_review.rb +2 -0
  24. data/deliver/lib/deliver/upload_assets.rb +2 -0
  25. data/deliver/lib/deliver/upload_metadata.rb +4 -0
  26. data/deliver/lib/deliver/upload_price_tier.rb +2 -0
  27. data/deliver/lib/deliver/upload_screenshots.rb +6 -0
  28. data/fastlane/lib/fastlane/actions/slack.rb +16 -11
  29. data/fastlane/lib/fastlane/plugins/template/.rubocop.yml +3 -0
  30. data/fastlane/lib/fastlane/version.rb +1 -1
  31. data/fastlane_core/lib/fastlane_core.rb +42 -77
  32. data/fastlane_core/lib/fastlane_core/analytics/action_completion_context.rb +2 -0
  33. data/fastlane_core/lib/fastlane_core/analytics/action_launch_context.rb +2 -1
  34. data/fastlane_core/lib/fastlane_core/analytics/analytics_ingester_client.rb +4 -0
  35. data/fastlane_core/lib/fastlane_core/analytics/analytics_session.rb +3 -1
  36. data/fastlane_core/lib/fastlane_core/analytics/app_identifier_guesser.rb +3 -3
  37. data/fastlane_core/lib/fastlane_core/android_package_name_guesser.rb +5 -0
  38. data/fastlane_core/lib/fastlane_core/build_watcher.rb +4 -0
  39. data/fastlane_core/lib/fastlane_core/cert_checker.rb +2 -0
  40. data/fastlane_core/lib/fastlane_core/command_executor.rb +4 -0
  41. data/fastlane_core/lib/fastlane_core/configuration/commander_generator.rb +4 -2
  42. data/fastlane_core/lib/fastlane_core/configuration/config_item.rb +6 -1
  43. data/fastlane_core/lib/fastlane_core/configuration/configuration.rb +5 -3
  44. data/fastlane_core/lib/fastlane_core/configuration/configuration_file.rb +3 -0
  45. data/fastlane_core/lib/fastlane_core/crash_reporter/crash_report_generator.rb +2 -0
  46. data/fastlane_core/lib/fastlane_core/crash_reporter/crash_reporter.rb +7 -1
  47. data/fastlane_core/lib/fastlane_core/device_manager.rb +6 -0
  48. data/fastlane_core/lib/fastlane_core/fastlane_folder.rb +2 -0
  49. data/fastlane_core/lib/fastlane_core/feature/feature.rb +2 -0
  50. data/fastlane_core/lib/fastlane_core/features.rb +2 -0
  51. data/fastlane_core/lib/fastlane_core/helper.rb +5 -1
  52. data/fastlane_core/lib/fastlane_core/ios_app_identifier_guesser.rb +5 -0
  53. data/fastlane_core/lib/fastlane_core/ipa_file_analyser.rb +3 -1
  54. data/fastlane_core/lib/fastlane_core/ipa_upload_package_builder.rb +4 -0
  55. data/fastlane_core/lib/fastlane_core/itunes_search_api.rb +2 -0
  56. data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +3 -0
  57. data/fastlane_core/lib/fastlane_core/keychain_importer.rb +2 -0
  58. data/fastlane_core/lib/fastlane_core/module.rb +31 -0
  59. data/fastlane_core/lib/fastlane_core/pkg_file_analyser.rb +2 -0
  60. data/fastlane_core/lib/fastlane_core/pkg_upload_package_builder.rb +4 -0
  61. data/fastlane_core/lib/fastlane_core/print_table.rb +3 -0
  62. data/fastlane_core/lib/fastlane_core/project.rb +3 -0
  63. data/fastlane_core/lib/fastlane_core/provisioning_profile.rb +2 -0
  64. data/fastlane_core/lib/fastlane_core/swag.rb +3 -0
  65. data/fastlane_core/lib/fastlane_core/test_parser.rb +7 -0
  66. data/fastlane_core/lib/fastlane_core/tool_collector.rb +2 -0
  67. data/fastlane_core/lib/fastlane_core/ui/errors.rb +1 -0
  68. data/fastlane_core/lib/fastlane_core/ui/errors/fastlane_common_error.rb +2 -0
  69. data/fastlane_core/lib/fastlane_core/ui/errors/fastlane_crash.rb +2 -0
  70. data/fastlane_core/lib/fastlane_core/ui/errors/fastlane_error.rb +2 -0
  71. data/fastlane_core/lib/fastlane_core/ui/errors/fastlane_shell_error.rb +2 -0
  72. data/fastlane_core/lib/fastlane_core/ui/fastlane_runner.rb +10 -1
  73. data/fastlane_core/lib/fastlane_core/ui/github_issue_inspector_reporter.rb +4 -1
  74. data/fastlane_core/lib/fastlane_core/ui/implementations/shell.rb +6 -0
  75. data/fastlane_core/lib/fastlane_core/ui/interface.rb +3 -0
  76. data/fastlane_core/lib/fastlane_core/ui/ui.rb +5 -5
  77. data/fastlane_core/lib/fastlane_core/update_checker/changelog.rb +2 -2
  78. data/fastlane_core/lib/fastlane_core/update_checker/update_checker.rb +5 -3
  79. data/frameit/lib/frameit.rb +0 -40
  80. data/frameit/lib/frameit/commands_generator.rb +7 -0
  81. data/frameit/lib/frameit/config_parser.rb +2 -0
  82. data/frameit/lib/frameit/dependency_checker.rb +2 -0
  83. data/frameit/lib/frameit/editor.rb +9 -0
  84. data/frameit/lib/frameit/frame_downloader.rb +5 -0
  85. data/frameit/lib/frameit/mac_editor.rb +3 -0
  86. data/frameit/lib/frameit/module.rb +40 -0
  87. data/frameit/lib/frameit/offsets.rb +3 -0
  88. data/frameit/lib/frameit/options.rb +4 -0
  89. data/frameit/lib/frameit/runner.rb +5 -1
  90. data/frameit/lib/frameit/screenshot.rb +9 -0
  91. data/frameit/lib/frameit/strings_parser.rb +2 -0
  92. data/frameit/lib/frameit/template_finder.rb +6 -0
  93. data/frameit/lib/frameit/trim_box.rb +2 -0
  94. data/gym/lib/gym.rb +9 -46
  95. data/gym/lib/gym/code_signing_mapping.rb +2 -0
  96. data/gym/lib/gym/commands_generator.rb +6 -3
  97. data/gym/lib/gym/detect_values.rb +4 -1
  98. data/gym/lib/gym/error_handler.rb +3 -0
  99. data/gym/lib/gym/generators/build_command_generator.rb +1 -0
  100. data/gym/lib/gym/generators/package_command_generator.rb +1 -1
  101. data/gym/lib/gym/generators/package_command_generator_xcode7.rb +5 -0
  102. data/gym/lib/gym/manager.rb +4 -0
  103. data/gym/lib/gym/module.rb +36 -0
  104. data/gym/lib/gym/options.rb +3 -2
  105. data/gym/lib/gym/runner.rb +8 -0
  106. data/gym/lib/gym/xcode.rb +2 -0
  107. data/gym/lib/gym/xcodebuild_fixes/generic_archive_fix.rb +3 -0
  108. data/match/lib/match.rb +12 -37
  109. data/match/lib/match/change_password.rb +4 -0
  110. data/match/lib/match/commands_generator.rb +9 -3
  111. data/match/lib/match/encrypt.rb +4 -0
  112. data/match/lib/match/generator.rb +7 -2
  113. data/match/lib/match/git_helper.rb +5 -0
  114. data/match/lib/match/module.rb +23 -0
  115. data/match/lib/match/nuke.rb +8 -0
  116. data/match/lib/match/options.rb +3 -2
  117. data/match/lib/match/runner.rb +11 -0
  118. data/match/lib/match/setup.rb +2 -0
  119. data/match/lib/match/spaceship_ensure.rb +5 -2
  120. data/match/lib/match/table_printer.rb +6 -0
  121. data/match/lib/match/utils.rb +3 -0
  122. data/pem/lib/pem.rb +3 -20
  123. data/pem/lib/pem/commands_generator.rb +4 -0
  124. data/pem/lib/pem/manager.rb +3 -0
  125. data/pem/lib/pem/module.rb +18 -0
  126. data/pem/lib/pem/options.rb +4 -2
  127. data/pilot/lib/pilot.rb +1 -14
  128. data/pilot/lib/pilot/build_manager.rb +6 -0
  129. data/pilot/lib/pilot/commands_generator.rb +8 -2
  130. data/pilot/lib/pilot/manager.rb +10 -3
  131. data/pilot/lib/pilot/module.rb +9 -0
  132. data/pilot/lib/pilot/options.rb +4 -2
  133. data/pilot/lib/pilot/tester_exporter.rb +6 -3
  134. data/pilot/lib/pilot/tester_importer.rb +3 -1
  135. data/pilot/lib/pilot/tester_manager.rb +6 -5
  136. data/precheck/lib/precheck.rb +2 -22
  137. data/precheck/lib/precheck/commands_generator.rb +8 -1
  138. data/precheck/lib/precheck/module.rb +21 -0
  139. data/precheck/lib/precheck/options.rb +4 -3
  140. data/precheck/lib/precheck/rule.rb +7 -4
  141. data/precheck/lib/precheck/rule_processor.rb +5 -2
  142. data/precheck/lib/precheck/rules/abstract_text_match_rule.rb +1 -1
  143. data/precheck/lib/precheck/rules/all.rb +1 -0
  144. data/precheck/lib/precheck/rules/copyright_date_rule.rb +1 -2
  145. data/precheck/lib/precheck/rules/curse_words_rule.rb +2 -1
  146. data/precheck/lib/precheck/rules/custom_text_rule.rb +1 -2
  147. data/precheck/lib/precheck/rules/free_stuff_iap_rule.rb +1 -2
  148. data/precheck/lib/precheck/rules/future_functionality_rule.rb +1 -2
  149. data/precheck/lib/precheck/rules/negative_apple_sentiment_rule.rb +1 -2
  150. data/precheck/lib/precheck/rules/other_platforms_rule.rb +1 -2
  151. data/precheck/lib/precheck/rules/placeholder_words_rule.rb +1 -2
  152. data/precheck/lib/precheck/rules/test_words_rule.rb +1 -2
  153. data/precheck/lib/precheck/rules/unreachable_urls_rule.rb +3 -1
  154. data/precheck/lib/precheck/runner.rb +6 -4
  155. data/produce/lib/produce.rb +6 -21
  156. data/produce/lib/produce/commands_generator.rb +5 -0
  157. data/produce/lib/produce/developer_center.rb +1 -0
  158. data/produce/lib/produce/group.rb +1 -0
  159. data/produce/lib/produce/itunes_connect.rb +5 -3
  160. data/produce/lib/produce/manager.rb +4 -0
  161. data/produce/lib/produce/merchant.rb +1 -0
  162. data/produce/lib/produce/module.rb +14 -0
  163. data/produce/lib/produce/options.rb +4 -2
  164. data/produce/lib/produce/service.rb +3 -0
  165. data/scan/lib/scan.rb +10 -40
  166. data/scan/lib/scan/commands_generator.rb +6 -2
  167. data/scan/lib/scan/detect_values.rb +4 -0
  168. data/scan/lib/scan/error_handler.rb +2 -0
  169. data/scan/lib/scan/manager.rb +4 -0
  170. data/scan/lib/scan/module.rb +32 -0
  171. data/scan/lib/scan/options.rb +3 -2
  172. data/scan/lib/scan/runner.rb +9 -0
  173. data/scan/lib/scan/slack_poster.rb +2 -0
  174. data/scan/lib/scan/test_command_generator.rb +2 -0
  175. data/scan/lib/scan/test_result_parser.rb +2 -0
  176. data/scan/lib/scan/xcpretty_reporter_options_generator.rb +2 -0
  177. data/screengrab/lib/screengrab.rb +7 -33
  178. data/screengrab/lib/screengrab/android_environment.rb +2 -0
  179. data/screengrab/lib/screengrab/commands_generator.rb +8 -0
  180. data/screengrab/lib/screengrab/dependency_checker.rb +2 -0
  181. data/screengrab/lib/screengrab/module.rb +24 -0
  182. data/screengrab/lib/screengrab/options.rb +3 -2
  183. data/screengrab/lib/screengrab/reports_generator.rb +3 -1
  184. data/screengrab/lib/screengrab/runner.rb +4 -0
  185. data/screengrab/lib/screengrab/setup.rb +2 -0
  186. data/sigh/lib/sigh.rb +4 -19
  187. data/sigh/lib/sigh/commands_generator.rb +5 -0
  188. data/sigh/lib/sigh/download_all.rb +5 -0
  189. data/sigh/lib/sigh/local_manage.rb +5 -0
  190. data/sigh/lib/sigh/manager.rb +3 -2
  191. data/sigh/lib/sigh/module.rb +16 -0
  192. data/sigh/lib/sigh/options.rb +3 -2
  193. data/sigh/lib/sigh/repair.rb +4 -0
  194. data/sigh/lib/sigh/resign.rb +3 -0
  195. data/sigh/lib/sigh/runner.rb +4 -0
  196. data/snapshot/lib/snapshot.rb +19 -61
  197. data/snapshot/lib/snapshot/collector.rb +5 -0
  198. data/snapshot/lib/snapshot/commands_generator.rb +4 -1
  199. data/snapshot/lib/snapshot/dependency_checker.rb +27 -23
  200. data/snapshot/lib/snapshot/detect_values.rb +7 -0
  201. data/snapshot/lib/snapshot/error_handler.rb +2 -0
  202. data/snapshot/lib/snapshot/fixes/hardware_keyboard_fix.rb +2 -0
  203. data/snapshot/lib/snapshot/fixes/simulator_zoom_fix.rb +2 -0
  204. data/snapshot/lib/snapshot/latest_os_version.rb +5 -2
  205. data/snapshot/lib/snapshot/module.rb +44 -0
  206. data/snapshot/lib/snapshot/options.rb +11 -2
  207. data/snapshot/lib/snapshot/reports_generator.rb +4 -2
  208. data/snapshot/lib/snapshot/reset_simulators.rb +3 -0
  209. data/snapshot/lib/snapshot/runner.rb +10 -0
  210. data/snapshot/lib/snapshot/screenshot_flatten.rb +2 -0
  211. data/snapshot/lib/snapshot/screenshot_rotate.rb +4 -1
  212. data/snapshot/lib/snapshot/setup.rb +2 -0
  213. data/snapshot/lib/snapshot/simulator_launchers/launcher_configuration.rb +0 -1
  214. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher.rb +27 -27
  215. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +8 -0
  216. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_xcode_8.rb +4 -1
  217. data/snapshot/lib/snapshot/test_command_generator.rb +2 -1
  218. data/snapshot/lib/snapshot/test_command_generator_base.rb +10 -4
  219. data/snapshot/lib/snapshot/test_command_generator_xcode_8.rb +3 -1
  220. data/snapshot/lib/snapshot/update.rb +3 -0
  221. data/spaceship/lib/spaceship.rb +14 -36
  222. data/spaceship/lib/spaceship/client.rb +26 -76
  223. data/spaceship/lib/spaceship/commands_generator.rb +4 -2
  224. data/spaceship/lib/spaceship/du/du_client.rb +3 -0
  225. data/spaceship/lib/spaceship/du/upload_file.rb +2 -0
  226. data/spaceship/lib/spaceship/errors.rb +67 -0
  227. data/spaceship/lib/spaceship/globals.rb +1 -1
  228. data/spaceship/lib/spaceship/helper/plist_middleware.rb +1 -1
  229. data/spaceship/lib/spaceship/helper/rels_middleware.rb +2 -0
  230. data/spaceship/lib/spaceship/launcher.rb +7 -5
  231. data/spaceship/lib/spaceship/module.rb +4 -0
  232. data/spaceship/lib/spaceship/playground.rb +3 -0
  233. data/spaceship/lib/spaceship/portal/app.rb +3 -0
  234. data/spaceship/lib/spaceship/portal/app_group.rb +2 -0
  235. data/spaceship/lib/spaceship/portal/app_service.rb +38 -290
  236. data/spaceship/lib/spaceship/portal/certificate.rb +3 -1
  237. data/spaceship/lib/spaceship/portal/device.rb +5 -3
  238. data/spaceship/lib/spaceship/portal/invite.rb +2 -0
  239. data/spaceship/lib/spaceship/portal/key.rb +2 -0
  240. data/spaceship/lib/spaceship/portal/legacy_wrapper.rb +21 -0
  241. data/spaceship/lib/spaceship/portal/merchant.rb +2 -0
  242. data/spaceship/lib/spaceship/portal/passbook.rb +2 -0
  243. data/spaceship/lib/spaceship/portal/person.rb +2 -0
  244. data/spaceship/lib/spaceship/portal/persons.rb +3 -0
  245. data/spaceship/lib/spaceship/portal/portal_base.rb +3 -0
  246. data/spaceship/lib/spaceship/portal/portal_client.rb +37 -23
  247. data/spaceship/lib/spaceship/portal/provisioning_profile.rb +27 -20
  248. data/spaceship/lib/spaceship/portal/provisioning_profile_template.rb +2 -0
  249. data/spaceship/lib/spaceship/portal/spaceship.rb +13 -10
  250. data/spaceship/lib/spaceship/portal/ui/select_team.rb +2 -0
  251. data/spaceship/lib/spaceship/portal/website_push.rb +2 -0
  252. data/spaceship/lib/spaceship/spaceauth_runner.rb +4 -2
  253. data/spaceship/lib/spaceship/test_flight.rb +0 -1
  254. data/spaceship/lib/spaceship/test_flight/app_test_info.rb +4 -0
  255. data/spaceship/lib/spaceship/test_flight/base.rb +22 -17
  256. data/spaceship/lib/spaceship/test_flight/beta_review_info.rb +2 -0
  257. data/spaceship/lib/spaceship/test_flight/build.rb +211 -203
  258. data/spaceship/lib/spaceship/test_flight/build_trains.rb +4 -1
  259. data/spaceship/lib/spaceship/test_flight/client.rb +255 -251
  260. data/spaceship/lib/spaceship/test_flight/export_compliance.rb +2 -0
  261. data/spaceship/lib/spaceship/test_flight/group.rb +2 -0
  262. data/spaceship/lib/spaceship/test_flight/test_info.rb +2 -0
  263. data/spaceship/lib/spaceship/test_flight/tester.rb +114 -110
  264. data/spaceship/lib/spaceship/tunes/app_details.rb +5 -1
  265. data/spaceship/lib/spaceship/tunes/app_image.rb +2 -0
  266. data/spaceship/lib/spaceship/tunes/app_ratings.rb +2 -68
  267. data/spaceship/lib/spaceship/tunes/app_review.rb +55 -0
  268. data/spaceship/lib/spaceship/tunes/app_screenshot.rb +2 -0
  269. data/spaceship/lib/spaceship/tunes/app_submission.rb +1 -0
  270. data/spaceship/lib/spaceship/tunes/app_trailer.rb +2 -0
  271. data/spaceship/lib/spaceship/tunes/app_version.rb +11 -0
  272. data/spaceship/lib/spaceship/tunes/app_version_generated_promocodes.rb +2 -0
  273. data/spaceship/lib/spaceship/tunes/app_version_history.rb +2 -0
  274. data/spaceship/lib/spaceship/tunes/app_version_promocodes.rb +2 -0
  275. data/spaceship/lib/spaceship/tunes/app_version_ref.rb +2 -0
  276. data/spaceship/lib/spaceship/tunes/app_version_states_history.rb +2 -0
  277. data/spaceship/lib/spaceship/tunes/application.rb +18 -6
  278. data/spaceship/lib/spaceship/tunes/availability.rb +2 -0
  279. data/spaceship/lib/spaceship/tunes/build.rb +2 -0
  280. data/spaceship/lib/spaceship/tunes/build_details.rb +2 -0
  281. data/spaceship/lib/spaceship/tunes/build_train.rb +5 -1
  282. data/spaceship/lib/spaceship/tunes/developer_response.rb +23 -0
  283. data/spaceship/lib/spaceship/tunes/errors.rb +17 -0
  284. data/spaceship/lib/spaceship/tunes/iap_detail.rb +5 -0
  285. data/spaceship/lib/spaceship/tunes/iap_families.rb +1 -0
  286. data/spaceship/lib/spaceship/tunes/iap_family_details.rb +1 -0
  287. data/spaceship/lib/spaceship/tunes/iap_family_list.rb +1 -0
  288. data/spaceship/lib/spaceship/tunes/iap_list.rb +3 -0
  289. data/spaceship/lib/spaceship/tunes/iap_subscription_pricing_info.rb +46 -0
  290. data/spaceship/lib/spaceship/tunes/iap_subscription_pricing_tier.rb +2 -41
  291. data/spaceship/lib/spaceship/tunes/language_converter.rb +2 -0
  292. data/spaceship/lib/spaceship/tunes/legacy_wrapper.rb +13 -0
  293. data/spaceship/lib/spaceship/tunes/member.rb +3 -0
  294. data/spaceship/lib/spaceship/tunes/members.rb +2 -0
  295. data/spaceship/lib/spaceship/tunes/pricing_info.rb +42 -0
  296. data/spaceship/lib/spaceship/tunes/pricing_tier.rb +2 -37
  297. data/spaceship/lib/spaceship/tunes/recovery_device.rb +2 -0
  298. data/spaceship/lib/spaceship/tunes/sandbox_tester.rb +2 -0
  299. data/spaceship/lib/spaceship/tunes/spaceship.rb +2 -0
  300. data/spaceship/lib/spaceship/tunes/territory.rb +2 -0
  301. data/spaceship/lib/spaceship/tunes/transit_app_file.rb +2 -0
  302. data/spaceship/lib/spaceship/tunes/tunes.rb +34 -39
  303. data/spaceship/lib/spaceship/tunes/tunes_base.rb +2 -0
  304. data/spaceship/lib/spaceship/tunes/tunes_client.rb +20 -14
  305. data/spaceship/lib/spaceship/tunes/user_detail.rb +2 -0
  306. data/spaceship/lib/spaceship/tunes/version_set.rb +2 -0
  307. data/spaceship/lib/spaceship/two_step_client.rb +5 -1
  308. data/spaceship/lib/spaceship/ui.rb +7 -7
  309. data/supply/lib/supply/options.rb +2 -2
  310. metadata +31 -6
@@ -1,3 +1,6 @@
1
+ require_relative 'base'
2
+ require_relative 'build'
3
+
1
4
  module Spaceship::TestFlight
2
5
  class BuildTrains < Base
3
6
  ##
@@ -15,7 +18,7 @@ module Spaceship::TestFlight
15
18
 
16
19
  data.each do |train_version|
17
20
  builds_data = client.get_builds_for_train(app_id: app_id, platform: platform, train_version: train_version, retry_count: retry_count)
18
- trains[train_version] = builds_data.map { |attrs| Build.new(attrs) }
21
+ trains[train_version] = builds_data.map { |attrs| Spaceship::TestFlight::Build.new(attrs) }
19
22
  end
20
23
 
21
24
  self.new(trains)
@@ -1,323 +1,327 @@
1
- module Spaceship::TestFlight
2
- class Client < Spaceship::Client
3
- ##
4
- # Spaceship HTTP client for the testflight API.
5
- #
6
- # This client is solely responsible for the making HTTP requests and
7
- # parsing their responses. Parameters should be either named parameters, or
8
- # for large request data bodies, pass in anything that can resond to
9
- # `to_json`.
10
- #
11
- # Each request method should validate the required parameters. A required parameter is one that would result in 400-range response if it is not supplied.
12
- # Each request method should make only one request. For more high-level logic, put code in the data models.
13
-
14
- def self.hostname
15
- 'https://itunesconnect.apple.com/testflight/v2/'
16
- end
1
+ require_relative '../client'
2
+
3
+ module Spaceship
4
+ module TestFlight
5
+ class Client < Spaceship::Client
6
+ ##
7
+ # Spaceship HTTP client for the testflight API.
8
+ #
9
+ # This client is solely responsible for the making HTTP requests and
10
+ # parsing their responses. Parameters should be either named parameters, or
11
+ # for large request data bodies, pass in anything that can resond to
12
+ # `to_json`.
13
+ #
14
+ # Each request method should validate the required parameters. A required parameter is one that would result in 400-range response if it is not supplied.
15
+ # Each request method should make only one request. For more high-level logic, put code in the data models.
16
+
17
+ def self.hostname
18
+ 'https://itunesconnect.apple.com/testflight/v2/'
19
+ end
17
20
 
18
- ##
19
- # @!group Build trains API
20
- ##
21
+ ##
22
+ # @!group Build trains API
23
+ ##
21
24
 
22
- # Returns an array of all available build trains (not the builds they include)
23
- def get_build_trains(app_id: nil, platform: "ios")
24
- assert_required_params(__method__, binding)
25
+ # Returns an array of all available build trains (not the builds they include)
26
+ def get_build_trains(app_id: nil, platform: "ios")
27
+ assert_required_params(__method__, binding)
25
28
 
26
- response = request(:get, "providers/#{team_id}/apps/#{app_id}/platforms/#{platform}/trains")
29
+ response = request(:get, "providers/#{team_id}/apps/#{app_id}/platforms/#{platform}/trains")
27
30
 
28
- handle_response(response)
29
- end
30
-
31
- def get_builds_for_train(app_id: nil, platform: "ios", train_version: nil, retry_count: 3)
32
- assert_required_params(__method__, binding)
33
- with_retry(retry_count) do
34
- response = request(:get, "providers/#{team_id}/apps/#{app_id}/platforms/#{platform}/trains/#{train_version}/builds", nil, {}, true)
35
31
  handle_response(response)
36
32
  end
37
- end
38
33
 
39
- ##
40
- # @!group Builds API
41
- ##
34
+ def get_builds_for_train(app_id: nil, platform: "ios", train_version: nil, retry_count: 3)
35
+ assert_required_params(__method__, binding)
36
+ with_retry(retry_count) do
37
+ response = request(:get, "providers/#{team_id}/apps/#{app_id}/platforms/#{platform}/trains/#{train_version}/builds", nil, {}, true)
38
+ handle_response(response)
39
+ end
40
+ end
42
41
 
43
- def get_build(app_id: nil, build_id: nil)
44
- assert_required_params(__method__, binding)
42
+ ##
43
+ # @!group Builds API
44
+ ##
45
45
 
46
- response = request(:get, "providers/#{team_id}/apps/#{app_id}/builds/#{build_id}")
47
- handle_response(response)
48
- end
46
+ def get_build(app_id: nil, build_id: nil)
47
+ assert_required_params(__method__, binding)
49
48
 
50
- def put_build(app_id: nil, build_id: nil, build: nil)
51
- assert_required_params(__method__, binding)
52
-
53
- response = request(:put) do |req|
54
- req.url "providers/#{team_id}/apps/#{app_id}/builds/#{build_id}"
55
- req.body = build.to_json
56
- req.headers['Content-Type'] = 'application/json'
49
+ response = request(:get, "providers/#{team_id}/apps/#{app_id}/builds/#{build_id}")
50
+ handle_response(response)
57
51
  end
58
- handle_response(response)
59
- end
60
52
 
61
- def post_for_testflight_review(app_id: nil, build_id: nil, build: nil)
62
- assert_required_params(__method__, binding)
53
+ def put_build(app_id: nil, build_id: nil, build: nil)
54
+ assert_required_params(__method__, binding)
63
55
 
64
- response = request(:post) do |req|
65
- req.url "providers/#{team_id}/apps/#{app_id}/builds/#{build_id}/review"
66
- req.body = build.to_json
67
- req.headers['Content-Type'] = 'application/json'
56
+ response = request(:put) do |req|
57
+ req.url "providers/#{team_id}/apps/#{app_id}/builds/#{build_id}"
58
+ req.body = build.to_json
59
+ req.headers['Content-Type'] = 'application/json'
60
+ end
61
+ handle_response(response)
68
62
  end
69
- handle_response(response)
70
- end
71
63
 
72
- def expire_build(app_id: nil, build_id: nil, build: nil)
73
- assert_required_params(__method__, binding)
64
+ def post_for_testflight_review(app_id: nil, build_id: nil, build: nil)
65
+ assert_required_params(__method__, binding)
74
66
 
75
- response = request(:post) do |req|
76
- req.url "providers/#{team_id}/apps/#{app_id}/builds/#{build_id}/expire"
77
- req.body = build.to_json
78
- req.headers['Content-Type'] = 'application/json'
67
+ response = request(:post) do |req|
68
+ req.url "providers/#{team_id}/apps/#{app_id}/builds/#{build_id}/review"
69
+ req.body = build.to_json
70
+ req.headers['Content-Type'] = 'application/json'
71
+ end
72
+ handle_response(response)
79
73
  end
80
- handle_response(response)
81
- end
82
74
 
83
- ##
84
- # @!group Groups API
85
- ##
75
+ def expire_build(app_id: nil, build_id: nil, build: nil)
76
+ assert_required_params(__method__, binding)
77
+
78
+ response = request(:post) do |req|
79
+ req.url "providers/#{team_id}/apps/#{app_id}/builds/#{build_id}/expire"
80
+ req.body = build.to_json
81
+ req.headers['Content-Type'] = 'application/json'
82
+ end
83
+ handle_response(response)
84
+ end
86
85
 
87
- # Returns a list of available testing groups
88
- # e.g.
89
- # {"b6f65dbd-c845-4d91-bc39-0b661d608970" => "Boarding",
90
- # "70402368-9deb-409f-9a26-bb3f215dfee3" => "Automatic"}
91
- def get_groups(app_id: nil)
92
- return @cached_groups if @cached_groups
93
- assert_required_params(__method__, binding)
86
+ ##
87
+ # @!group Groups API
88
+ ##
94
89
 
95
- response = request(:get, "/testflight/v2/providers/#{provider_id}/apps/#{app_id}/groups")
96
- @cached_groups = handle_response(response)
97
- end
90
+ # Returns a list of available testing groups
91
+ # e.g.
92
+ # {"b6f65dbd-c845-4d91-bc39-0b661d608970" => "Boarding",
93
+ # "70402368-9deb-409f-9a26-bb3f215dfee3" => "Automatic"}
94
+ def get_groups(app_id: nil)
95
+ return @cached_groups if @cached_groups
96
+ assert_required_params(__method__, binding)
98
97
 
99
- def add_group_to_build(app_id: nil, group_id: nil, build_id: nil)
100
- assert_required_params(__method__, binding)
101
-
102
- body = {
103
- 'groupId' => group_id,
104
- 'buildId' => build_id
105
- }
106
- response = request(:put) do |req|
107
- req.url "providers/#{team_id}/apps/#{app_id}/groups/#{group_id}/builds/#{build_id}"
108
- req.body = body.to_json
109
- req.headers['Content-Type'] = 'application/json'
98
+ response = request(:get, "/testflight/v2/providers/#{provider_id}/apps/#{app_id}/groups")
99
+ @cached_groups = handle_response(response)
110
100
  end
111
- handle_response(response)
112
- end
113
101
 
114
- def create_group_for_app(app_id: nil, group_name: nil)
115
- assert_required_params(__method__, binding)
116
- body = {
117
- 'name' => group_name
118
- }
102
+ def create_group_for_app(app_id: nil, group_name: nil)
103
+ assert_required_params(__method__, binding)
104
+ body = {
105
+ 'name' => group_name
106
+ }
119
107
 
120
- response = request(:post) do |req|
121
- req.url "providers/#{team_id}/apps/#{app_id}/groups"
122
- req.body = body.to_json
123
- req.headers['Content-Type'] = 'application/json'
108
+ response = request(:post) do |req|
109
+ req.url "providers/#{team_id}/apps/#{app_id}/groups"
110
+ req.body = body.to_json
111
+ req.headers['Content-Type'] = 'application/json'
112
+ end
113
+ handle_response(response)
124
114
  end
125
- handle_response(response)
126
- end
127
115
 
128
- #####################################################
129
- # @!group Testers
130
- #####################################################
131
- def testers(tester)
132
- url = tester.url[:index]
133
- r = request(:get, url)
134
- parse_response(r, 'data')['users']
135
- end
136
-
137
- def testers_by_app(tester, app_id, group_id: nil)
138
- if group_id.nil?
139
- group_ids = get_groups(app_id: app_id).map do |group|
140
- group['id']
116
+ def add_group_to_build(app_id: nil, group_id: nil, build_id: nil)
117
+ assert_required_params(__method__, binding)
118
+
119
+ body = {
120
+ 'groupId' => group_id,
121
+ 'buildId' => build_id
122
+ }
123
+ response = request(:put) do |req|
124
+ req.url "providers/#{team_id}/apps/#{app_id}/groups/#{group_id}/builds/#{build_id}"
125
+ req.body = body.to_json
126
+ req.headers['Content-Type'] = 'application/json'
141
127
  end
128
+ handle_response(response)
142
129
  end
143
- group_ids ||= [group_id]
144
- testers = []
145
130
 
146
- group_ids.each do |json_group_id|
147
- url = tester.url(app_id, provider_id, json_group_id)[:index_by_app]
131
+ #####################################################
132
+ # @!group Testers
133
+ #####################################################
134
+ def testers(tester)
135
+ url = tester.url[:index]
148
136
  r = request(:get, url)
149
- testers += parse_response(r, 'data')['users']
137
+ parse_response(r, 'data')['users']
150
138
  end
151
139
 
152
- testers
153
- end
140
+ def testers_by_app(tester, app_id, group_id: nil)
141
+ if group_id.nil?
142
+ group_ids = get_groups(app_id: app_id).map do |group|
143
+ group['id']
144
+ end
145
+ end
146
+ group_ids ||= [group_id]
147
+ testers = []
154
148
 
155
- ##
156
- # @!group Testers API
157
- ##
158
-
159
- def testers_for_app(app_id: nil)
160
- assert_required_params(__method__, binding)
161
- page_size = 40 # that's enforced by the iTC servers
162
- resulting_array = []
163
- initial_url = "providers/#{team_id}/apps/#{app_id}/testers?limit=#{page_size}&sort=email&order=asc"
164
- response = request(:get, initial_url)
165
- link_from_response = proc do |r|
166
- # I weep for Swift nil chaining
167
- (l = r.headers['link']) && (m = l.match(/<(.*)>/)) && m.captures.first
149
+ group_ids.each do |json_group_id|
150
+ url = tester.url(app_id, provider_id, json_group_id)[:index_by_app]
151
+ r = request(:get, url)
152
+ testers += parse_response(r, 'data')['users']
153
+ end
154
+
155
+ testers
168
156
  end
169
- next_link = link_from_response.call(response)
170
- result = Array(handle_response(response))
171
- resulting_array += result
172
- return resulting_array if result.count == 0
173
157
 
174
- until next_link.nil?
175
- response = request(:get, next_link)
176
- result = Array(handle_response(response))
158
+ ##
159
+ # @!group Testers API
160
+ ##
161
+
162
+ def testers_for_app(app_id: nil)
163
+ assert_required_params(__method__, binding)
164
+ page_size = 40 # that's enforced by the iTC servers
165
+ resulting_array = []
166
+ initial_url = "providers/#{team_id}/apps/#{app_id}/testers?limit=#{page_size}&sort=email&order=asc"
167
+ response = request(:get, initial_url)
168
+ link_from_response = proc do |r|
169
+ # I weep for Swift nil chaining
170
+ (l = r.headers['link']) && (m = l.match(/<(.*)>/)) && m.captures.first
171
+ end
177
172
  next_link = link_from_response.call(response)
178
-
179
- break if result.count == 0
180
-
173
+ result = Array(handle_response(response))
181
174
  resulting_array += result
182
- end
183
- return resulting_array.uniq
184
- end
175
+ return resulting_array if result.count == 0
185
176
 
186
- def delete_tester_from_app(app_id: nil, tester_id: nil)
187
- assert_required_params(__method__, binding)
188
- url = "providers/#{team_id}/apps/#{app_id}/testers/#{tester_id}"
189
- response = request(:delete, url)
190
- handle_response(response)
191
- end
177
+ until next_link.nil?
178
+ response = request(:get, next_link)
179
+ result = Array(handle_response(response))
180
+ next_link = link_from_response.call(response)
192
181
 
193
- def search_for_tester_in_app(app_id: nil, text: nil)
194
- assert_required_params(__method__, binding)
195
- text = CGI.escape(text)
196
- url = "providers/#{team_id}/apps/#{app_id}/testers?order=asc&search=#{text}&sort=status"
197
- response = request(:get, url)
198
- handle_response(response)
199
- end
182
+ break if result.count == 0
200
183
 
201
- def resend_invite_to_external_tester(app_id: nil, tester_id: nil)
202
- assert_required_params(__method__, binding)
203
- url = "/testflight/v1/invites/#{app_id}/resend?testerId=#{tester_id}"
204
- response = request(:post, url)
205
- handle_response(response)
206
- end
184
+ resulting_array += result
185
+ end
186
+ return resulting_array.uniq
187
+ end
207
188
 
208
- def create_app_level_tester(app_id: nil, first_name: nil, last_name: nil, email: nil)
209
- assert_required_params(__method__, binding)
210
- url = "providers/#{team_id}/apps/#{app_id}/testers"
211
- response = request(:post) do |req|
212
- req.url url
213
- req.body = {
214
- "email" => email,
215
- "firstName" => first_name,
216
- "lastName" => last_name
217
- }.to_json
218
- req.headers['Content-Type'] = 'application/json'
189
+ def delete_tester_from_app(app_id: nil, tester_id: nil)
190
+ assert_required_params(__method__, binding)
191
+ url = "providers/#{team_id}/apps/#{app_id}/testers/#{tester_id}"
192
+ response = request(:delete, url)
193
+ handle_response(response)
219
194
  end
220
- handle_response(response)
221
- end
222
195
 
223
- def post_tester_to_group(app_id: nil, email: nil, first_name: nil, last_name: nil, group_id: nil)
224
- assert_required_params(__method__, binding)
225
-
226
- # Then we can add the tester to the group that allows the app to test
227
- # This is easy enough, we already have all this data. We don't need any response from the previous request
228
- url = "providers/#{team_id}/apps/#{app_id}/groups/#{group_id}/testers"
229
- response = request(:post) do |req|
230
- req.url url
231
- req.body = [{
232
- "email" => email,
233
- "firstName" => first_name,
234
- "lastName" => last_name
235
- }].to_json
236
- req.headers['Content-Type'] = 'application/json'
196
+ def search_for_tester_in_app(app_id: nil, text: nil)
197
+ assert_required_params(__method__, binding)
198
+ text = CGI.escape(text)
199
+ url = "providers/#{team_id}/apps/#{app_id}/testers?order=asc&search=#{text}&sort=status"
200
+ response = request(:get, url)
201
+ handle_response(response)
237
202
  end
238
- handle_response(response)
239
- end
240
203
 
241
- def delete_tester_from_group(group_id: nil, tester_id: nil, app_id: nil)
242
- assert_required_params(__method__, binding)
204
+ def resend_invite_to_external_tester(app_id: nil, tester_id: nil)
205
+ assert_required_params(__method__, binding)
206
+ url = "/testflight/v1/invites/#{app_id}/resend?testerId=#{tester_id}"
207
+ response = request(:post, url)
208
+ handle_response(response)
209
+ end
243
210
 
244
- url = "providers/#{team_id}/apps/#{app_id}/groups/#{group_id}/testers/#{tester_id}"
245
- response = request(:delete) do |req|
246
- req.url url
247
- req.headers['Content-Type'] = 'application/json'
211
+ def create_app_level_tester(app_id: nil, first_name: nil, last_name: nil, email: nil)
212
+ assert_required_params(__method__, binding)
213
+ url = "providers/#{team_id}/apps/#{app_id}/testers"
214
+ response = request(:post) do |req|
215
+ req.url url
216
+ req.body = {
217
+ "email" => email,
218
+ "firstName" => first_name,
219
+ "lastName" => last_name
220
+ }.to_json
221
+ req.headers['Content-Type'] = 'application/json'
222
+ end
223
+ handle_response(response)
224
+ end
225
+
226
+ def post_tester_to_group(app_id: nil, email: nil, first_name: nil, last_name: nil, group_id: nil)
227
+ assert_required_params(__method__, binding)
228
+
229
+ # Then we can add the tester to the group that allows the app to test
230
+ # This is easy enough, we already have all this data. We don't need any response from the previous request
231
+ url = "providers/#{team_id}/apps/#{app_id}/groups/#{group_id}/testers"
232
+ response = request(:post) do |req|
233
+ req.url url
234
+ req.body = [{
235
+ "email" => email,
236
+ "firstName" => first_name,
237
+ "lastName" => last_name
238
+ }].to_json
239
+ req.headers['Content-Type'] = 'application/json'
240
+ end
241
+ handle_response(response)
248
242
  end
249
- handle_response(response)
250
- end
251
243
 
252
- ##
253
- # @!group AppTestInfo
254
- ##
244
+ def delete_tester_from_group(group_id: nil, tester_id: nil, app_id: nil)
245
+ assert_required_params(__method__, binding)
255
246
 
256
- def get_app_test_info(app_id: nil)
257
- assert_required_params(__method__, binding)
247
+ url = "providers/#{team_id}/apps/#{app_id}/groups/#{group_id}/testers/#{tester_id}"
248
+ response = request(:delete) do |req|
249
+ req.url url
250
+ req.headers['Content-Type'] = 'application/json'
251
+ end
252
+ handle_response(response)
253
+ end
258
254
 
259
- response = request(:get, "providers/#{team_id}/apps/#{app_id}/testInfo")
260
- handle_response(response)
261
- end
255
+ ##
256
+ # @!group AppTestInfo
257
+ ##
262
258
 
263
- def put_app_test_info(app_id: nil, app_test_info: nil)
264
- assert_required_params(__method__, binding)
259
+ def get_app_test_info(app_id: nil)
260
+ assert_required_params(__method__, binding)
265
261
 
266
- response = request(:put) do |req|
267
- req.url "providers/#{team_id}/apps/#{app_id}/testInfo"
268
- req.body = app_test_info.to_json
269
- req.headers['Content-Type'] = 'application/json'
262
+ response = request(:get, "providers/#{team_id}/apps/#{app_id}/testInfo")
263
+ handle_response(response)
270
264
  end
271
- handle_response(response)
272
- end
273
265
 
274
- protected
266
+ def put_app_test_info(app_id: nil, app_test_info: nil)
267
+ assert_required_params(__method__, binding)
275
268
 
276
- def handle_response(response)
277
- if (200...300).cover?(response.status) && (response.body.nil? || response.body.empty?)
278
- return
269
+ response = request(:put) do |req|
270
+ req.url "providers/#{team_id}/apps/#{app_id}/testInfo"
271
+ req.body = app_test_info.to_json
272
+ req.headers['Content-Type'] = 'application/json'
273
+ end
274
+ handle_response(response)
279
275
  end
280
276
 
281
- raise InternalServerError, "Server error got #{response.status}" if (500...600).cover?(response.status)
277
+ protected
282
278
 
283
- unless response.body.kind_of?(Hash)
284
- raise UnexpectedResponse, response.body
285
- end
279
+ def handle_response(response)
280
+ if (200...300).cover?(response.status) && (response.body.nil? || response.body.empty?)
281
+ return
282
+ end
286
283
 
287
- raise UnexpectedResponse, response.body['error'] if response.body['error']
284
+ raise InternalServerError, "Server error got #{response.status}" if (500...600).cover?(response.status)
288
285
 
289
- raise UnexpectedResponse, "Temporary iTunes Connect error: #{response.body}" if response.body['statusCode'] == 'ERROR'
286
+ unless response.body.kind_of?(Hash)
287
+ raise UnexpectedResponse, response.body
288
+ end
290
289
 
291
- return response.body['data'] if response.body['data']
290
+ raise UnexpectedResponse, response.body['error'] if response.body['error']
292
291
 
293
- return response.body
294
- end
292
+ raise UnexpectedResponse, "Temporary iTunes Connect error: #{response.body}" if response.body['statusCode'] == 'ERROR'
295
293
 
296
- private
294
+ return response.body['data'] if response.body['data']
295
+
296
+ return response.body
297
+ end
297
298
 
298
- # used to assert all of the named parameters are supplied values
299
- #
300
- # @raises NameError if the values are nil
301
- def assert_required_params(method_name, binding)
302
- parameter_names = method(method_name).parameters.map { |k, v| v }
303
- parameter_names.each do |name|
304
- if local_variable_get(binding, name).nil?
305
- raise NameError, "`#{name}' is a required parameter"
299
+ private
300
+
301
+ # used to assert all of the named parameters are supplied values
302
+ #
303
+ # @raises NameError if the values are nil
304
+ def assert_required_params(method_name, binding)
305
+ parameter_names = method(method_name).parameters.map { |k, v| v }
306
+ parameter_names.each do |name|
307
+ if local_variable_get(binding, name).nil?
308
+ raise NameError, "`#{name}' is a required parameter"
309
+ end
306
310
  end
307
311
  end
308
- end
309
312
 
310
- def local_variable_get(binding, name)
311
- if binding.respond_to?(:local_variable_get)
312
- binding.local_variable_get(name)
313
- else
314
- binding.eval(name.to_s)
313
+ def local_variable_get(binding, name)
314
+ if binding.respond_to?(:local_variable_get)
315
+ binding.local_variable_get(name)
316
+ else
317
+ binding.eval(name.to_s)
318
+ end
315
319
  end
316
- end
317
320
 
318
- def provider_id
319
- return team_id if self.provider.nil?
320
- self.provider.provider_id
321
+ def provider_id
322
+ return team_id if self.provider.nil?
323
+ self.provider.provider_id
324
+ end
321
325
  end
322
326
  end
323
327
  end