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

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